최적화 실패를 어떻게 디버깅하고 완화할 수 있나요?
요약: 모델에 최적화 문제가 있는 경우 다른 작업을 시도하기 전에 먼저 문제를 해결하는 것이 중요합니다. 학습 실패를 진단하고 수정하는 것은 현재 연구 중인 영역입니다.
그림 4에서 다음 사항에 유의하세요.
- 스트라이드를 변경해도 낮은 학습률에서 성능이 저하되지 않습니다.
- 학습률이 불안정하면 더 이상 학습이 잘 되지 않습니다.
- 학습률 준비 1, 000단계를 적용하면 이 불안정성 특정 인스턴스가 해결되어 최대 학습률 0.1에서 안정적인 학습이 가능합니다.
불안정한 워크로드 식별
학습률이 너무 크면 모든 워크로드가 불안정해집니다. 불안정은 너무 작은 학습률을 사용해야 하는 경우에만 문제가 됩니다. 구별할 가치가 있는 학습 불안정성 유형은 최소한 다음 두 가지입니다.
- 초기화 또는 학습 초기의 불안정성
- 학습 도중 갑작스러운 불안정성
다음을 수행하여 체계적인 접근 방식으로 워크로드의 안정성 문제를 식별할 수 있습니다.
- 학습률을 조사하여 최적의 학습률을 찾습니다*.
- lr* 바로 위에 학습률에 대한 학습 손실 곡선을 표시합니다.
- 학습률 > lr* 에서 손실 불안정성을 보이는 경우 (학습 기간에 손실이 감소하지 않고 증가) 불안정성을 수정하면 일반적으로 학습이 개선됩니다.
이상점 값은 학습 도중에 잘못된 불안정성을 야기할 수 있으므로 학습 중에 전체 손실 경사의 L2 norm을 로깅합니다. 이를 통해 경사 또는 가중치 업데이트를 얼마나 적극적으로 자르는지 알 수 있습니다.
참고: 일부 모델은 매우 초기 불안정성을 보여준 후 복구를 통해 느리지만 안정적인 학습을 초래합니다. 일반적인 평가 일정에서 충분히 자주 평가하지 않으면 이러한 문제를 놓칠 수 있습니다.
이를 확인하려면 lr = 2 * current best
를 사용하여 약 500단계의 축약된 실행을 학습시켜서 모든 단계를 평가하면 됩니다.
일반적인 불안정 패턴 관련 잠재적 수정사항
일반적인 불안정 패턴에 대해 다음과 같은 해결 방법을 고려해 보세요.
- 학습률 준비를 적용합니다. 불안정한 초기 학습에 가장 적합합니다.
- 그라데이션 클리핑을 적용합니다. 이는 학습 초기 및 도중의 불안정성 모두에 유용하며, 준비할 수 없는 일부 잘못된 초기화를 해결할 수도 있습니다.
- 새 옵티마이저를 사용해 봅니다. 때로는 Adam은 운동량은 불가능한 불안정성을 처리할 수 있습니다. 이것은 현재 연구 중인 영역입니다.
- 모델 아키텍처에 대한 권장사항과 최상의 초기화를 따르고 있는지 확인합니다 (다음 예). 모델에 아직 포함되지 않은 경우 잔차 연결 및 정규화를 추가합니다.
- 잔차 이전의 마지막 작업으로 정규화합니다. 예를 들면
x + Norm(f(x))
입니다.Norm(x + f(x))
로 인해 문제가 발생할 수 있습니다. - 잔여 브랜치를 0으로 초기화해 보세요. (ReZero is All You Need: Fast Convergence at Large Depth.)
- 학습률을 낮춥니다. 이것은 최후의 수단입니다.
학습률 준비
학습률 준비를 적용해야 하는 경우
그림 7a에는 최적화 불안정이 발생하는 모델을 나타내는 초매개변수 축 플롯이 나와 있습니다. 최적의 학습률은 불안정성의 가장자리에 위치하기 때문입니다.
그림 7b는 이 피크보다 5배 또는 10배 더 큰 학습률로 학습된 모델의 학습 손실을 검사하여 어떻게 다시 확인할 수 있는지 보여줍니다. 이 플롯에서 완만한 감소 후 갑작스러운 손실 증가가 나타나는 경우 (예: 위 그림의 약 10,000단계) 모델은 최적화 불안정성으로 인해 어려움을 겪고 있을 가능성이 높습니다.
학습률 준비 적용 방법
위 절차에 따라 모델이 불안정해지는 학습률
unstable_base_learning_rate
로 가정합니다.
준비에는 학습률을 0에서 1자 이상의 안정적인 base_learning_rate
로 증가시키는 학습률 일정을 앞에 추가하는 것이 포함됩니다.unstable_base_learning_rate
기본값은 10x unstable_base_learning_rate
인 base_learning_rate
을 시도하는 것입니다. 하지만 100x unstable_base_learning_rate
같은 경우에 이 전체 절차를 다시 실행할 수 있습니다. 구체적인 일정은 다음과 같습니다.
- 준비_단계에 따라 0에서 base_learning_rate로 램프업합니다.
- post_warmup_steps에 대해 일정한 속도로 학습합니다.
목표는 unstable_base_learning_rate
보다 훨씬 높은 최대 학습률에 액세스할 수 있는 가장 짧은 warmup_steps
수를 찾는 것입니다.
따라서 각 base_learning_rate
의 warmup_steps
및 post_warmup_steps
를 조정해야 합니다. 일반적으로 post_warmup_steps
를 2*warmup_steps
로 설정하는 것이 좋습니다.
준비는 기존 가치 하락 일정과 독립적으로 조정할 수 있습니다. warmup_steps
는 몇 자릿수로 정리되어야 합니다. 예를 들어 연구의 예로 [10, 1000, 10,000, 100,000]
을 사용해 볼 수 있습니다. 가능한 가장 큰 지점은 max_train_steps
의 10% 를 초과하면 안 됩니다.
base_learning_rate
에서 학습을 크게 하지 않는 warmup_steps
가 설정되면 기준 모델에 적용해야 합니다.
기본적으로 이 일정을 기존 일정 앞에 추가하고 위에서 설명한 최적의 체크포인트 선택을 사용하여 이 실험을 기준과 비교합니다. 예를 들어 원래 max_train_steps
가 10,000개였고 1,000단계에 warmup_steps
을 실행했다면 새 학습 절차는 총 11,000단계 동안 실행되어야 합니다.
안정적인 학습에 긴 warmup_steps
가 필요한 경우(max_train_steps
의 5% 초과) 이를 고려하여 max_train_steps
를 늘려야 할 수 있습니다.
전체 워크로드에 실제로 '일반적인' 값은 없습니다. 일부 모델에는 100단계만 필요한 반면, 다른 모델 (특히 변압기)에는 40,000개 이상의 단계가 필요할 수 있습니다.
그라데이션 클리핑
그래디언트 클리핑은 크거나 이상점 그래디언트 문제가 발생할 때 가장 유용합니다. 그래디언트 클리핑을 사용하면 다음 문제 중 하나를 해결할 수 있습니다.
- 초기 학습 불안정 (초기 큰 기울기 norm)
- 학습 도중 불안정 (학습 도중 갑작스러운 경사 급증)
준비 기간이 길어지면 클리핑으로 해결하지 못하는 불안정성이 해결될 수도 있습니다. 자세한 내용은 학습률 준비를 참조하세요.
🗣 워밍업 중에 클립은 어떻게 하나요?
이상적인 클립 기준점은 '일반적인' 그라데이션 놈보다 약간 높은 수준입니다.
다음은 그라데이션 클리핑을 수행할 수 있는 방법의 예입니다.
- 기울기 $\left | g \right |$가 경사 클리핑 임곗값 $\ 대체합니다. 보다 크면 ${g}'= \ delta \times \frac{g}{\left | g \right |}$ 여기서 ${g}'$는 새 기울기입니다.
학습 중에 잘리지 않은 경사 놈을 로깅합니다. 기본적으로 다음을 생성합니다.
- 경사 정규화와 단계 비교 도표
- 모든 단계에서 집계된 경사 규범의 히스토그램
경사 규범의 90번째 백분위수를 기반으로 경사 클리핑 기준을 선택합니다. 기준점은 워크로드에 따라 다르지만 90% 로 시작하는 것이 좋습니다. 90% 가 작동하지 않으면 이 기준점을 조정할 수 있습니다.
📊 일종의 적응형 전략은 무엇인가요?
경사 클리핑을 시도하고 불안정성 문제가 남아 있으면, 더 강하게 시도할 수 있습니다. 즉, 임곗값을 더 작게 만들 수 있습니다.
매우 적극적인 경사 클리핑 (즉, 업데이트의 50% 이상이 잘림)은 본질적으로 학습률을 줄이는 이상한 방법입니다. 지나치게 공격적인 클리핑을 사용한다면 학습률을 그냥 낮추는 것이 좋습니다.
왜 학습률과 기타 최적화 매개변수를 초매개변수라고 부르나요? 이는 사전 분포의 매개변수가 아닙니다.
Bayesian 머신러닝에서 '초매개변수'라는 용어는 정확한 의미를 가지므로 학습률 및 기타 조정 가능한 대부분의 딥 러닝 매개변수를 '초매개변수'로 지칭하는 것은 틀림없는 용어의 악용입니다. 학습률, 아키텍처 매개변수, 기타 모든 조정 가능한 딥 러닝에는 '메타 매개변수'라는 용어를 사용하는 것이 좋습니다. 이는 메타 매개변수가 '초매개변수'라는 단어를 오용하여 비롯되는 혼란을 방지하기 때문입니다. 이러한 혼동은 특히 확률적 응답 노출 영역 모델에 고유한 실제 초매개변수가 있는 Bayesian 최적화를 논의할 때 발생할 가능성이 높습니다.
안타깝게도 혼동될 수도 있지만 '초매개변수'라는 용어는 딥 러닝 커뮤니티에서 매우 보편화되었습니다. 따라서 이 문서의 경우 이러한 기술에 대해 잘 알지 못하는 여러 사용자를 대상으로 하기 위해 Google에서는 다른 원인을 피하기 위해 현장에서 혼란을 야기하는 한 가지 원인에 기여하기로 했습니다. 그렇지만 Google은 연구 논문을 게시할 때 다른 선택을 할 수 있으며 다른 사람들은 대부분의 컨텍스트에서 '메타 매개변수'를 대신 사용하도록 권장합니다.
유효성 검사 세트 성능을 직접 개선하기 위해 배치 크기를 조정하면 안 되는 이유는 무엇인가요?
학습 파이프라인의 다른 세부정보를 변경하지 않고 배치 크기를 변경하면 검증 세트 성능에 영향을 주는 경우가 많습니다. 그러나 학습 파이프라인이 각 배치 크기에 독립적으로 최적화되면 일반적으로 두 배치 크기 간 검증 세트 성능의 차이는 사라집니다.
배치 크기와 가장 밀접하게 상호작용하여 각 배치 크기에 맞게 조정하는 것이 가장 중요한 초매개변수는 옵티마이저 초매개변수 (예: 학습률, 모멘텀) 및 정규화 초매개변수입니다. 배치 크기가 작을수록 샘플 분산으로 인해 학습 알고리즘에 더 많은 노이즈가 발생합니다. 이 노이즈는 정규화 효과를 낼 수 있습니다. 따라서 배치 크기가 클수록 과적합이 발생할 가능성이 높아 더 강력한 정규화 또는 추가 정규화 기술이 필요할 수 있습니다. 또한 배치 크기를 변경할 때 학습 단계 수를 조정해야 할 수 있습니다.
이러한 모든 효과가 고려되고 나면 배치 크기가 가능한 최대 유효성 검사 성능에 영향을 미친다는 확실한 증거는 없습니다. 자세한 내용은 Shallue 외 2018을 참고하세요.
널리 사용되는 최적화 알고리즘의 업데이트 규칙은 무엇인가요?
이 섹션에서는 널리 사용되는 몇 가지 최적화 알고리즘의 업데이트 규칙을 제공합니다.
확률적 경사하강법 (SGD)
\[\theta_{t+1} = \theta_{t} - \eta_t \nabla \mathcal{l}(\theta_t)\]
여기서 $\eta_t$ 는 $t$ 단계의 학습률입니다.
모멘텀
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t v_{t+1}\]
여기서 $\eta_t$ 는 $t$ 단계의 학습률이고 $\gamma$ 는 운동 계수입니다.
네스테로프
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t ( \gamma v_{t+1} + \nabla \mathcal{l}(\theta_{t}) )\]
여기서 $\eta_t$ 는 $t$ 단계의 학습률이고 $\gamma$ 는 운동 계수입니다.
RMSProp
\[v_0 = 1 \text{, } m_0 = 0\]
\[v_{t+1} = \rho v_{t} + (1 - \rho) \nabla \mathcal{l}(\theta_t)^2\]
\[m_{t+1} = \gamma m_{t} + \frac{\eta_t}{\sqrt{v_{t+1} + \epsilon}}\nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - m_{t+1}\]
ADAM
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l}(\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{m_{t+1}}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]
나담
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l} (\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{\beta_1 m_{t+1} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]