너무 오래 훈련 할 때 Adam 최적화 프로그램의 이상한 동작


11

64 개의 무작위로 생성 된 데이터 포인트에서 단일 퍼셉트론 (1000 입력 단위, 1 출력, 숨겨진 레이어 없음)을 훈련하려고합니다. Adam 최적화 프로그램을 사용하여 Pytorch를 사용하고 있습니다.

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()

처음에는 예상대로 손실이 빠르게 감소합니다.

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

약 300 회 반복하면 오류가 거의 0에 도달합니다.

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

이것은 수천 번 반복됩니다. 그러나 너무 오래 훈련 한 후에는 오류가 다시 증가하기 시작합니다.

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

왜 이런 일이 발생합니까?


과적 합이 설명하지 않는다고 생각합니다-검증 손실이 아닌 훈련 손실이 증가하고 있습니다. 예를 들어, SGD를 사용할 때는 Adam과 함께 만 발생합니다.
Bai Li

모델에는 1000 개의 매개 변수가 있고 데이터 포인트는 1 개뿐이므로 모델이 데이터에 정확히 맞아야하고 손실은 0이어야합니다.
Bai Li

아 죄송합니다. 64 개의 데이터 포인트가 있습니다.
Bai Li

64 개의 데이터 포인트 (즉, 제한 조건)와 1000 개의 매개 변수가 있으므로 오류가 0이되도록 매개 변수에 대한 선택 사항을 찾을 수 있습니다 (이는 분석적으로 수행하기 쉽습니다). 내 질문은 아담이 이것을 찾지 못하는 이유입니다.
Bai Li

답변:


19

수렴이 끝날 때의 이러한 작은 불안정성은 Adam (및 RMSProp)의 특징으로, 최근 단계에 대한 평균 기울기 크기를 추정하고 그 단계로 나눕니다.

Adam이하는 일 중 하나는 최근 그라디언트 및 그라디언트 사각형의 롤링 기하 평균을 유지하는 것입니다. 그라디언트의 제곱은 현재 단계를 결정하기 위해 현재 그라디언트를 나누는 데 사용됩니다. 그러나 그래디언트가 0에 매우 가깝게 유지되면 그래디언트의 제곱이 너무 낮아져 큰 반올림 오류가 발생하거나 효과적으로 제로가되어 불안정성이 발생할 수 있습니다 (예 : 하나의 차원은1010105다른 매개 변수의 변경으로 인해 ), 단계 크기가 다시 시작되기 전에 점프하기 시작합니다.

계산을 통해 문제를 해결할 수 있기 때문에 수치 손실이 0에 가까워 진다고 가정 할 때 실제로는 기본 기울기 하강보다 문제에 대해 Adam의 안정성이 떨어지고 악화됩니다.

실제로 딥 러닝 문제에 대해서는 수렴에 가깝지 않으며 조기 중지와 같은 일부 정규화 기술의 경우 어쨌든 원하지 않습니다. Adam은 설계되었습니다.

다른 옵티 마이저를 비교하여 RMSProp에서 실제로 발생하는 것을 볼 수 있습니다 (RMSProp은 검은 선입니다. 목표에 도달하는 것처럼 마지막 단계를보십시오).

여기에 이미지 설명을 입력하십시오

학습 속도를 줄임으로써 Adam을보다 안정적으로 만들고 진정한 수렴에 가까워 질 수 있습니다. 예 :

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

최적화하는 데 시간이 더 걸립니다. 사용 lr=1e-5값이 주변을 맴 돕니 다, 당신이 불안정성을보기 전에 20,000 반복 훈련을해야하고, 불안을 덜 극적이다107.


이것은 놀라운 시각화입니다, 닐. 실제 치수는 무엇입니까? x와 y는 무엇을 나타 냅니까? 프레임이 프레임 당 델타 t 또는 n 에포크입니까? 나는 별이 두 개의 선택된 매개 변수와 관련하여 불일치 (오류)의 지형 표현에서 세계적으로 최적이라고 생각합니다. 내 추측이 맞습니까?
Douglas Daseeco

그것은 내 시각화가 아니며 많은 곳에서 찾을 수 있습니다. 치수는 테스트 기능에 대한 임의의 입력 매개 변수 단위이며 그래프는 해당 기능에 대한 등고선을 나타냅니다 (임의의 단위로 표시되며, NN이 정상적으로 작동하도록 조정될 수 있음). 각 프레임은 가중치 업데이트 단계입니다. 아마도 미니 배치 업데이트와 동일 할 수 있으며 SGD의 동작으로 인해 실제로 테스트 기능의 실제 기울기를 사용하여 정확하게 해결 될 것으로 예상됩니다. 즉, 데이터 세트 또는 샘플링이 없습니다.
닐 슬레이터

1

그 이유는 작은 기울기 주위 에서이 문제를 피하기 위해 더 작은 학습 속도를 사용하는 것이 좋습니다.

몇 가지 접근 방식을 생각할 수 있습니다.

  1. 상한 / 하한을 사용하여 그라디언트를 클리핑 할 수 있지만 수렴을 보장하지는 않으며 일부 로컬 최소값에 갇히지 않아 트레이닝이 중단 될 수 있습니다.

  2. 더 높은 배치 크기, 더 많은 에포크 및 쇠퇴 학습 속도로 훈련하십시오. 이제 배치 크기를 늘리면 더 나은 그라디언트를 얻을 수 있다는 실제적인 증거는 없지만 거의 비슷한 문제에 직면하여 관찰 한 것에서 거의 도움이되었습니다.

통계를 기반으로 최적의 학습 속도를 찾으려고하는 다른 방법 (예 : 주기적 학습 속도 등)이 있다고 확신합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.