티스토리 뷰
Initialization(초기화)
신경망은 처음에 Weight를 랜덤하게 초기화하고 Loss가 최소화되는 부분을 찾아간다. 이때 Weight를 랜덤하게 초기화하면 신경망의 초기 Loss값도 랜덤하게 달라지게 되는데, 최적의 Loss를 찾기 위해서는 Weight를 어떻게 초기화하는 지가 중요하다.
초기화 기법으로는 LeCun Normal Initialization, LeCun Uniform Initialization, Xavier Initialization, He Initialization 등이 있다. 이에 대해서는 책에 자세하게 안나와있다... 그래서 갖고있는 다른 교재를 참고하여 초기화 기법에 대해서 짧게 정리해보자면
- Xavier Initialization : 표준편차가 1/루트n(n = 앞 층의 노드 수)인 분포를 사용
- He Initialization : 표준편차가 루트2/루트n(n = 앞 층의 노드 수)인 정규분포를 사용. ReLU에 특화된 초깃값
일반적으로 딥러닝 모델을 설계하고 학습하는 과정은 다음과 같다.
1. 모델 구조 설계 및 파라미터 값을 랜덤으로 샘플링
2. Feature 값으로 이용되는 데이터를 설계한 모델의 Input으로 사용하여 Output 계산
3. 기존에 정의한 objective function을 통해 Loss 계산
4. Loss를 통해 Gradient 계산 후 모델 내 파라미터 값을 Back Propagation에 의해 업데이트
1번(랜덤으로 파라미터 값을 샘플링하는 과정)에서 중요한 것은 어떤 분포에서 샘플링을 진행하는가?이다.
어떻게 샘플링하느냐에 따라 좋은 방향으로 학습이 진행될 수도 있고 나쁜 방향으로 진행될 수도 있다.
현재 이용하고 있는 파이토치 내의 nn.linear는 output으로 계산되는 벡터의 차원 수의 역수 값에 대한 +/- 범위 내 uniform distribution을 설정해 샘플링한다. 여기서 정의한 분포가 아닌 he initialization을 이용해 파라미터를 초기화 해보자.
이전까지 새롭게 적용했던 Dropout이나 ReLU, Batch Normalization은 모델 설계 영역을 수정했다면 이번에는 모델을 정의하는 부분에서 he initialization을 적용해준다. model을 정의한 후 apply를 이용해 모델의 파라미터를 초기화한다. 이때 사용하는 weight_init 함수를 보면 he 초기화를 적용해주는 것을 알 수 있다.
Optimizer(매개변수 갱신 기법)
Optimization(매개변수를 갱신하는 과정) 단계에서는 손실 함수의 값을 가능한 낮추는 매개변수를 찾는다. 이때 다양한 Optimizer가 사용된다.
이전까지는 주로 Stochastic Gradient Descent(SGD)를 optimizer로 사용했었다. SGD는 단순하고 구현도 쉽지만, 아쉽게도 단점이 존재한다.
SGD를 사용했을 때의 optimization 경로는 위 사진과 같다. SGD는 SGD는 방향에 따라 기울기가 달라지는 함수에서 탐색 경로가 비효율적이다.SGD가 지그재그로 탐색하는 근본 원인은 기울어진 방향이 본래의 최솟값과 다른 방향으로 가리키기 때문이다.
이렇게 무작정 기울어진 방향으로 진행하는 SGD의 단점을 개선해주는 여러 대안이 존재한다.
지금부터는 SGD를 대체할 수 있는 다른 Optimizer에 대해서 알아보도록 하겠다.
* 수식보다는 개념 위주로 정리하였다. 수식이 궁금하다면 구글창이나 교재를 참고하도록 하자
* 교재에 나온 모든 Optimizer를 정리하지 않고 자주 언급(되는 것 같은) 3가지만 정리해보았다.
Momentum
매개변수 갱신 시 미분을 통한 Gradient 방향으로가되, 일종의 관성을 추가. 모멘텀을 사용하면 최적의 장소로 더 빠르게 수렴할 수 있다(관성을 추가하여 걸어가는 보촉을 크게 하는 개념). 모멘텀을 이용한 optimazation 경로는 아래의 이미지와 같다.
Adaptive Gradient(Adagrad)
가보지 않은 곳은 많이 움직이고, 가본 곳은 조금 움직인다. Adagrad는 각각의 매개변수에 맞춤형 값을 만들어 적응적으로 학습률을 조정하면서 학습을 진행한다. Adagrad을 이용한 optimazation 경로는 아래의 이미지와 같다.
Adaptive Moment Estimation(Adam)
공이 그릇 바닥을 구르는 듯한 움직임을 보여주는 Momentum과 매개변수 원소별 적응적 갱신이 가능한 Adagrad를 융합한 기법. 2020년 기준 많은 딥러닝 SGD와 함께 많이 사용되고 있음. Adam을 이용한 optimazation 경로는 아래의 이미지와 같다.
실습시 Optimizer를 적용하는 방법은 간단하다. 수정할 부분은 6. Optimizer, Objective Function 설정하기 단계이다.
파란색 형광펜칠이 되어있는 부분이 현재까지 Optimizer로 SGD를 적용해왔음을 보여준다.
이 부분을
optimizer = torch.optim.Adam(model.Adam(model.parameters(), lr = 0.01)
이렇게 살짝 수정하면 Adam을 활용하여 학습을 진행하고 Oprimization 할 수 있다.
어떤 갱신기법(Optimizer)를 사용할 것인가는 풀어야 할 문제가 무엇이냐에 따라 달라진다.
모든 문제에서 항상 뛰어난 기법은 없기 때문에 각자의 상황을 고려하여 여러가지를 시도해봐야 알 수 있다!
'딥러닝' 카테고리의 다른 글
[컴퓨터비전] CNN (0) | 2021.07.22 |
---|---|
[Deep Learning] AutoEncoder(AE) (0) | 2021.07.17 |
[Deep Learning] Dropout, Activation Function, Batch Normalization (0) | 2021.07.16 |
[AI Background] 인공 신경망 & MNIST 실습 (0) | 2021.07.13 |
[AI Background] 과적합 (0) | 2021.07.11 |