Sự khác biệt giữa GradientDescentOptimizer và AdamOptimizer (TensorFlow)?


45

Tôi đã viết một MLP đơn giản trong TensorFlow đang tạo mô hình Cổng XOR .

Vì vậy đối với:

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

nó sẽ tạo ra như sau:

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

Mạng có một lớp đầu vào, một lớp ẩn và một lớp đầu ra với 2, 5 và 1 nơ-ron mỗi lớp.

Hiện tại tôi có entropy chéo sau:

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

Tôi cũng đã thử cách thay thế đơn giản hơn này:

cross_entropy = tf.square(n_output - output)

cùng với một số cố gắng khác.


Tuy nhiên, không có vấn đề gì thiết lập của tôi là, lỗi với một GradientDescentOptimizerđã giảm nhiều chậm hơn so với một AdamOptimizer.

Trong thực tế đã tf.train.AdamOptimizer(0.01)tạo ra kết quả thực sự tốt sau 400-800 bước học (phụ thuộc vào tốc độ học tập, nơi 0.01có kết quả tốt nhất) trong khi tf.train.GradientDescentOptimizerluôn cần hơn 2000 bước học bất kể sử dụng phép tính entropy chéo hay tỷ lệ học tập nào.

Tại sao cái này rất? Có vẻ như AdamOptimizerluôn luôn là một lựa chọn tốt hơn?!


2
Trình tối ưu hóa Adam tinh vi hơn độ dốc gốc (nó dựa trên bài báo này ).
Marc Claesen

Câu trả lời:


77

Sử tf.train.AdamOptimizerdụng thuật toán Adam của Kingma và Ba để kiểm soát tốc độ học tập. Adam cung cấp một số lợi thế so với đơn giản tf.train.GradientDescentOptimizer. Đầu tiên là nó sử dụng trung bình di động của các tham số (động lượng); Bengio thảo luận về lý do tại sao điều này có lợi trong Phần 3.1.1 của bài viết này . Nói một cách đơn giản, điều này cho phép Adam sử dụng kích thước bước hiệu quả lớn hơn và thuật toán sẽ hội tụ đến kích thước bước này mà không cần tinh chỉnh.

Mặt trái chính của thuật toán là Adam yêu cầu tính toán nhiều hơn cho mỗi tham số trong mỗi bước đào tạo (để duy trì đường trung bình và phương sai di chuyển, và tính toán độ dốc tỷ lệ); và nhiều trạng thái được giữ lại cho từng tham số (tăng gấp ba lần kích thước của mô hình để lưu trữ trung bình và phương sai cho từng tham số). Một đơn giản tf.train.GradientDescentOptimizercó thể được sử dụng như nhau trong MLP của bạn, nhưng sẽ yêu cầu điều chỉnh siêu tham số nhiều hơn trước khi nó sẽ hội tụ nhanh chóng.


5
Cảm ơn câu trả lời này! Bạn có thể thêm chính xác ý của bạn khi bạn nói về " điều chỉnh siêu tham số " không?
daniel451

12
Xin lỗi vì biệt ngữ! Gần như nói, tôi có nghĩa là "thay đổi learning_rateđối số cho hàm tf.train.GradientDescentOptimizertạo cho đến khi nó hội tụ nhanh hơn." :)
mrry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.