Lecture6: Training Neural Networks I
- CS231n 강의 [1]를 듣고 공부한 내용을 나름대로 정리했다.
- 글에 있는 모든 그림, 표, 예시는 [2]에서 가져왔다.
~ 목차 ~
1. Activation Functions
1.1 Sigmoid
1.2 Tanh
1.3 ReLU
1.4 Leaky ReLU
1.5 ELU
1.6 Maxout
1.7 정리
2. Data Preprocessing
3. Weight Initialization3.1 랜덤 초기화
3.2 특정 수로 초기화
3.3 Xavier 초기화
3.4 He 초기화
4. Batch Normalization
5. Babysitting the Learning Process5.1 데이터 전처리
5.2 모델 선택
5.3 잘 작동하는지 체크
5.4 모델 학습
6. Hyperparameter Search
6.1 Coarse Search
6.2 Fine Search
1. Activation Functions
- Activation Function은 활성화 함수로, 뉴런의 출력을 결정하는 함수이다.
활성화 함수는 아래 그림과 같이 각 레이어의 $wx+b$ 연산 뒤에 위치한다. 연산 결과는 활성화 함수를 거친 다음에 다른 레이어로 전달된다.
- 강의에서는 6가지 활성화함수를 소개한다. 활성화 함수 중에서도 nonlinear한 것들을 다루고 있는데, 이를 사용하면 기존의 선형 계산값에 비선형성이 추가해서 모델이 복잡한 패턴을 학습할 수 있게 된다.
1.1 Sigmoid
- Sigmoid의 수식과 그 모양은 다음과 같다.
- 수식을 바탕으로 특징과 그 특징에서 오는 단점을 생각해보자면,
① 출력값이 (0,1)로 조정된다. (not zero-centered)
- 단점: 이렇게 되면 출력이 아래 그림처럼 한쪽으로 치우치게 되고, 가중치 업데이트가 비효율적으로 이루어지게 된다.
zero-centered를 추구하는 것이 좋다.
② 함수값의 절댓값이 커질수록 출력값의 기울기가 0에 가까워진다. (saturated gradient)
- 단점: 기울기가 0에 가까우면 back prop 단계에서 기울기가 점점 작아지면서 초기 레이어로 갈수록 학습이 거의 이루어지지 않는다.
그러면 학습 속도가 느려지고, 깊은 네트워크에서는 학습이 제대로 되지 않을 수 있습니다.
③ 지수함수 $e^{-x}$가 사용된다. (not computationally efficient)
- 단점: 지수함수가 계산비용이 크기 때문에 부담이 될 수 있다. (하지만 큰 문제는 아니다.)
1.2 Tanh
- Tanh의 수식과 그 모양은 다음과 같다.
- 장점: Sigmoid와는 다르게 zero-centered 되었음을 알 수 있다.
- 단점: 하지만 여전히 saturated gradient 문제가 있다.
1.3 ReLU
- ReLU의 수식과 그 모양은 다음과 같다.
- 장점: ReLU는 sigmoid와 tanh에서 보였던 saturated gradient 문제를 해결해준다. 더이상 기울기가 포화되지 않는다.
그리고 max함수와 같은 단순한 함수를 사용하기 때문에 computationally efficient하다.
→ 이러한 개선사항들 때문에 sigmoid나 tanh보다 수렴속도가 6배정도 빠르다!
- 단점: zero-centered 되지 않았다.
이는 함수값이 0보다 작을 때 출력값을 0으로 없애기 때문에 아래와 같은 dead ReLU 현상이 나타날 수 있다.
1.4 Leaky ReLU
- Leaky ReLU는 ReLU의 dead ReLU 현상을 개선하기 위해 x<0일 때 0.01과 같은 작은 편향값을 준다.
- 수식과 그 모양은 다음과 같다.
- 장점: ReLU의 장점에 편향값을 줄 때의 장점(출력값이 죽어버리지 않음)이 추가된다.
1.5 ELU
- ELU는 ReLU의 dead ReLU 현상을 개선하기 위해 x<0일 때 지수함수로 작은 편향값을 준다.
- 수식과 그 모양은 다음과 같다.
- 장점: Leaky ReLU에 비해서 노이즈에 대해 robust하다.
ReLU에 비해서 비교적 zero-centered 된다.
- 단점: 지수함수를 사용하기 때문에 computational effiency가 떨어진다.
1.6 Maxout
- Maxout의 수식과 그 모양은 다음과 같다.
- 장점: ReLU와 Leaky ReLU를 포함하는 보다 일반화된 형태이다.
Saturated gradient문제도 없고, 기울기가 소멸디지도 않는다!
- 단점: 연산량이 2배가 된다. 파라미터 수와 뉴런 수가 2배가 되기 때문이다.
1.7 정리
- 기본적으로 ReLU를 사용하고, leaky ReLU, maxout, ELU도 적용해볼만은 하다.
- Tanh는 적용해볼 수는 있지만 너무 기대하지 말고, sigmoid는 그냥 사용하지 말라고 한다.
2. Data Preprocessing
- Data preprocessing은 데이터 전처리로, 데이터를 입력값으로 넣기 전에 사용하기 편하게 처리해주는 것이다.
- 아래와 같은 방법들이 있지만, 이미지를 처리할 때는 보통 zero-centering(이미지 픽셀값 평균을 0으로 맞춤)만 사용된다.
공간정보를 보존하기 위해서이다.
3. Weight Initialization
- 가중치를 어떻게 초기화 할 수 있을까? 사고의 흐름에 따라서 설명을 해준다.
3.1 랜덤 초기화
- 아래와 같이 단순하게 작은 수를 랜덤으로 설정해주는 방법을 생각해볼 수 있다.
- 작은 모델에서는 낫밷이지만, 큰 모델에서는 문제가 많다.. (어떤 문제인지는 설명 생략)
3.2 특정 수로 초기화
- 특정 수로 초기화하면 어떨까...? 여기서도 문제가 생긴다.
아래에서 초기화 가중치가 너무 작거나 클 때 발생하는 문제에 대해서 설명한다.
(i) 초기화 가중치가 너무 작을 때
- 아래 그래프는 초기화 가중치를 0.01로 설정했을 때의 층별 출력의 평균과 표준편차값을 나타낸다.
→ 학습이 진행될수록 활성화 함수의 출력이 0에 가까워져서 활성화 함수의 기울기가 소실되어버린다.
(ii) 초기화 가중치가 너무 클 때
- 아래 그래프는 초기화 가중치를 1로 설정했을 때의 층별 출력의 평균과 표준편차값을 나타낸다.
→ 학습이 진행될수록 활성화 함수의 출력이 포화되어버린다.
여기서는 활성화함수로 $tanh$를 사용했기 때문에 출력이 -1과 1로 포화되었음을 볼 수 있다.
3.3 Xavier 초기화
- 그래서. Xavier 초기화가 등장한다. 코드로 구현하면 아래와 같다.
W = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in)
- Xavier 초기화는 $\frac{1}{입력 뉴런 수}$을 통해 가중치를 스케일링한다.
모든 층에서 출력의 분산이 일정하게 유지되도록 하기 위해서이다.
아래 그래프는 Xavier 초기화를 적용했을 때의 층별 출력의 평균과 표준편차값을 나타낸다.
- 하지만 ReLU와 같은 비대칭 활성화함수를 통과하게 되면 아래의 그래프처럼 기울기 소실 문제가 발생한다.
(∵ReLU에서 입력값이 음수일 때 출력값이 0이 되고, 그러면 전체적으로 출력값의 분산이 확률적으로 봤을 때 절반으로 줄어든다.
그리고 층이 깊어질수록 줄어든 분산 $\frac{1}{2}$이 계속 곱해지기 때문에 기울기 소실 문제가 발생하는 것이다.)
- 이를 보완하기 위해 He초기화가 등장한다.
3.4 He 초기화
- He 초기화는 ReLU와 같은 비대칭 활성화함수에서도 잘 작동한다. 코드로 구현하면 다음과 같다.
W = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in / 2)
- 분모의 fan_in값을 단순히 2로 나눠줬을 뿐인데 기울기 소실이 많이 잡힌 것을 확인할 수 있다. (자세한 설명은 생략)
4. Batch Normalization
- Batch Normalization이란 배치 정규화로, 배치의 활성화 값을 평균을 0으로, 분산을 1로 정규화 하는 작업이다.
- Batch normalization을 적용하면 기울기의 분포를 조금 더 좋게 만들고, learning rate를 좀 더 높일 수 있다.
그리고 초기화값의 의존도를 줄일 수 있다.
- 순서는 가중치 계산 → batch normalization → activation function로 진행된다.
- 먼저, 평균과 분산값을 구해서 아래의 정규화 공식에 넣어준다.
- 근데 정규화만 해주면 모델의 출력값이 제한되어버릴 수 있다.
Tanh를 예시로 들자면, 값이 -1과 1 사이에 있어서 원래 데이터의 고유 분포가 사라져버린다.
- 이를 살리기 위해 scale과 shift를 해준다. 공식은 아래와 같다.
- 진행을 정리해서 보면 아래와 같다. Mini-batch의 평균과 분산을 구해서 정규화 한 다음 변환을 하면 된다.
5. Babysitting the Learning Process
- 모델 학습 과정은 크게 데이터 전처리→ 모델 선택 → 잘 작동하는지 체크 → 모델 학습 순서로 진행된다.
(+ 번외로 제목에서 '베이비시팅하듯이 learning process를 잘 어르고 달래면서 하거라'라는 표현이 좀 재밌다)
5.1 데이터 전처리
- 먼저 데이터 전처리를 한다. Section2(data preprocessiong)에서 나온 전처리 방법들을 적절하게 적용해주면 된다.
5.2 모델 선택
- 전처리를 한 다음 어떤 모델을 사용할지 정한다.
- 모델 층을 얼마나 쌓을 것인지, 어떤 패턴으로 conv layer, pooling layer, fc layer 등을 배치할지 등이 여기에 해당한다.
5.3 잘 작동하는지 체크
- 학습을 본격적으로 시작하기 전에, 학습이 잘 돌아가는지 간을 본다.
아래 그림처럼 정규화를 줬을 때 안 줬을 때에 비해서 loss값이 올라가는지 체크해볼 수 있다.
5.4 모델 학습
- 처음에는 적당한 learning rate를 찾는 데에 초점을 둔다. 전체 loss값, 즉 cost값을 보고 learning rate가 적절한지 판단할 수 있다.
아래와 같이 cost값의 변화가 작으면 learning rate가 너무 작은 것이고, cost가 nan 또는 inf이면 learning rate가 너무 큰 것이다.
6. Hyperparameter Search
- Search 방법으로는 Grid search와 Random search가 있는데 실제 학습에서는 Random search가 더 좋다.
아래 그림처럼 고차원으로 갈수록 적은 시도로 좋은 조합을 발견할 확률이 높아지기 때문이다.
- Coarse search에서부터 fine search로 접근하자.
6.1 Coarse search
- 먼저 몇 에폭만 돌려보고 잘 작동하는지 확인한 다음에 본격적인 학습으로 넘어가는 것이 좋다.
만약에 cost가 너무 많이 커지면 (초기값의 3배 이상) 무언가 잘못되고 있다는 뜻이니 학습을 멈추고 확인해봐야 한다.
6.2 Fine search
- 그 다음에 본격적으로 학습을 돌린다. 몇가지 지표로 학습이 잘 진행되고 있는지 확인해볼 수 있다.
① Val_acc와 lr의 추세를 보면서 문제가 있는지 없는지 확인할 수 있다.
아래의 학습결과를 보면 val_acc가 53%로 준수할 때, lr이 갑자기 9.47e-04로 튄다. 학습이 살짝 불안정하다는 것을 알 수 있다.
실제 학습에서는 수많은 cross-validation을 통해서 하이퍼파라미터를 실험해봐야 한다.
② Loss와 acc값의 추세를 보고 학습의 진행상황을 파악할 수 있다.
이때, 잘 진행되는 학습의 loss는 아래 왼쪽 그래프와 같이 점진적으로 감소해야 한다.
그리고 아래 오른쪽 그래프와 같이 loss의 추세를 보고 lr가 적합한지 안 적합한지도 확인해볼 수 있다.
③ 아래 그래프와 같이 train_acc와 val_acc가 차이가 너무 많이 나면 오버피팅을 의심해볼 수 있다.
- 이어서 다음 시간에도 training 기술들에 대해서 배울 것이다.
참고문헌
[1] Stanford University, "Lecture6, Training Neural Networks I," YouTube, Aug. 12, 2017. [Online]. Available:
https://www.youtube.com/watch?v=wEoyxE0GP2M&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv&index=6
[2] F. Li, J. Johnson, and S. Yeung, "CS231n Convolutional Neural Networks for Visual Recognition: Lecture 6-Training Neural Networks I," Stanford Univ., 2017. [Online]. Available:
https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture6.pdf
'CS231n' 카테고리의 다른 글
[CS231n] Lecture8: Deep Learning Software (0) | 2024.11.23 |
---|---|
[CS231n] Lecture7: Training Neural Networks II (1) | 2024.11.22 |
[CS231n] Lecture5: Convolutional Neural Networks (0) | 2024.11.20 |
[CS231n] Lecture4: Introduction to Neural Networks (0) | 2024.11.19 |
[CS231n] Lecture3: Loss Functions and Optimization (0) | 2024.11.18 |