본문 바로가기

모두를 위한 딥런닝 by PyTorch

Lab 07-2 DNN

728x90

이번 시간에는 딥러닝 모델을 학습시키는 데 있어

자주 사용하고 중요한 ReLU 함수, Weight 초기화, nomalization 등을

학습해보도록 하겠습니다.

마찬가지로 위키독스와 모모딥 시즌1을 참고하여 정리해보도록 하겠습니다.

학습 목표

ReLU 활성화 함수에 대해 알아본다.

Weight 초기화 방법에 대해 알아본다.

배치정규화에 대해 알아본다.

핵심 키워드

ReLU

세이비어 초기화(Xavier Initialization)

He 초기화(He Initialization)

배치정규화(batch nomalization)


1. Sigmoid 함수의 기울기 소실

ReLU는 비선형 활성 함수의 대표주자입니다. 그만큼 많이 사용되고 중요한 함수입니다. 그럼 우선 활성 함수란 무엇일까요? 활성 함수란 어떤 입력에 대하여 수학적 변환을 수행하고 출력하는 함수입니다. 우리가 그동안 배운 Sigmoid 함수, Softmax 함수가 모두 이런 활성 함수에 속합니다. 그럼 왜 비선형이라는 말이 붙었을까요?

활성화 함수를 f(x)=Wx라 가정해보겠습니다. 여기에 두 개의 은닉층을 추가하게 된다면 출력층까지 포함하여

 y(x)=f(f(f(x)))가 될 것입니다. 이를 식으로 나타내면  W×W×W×x가되고 결국 이는 y(x)=kx로 표현이 가능합니다. 즉, 학습 가능한 가중치가 새로 생기게 되는 것입니다. 이를 방지하기 위해 비선형 함수를 사용하는 것입니다.

 

여기서 이제 의문이 생길 수 있습니다. 그동안 비선형인 Sigmoid 함수를 이용해서 잘만 학습시켰는데 왜 굳이 ReLU를 사용하는 걸까? 바로 기울기 소실(Vanishing Gradient) 때문입니다. 아래 Sigmoid 함수를 보면 함수의 중앙 부분은 gradient를 구하기에 큰 문제가 없어 보입니다. 하지만 양 끝의 gradient는 모두 0으로 수렴하고 있습니다. 이를 기울기 손실이라고 합니다.

이러한 기울기 손실은 backpropagation을 할 때 문제를 발생시킵니다. backpropagation을 하는 과정을 보면 forward pass를 구하고 gradient를 계산하여 이 gradient를 이용해서 backward pass를 구합니다. 하지만 여기서 gradient가 0에 가까운 값이 될 경우, 기울기가 계속 곱해지면서 앞쪽에 위치한 W는 업데이트가 되지 않아 학습이 되지 않습니다. 따라서 이러한 문제를 해결하기 위해 ReLU 함수가 등장하게 되었습니다.

2. ReLU

ReLU 함수의 수식은  f(x)=max(0 , x)로  단순합니다. 아래와 같이 0보다 작은 값에 대해서는 0으로, 0보다 큰 값은 X가 됩니다.

 

ReLU는 특정 양수 값에 수렴하지 않기 때문에 Sigmoid 함수보다 깊은 신경망에서 더욱 잘 작동합니다. 또한 연산이 필요한 것이 아니라 단순 임계값이기 때문에 연산속도도 빠릅니다. 물론 ReLU도 음수 값이 음력 되면 기울기가 0이 되어 dying ReLU가 발생합니다. 이를 방지하기 위해 음수일 경우 0이 아닌 0.001과 같은 매우 작은 수를 반환하는 Leaky ReLU 함수가 있습니다. 

3. Weight 초기화

weight를 어떻게 초기화하고 학습하냐는 학습의 성능에 많은 영향을 미칩니다. weight 초기화에서 과거에 사용했던 세이비어(Xavier Initialization)와 이를 변형하여 가장 많이 사용되는 He 초기화에 대해서 배워보도록 하겠습니다.

   3.1 세이비어 초기화(Xavier Initialization)

세이비어 초기화는 해당 방법을 제안한 세이비어의 이름을 딴 방법입니다. 세이비어 방법은 weight의 각 원소들이 균등 분포 또는 정규분포를 따르도록 초기화하는 방법입니다. 이전 층의 뉴런의 개수(in), 다음 층의 뉴런의 개수(out)를 이용해서 식을 세웁니다. 아래 식은 균등 분포를 따르도록 초기화한 것입니다.

정규분포로 초기화하는 경우에는 아래와 같이 평균이 0이고 표준편차가 아래 식을 만족하도록 합니다.

세이비어 초기화를 사용하게 되면 여러 층의 기울기 분산 사이에 균형을 맞추게 되어 어느 특정층이 집중되거나 다른 층이 뒤처지는 것을 막을 수 있습니다. 하지만 세이비어 초기화는 시그모이드 함수와 같은 S함수에서는 성능이 우수하지만 ReLU함수와 사용할 경우 성능이 좋지 못합니다. ReLU 함수와 함께 사용했을 때 성능이 좋은 초기화 방법이 바로 다음에 소개할 He 초기화입니다.

 

   3.2 He 초기화(He Initialization)

He 초기화 방법은 세르비아 초기화와 마찬가지로 균등 분포, 정규분포 두 개로 나뉩니다. 하지만 He초기화에서는 세이 비어 초기화와 다르게 다음 층의 뉴런 개수를 고려하지 않습니다. 균등 분포를 따르도록 초기화할 경우 아래의 범위를 갖도록 합니다.

정규분포를 따르도록 초기화할 경우에는 평균이 0이고 표준편차가 아래 식을 만족하도록 합니다.

앞서 언급했듯이 He 초기화는 ReLU계열의 함수와 매우 좋은 성능을 보입니다. 앞으로 ReLU + He 초기화의 조합을 자주 보게 될 것입니다.

4. 배치 정규화

배치 정규화란 인공신경망의 각 층에 들어가는 입력을 평균과 분산으로 정규화하여 학습을 더욱 효율적으로 하는 방법입니다. 배치 정규화를 하는 이유는 바로 내부 공변량의 변화 때문입니다.  내부 공변량의 변화란 각 층별로 입력 데이터의 분포가 달라지는 현상을 말합니다. 이전 입력 분포로 학습을 진행했던 현재 층은 새롭게 변한 입력 분포의 변화로 인해 기존의 학습했던 분포와 차이가 발생하게 됩니다. 이로 인해 딥러닝 모델이 불안정하게 됩니다. 이를 극복하기 위해 제안된 방법이 배치 정규화입니다. 배치 정규화는 각 층에서 활성화 함수를 통과하기 전에 이루어집니다.

(배치 정규화의 효과가 내부 공변량 때문은 아니라는 논문도 있습니다.)

배치 정규화는 m개의 데이터로 이루어진 하나의 미니 배치에 대하여 미니 배치 안 데이터의 평균과 분산을 구하여 위와 같이 정규화합니다. 이후 r를 스케일을, B를 통해 shift를 수행하여 다음 층에 일정 범위의 값들만 전달합니다. r, B는 모두 학습해야 되는 매개변수이며 학습 시 각 미니 배치마다 r, B를 구하여 저장하고 테스트 시에는 저장된 값들을 사용합니다.

 

이렇게 배치 정규화를 사용하게 되면 가중치 초기화에 덜 민감해지고 과적합을 방지하며, 높은 학습률을 통해 학습 속도를 개선할 수 있다는 장점이 있습니다. 하지만 미니 배치의 크기가 너무 작으면 오히려 잘 작동하지 않고 RNN에 적용하기 어렵다는 단점이 있습니다. 


이렇게 기울기 손실/ 폭주와 같이 학습률을 저해시키는 요인에 대하여

이를 방지할 수 있는 다양한 방법에 대하여 학습해보았습니다.

이제 다음부터는 ComputerVision의 꽃은 CNN에 대하여

본격적으로 학습해보도록 하겠습니다.

반응형

'모두를 위한 딥런닝 by PyTorch' 카테고리의 다른 글

Lab-8 CNN  (0) 2021.09.06
Lab-07-1 DNN  (0) 2021.08.24
Lab-06 Softmax Classification  (0) 2021.08.14
Lab-05 Logistic Regression  (0) 2021.08.12
Lab-04-2 Minibatch Gradient Descent  (0) 2021.08.09