학습 관련 기술
이번 chapter에서는 학습과 관련된 기술들인 최적화 방법, 가중치 매개변수 초기화, 하이퍼파라미터 설정 방법, 가중치 감쇠와 드롭아웃, 배치 정규화 등 여러 가지 딥러닝에 사용되는 기술들을 공부한다.
매개변수 갱신
신경망에서의 학습은 손실 함수의 결과가 가장 작아지는 가중치 매개변수를 찾는 것인데, 이는 가중치 매개변수를 최적화하는 일이라고도 한다.
매개변수의 공간은 신경망의 크기에 따라 다르겠지만 심층 신경망의 경우 매우 높은 차원의 공간을 가지기 때문에 최적 매개변수를 찾는 것이 매우 어려운 일이다.
우리는 이전 chapter까지 신경망을 최적화할 때 기울기만을 사용하는 SGD(Stochastic Gradient Descent, 확률적 경사하강법)를 사용했다. 이번에는 SGD보다 더 스마트한 방법을 사용해서 최적화 하는 방법을 알아보자.
SGD
먼저 이전에 배웠던 확률적 경사하강법에 대해 한번 더 짚고 넘어가자.
SGD는 갱신할 매개변수에 대한 손실 함수의 기울기를 구해서 해당 매개변수를 갱신하면 된다. 다만 데이터를 배치 방식으로 묶어서 갱신하는 경우에는 무작위로 추출해서 갱신하기 때문에 '확률적'이라는 단어가 들어가는 것이다.
SGD의 단점
SGD는 구현하기도 쉽고 단순하지만, 문제에 따라 비효율적인 최적화 방법이 될 수도 있다.
예를 들어, 아래와 같은 손실함수가 있다고 가정해보자.
해당 손실 함수는 x축으로 넓게 펴진 그래프를 가진다. 아래의 그래프가 이해에 도움이 될 것이다.
이런 이유 때문에 SGD로 최적화할 때는 모든 매개변수 지점에서 (0, 0)을 바라보고 있지 않다는 문제와 y축 방향의 기울기는 가파른데 x축 방향의 기울기는 완만하다는 문제가 있다. 즉, 학습에 걸리는 시간이 오래 걸릴 것이라고 예상할 수 있다.
위처럼 y축에 대해서는 계속해서 크게 갱신하고 x축으로는 갱신되는 양이 적어 조금씩 이동하게 되어 최적해에 도달하는 시간이 오래 걸리게 된다.
모멘텀 (Momentum)
모멘텀은 SGD의 최적화 시간이 오래걸리는 단점을 보완한다. 모멘텀은 물리과학에서 '관성'을 의미하는데, 이동하고 있는 방향으로의 힘이 남아있는 것을 의미한다.
아래는 이해를 돕기 위한 GD와 Momentum의 벡터 그림이다.
GD는 다른 변수에 영향을 받지 않고 오직 현재 매개변수의 기울기에 집중하여 이동한다.
하지만 Momentum은 이전에 이동한 벡터의 방향과 크기를 일부 참고하여 다음에 이동할 때 영향을 준다.
이런 모멘텀의 특징 때문에 SGD에서 발생했던 y의 큰 폭 변화는 줄이고 x축으로의 가속은 돕게 된다. 때문에 모멘텀은 SGD보다 훨씬 더 빠른 최적화를 지원한다.
위 그림처럼 모멘텀 방식은 x축으로의 힘이 아주 작지만 방향은 변하지 않기에 일정하게 가속되고 y축으로의 힘은 크지만 위 아래로 번갈아 작용되기 때문에 상충된다.
AdaGrad
AdaGrad는 SGD에서 학습률을 보정하는 방식이 적용된 최적화 방법이다.
Ada는 'Adaptive'를 의미한다. 즉, 각 매개변수를 각각의 매개변수에 맞게 학습률을 적용한다.
h는 기존의 기울기 값을 제곱하여 계속해서 더해준다. 때문에 초반에 기울기의 값이 작다면 큰 학습률이 적용될 것이고, 기울기의 값이 크다면 작은 학습률을 적용하게 될 것이다.
하지만 AdaGrad는 계속해서 기울기가 h에 제곱으로 더해지면서 결국 h는 점점 커지고 학습률은 점점 작아지게 된다. 그래서 AdaGrad를 적용하고 오랫동안 학습을 진행하면 학습이 점점 더디게 진행되게 된다.
이런 AdaGrad의 단점 때문에 RMSProp이라는 최적화 방법이 등장하게 된다. RMSProp은 AdaGrad와 아주 비슷한데, h에 과거의 기울기를 계속해서 더해가는 것이 아니라 아주 과거의 기울기는 서서히 잊도록 만든다. 이런 방식을 사용하면 학습을 오래 진행할 때 학습률이 0에 가까워지는 문제를 해결할 수 있고, 또 AdaGrad의 개별 매개변수마다 다른 학습률을 적용하는 장점은 그대로 가져갈 수 있다.
Adam
마지막으로 깊은 신경망에서 가장 자주 사용되는 최적화 방법인 Adam이다. Adam은 AdaGrad와 Momentum을 융합한 기법으로 학습률과 학습과정의 갱신방법을 보완한 장점을 모두 가진 방법이다.
Optimizer 비교
optimizer들은 어떤 task에 사용되느냐에 따라 모두 성능이 각기 다르다. SGD 방식도 어떤 task에서는 momentum, Adagrad, Adam보다 더 뛰어난 성능을 보일 수도 있다.
이런 이유들 때문에 Task에 따라서 최적화 기법들을 다양하게 사용할 수 있고 또 잘 선택해야 한다.
(하지만 요즘은 대체적으로 성능이 잘 나오는 편인 Adam을 선호하는 편이다.)
가중치의 초깃값
가중치, 신경망의 매개변수를 초기화하는 일을 생각보다 매우 중요하다. 가중치를 잘 설정하는 것이 신경망 학습의 성패를 가르는 일이 종종 있고, 또 과적합과도 관련이 높다.
가중치가 높다는 것은 표현력이 높고 복잡하다는 것과 동일하게 생각할 수 있다. 이런 이유 때문에 가중치는 보통 작게 설정하는 것이 좋다.
그렇다면 가중치의 초깃값을 0으로 설정하면 어떻게 될까?
가중치의 초깃값을 0으로?
결론부터 말하자면, 가중치의 초깃값을 0으로 만들게 되면 안된다. 가중치의 초깃값을 0으로 만들어버리면 어떤 층의 노드가 여러개 존재하는 이유가 없어지게 되기 때문이다.
가중치의 초깃값을 0으로 설정하면, 순전파에서는 다른 입력이 들어오더라도 모든 노드에서 같은 값이 다음 층으로 넘어가게 된다. 이 과정이 출력층까지 도달하게 되었다고 하고 역전파를 진행해보자.
역전파에서는 가중치 매개변수가 갱신될 때 어떤 층 내 노드들은 모두 같은 순전파 값을 가졌기 때문에 갱신되는 값도 모두 동일하다. 즉, 학습하면서 같은 층에 있는 노드들은 계속해서 같은 값을 가지게 되는 것이다.
이런 문제는 해당 층의 어떤 노드가 여러 개 존재하는 의미를 사라지게 만든다. 때문에 가중치 매개변수는 반드시 무작위로 초기화해야 한다.
은닉층의 활성화 분포
이제 매개변수를 초기화할 때 무작위로 해야하는 것을 배웠으니, 가중치 매개변수를 평균이 0, 표준편차를 1이하인 정규분포로 초기화하는 것을 시도해보자.
정규분포로 매개변수들을 초기화하게 되면 고르게 매개변수들이 분포하게 된다. 다만 표준편차에 의해 중심에 몰릴 수도, 너무 고르게 퍼질 수도 있다.
https://blog.naver.com/tinz6461/221599717016
Weight Initialization (가중치 초기화)
1. Weight Initialization(가중치 초기화) - 학습의 성공 유무를 결정하는 중요한 요소 - if 잘못된 가중...
blog.naver.com
위 링크는 좀 더 자세한 분포를 보여준다. (위 그림은 분포가 0~1이라 이해가 잘 안간다면 링크의 그래프를 보는 것이 좋다)
위 그림은 sigmoid 활성화 함수를 사용할 때, 만약 너무 고른 (표준 편차가 큰) 정규분포를 초기화에 사용했다면 나타날 활성화 분포이다. sigmoid 함수는 x값이 0에 가까울 수록 기울기가 1에 가깝고 y값이 -1, 1에 가까운 x값이라면 기울기가 0에 가까울 것이다. 때문에 너무 고른 정규분포 초기화는 위와 같이 기울기가 0과 1에 몰리는 분포를 나타내게 될 것이다. 이는 다음 층에 전달될 때에도 계속해서 0과 1에 몰리는 분포를 야기한다. 결국 sigmoid함수에 의해서 기울기 소실 (Gradient Vanishing) 문제가 발생할 수 있다.
그렇다면 표준편차를 줄여 0 근처에 많이 몰리도록 초기화하면 어떻게 될까?
아래는 표준편차를 0.01로 설정한 초기화 방법으로 활성화 분포를 확인한 그래프이다.
이런 방식으로 초기화한다면 계속해서 0.5에 가까운 값을 만들 것이고 이는 대부분의 노드들이 같은 값을 도출하기 때문에 모든 매개변수를 0으로 초기화했던 것과 비슷하게 같은 층 내 여러 노드의 존재 이유가 사라지게 된다. (표현력 문제)
자비에 초기화 (Xavier Initialization)
위에서 표준편차가 1과 0.01로 설정한 초기화 경우에 대해서 알아봤다. 그렇다면 1과 0.01 사이의 어떤 적절한 값을 표준편차로 사용해서 초기화를 해야된다는 뜻인데, 이 적절한 값을 어떻게 찾을까?
자비에와 요슈아 벤지오 교수님은 자비에 초기화를 사용해서 활성화 시킬 매개변수 값들을 광범위하게 분포시켰다. 자비에 초기화는 앞 계층의 노드가 n개라면 1/√n을 표준편차로 사용하는 것이다.
위는 자비에 초기화로 초기화된 매개변수들의 각 층에서 활성화 분포이다. 층이 깊어지면서 분포가 점점 일그러지기는 하지만 어느정도 넓게 분포되는 것을 확인할 수 있다.
위에서 층이 깊어짐에 따라 분포가 일그러지는 문제는 sigmoid대신 tanh를 사용하면 개선된다. 또, Xavier 초기화는 선형함수에 특화되어 있어 중간 부분에서 선형을 보이는 sigmoid와 tanh 활성화함수와 자주 같이 사용된다.
He 초기화
자비에 초기화는 선형을 전제로 이끈 결과이다. 우리는 신경망에서 ReLU 활성화 함수를 사용할 때도 많은데 ReLU는 선형이 아니다! 이 문제는 He 초기화로 해결할 수 있다. He 초기화는 Xavier 초기화 방법과 굉장히 유사하게 표준편차를 앞층의 노드 갯수에 의존한다. 바로 √2/√n을 표준편차로 사용하는 것이다. (아마 ReLU는 음의 영역에서 0을 가지기 때문에 더 넓게 분포시켜 다양한 값이 나올 수 있도록 하기 위해 2배의 계수가 필요한 것으로 추측할 수 있다.)
정리하자면..
- 신경망에서는 학습 못지 않게 매개변수의 초기화도 중요하다.
- 가중치 매개변수는 0으로 초기화하면 안된다.
- ReLU를 활성화 함수로 사용한다면 He 초기화를 사용.
- Sigmoid나 tanh를 활성화 함수로 사용한다면 Xavier 초기화를 사용하자.
배치 정규화 (Batch Normalization)
배치 정규화는 배치 단위로 데이터 값들을 정규화하는 것을 의미한다.
앞에서는 매개변수를 초기화하면서 데이터값들이 고르게 분포되도록 유도한 것이지만, 배치 정규화는 직접적으로 feature 값들이 계속해서 고른 분포를 가질 수 있도록 강제하는 기법이다.
배치 정규화는 다음과 같은 이점이 있다.
- 학습을 빨리 진행할 수 있다. (학습 속도 개선)
- 초깃값에 크게 의존하지 않는다.
- 과적합을 예방할 수 있다. (드롭 아웃 같은 정규화의 필요성이 감소)
배치 정규화는 이름 그대로 미니 배치 단위로 정규화한다.
위와 같이 미니 배치 단위로 평균과 표준편차를 구해 정규화한다.
과적합 (Overfitting)
신경망의 학습에서는 과적합으로 문제되는 경우가 빈번하다. 신경망이 overfitting 되어 있으면 훈련 데이터에만 과도하게 적응되어 그 외의 다른 데이터는 제대로 맞추지 못한다.
신경망 모델은 항상 범용적인 성능을 갖는 것이 중요하다.
과적합이 발생하는 원인
과적합은 주로 아래와 같은 원인으로 발생한다.
- 매개변수가 많고 표현력이 높은 모델
- 훈련 데이터가 적음
매개변수가 많고 표현력이 높은 모델은 복잡한 모델이다. 복잡한 모델은 표현능력이 좋아 훈련 데이터의 이상치 부분까지도 학습하게 되고 이는 시험 데이터에서 높은 오류로 나타나게 된다. (과적합)
복잡한 모델은 용량(capacity)이 큰 모델이라고도 불린다.
과적합 방지
과적합을 방지하는 방법은 여러가지 존재한다. 그 중에서도 가중치 감쇠(Weight Decay)와 드롭아웃(Dropout)에 대해서 알아보자.
가중치 감쇠 (Weight Decay)
가중치 감쇠는 표현력이 높은 모델을 강제로 표현력이 적도록 유도하는 방법이다. 표현 능력이 너무 좋아 훈련 데이터의 노이즈까지 학습하는 문제를 방지할 수 있다.
가중치 감쇠는 보통 L2 법칙을 사용해 손실함수에 포함시킨다.
이렇게 가중치 감쇠 항이 손실함수에 포함되면 신경망은 학습하면서 손실함수를 작게 만드려고 하기 때문에 자연스럽게 가중치도 작게 만들려고 할 것이다.
드롭아웃 (Dropout)
신경망 모델이 깊어지고 복잡해지면 가중치 감쇠만으로 과적합을 방지하기 어려워진다. 이럴 때는 드롭아웃 기법을 사용해서 방지하는데 사용하곤 한다. 드롭 아웃은 신경망을 학습할 때 어떤 은닉층의 랜덤한 임의의 노드들을 학습에 참여하지 않게 만드는 것이다.
이 방법은 기존의 노드들이 학습하던 방식에서 개수가 줄어든 노드들이 이 특징들을 모두 학습해야 하므로 좀 더 노드들이 입력에 강인(robust)해진다는 특성을 가진다. 그리고 머신러닝에서 자주 사용되는 앙상블(ensemble)효과도 보이는데, 이는 각기 다른 노드 구성으로 학습을 진행하고 마지막에 추론할 때는 모든 노드들을 참여시키는 특징 때문이다.
드롭아웃은 학습에서만 적용되고 추론 단계에서는 모든 노드들을 활성화한다는 것을 잊으면 안된다.
추론에서 Wx(1-p)를 해주는 이유는 다음과 같다. 만약 dropout 비율이 0.2라면 학습할 때 5개 중 하나는 랜덤하게 배제되고 학습이 이뤄졌을 것이다. 즉, 학습 때는 다음 층에 0.8의 입력값 합이 전달된다. 이제 추론 단계를 보자. 추론 단계에서는 모든 노드들이 활성화된다. 즉, 다음 층에 1의 입력값 합이 전달된다. 때문에 입력값의 크기 차이가 존재할 수 있다. 이런 이유로 dropout을 수행했다면 추론에서는 입력값의 크기를 학습때와 동일하게 만들어주기 위해 (1-dropout비율)을 적용해야 한다.
적절한 하이퍼파라미터 탐색
- 검증 데이터는 하이퍼파라미터를 적용했을 때 성능을 평가하는 데이터이다.
- 하이퍼파라미터는 큰 범위에서 랜덤하게 먼저 찾고, 이후에 작은 범위에서 세세하게 찾는다.
- 하이퍼파라미터를 찾을 때는 에폭을 작게하여 1번의 시도에 걸리는 시간을 최소로 만든다.
- 좀 더 세련된 하이퍼파라미터 탐색 방식은 베이즈 최적화 같은 것이 있다.
'ML & DL > 복습' 카테고리의 다른 글
밑바닥부터 시작하는 딥러닝 Chapter 7 (0) | 2023.01.24 |
---|---|
밑바닥부터 시작하는 딥러닝 Chapter 5 (0) | 2023.01.22 |
밑바닥부터 시작하는 딥러닝 Chapter 4 (0) | 2023.01.22 |
밑바닥부터 시작하는 딥러닝 Chapter 3 (0) | 2023.01.21 |
밑바닥부터 시작하는 딥러닝 Chapter 2 (0) | 2023.01.21 |