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=(x−u)/(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+1
bướ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ỏ).