새소식

Study/Today_I_Learned

[딥러닝] 핵심개념(2) - 모델의 최적화

  • -
728x90

핵심 개념 둘째날은 모델의 최적화 방법에 대해 공부했습니다. 
하루하루 복습이 밀리고 있지만.. 최선을 다하는 중

3. 다층 퍼셉트론 Multi-layer perceptron

Single layer perceptron을 통해서는 OR 혹은 AND 문제를 선형 함수 1개로 분류하여 풀 수 있었지만, XOR 문제는 풀 수 없었습니다. 

출처: t.ly/8bFH

하지만 2중 perceptron을 이용한다면 다음과 같이 구분이 가능합니다. 

X1 X2 and(~X1, X2) and(X1, ~X2) Y (predict)
0 0 0 0 0
0 1 1 0 1
1 0 0 1 1
1 1 0 0 0

이처럼 퍼셉트론을 모은 layer들의 다층으로 구성하면 보다 복잡한 모델이 되면서, 어려운 모델을 풀 수 있도록 발전하였습니다. 
다층 퍼셉트론 또한 일종의 artificail neural network, ANN입니다. 

출처: t.ly/3cif

인공신경망의 구성요소는 크게 
Input layer / Hidden layer (learnable kernels) / Output layer 
로 분류할 수 있습니다. 

  • Input layer: 외부로부터 데이터를 입력받는 신경망 입구의 layer
  • Hidden layer: input layer와 output layer 사이의 모든 layer들 
    이 hidden layer로 들어오고 나가는 연산들이 사실상 딥러닝의 주인공이며, 모델이 결정하고 업데이트하는 parameter 들입니다. 
  • Output layer: 모델의 최종 연산 결과를 내보는 신경망 출구 
    회귀regression 문제를 풀고 싶다면 output layer에서  결과값을 그대로 출력하고,
    이진 분류binary classification 의 경우 sigmoid 함수를 거쳐 한 class 에 속할 확률을 계산할 수도 있습니다. 

Forward propagation & Back propagation algorithm

input layer로부터 시작해서 output layer에서 결과를 얻기까지, 두가지 방향으로 학습을 진행시킬 수 있습니다.


Forward propagation이란 Input layer에서 순방향으로 계산하며, 노드들간의 연결이 loop나 cycle을 이루지 않습니다. 
feedforward 신경망의 학습은 원하는 결과를 얻기 위해 neuron 들 사이의 적당한 가중치 weight들을 알아내는 것입니다. 
인공신경망에서 Hyper parameter는 다음과 같습니다. 

  • 레이어 개수
  • 뉴런 개수
  • 활성화 함수의 종류

하지만 hidden layer에서 neuron의 수가 너무 많으면 과대적합이 발생하고, 너무 적으면 과소적합이 발생합니다. 
머신러닝은 높은 성능을 낼 수 있도록 하는 초기 세팅 방법과의 싸움이라면, 딥러닝은 오버피팅과의 싸움이라고 합니다. 

Back propagation algorithm, 오차 역전파 알고리즘은 레이어가 복잡해질수록 연산이 복잡해지면서 효율이 떨어지는 문제를 해결하기 위해, 학습된 출력값과 실제값의 차이인 오차를 역방향으로 전달하여 parameter를 업데이트시키는 알고리즘입니다. 
한 개의 hidden layer 에서는, 틀린 정도를 미분하여 곱하고 더하는 것을 역방향으로 전달하며 parameter의 업데이트는 이 과정을 반복하며 이루어집니다. 
 하지만 레이어가 깊어질수록, sigmoid 함수로 인한 문제가 발생합니다. Vanishing gradient로 불리는 이 문제는 sigmoid 함수의 도함수의 최댓값이 0.25이기 때문에, 0.25보다 작은 숫자를 거듭해서 곱해질 때 오차 값이 점점 사라지면서 학습 속도가 느려지거나 학습이 중지되어 버리는 현상입니다. 하지만 이런 현상은 activation function을 ReLU function 으로 바꾸면서 해결됩니다. 

4. 인공신경망의 최적화

Vanilla Gradient Descent - 가장 기본적인 인공신경망의 경사하강법을 통한 신경망의 학습 과정은 다음과 같습니다. 
1. 모든 파라미터 초기화 
2. cost function 이 최솟값을 가지는 지점을 향해 반복하며
3. gradient descent method를 적용해 파라미터를 업데이트
데이터 분석을 공부하면 할수록 느끼는 것은, 세상에 왕도는 없고 어떤 방법이든 개선시킬 점이 있다는 점입니다. 
신경망의 성능을 어떻게하면 더 높일 수 있는지 그 방법론에 대해서 아래와 같이 알아보도록 하겠습니다. 

최적화 방법 1) 가중치 초기화 weight initizalization 

Gradient descent 적용의 첫 단계는 모든 Parameter의 초기화입니다. 
가중치를 너무 작은 값으로 초기화하게 되면 입력값들이 점점 작아져 0에 가까워지므로 backpropagation에 문제가 발생합니다. 하지만 그렇다고 너무 큰 값으로 지정하게 되면 활성화 함수로부터 출력된 값이 -1 혹은 +1 만 나오는 대참사가 일어날 수 있습니다. (참고 링크) 그래서 우리는 가중치를 너무 크지도, 작지도 않은 값으로 초기화해주어야 합니다. 수업시간에서는 가장 널리 알려진 두 가지 방법을 배웠습니다. 

  • Xavier initialization 
    Glorot initialization 이라고도 함
    평균이 0, 표준편차가 $ \sqrt{\frac{1}{n}} $ 인 정규분포를 따르도록 가중치를 초기화 
        → n : 이전 레이어의 노드 개수, 노드 개수가 많으면 편차가 작아지게 함
    활성화 함수로 sigmoid 혹은 $tanh$ 함수를 사용할 때 적용 (텍스트 데이터)
    다수의 딥러닝 라이브러리의 default
    *활성화함수가 ReLU일 경우 음수인 결과값이 0이 되므로 적절하지 않음
  • He initialization
    평균이 0, 표준편차가 $ \sqrt{\frac{2}{n}} $ 인 정규분포를 따르도록 가중치를 초기화

이런 가중치 초기화의 목적은 해당 레이어 출력값의 분포가 너무 넓거나 너무 좁아지지 않도록 해주기 위함입니다. 

최적화 방법 2) 가중치 규제 weight regularization (혹은 파라미터 규제)

가중치를 업데이트하는 궁극적인 목적은 예측값과 실제값의 오차가 최소화되도록, 즉 cost function의 함숫값이 최소가 되도록하여 신경망이 예측을 잘하도록 만들어주기 위함입니다. 하지만 우리의 신경망은 training data만을 활용해 학습을 진행하고 있으므로, 이 cost function만을 기준으로 하여 gradient descent 방법을 적용하면 오버피팅이 일어날 가능성이 높습니다.

출처:t.ly/5Ok9

위 그림의 오른쪽 그림은 테스트 데이터에 대해 오버피팅된 모델의 그래프입니다. 왼쪽의 그림보다 각 점에서의 기울기가 가파른 것을 확인할 수 있습니다. 즉, 모델이 복잡해진다는 것은 모델의 수식에서 parameter의 개수가 증가하고, 각 파라미터의 계수의 절댓값이 증가함을 의미합니다. 이렇게 복잡해지는 것을 막기 위해, 파라미터 $\theta$ 에 관한 함수를 cost function에 더해준다면 cost function이 과한 최솟값을 가지게 되는 것을 막을 수 있을 것입니다. 
$J(\theta) = MSE + \lambda R(\theta)$
강의에서는 다음과 같이 두 가지의 $R(\theta)$ 를 배웠습니다. 

  • L1 regularization - Lasso
    가중치의 절댓값의 합에 비례한 페널티
     관련성이 매우 낮은 feature의 가중치를 0으로 유도해 feature selection 효과를 얻을 수 있음 
  • L2 regularization - Ridge
    가중치의 제곱의 합에 비례한 페널티
    큰 값을 가진 가중치에 더 큰 제약을 줌
    전반적인 Overfitting을 줄이는데 효과적

Lasso / Ridge 를 절충하여 적용한 모델인 Elastic net이라는 방법도 있다고 합니다. 

출처:t.ly/5Ok9

위 그림에서 빨간 선은 3차원 공간에 있는 cost function을 위에서 쳐다봤을 때 함수의 등고선으로 이해하면 됩니다. 
\hat{W}는 규제를 적용하기 전 cost function에서의 최솟값이고, 이 지점에서 모델이 오버피팅된 경우  \hat{W} 에서의 파라미터인 W_{1} 와 W_{2}를 선택하지 않습니다. 그 대신, 규제를 적용하여 새롭게 얻은 파라미터인 초록색 도형과 cost function이 만나는 지점의 W_{1} 와 W_{2}를 사용합니다.
이때 Hyper parameter인 $ \lambda $ 는 초록색 도형 안의 넓이를 결정해 줍니다. 
*L1 & L2 regularization 을 weight decay, 가중치 감퇴/감소라고 부르기도 합니다. 

최적화 방법 3) Advanced gradient descent algorithm

 기존의 GD를 적용하기 위해서는 전체 training data (full batch)를 통으로 학습하고 오차를 계산해야하므로 입력되는 데이터가 많으면 파라미터의 업데이트가 오래 걸릴 수밖에 없습니다. 
이렇게 시간이 많이 걸리는 기존 GD 모델을 1차적으로 개선한 최적화 방법은 Stochastic Gradient Descent입니다. 
전체 데이터를 1번 학습 후 가중치를 업데이트하는 기존 방법과 달리, 1개의 데이터를 1 개의 batch 로 설정하여 (batch size = 1) 매번 gradient descent를 적용하는 방법입니다.

  • 장점
    데이터가 너무 많을 때 기존 모델보다 학습 속도가 빠름
  • 단점
    매번 weight를 갱신하기 때문에 신경망의 성능이 안정적으로 증가하지 않음
    최적의 learning rate를 구하기 위해 지속적으로 튜닝이 필요하고, early-stop조건 조정이 필요함

 Mini-batch stochastic Gradient Descent 는 GD와 SGD를 절충한 방법으로, training data에서 일정한 크기(batch size)의 데이터를 선택하여 cost function을 계산하고 GD를 적용해줍니다. batch size는 hyper parameter이므로 설계자가 적당한 크기의 배치 사이즈를 결정함으로써 효율적으로 모델의 성능을 높일 수 있습니다. 
$ batch size \times iteration = 1 epoch $

이 외에도 gradient descent method는 다양합니다. Pytorch 공식문서에는 다음과 같은 최적화 알고리즘 외에도 다양한 optimizer들이 구현되어 있습니다.

  • Adadelta
  • Adagrad
  • Adam
  • SparseAdam
  • Adamax
  • RAdam
  • SGD
728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.