1. 도입
머신러닝에서 학습을 위해 필요한 과정 중 하나로 역전파를 통해 손실함수의 그래디언트를 계산합니다. 이렇게 계산한 값을 활용해 경사 하강법 단계에서 파라미터를 수정하게 되죠. [1]
그런데 여러개의 연산을 쌓아서 만들어진 인공신경망(네트워크)에서 그래디언트가 작아지는 경우가 있습니다. 이렇게 값이 작아진다면 수렴이 되지 않아 원하는 결과를 얻지 못하게 되는데, 이러한 경우를 '그래디언트 소실(vanishing gradient)'이라 합니다. 그와 반대되는 현상으로 그래디언트가 커지면서 파라미터가 수렴하지 않고 발산하게 되는 '그래디언트 폭주(exploding gradient)'도 있습니다. [2]
이렇게 그래디언트가 소멸하거나 폭주하게 되면, 신경망 훈련이 어려워지게 됩니다. 이를 해결하기 위해 다양한 방법들이 연구되었는데, 여기서는 두가지만 우선 소개합니다.
2. 활성화 함수
활성화 함수는 인공 신경망의 각 요소들에서 함수를 언제 활성화할 것인지에 대해 결정하는 함수를 말합니다. 활성화 함수 사용가능한 것들은 시그모이드 함수(로지스틱), 하이퍼볼릭 탄젠트 함수, ReLU (Rectified Linear Unit) 함수가 있습니다. 종류는 다양하지만, 활성화 함수를 잘못 선택할 경우 그래디언트 소실이나 폭주 현상이 일어날 수 있어 주의가 필요합니다.
여러 연구를 거치면서 ReLU 함수가 특정 양수로 수렴하지 않는 것이 밝혀졌고, 지수함수를 사용하는 다른 함수에 비해 1차 함수이기 때문에 연산도 빠릅니다. 여러 장점이 있지만, 음수 영역에서 0을 출력하는 Dead ReLU 문제를 발생하기 때문에 음수영역에 약간의 기울기(예 : 0.01)를 주는 Leaky ReLU, 음수 영역에서 지수함수를 포함한 ELU(Exponential Linear Unit)을 통해 해결이 가능합니다. [1]
파이토치에선 nn 모듈에서 다양한 활성화함수를 활용할 수 있습니다.
import torch.nn as nn
relu = nn.ReLU()
leaky_relu = nn.LeakyReLU(negative_slope = 0.01)
elu = nn.ELU(alpha = 1.1)
3. 가중치 초기화
이전 머신러닝 사이클에서 모델 기반 학습의 두번째 단계로 '무작위로 파라미터 설정'(여기서 부터는 '초기화')을 얘기한 바 있습니다. [1] 다른 단계들은 한번씩 논의가 됐지만, 이 단계에 대해서는 따로 다룬 적이 없지만 올바른 학습을 위해서는 더 나은 초기화가 이뤄져야 합니다.
만약 초기화 값을 np.random.randn 처럼 정규분포에 맞춰서 데이터를 생성하게 되면 어떻게 될까요? 아래와 같이 값들이 0과 1에 치우쳐서 분포하게 됩니다. 이렇게 될 경우 활성화 함수(예를 들어, 시그모이드 함수)의 값이 0이 되기 때문에 기울기가 없어지는 문제가 생깁니다. 이를 그래디언트 소실(vanishing gradient) 문제라고 합니다.
그렇다면, 그래디언트 소실 문제를 해결하려면 어떻게 해야 할까요? 대표적으로 많이 사용하는 방법은 Xavier 초기화, He 초기화(또는 Kaming 초기화. Kaming He의 이름.)를 활용하는 것 입니다. 파이토치에서는 torch.nn.init을 통해 지원하고 있습니다.
import torch
# Xavier initialization
torch.nn.init.xavier_normal(tensor)
torch.nn.init.xavier_uniform_(tensor)
# He initialization
torch.nn.init.kaming_normal(tensor)
torch.nn.init.kaming_uniform(tensor)
여기서 normal과 uniform의 차이는 가중치가 초기화될 때 값들의 분포를 결정하는 차이입니다. normal은 정규 분포에서 샘플링된 값으로 초기화되며, 대부분의 값이 평균 근처에 모이게 되고, uniform은 특정 범위에서 고르게 분포하게끔 만듭니다.
Xavier 초기화와 He 분포의 선택 기준은 다음과 같습니다. [2]
초기화 방법 | 활성화 함수 |
Xavier | 대칭적 활성화 함수 (tanh, Sigmoid, Softmax) |
He | 비대칭적 함수 (ReLU, Leaky ReLU 등 변종 함수) |
4. 참고자료
[1] https://seanpark11.tistory.com/109
[2] 오렐리앙 제롱. 『핸즈온 머신러닝 (제2판)』
[3] Fei-Fei, Krishna, Xu. CS231n Lecture. https://cs231n.stanford.edu/slides/2023/lecture_7.pdf
'Python > Data Analysis' 카테고리의 다른 글
앙상블 기법을 딥러닝에서 활용할 수 있게 pytorch로 구현하기 | Voting, Bagging, Stacking (0) | 2024.11.11 |
---|---|
PIL을 활용한 이미지 특징(Image attributes) 추출하기 | 이미지 데이터 EDA (0) | 2024.09.25 |
PyTorch로 Binary Classifier 구현하기 | 로지스틱 회귀, 이진 분류 (0) | 2024.08.19 |
PyTorch를 통해 Linear Regression 구현하기 (0) | 2024.08.19 |
머신러닝 과정에서 손실함수와 최적화가 필요한 이유 (1) | 2024.08.17 |