파이썬 python 딥러닝 최적화 SDG Gradient Descent Optimazation

지금까지는 네트워크를 최적화하기 위해 SGD (Stochastic Gradient Descent) 만 연구하고 사용했지만 딥 러닝에 사용되는 다른 최적화 방법이 있습니다. 특히 이러한 고급 최적화 기술은 다음 중 하나를 추구합니다.

1. 합리적인 분류 정확도를 얻기 위해 시간 (즉, 에포크 수)을 줄입니다.

2. 학습률 이외의 더 넓은 범위의 하이퍼 파라미터에 대해 네트워크를 더 “잘 작동”하도록 만듭니다.

3. 이상적으로는 SGD로 가능한 것보다 더 높은 분류 정확도를 얻을 수 있습니다.

딥 러닝의 최신 방법으로 각각 SGD를 개선하고 적응형 학습률 개념을 제공하고자하는 새로운 최적화 기술이 폭발적으로 증가했습니다. 아시다시피 SGD는 주어진 학습률에 비례하여 네트워크의 모든 매개 변수를 동일하게 수정합니다. 그러나 네트워크의 학습률이 (1) 조정해야 할 가장 중요한 하이퍼 파라미터이고 (2) 올바르게 설정하기가 어렵고 지루한 하이퍼 파라미터라는 점을 감안할 때 딥 러닝 연구자들은 일부 경우 학습률을 네트워크가 훈련됨에 따라 (매개 변수 당) 적응적으로 조정할 필요가 있다고 가정했습니다. 이 장에서는 적응형 학습률 방법을 검토합니다. 또한 자신의 프로젝트에서 사용해야하는 최적화 알고리즘에 대한 제안도 제공합니다

이 섹션의 각 최적화 알고리즘을 이해하기 위해 의사 코드 (특히 업데이트 단계) 측면에서 이를 조사 할 것입니다. 콘텐츠를 보다 쉽게 ​​이해할 수 있도록 이러한 방법에 대한 설명을 확장 (경우에 따라 단순화) 할 것입니다. 시작하려면 이미 익숙한 알고리즘 인 바닐라 SGD의 업데이트 단계를 살펴 보겠습니다.

W += -lr * dW

여기에 세 가지 값이 있습니다.

1. W : 가중치 행렬.

2. lr : 학습률.

3. dW : W의 기울기입니다.

여기서 우리의 학습률은 고정되어 있으며, 충분히 작 으면 훈련 중에 손실이 감소 할 것임을 압니다. 이전에 모멘텀과 Nesterov 가속화를 통합하는 SGD의 확장도 확인했습니다.이 표기법을 고려하여 딥 러닝 경력에서 접하게 될 일반적인 적응 형 학습률 최적화 도구를 살펴 보겠습니다.

27.1.1 Adagrad

우리가 탐구 할 첫 번째 적응 형 학습률 방법은 Duchi et al에 의해 처음 소개 된 Adagrad입니다. Adagrad는 학습률을 네트워크 매개 변수에 맞게 조정합니다. 자주 변경되지 않는 매개 변수에 대해 더 큰 업데이트가 수행되고 자주 변경되는 매개 변수에 대해 작은 업데이트가 수행됩니다. 아래에서 Adagrad 업데이트의 의사 코드 표현을 볼 수 있습니다.

cache += (dW ** 2)

W += -lr * dW / (np.sqrt(cache) + eps)

여기서 눈에 띄는 첫 번째 매개 변수는 캐시입니다.이 변수는 제곱 기울기의 매개 변수 당 합계를 유지하며 학습 프로세스의 모든 미니 배치에서 업데이트됩니다. 캐시를 검사하여 자주 업데이트되는 매개 변수와 자주 업데이트되는 매개 변수를 확인할 수 있습니다.

그런 다음 lr * dx를 캐시의 제곱근으로 나눌 수 있습니다 (매끄럽게하기 위해 엡실론 값을 더하고 0 오류로 나누는 것을 방지). 이전의 모든 제곱 그래디언트 합계로 업데이트 크기를 조정하면 네트워크의 매개 변수를 적응적으로 업데이트 할 수 있습니다.

캐시에서 자주 업데이트되거나 큰 기울기가있는 가중치는 업데이트 크기를 축소하여 매개 변수의 학습률을 효과적으로 낮 춥니 다. 반면, 캐시에 자주 업데이트되지 않거나 더 작은 기울기가있는 가중치는 업데이트 크기를 확장하여 특정 매개 변수에 대한 학습률을 효과적으로 높입니다.

Adagrad의 주요 이점은 더 이상 학습률을 수동으로 조정할 필요가 없다는 것입니다. 대부분의 Adagrad 알고리즘 구현은 초기 학습률을 0.01로 유지하고 알고리즘의 적응 형 특성으로 인해 매개 변수별로 학습률을 조정할 수 있습니다.

그러나 Adagrad의 약점은 캐시를 검사하여 확인할 수 있습니다. 각 미니 배치에서 제곱 기울기가 분모에 누적됩니다. 그래디언트가 제곱 (따라서 항상 양수)이므로이 누적은 훈련 과정에서 계속 증가합니다. 아시다시피, 작은 수 (그라데이션)를 매우 큰 수 (캐시)로 나누면 네트워크가 실제로 나중에 어떤 것을 학습하기에는 너무 작은 업데이트가 발생합니다.

이 현상은 작은 경우에도 발생합니다. 캐시의 양수 값이 단조롭게 증가함에 따라 드물게 업데이트되는 매개 변수는 Adagrad가 (최신) 딥 러닝 신경망을 훈련하는 데 거의 사용되지 않는 이유입니다. 그러나 Adagrad 알고리즘의 확장을 이해할 수 있도록 검토하는 것이 중요합니다.

27.1.2 Adadelta

Adadelta 알고리즘은 Zeiler가 2012 년 논문 ADADELTA : 적응형 학습률 방법에서 제안했습니다. Adadelta는 캐시로 인해 단조롭게 감소하는 학습률을 줄이는 Adagrad의 확장으로 볼 수 있습니다.

Adagrad 알고리즘에서는 이전에 제곱 된 모든 그라디언트로 캐시를 업데이트합니다. 그러나 Adadelta는 적은 수의 과거 그래디언트만 누적하여 이 캐시 업데이트를 제한합니다. 실제로 구현 될 때이 작업은 모든 과거 제곱 그래디언트의 감쇠 평균을 계산하는 것과 같습니다. 따라서 Adadelta는 Adagrad의 개선점으로 볼 수 있습니다. 그러나 매우 밀접하게 관련된 RMSprop 알고리즘 (캐시 붕괴도 수행함)이 종종 Adadelta보다 선호됩니다.

27.1.3 RMSprop

Adadelta와 독립적으로 개발 된 RMSprop 알고리즘은 Geoffrey Hinton의 Coursera 클래스 슬라이드에 표시된 (미공개) 최적화 알고리즘입니다. Adadelta와 마찬가지로 RMSprop은 캐시를 지수 가중치 이동 평균으로 변환하여 전역적으로 누적 된 캐시의 부정적인 영향을 수정하려고합니다. RMSprop 의사 코드 업데이트를 살펴 보겠습니다.

cache = decay_rate * cache + (1 – decay_rate) * (dW ** 2)

W += -lr * dW / (np.sqrt(cache) + eps)

RMSprop의 첫 번째 측면은 가중치 행렬 W에 대한 실제 업데이트가 Adagrad의 업데이트와 동일하다는 것입니다. 여기서 중요한 것은 캐시가 업데이트되는 방식입니다. 종종 ρ로 정의되는 decay_rate는 일반적으로 0.9로 설정되는 하이퍼 파라미터입니다. 여기서 우리는 캐시의 이전 항목이 새 업데이트보다 훨씬 더 작은 가중치를 갖는 것을 볼 수 있습니다. RMSprop의 이러한 “이동 평균”측면을 통해 캐시는 이전 제곱 그래디언트를 “leak out”하여 새로운 “fresher” 그래디언트로 대체 할 수 있습니다.

다시 말하지만, W에 대한 실제 업데이트는 알고리즘 힌지의 핵심인 Adagrad와 동일합니다. 캐시를 기하 급수적으로 감소시켜 학습 과정에서 학습률이 단조롭게 감소하는 것을 방지 할 수 있습니다. 실제로 RMSprop은 다양한 딥 러닝 네트워크를 학습하는 데 적용 할 때 Adagrad와 Adadelta보다 더 효과적입니다. 또한 RMSprop은 SGD보다 훨씬 빠르게 수렴하는 경향이 있습니다.

SGD 외에 RMSprop는 최근 딥 러닝 문헌에서 두 번째로 가장 많이 사용 된 최적화 알고리즘이었습니다. 그러나 우리가 논의 할 다음 최적화 방법 인 Adam은 이제 RMSprop보다 더 많이 사용되고 있습니다.

27.1.4 Adam

Kingma와 Ba가 2014 년 논문 Adam : A Method for Stochastic Optimization에서 제안한 Adam (Adaptive Moment Estimation) 최적화 알고리즘은 기본적으로 모멘텀이 추가 된 RMSprop입니다.

m = beta1 * m + (1 – beta1) * dW

v = beta2 * v + (1 – beta2) * (dW ** 2)

x += -lr * m / (np.sqrt(v) + eps)

m과 v의 값은 시간 t-1의 이전 값에 따라 SGD 모멘텀과 유사합니다. 값 m은 기울기의 첫 번째 모멘트 (평균)를 나타내고 v는 두 번째 모멘트 (분산)를 나타냅니다.

W에 대한 실제 업데이트는 RMSprop와 거의 동일합니다. 이제 우리는 원시 그래디언트 dW가 아닌 m의 “평활화 된”버전 (평균 계산으로 인해)을 사용하고 있습니다. 평균을 사용하면 가능한 한 더 바람직한 업데이트로 이어질 수 있습니다. 원시 dW 값에서 노이즈 한 업데이트를 부드럽게 처리합니다. 일반적으로 beta1은 0.9로 설정되고 beta2는 0.999로 설정됩니다. 이 값은 Adam 최적화 프로그램을 사용할 때 거의 변경되지 않습니다.

실제로 Adam은 많은 상황에서 RMSprop보다 더 잘 작동하는 경향이 있습니다. Adam 최적화 알고리즘에 대한 자세한 내용은 Kingma 및 Ba를 참조하십시오.

27.1.5 Nadam

Adam이 모멘텀이있는 RMSprop 인 것처럼 Nadam은 Nesterov 가속이 있는 RMSprop입니다. Nadam은 Timothy Dozat 스탠포드 대학 박사 과정 학생에 의해 제안 되었습니다. 우리는 일반적으로 Nadam이 “실제 응용” 에서 사용되는 것을 보지 못하지만, 이러한 Adam 변형이 존재한다는 것을 이해하는 것이 중요합니다.