Hành vi kỳ lạ với trình tối ưu hóa Adam khi đào tạo quá lâu


11

Tôi đang cố gắng đào tạo một perceptron (1000 đơn vị đầu vào, 1 đầu ra, không có lớp ẩn) trên 64 điểm dữ liệu được tạo ngẫu nhiên. Tôi đang sử dụng Pytorch bằng trình tối ưu hóa Adam:

import torch
from torch.autograd import Variable

torch.manual_seed(545345)
N, D_in, D_out = 64, 1000, 1

x = Variable(torch.randn(N, D_in))
y = Variable(torch.randn(N, D_out))

model = torch.nn.Linear(D_in, D_out)
loss_fn = torch.nn.MSELoss(size_average=False)

optimizer = torch.optim.Adam(model.parameters())
for t in xrange(5000):
  y_pred = model(x)
  loss = loss_fn(y_pred, y)

  print(t, loss.data[0])

  optimizer.zero_grad()
  loss.backward()
  optimizer.step()

Ban đầu, tổn thất nhanh chóng giảm, như mong đợi:

(0, 91.74887084960938)
(1, 76.85824584960938)
(2, 63.434078216552734)
(3, 51.46927261352539)
(4, 40.942893981933594)
(5, 31.819372177124023)

Khoảng 300 lần lặp, lỗi đạt gần 0:

(300, 2.1734419819452455e-12)
(301, 1.90354676465887e-12)
(302, 2.3347573874232808e-12)

Điều này diễn ra trong vài nghìn lần lặp. Tuy nhiên, sau khi đào tạo quá lâu, lỗi bắt đầu tăng trở lại:

(4997, 0.002102422062307596)
(4998, 0.0020302983466535807)
(4999, 0.0017039275262504816)

Tại sao chuyện này đang xảy ra?


Tôi không nghĩ rằng quá mức giải thích nó - tổn thất đào tạo đang tăng lên, không phải là mất xác nhận. Ví dụ, điều này không xảy ra khi sử dụng SGD, chỉ với Adam.
Bai Li

Mô hình có 1000 tham số và chỉ có 1 điểm dữ liệu, do đó mô hình phải khớp chính xác với dữ liệu và tổn thất phải bằng không.
Bai Li

Ôi xin lỗi, bạn nói đúng. Có 64 điểm dữ liệu.
Bai Li

Có 64 điểm dữ liệu (nghĩa là các ràng buộc) và 1000 tham số, vì vậy có thể tìm thấy các lựa chọn cho các tham số sao cho sai số bằng 0 (và điều này rất dễ thực hiện phân tích). Câu hỏi của tôi là tại sao Adam không tìm thấy điều này.
Bai Li

Câu trả lời:


19

Sự không ổn định nhỏ này khi kết thúc hội tụ là một đặc điểm của Adam (và RMSProp) do cách nó ước tính cường độ dốc có nghĩa là các bước gần đây và chia cho chúng.

1010105

Điều này thực sự làm cho Adam kém ổn định và tồi tệ hơn cho vấn đề của bạn so với việc giảm độ dốc cơ bản hơn, giả sử bạn muốn có được số lượng gần bằng 0 khi tính toán cho phép giải quyết vấn đề của bạn.

Trong thực tế về các vấn đề học tập sâu, bạn không hiểu được sự hội tụ này (và đối với một số kỹ thuật chính quy hóa như dừng sớm, dù sao bạn cũng không muốn), vì vậy, đây thường không phải là mối quan tâm thực tế đối với các loại vấn đề Adam được thiết kế cho.

Bạn thực sự có thể thấy điều này xảy ra với RMSProp khi so sánh các trình tối ưu hóa khác nhau (RMSProp là đường màu đen - xem các bước cuối cùng khi nó đạt được mục tiêu):

nhập mô tả hình ảnh ở đây

Bạn có thể làm cho Adam ổn định hơn và có thể tiến gần hơn đến sự hội tụ thực sự bằng cách giảm tỷ lệ học tập. Ví dụ

optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)

lr=1e-5107


Đây là một hình ảnh ngoạn mục, Neil. Các kích thước thực tế là gì? X và y đại diện cho cái gì? Là các khung một số delta t hoặc n epochs trên mỗi khung? Tôi đoán ngôi sao là tối ưu toàn cầu trong biểu diễn địa hình của sự chênh lệch (lỗi) liên quan đến hai tham số đã chọn. Dự đoán của tôi có đúng không?
Douglas Daseeco

Đó không phải là hình dung của tôi, bạn sẽ tìm thấy nó ở nhiều nơi. Kích thước là các đơn vị tham số đầu vào tùy ý cho hàm kiểm tra và biểu đồ hiển thị các đường đồng mức cho chức năng đó (một lần nữa trong các đơn vị tùy ý, có thể được chia tỷ lệ để NN hoạt động tốt). Mỗi khung là một bước cập nhật trọng lượng. Nó có thể tương đương với một bản cập nhật hàng loạt nhỏ và do hành vi của SGD, tôi hy vọng rằng trên thực tế nó được giải quyết chính xác bằng cách sử dụng độ dốc thực sự của chức năng kiểm tra - tức là không có bộ dữ liệu hoặc lấy mẫu.
Neil Slater

1

Lý do là chính xác như được đề cập trong câu trả lời khác với một gợi ý tuyệt vời để sử dụng tỷ lệ học tập nhỏ hơn để tránh vấn đề này xung quanh độ dốc nhỏ.

Tôi có thể nghĩ ra một vài cách tiếp cận:

  1. Bạn có thể cắt các gradient với giới hạn trên / dưới nhưng điều này không đảm bảo sự hội tụ và có thể dẫn đến việc đóng băng đào tạo bằng cách bị mắc kẹt trong một số cực tiểu địa phương và không bao giờ thoát khỏi nó.

  2. Đào tạo với kích thước lô cao hơn, nhiều kỷ nguyên hơn và với tốc độ học tập bị phân rã. Bây giờ tôi không có bất kỳ bằng chứng thực tế nào cho thấy việc tăng kích thước lô dẫn đến độ dốc tốt hơn nhưng từ những gì tôi đã quan sát thấy khi đối mặt với các vấn đề tương tự như của bạn, làm như vậy hầu như luôn giúp ích.

Tôi chắc chắn có những phương pháp khác (như tỷ lệ học theo chu kỳ, v.v.) cố gắng tìm một tỷ lệ học tối ưu dựa trên số liệu thống kê.

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.