Giải thích về các đột biến trong mất tập luyện so với các lần lặp với Trình tối ưu hóa Adam


15

Tôi đang đào tạo một mạng lưới thần kinh bằng cách sử dụng i) SGD và ii) Trình tối ưu hóa Adam. Khi sử dụng SGD bình thường, tôi nhận được một sự mất tập luyện trơn tru so với đường cong lặp lại như được thấy dưới đây (màu đỏ). Tuy nhiên, khi tôi sử dụng Trình tối ưu hóa Adam, đường cong mất tập luyện có một số đột biến. Giải thích về những gai này là gì?

Chi tiết mô hình:

14 nút đầu vào -> 2 lớp ẩn (100 -> 40 đơn vị) -> 4 đơn vị đầu ra

Tôi đang sử dụng các thông số mặc định cho Adam beta_1 = 0.9, beta_2 = 0.999, epsilon = 1e-8batch_size = 32.

i) Với SGD ii) Với AdamVới SGD Với Adam


Để biết thông báo trong tương lai, việc giảm tỷ lệ học tập ban đầu của bạn có thể giúp loại bỏ các đột biến trong Adam
in đậm

Câu trả lời:


12

Sự tăng đột biến là hậu quả không thể tránh khỏi của Mini-Batch Gradient Descent trong Adam ( batch_size=32). Một số lô nhỏ có dữ liệu không may mắn 'do tình cờ' để tối ưu hóa, tạo ra những đột biến mà bạn thấy trong hàm chi phí của mình bằng Adam. Nếu bạn thử giảm độ dốc ngẫu nhiên (giống như sử dụng batch_size=1), bạn sẽ thấy rằng thậm chí còn có nhiều đột biến hơn trong hàm chi phí. Điều tương tự không xảy ra trong Batch GD (Full) vì nó sử dụng tất cả dữ liệu huấn luyện (tức là kích thước lô bằng với số lượng thẻ của tập huấn luyện của bạn) mỗi kỷ nguyên tối ưu hóa. Như trong đồ họa đầu tiên của bạn, chi phí giảm đơn điệu một cách trơn tru, có vẻ như tiêu đề ( i) Với SGD ) là sai và bạn đang sử dụng (Full) Batch Gradient Descent thay vì SGD.

Trong khóa học Deep Learning tuyệt vời của mình tại Coursera , Andrew Ng giải thích rất chi tiết về điều này bằng cách sử dụng hình ảnh dưới đây:

Hàm chi phí


2
'SGD ... sử dụng tất cả dữ liệu đào tạo' - bạn có chắc chắn về điều này không? Điều này có nghĩa là trọng số được cập nhật sau khi tất cả dữ liệu được chuyển tiếp, nhưng đây được gọi là gd toàn bộ, không phải sgd. Stochastic ngụ ý xe buýt nhỏ
Alex

Cảm ơn bạn @Alex đã chỉ ra lỗi của tôi, tôi đã sửa nó và cải thiện câu trả lời với tham khảo để biết thêm thông tin.
xboard

@xboard - Không, tôi đang sử dụng gốc giảm dần hàng loạt cho lần đầu tiên.
Abdul Fatir

6

Tôi đã dành thời gian điên rồ để gỡ lỗi độ dốc và hành vi tương tự. Câu trả lời của bạn sẽ phụ thuộc vào chức năng mất dữ liệu, dữ liệu, kiến ​​trúc, vv Có hàng trăm lý do. Tôi sẽ kể tên một vài người.

  • Mất phụ thuộc. Loglikabilities-loss cần phải được cắt bớt, nếu không, nó có thể đánh giá gần log(0)các dự đoán / ngoại lệ xấu trong tập dữ liệu, gây ra độ dốc bùng nổ. Hầu hết các gói (đèn pin, dòng chảy v.v.) thực hiện cắt theo mặc định cho các tổn thất của chúng.
  • Outliers trong tập dữ liệu.
  • ϵy=(xu)/(s+ϵ)sϵy
  • Lô cuối cùng trong một epoch có thể nhỏ nếu tập dữ liệu không thể chia theo lô. Trong dataloader có một lá cờ drop_last. Lô nhỏ = phương sai cao

Bây giờ đến lý do tại sao bạn nhìn thấy nó với Adam mà không phải với SGD? Rõ ràng bạn đã đạt được sự mất mát thấp hơn với Adam. Như đã lưu ý trước đây, nếu 99,9% dữ liệu có tối ưu tại một điểm trừ một số quan sát, thì đây có thể là quan sát hét lên "KHÔNG" và nhảy ra khỏi cực tiểu địa phương khi được chọn ngẫu nhiên theo một đợt. Nếu bạn nhìn thấy nó từng dataset_size//batch_size+1bước, có lẽ là do đợt cuối cùng nhỏ. Tôi cá là bạn cũng sẽ thấy SGD tăng đột biến nếu bạn để nó đạt mức thua lỗ thấp hơn.

Phần thưởng: Việc bạn giảm tốc độ rất nhanh với trình tối ưu hóa động lượng (Adam) có thể có nghĩa là một số lớp (lớp đầu vào? Lớp đầu ra?) Được khởi tạo cách ra khỏi quy mô (đến trọng lượng lớn / nhỏ).

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.