Reference
https://iai.postech.ac.kr/teaching/machine-learning
https://iai.postech.ac.kr/teaching/deep-learning
위 링크의 강의 내용에 기반하여 중요하거나 이해가 어려웠던 부분들을 정리하여 작성하였고,
모든 강의 슬라이드의 인용은 저작권자의 허가를 받았습니다.
또한, 모든 내용은 아래 Notion에서 더 편하게 확인하실 수 있습니다.
>>노션 링크<<
Keywords
- Nonlinear Activation Function
- Vanishing Gradient Problem
- Batch Normalization
- Dropout (Regularization)
Nonlinear Activation Function: Vanishing Gradient Problem
이전 장들에서, ANN에서의 Layer의 Activation Function으로 Sigmoid와 같은 함수들을 사용했던 것을 이미 알고 있을 것이다.
위의 그래프에서 확인할 수 있듯, sigmoid 함수의 미분값(gradient)는 전 구간에서 0.5도 넘지 못한다.
이러한 sigmoid가 activation function으로 ANN의 모든 layer에 중첩되어 있다고 생각해 보자.
Backpropagation에서 Chain Rule에 의해 gradient가 계산되는 것을 생각해 보면, 1보다 더 작은 gradient들이 layer마다 계속해서 곱해지는 꼴이 되므로, 결국 loss function의 gradient(전체 gradient)가 layer가 깊어질수록 0에 가까워지게 된다.
이렇게 gradient값이 작아지게 되면, 결국 Gradient Descent를 적용하였을 때
$x ← x - \alpha\frac{dL}{dx}$ 식에서 $\frac{dL}{dx}$ 값이 작아지는 것이므로- update가 천천히 진행되고, 결과적으로 학습이 느려지고, 어려워지게 된다.
이를 Vanishing Gradient Problem이라 한다.
그래서 고안된 것이, Activation Function으로 ReLU라는 함수를 이용하는 것이다.
ReLU는 0보다 작은 부분에서는 $y=0$, 0보다 큰 부분에서는 $y=x$ 꼴을 띄는데,
이 특성 때문에 미분값이 0보다 작은 구간에서는 0, 0보다 큰 구간에서는 1이 된다.
→ 여러 번 Chain Rule에 의해 곱해져도, 0보다 큰 구간에서 미분값이 1이기 때문에, gradient값이 그대로 곱해져 유지된다.
(tanh를 이용해도, sigmoid보다는 낫지만 결국 vanishing gradient descent 문제가 발생한다.)
음수 부분을 0으로 만드는 것도 네트워크의 희소성을 증가시켜, overfitting을 줄이는 효과가 있음.
Batch Normalization
ANN에서 성능과 안정성을 향상시키기 위해 나온 테크닉 중 하나.
하나의 뉴런에서, activation function으로 들어가는 input에 sigmoid function을 적용한다고 하면, 하나의 batch 안의 data들 중 양 끝에 가까운 점들은 0에 가까운 gradient값을 갖게 된다. (그림 참조)
이러한 input에 대해 하나의 batch마다(약 50개의 data) normalize를 수행하여, 값들을 조정하는 것이다.
이를 통해 0 근처로 값들을 모아, vanishing gradient 문제를 어느 정도 개선할 수 있다는 아이디어이다.
(양끝으로 갈수록 gradient가 작고, 가운데로 갈수록 gradient가 큼!)
Batch Normalization을 통해 (위의 그림을 통한 시각적인 이해를 해 보자면,) batch마다 normalization을 하여 scaling을 수행함의 결과로, feature에 따른 learning rate의 영향(traning 속도)이 균등하지 않은 것을 조금 더 균등하게 만들어 준다. (왼쪽의 타원형에서, 오른쪽의 원형으로 바꾸는 효과가 있음)
⇒ 각 feature마다의 값을 normalizing 함으로써, learning rate의 effect를 각 축(feature)마다 균등하게 설정하여 학습에 대한 안정성이 상승할 수 있다.
위에서는 Vanishing Gradient 문제를 해결할 수 있는 결과, 여기서는 learning rate의 effect가 균등해진다는 결과.
Batch Normalization에 따른 Normalizing은 위와 같이 수행.
Training 도중에는 각 batch에 대한 mean, variance를 구해 그 값으로 각각 normalization 수행.
Testing에서는, training 시 사용된 각 batch의 mean, variance를 이용해 normalization 수행. (test data에 대한 batch mean, variance를 이용해 normalization을 수행하는 것이 아님을 주의!)
값을 normalization 시키면 당연히 weight값이 달라지겠지만.. 오히려 내부 공변량 이동 (Internal Covariate Shift) 현상을 줄임으로 인해 학습 안정성 상승, 수렴 속도 상승을 야기.
내부 공변량 이동이 문제가 되는 이유:
각 층의 입력 분포가 계속 변하면, 다음 층은 계속해서 새로운 분포에 적응해야 하므로, 이는 학습을 불안정하게 만들고 수렴을 느리게 한다. → 학습 불안정성을 야기하며, 높은 learning rate 사용에 무리.
자세한 Batch Normalization에 대한 내용은 아래 링크의 설명을 참고.
[Deep Learning] Batch Normalization (배치 정규화)
Batch Normalization: Accelerating Deep Network Training by...
Dropout
Regularization 기법으로 앞에서 설명했던 penalty항을 추가하는 방법도 있었지만,
비교적 큰 dataset을 사용한다면 학습이 여러 번 될 것이니 자연스럽게 Regularization 효과가 있으며, 그를 위해 data augmentation (학습 데이터 양을 늘리기 위해, 기존의 입력 데이터를 여러 가지로 변형하여 데이터 양을 절대적으로 늘리는 방법) 과 같은 방식을 사용할 수도 있다.
그리고 test, training 과정에 있어, iteration 횟수가 계속 증가함에 따라 testing error가 증가하는 경향을 띄므로(+testing data와 training data의 error의 차이가 증가하는 경향), iteration을 일찍 끝내는 방법도Regularization의 한 방식으로 존재한다. (early stopping)
또 다른 Regularization의 방법으로, Dropout이라는 방법이 있다.
각 iteration마다, random하게 node들을 선택하여 제거하는 방법이다. (제거되지 않은 node에 대해서만 weight를 update해나가게 되며, 다음 iteration에서는 또 다시 처음으로 돌아가 random하게 node를 삭제하는 방식. 한 번 삭제한 node는 끝까지 삭제하는 것이 아니라, 그 iteration에서만 삭제한다.)
(직관적으로 이해하자면) ML에서의 ensemble 방식과 비슷한 효과를 낸다고 생각할 수 있다. (조금씩 다른 모델들이 계속 만들어지고, 이것을 최종적으로 summation하게 되면 앙상블 효과가 되고, 결국 regularization의 효과가 난다.)
자세한 내용은 논문 참고.
주의해야 할 것은, training 시 dropout rate에 따라 input data를 scaling해줘야 전체적인 output의 크기가 유지된다는 것. (drop된 node에서는 output이 없을 것이므로, input data의 scale이 그대로라면 전체 output의 크기가 당연히 감소하게 된다.)
당연히, training 시에만 dropout을 수행하고, test 시에는 dropout 없이 모든 node에 대해 계산하여 prediction을 수행한다.
Dropout 관련 논문: www.cs.toronto.edu