신경망 학습의 목적은 손실 함수의 값을 가능한 한 낮추는 매개변수를 찾는 것이며, 이것을 '최적화'라고 한다
우리는 지금까지 매개변수의 기울기를 구해, 기울어진 방향으로 매개변수 값을 갱신하는 '확률적 경사 하강법(SGD)'를 이용했다
W는 갱신할 가중치 매개변수고, η는 학습률을 의미하는데, 0.01이나 0.001과 같은 값을 미리 정해서 사용한다
또한 <-는 우변의 값으로 좌변의 값을 갱신한다는 뜻이다
SGD는 단순하고 구현도 쉽지만 문제에 따라 비효울적일 수 있다
다음 그림은 위 함수를 표현한 그래프와 등고선이다
이 함수의 기울기는 y축 방향에선 크지만 x축 방향은 작다
또한 최소값이 되는 장소는 (0, 0)이지만, 기울기 대부분은 (0, 0)을 가리키지 않는다
위 함수에 SGD를 적용한 결과다
SGD의 단점은 비등방성 함수(방향에 따라 성질, 즉 여기에서는 기울기가 달라지는 함수)에서는 탐색 경로가 비효율적이라는 것이다
또한, SGD가 지그재그로 탐색하는 근본 원인은 기울어진 방향이 본래의 최솟값과 다른 방향을 가리켜서라는 점도 있다
모멘텀은 '운동량'을 뜻하는 단어로, 물리와 관계가 있다
여기에선 v라는 변수가 나오는데, 이는 물리에서 말하는 속도에 해당된다
기울기 방향으로 힘을 받아 물체가 가속된다는 물리 법칙을 나타낸다
av항은 물체가 아무런 힘을 받지 않을 때 서서히 하강시키는 역할을 한다(α는 0.9 등의 값을 설정)
모멘텀의 갱신 경로는 공이 그릇 바닥을 구르듯 움직인다
x축의 힘은 아주 작지만 방향은 변하지 않아서 한 방향으로 일정하게 가속하기 때문이다
거꾸로 y축의 힘은 크지만 위아래로 번갈아 받아서 상충하여 y축의 방향의 속도는 안정적이지 않다
신경망 학습에서 학습률을 정하는 효과적 기술로 '학습률 감소'가 있다
이는 학습을 진행하면서 학습률을 점차 줄여가는 방법이다
학습률을 서서히 낮추는 가장 간단한 방법은 매개변수 '전체'의 학습률 값을 일괄적으로 낮추는 것이다
이를 더욱 발전시킨 것이 'AdaGrad'이다
각각의 매개변수에 적응적으로 조정하며 맞춤형 값을 만들어준다
여기서 새로 등장한 h는 기존 기울기 값을 제곱하여 계속 더해준다(⊙는 행렬의 원소별 곱셈을 의미)
그리고 매개변수를 갱신할 때 1/sqrt(h)을 곱해 학습률을 조정한다
매개변수의 원소 중에서 많이 움직인 원소는 학습률이 낮아진다는 뜻인데, 다시 말해 학습률 감소가 매개변수의 원소마다 다르게 적용됨을 뜻한다
y축 방향은 기울기가 커서 처음에는 크게 움직이지만, 그 큰 움직임에 비례해 갱신 정도도 큰 폭으로 작아지도록 조정된다
그래서 y축 방향으로 갱신 강도가 빠르게 약해지고, 지그재그 움직임이 줄어든다
Adam은 이론이 다소 복잡하지만 직관적으로는 모멘텀과 AdaGrad를 융합한 듯한 방법이다
또, 하이퍼파라미터의 '편향 보정'이 진행된다는 특징이 있다
Adam 갱신 과정도 그릇 바닥을 구르듯 움직인다
모멘텀과 비슷한 패턴인데, 모멘텀보다 공의 좌우 흔들림이 적다
이는 학습의 갱신 강도를 적응적으로 조정해서 얻는 혜택이다
SGD, 모멘텀, AdaGrad, Adam중 어느 것을 채택할까
모든 문제에서 항상 뛰어난 기법이라는 것은 없기 때문에 각 분야에 따라 사용하는 방법이 달라진다
'가중치 감소'는 가중치 매개변수의 값이 작아지도록 학습하는 방법이다
가중치 값을 작게 하여 오버피팅이 일어나지 않게 한다
가중치의 초깃값을 모두 0으로 설정하면 어떻게 될까
순전파 때 입력층의 가중치가 0이기 때문에 두 번째 층의 뉴런에 모두 같은 값이 전달되고, 이는 역전파 때 가중치가 모두 똑같이 갱신됨을 의미한다
그래서 갱신을 거쳐도 같은 값을 유지한다
이 '가중치가 고르게 도어버리는 상황'을 막을려면 초기값을 무작위로 설정해야 한다
다음 그림은 활성화 함수로 시그모이드 함수를 사용하는 5층 신경망에 무작위로 생성한 입력 데이터를 흘리며 각 층의 활성화값 분포를 히스토그램으로 그린 것이다
표준편차가 1인 정규분포를 이용했는데, 각 층의 활성화값들이 0고 1에 치우쳐 분포되었다
시그모이드 함수는 출력이 0에 가까워지자 그 미분은 0에 다가간다
그래서 데이터가 0과 1에 치우쳐 분포하게 되면 역전파의 기울기 값이 점점 작아지다가 사라지는데, 이를 '기울기 소실'이라고 한다
다음 그림은 표준편차를 0.01로 제한한 활성화값 분포다
이번에는 0.5 부근에 집중되어 기울기 소실은 일어나지 않지만, 다수의 뉴런이 거의 같은 값을 출력하고 있으니 뉴런을 여러 개 둔 의미가 없어진다
그래서 활성화 값들이 치우치면 '표현력을 제한'한다는 문제가 발생한다
활성화값은 적당히 고루 분표되어야 한다.
층과 층 사이에 적당하게 다양한 데이터가 흐르게 해야 신경망 학습이 효율적으로 이뤄지기 때문이다
이번에는 'Xavier 초기값'을 사용한다
사비에르는 일반적인 딥려닝 프레임워크들이 표준적으로 이용한다
앞 계층의 노드가 n개라면 표준편차가 1/sqrt(n)인 분포를 사용하면 된다는 결론이다
사비에르 초기값을 사용하면 앞 층에 노드가 많을수록 대상 노드의 초기값의 가중치가 좁게 퍼진다
다음 결과처럼 형태가 일그러지지만, 앞 방식보다 넓게 분포된다
각 층에 데이터가 적당히 퍼져 있기 때문에 학습이 효울적으로 이루어진다
이 일그러짐은 시그모이드 대신 tanh 함수를 이용하면 개선된다
사비에르 초깃값은 활성화 함수가 선형인 것을 전제로 이끈 결과다
시그모이드는 좌우 대칭이라 중앙 부근이 선형인 함수로 볼 수 있다
반면 ReLU를 이용할 때는 'He 초깃값'을 사용한다
He 초기값은 앞 계층의 노드가 n개일 때, 표준편차가 sqrt(2/n)인 정규분포를 사용한다
ReLU는 음의 영역이 0이라서 더 넓게 분포시키기 위해 2개의 계수가 필요하다고 해석할 수 있다
위는 표준편차가 0.01인 정규분포, Xavier 초깃값, ReLU 전용 He 초기값일 때의 결과다
결과를 보면 std=0.01일 때의 각 층의 활성화값들은 아주 작은 값들이다
신경망에 아주 작은 데이터가 흐른다는 것은 가중치의 기울기 역시 작아져, 학습이 잘 이루어지지 않는다는 의미다
Xavier 초기값의 결과를 보면 층이 깊어지면서 치우침이 커진다
이는 활성화값들의 치우침도 커지고, 기울기 소실 문제를 일으킨다
He 초기값은 모든 층에서 균일하게 분포되어, 역전패 때도 적절한 값이 나올 것이다
이를 통해, 활성화 함수로 ReLU를 사용할 때는 He 초기값을, sigmoid나 tanh 등의 S자 모양 곡선일 때는 Xavier 초기값을 사용한다는 것을 알 수 있다
'배치 정규화'는 각 층이 활성화를 적당히 퍼뜨리도록 강제하는 방법이다
배치 정규화는 다음과 같은 장점을 갖는다
배치 정규화의 기본 아이디어는 각 층에서의 활성화값이 적당히 분포되도록 조정하는 것이다
그래서 다음과 같이 데이터 분포를 정규화하는 '배치 정규화 계층'을 신경망에 삽입한다
배치 정규화는 학습 시 미니배치를 단위로 정규화한다
구체적으로는 데이터 분포가 평균이 0, 분산인 1이 되도록 정규화한다
미니배치 B={x1, x2, ..., xm}이라는 m개의 입력 데이터 집합에 대해 평균 μB와 분산 σB^2을 구한다
그리고 평균이 0, 분산이 1이 되게 정규화하고, ε(앱실론)은 작은 값으로, 0으로 나누는 사태를 예방한다
이 처리를 활성화 함수의 앞에 삽입함으로써 데이터 분포가 덜 치우치게 할 수 있다
또한, 배치 정규화 계층마다 이 정규화된 데이터에 고유햔 확대와 이동 변환을 수행한다
이 식에서 γ가 확대를 β가 이동을 담당한다
두 값은 처음에는 γ = 1, β = 0부터 시작하고, 학습하면서 적합한 값으로 조정해간다
이 알고리즘이 신경망에서 순전파 때 적용된다
다음은 MNIST 데이터셋을 사용하여 배치 정규화 계층을 사용할 때와 사용하지 않을 때의 학습 진도다
배치 정규화가 학습을 빨리 진전시키는 걸 볼 수 있다
다음은 가중치 초깃값의 표준편차를 다양하게 바꿔가며 학습 경과를 관찰한 그래프다
거의 모든 경우에서 배치 정규화를 사용할 때의 학습 진도가 빠른 것으로 나타난다
배치 정규화를 이용하지 않는 경우엔 학습이 전혀 진행되지 않는 모습도 확인할 수 있다
'오버피팅'이란 신경망이 훈련 데이터에만 지나치게 적응되어 그 외의 데이터에는 제대로 대응하지 못하는 상태를 말하며 주로 다음 두 경우에 일어난다
다음은 MNIST 데이터셋의 훈련 데이터 중 300개만 사용하고, 7층 네트워크를 사용해 네트워크를 구성한 모델로, 각 층의 뉴런은 100개, 활성화 함수는 ReLU를 사용했다
그리고 정확도를 출력한 결과 훈련 때 사용하지 않은 범용 데이터에는 제대로 대응하지 못하는 것을 확인할 수 있다
주로 학습 과정에서 큰 가중치에 대해서는 그에 상응하는 큰 페널티를 부과하는 '가중치 감소'를 통해 오버피팅을 억제한다
가중치에 제곱 노름(I.2 노름)을 손실 함수에 더하여 가중치가 커지는 것을 억제한다
가중치가 W라면 I.2노름에 따른 가중치 감소는 1/2λ(W^2)이 되고, 이 1/2λ(W^2)을 손실 함수에 더한다
여기서 λ(람다)는 정규화의 세기를 조절하는 하이퍼파라미터로, 크게 설정할수록 페널티가 커진다
앞쪽 1/2sms 1/2λ(W^2)의 미분 결과인 λW를 조정하는 역할의 상수다
가중치 감소는 모든 가중치 각각의 손실 함수에 1/2λ(W^2)을 더한다
따라서 가중치의 기울기를 구하는 계산에서는 그동안 오차역전파법에 따른 결과에 정규화 항을 미분한 λW를 더한다다음은 λ = 0.1로 가중치 감소를 적용한 결과다
훈련 데이터에 대한 정확도와 시험 데이터에 대한 정확도는 여전히 차이가 나지만 그 차이가 전보다 줄어들었다
즉, 오버피팅이 억제됐다는 소리며, 앞서와 달리 정확도가 100%에 도달하지 못한 점도 주목해야 한다
신경망 모델이 복잡해지면 가중치 감소만으로는 대응하기 어려워진다
이럴 때는 흔히 '드롭아웃'이라는 기법을 이용한다
드롭아웃은 뉴런을 임의로 삭제하면서 학습하는 방법이다
훈련 때 은닉층의 뉴런을 무작위로 골라 삭제한다
삭제된 뉴런은 신호를 전달하지 않게 된다
훈련 때는 데이터를 흘릴 때마다 삭제할 뉴런을 무작위로 선택하고, 시험 때는 모든 뉴런에 신호를 전달한다
단, 시험 때는 각 뉴런의 출력에 훈련 때 삭제 안 한 비율을 곱하여 출력한다
앞의 실험과 마찬가지로 7층 네트워크(각 층의 뉴런 수는 100개, 활성화 함수는 ReLU)를 써서 진행했다
훈련 데이터와 시험 데이터에 대한 정확도 차이가 줄어들었다
또한, 훈련 데이터에 대한 정확도가 100%에 도달하지도 않게 되었다
이처럼 표현력을 높이면서 오버피팅을 억제할 수 있다
여기서 말하는 하이퍼파라미터는 각 층의 뉴런 수, 배치 크기, 매개변수 갱신 시의 학습률과 가중치 감소다
하이퍼파라미터의 성능을 평가할 대는 시험 데이터를 사용해선 안된다
시험 데이터를 사용하여 하이퍼파라미터를 조정하면 하이퍼파라미터 값이 시험 데이터에 오버피팅된다
그래서 하이퍼파라미터를 조정할 때는 하이퍼파라미터의 적절성을 평가하는 '검증 데이터'를 사용한다
데이터를 얻는 가장 간단한 방법으론 학습 데이터의 20% 정도를 검증 데이터로 분리하는 것이다
하이퍼파라미터를 최적화할 때는 우선 대략적인 ㅂㅁ위를 설정하고 그 범위에서 무작위로 하이퍼파라미터 값을 골라낸(샘플링) 후, 그 값으로 정확도를 평가한다
정확도를 잘 살피면서 이 작업을 반복하여 ‘최적 값’의 범위를 좁혀간다
하이퍼파라미터의 범위는 ‘대략적으로’ 지정하는 것이 효과적이다
실제로도 0.001에서 1000사이와 같이 ‘10의 거듭제곱’ 단위로 범위를 지정하는데, 이를 ‘로그 그케일’로 지정한다고 한다
하이퍼파라미터를 최적화할 때는 오랜 시간이 걸리기 때문에 나쁠 듯한 값은 일찍 포기한다
그래서 학습을 위한 에폭을 작게 하여, 1회 평가에 걸리는 시간을 단축하는 것이 효과적이다
다음은 가중치 감소 계수의 범위를 10^-8 ~ 10^-4, 학습률의 범위를 10^-6 ~ 10^-2로 하여 실험한 결과다
검증 데이터의 학습 추이를 정확도가 높은 순서대로 나열했다
‘Best-5’ 까지는 학습이 순조롭게 진행되므로 하이퍼파라미터의 값을 살펴보면 다음과 같다
학습이 잘 진행될 때의 학습률은 0.001 ~ 0.01, 가중치 감소 계수는 10^-8 ~ 10^-6정도라는 것을 알 수 있다
이렇게 적절한 값이 위치한 범위를 좁혀가다가 특정 단계에서 최종 하이퍼파라미터 값을 하나 선택한다