ความแตกต่างระหว่าง GradientDescentOptimizer และ AdamOptimizer (TensorFlow)?


45

ผมเคยเขียนง่ายMLPในTensorFlowซึ่งจะสร้างแบบจำลองXOR ประตู

ดังนั้นสำหรับ:

input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]

มันควรผลิตดังต่อไปนี้:

output_data = [[0.], [1.], [1.], [0.]]

เครือข่ายมีเลเยอร์อินพุตเลเยอร์ที่ซ่อนอยู่และเลเยอร์เอาท์พุทที่มีเซลล์ประสาท 2, 5 และ 1 เซลล์

ขณะนี้ฉันมีเอนโทรปีของการข้ามต่อไปนี้:

cross_entropy = -(n_output * tf.log(output) + (1 - n_output) * tf.log(1 - output))

ฉันได้ลองทางเลือกที่ง่ายกว่านี้แล้ว:

cross_entropy = tf.square(n_output - output)

ควบคู่ไปกับความพยายามอื่น ๆ


อย่างไรก็ตามไม่ว่าสิ่งที่การตั้งค่าของฉันคือข้อผิดพลาดที่มีการGradientDescentOptimizerลดลงมากAdamOptimizerช้ากว่า

ในความเป็นtf.train.AdamOptimizer(0.01)จริงให้ผลลัพธ์ที่ดีจริงๆหลังจากขั้นตอนการเรียนรู้ 400-800 ขั้น (ขึ้นอยู่กับอัตราการเรียนรู้ที่0.01มีผลลัพธ์ที่ดีที่สุด) ในขณะที่tf.train.GradientDescentOptimizerต้องการมากกว่า 2,000 ขั้นตอนการเรียนรู้เสมอไม่ว่าการคำนวณแบบเอนโทรปีหรืออัตราการเรียนรู้

ทำไมเป็นเช่นนี้ ดูเหมือนว่าAdamOptimizerเป็นทางเลือกที่ดีกว่าเสมอ!


2
เพิ่มประสิทธิภาพอดัมเป็นความซับซ้อนมากขึ้นกว่าการไล่ระดับสีโคตร (มันจะขึ้นอยู่กับบทความนี้ )
Marc Claesen

คำตอบ:


77

การtf.train.AdamOptimizerใช้อัลกอริธึมของ Kingma และ Ba เพื่อควบคุมอัตราการเรียนรู้ อดัมมีข้อได้เปรียบหลายอย่างที่ง่ายtf.train.GradientDescentOptimizerกว่า สำคัญที่สุดคือมันใช้ค่าเฉลี่ยเคลื่อนที่ของพารามิเตอร์ (โมเมนตัม); Bengio พูดถึงเหตุผลว่าทำไมสิ่งนี้จึงเป็นประโยชน์ในหัวข้อ 3.1.1 ของบทความนี้ พูดง่ายๆคือนี่ช่วยให้อดัมใช้ขนาดขั้นตอนที่มีขนาดใหญ่ขึ้นและอัลกอริทึมจะรวมกันเป็นขนาดขั้นตอนนี้โดยไม่ต้องทำการจูนอย่างละเอียด

ด้านล่างสุดของอัลกอริทึมคืออดัมต้องการการคำนวณเพิ่มเติมสำหรับแต่ละพารามิเตอร์ในแต่ละขั้นตอนการฝึกอบรม (เพื่อรักษาค่าเฉลี่ยเคลื่อนที่และความแปรปรวนและคำนวณการไล่ระดับสี) และสถานะอื่น ๆ ที่จะเก็บรักษาไว้สำหรับแต่ละพารามิเตอร์ (ประมาณสามเท่าของขนาดของแบบจำลองเพื่อเก็บค่าเฉลี่ยและความแปรปรวนสำหรับแต่ละพารามิเตอร์) วิอย่างง่ายtf.train.GradientDescentOptimizerสามารถนำมาใช้อย่างเท่าเทียมกันใน MLP ของคุณ แต่จะต้องมีการปรับแต่งพารามิเตอร์มากขึ้นก่อนที่มันจะมาบรรจบกันอย่างรวดเร็ว


5
ขอบคุณสำหรับคำตอบนี้! คุณสามารถเพิ่มสิ่งที่คุณหมายถึงเมื่อคุณพูดถึง " การปรับพารามิเตอร์ไฮเปอร์ "?
daniel451

12
ขอโทษสำหรับศัพท์แสง! ผมพูดถึงประมาณว่า "เปลี่ยนlearning_rateอาร์กิวเมนต์ให้กับคอนtf.train.GradientDescentOptimizerสตรัคเตอร์จนกว่ามันจะบรรจบกันเร็วขึ้น" :)
mrry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.