그라디언트 및 유사한 동작을 폭발시키는 디버깅에 엄청난 시간을 보냈습니다. 답은 손실 함수, 데이터, 아키텍처 등에 따라 달라집니다. 수백 가지 이유가 있습니다. 몇 가지 이름을하겠습니다.
- 손실에 따라 다릅니다. 로그 가능성 손실은 잘리지 않아야하며, 그렇지 않은 경우
log(0)
데이터 세트의 나쁜 예측 / 이상치에 대해 거의 평가 하여 폭발적인 그래디언트를 유발할 수 있습니다. 대부분의 패키지 (토치, 텐서 플로우 등)는 기본적으로 손실에 대한 클리핑을 구현합니다.
- 데이터 세트의 특이 치
- ϵy=(x−u)/(s+ϵ)sϵy
- 데이터 크기를 batchsize로 나눌 수없는 경우 에포크의 최종 배치는 작을 수 있습니다. 토치 데이터 로더에는 플래그가
drop_last
있습니다. 작은 배치 크기 = 높은 분산
이제 왜 SGD가 아닌 Adam과 함께 보입니까? 분명히 당신은 아담과 더 낮은 손실에 도달했습니다. 이전에 언급 한 바와 같이, 일부 관측치를 제외하고 데이터 세트의 99.9 %가 한 지점에서 최적화 된 경우, 무작위로 선택 될 때 "NO"라고 비명을 지르고 국소 최소 점에서 뛰어 내릴 수 있습니다. 모든 dataset_size//batch_size+1
단계 마다 표시되는 경우 최종 배치 크기가 작기 때문일 수 있습니다. 더 낮은 손실에 도달하면 SGD 스파이크도 보게 될 것입니다.
보너스 : 운동량 최적화 기능 (Adam)을 사용하여 실제로 빠르게 감소하면 일부 레이어 (입력 레이어? 출력 레이어?)가 규모를 벗어나 (대규모 / 작은 무게로) 초기화되었음을 의미 할 수 있습니다.