slide-image

딥러닝

[2019-1]

#04

 

이번 시간에는 활성화 함수, 역전파, 가중치 초기화에 대해서 했다.

그치만 역전파는 다음 시간에 더 자세히 한다고 하고, 일단 활성화 함수에 대해서 해보겠다.

 

활성화 함수

일반적으로 뉴럴넷을 구성할 때에, 노드에 들어오는 값들에 대해서 곧바로 다음 레이어로 전달하지 않고 비선형 함수를 통과시킨 후 전달한다. 이 때 사용되는 함수가 활성화(Activation Function)이다.

이름으로 보면, 뭔가 시작 부분에 쓰여야 할 것 같지만, 히든레이어에 쓰이는 함수인 것이다.

 

그렇다면, 왜 활성화 함수는 선형 함수를 사용하지 않는가?

만약 선형 함수를 활성화 함수로 사용하면 여러 층의 은닉 신경망 네트워크를 사용하더라도 결국 식으로 나타내도 어차피 선형이므로 1번 은닉하나 여러번 은닉하나 결과값이 같다.

h(x)=cx라고 할 때, y(x)=h(h(h(x)))=c*c*c*x이기 때문이다. h(x)가 일반적인 선형식 ax+b여도 마찬가지로 계수 값과 상수 값만 바뀔 뿐이다.

즉, 여러 층으로 은닉하는 신경망의 이점(의미있는 값만 걸러내는 역할)을 할 수 없게된다.

 

활성화 함수의 종류에 대해서 살펴보자. 수학식이나 증명없이 그냥 어디에 쓰이는지, 장단점에 대한 이야기만 할 것이다.

 

1. 시그모이드 함수 (Sigmoid function)

: 이진 분류에 적합, 특히 출력층에 적합. 따라서 이진분류 출력층 이외에서는 잘 안쓰임.

양 끝으로 갈수록 경하사강법이 느려서 학습률이 현저히 떨어짐.

 

2. tanh함수 (Hyperbolic tangent function)

: 데이터의 평균을 0으로 맞추어 줌. 따라서 출력층보다는 은닉층에 적합함.

그래프 형태를 보면 알겠지만 시그모이드 함수와 마찬가지로 양 끝으로 갈수록 경사하강법이 느려져 학습률이 떨어짐.

 

3. ReLU함수 (Rectified Linear Unit)

: 그래프를 보듯이 학습 속도가 빠름.

연산 비용이 작고 구현이 간단하지만, x<0인 값들에 대해서는 뉴런 사망 가능(학습이 되지 않음, Dying ReLU 현상)

4. Leaky ReLU함수

ReLU함수와 비슷하지만, Dying ReLU 현상을 해결한 함수.

 

이 외에도 PReLU, ELU, Maxout 함수 등등이 있지만, 거의 ReLU를 개선한 함수들이고 가장 많이 사용하는 것은 ReLU이다.

 

역전파

저번에 했던 편미분으로 최소값을 구할 때 거꾸로 올라갔던 것처럼, 거꾸로 구하는 과정을 역전파 과정이라고 한다.

농구에 빗대어 설명하면, 자유투를 던지는 과정은 순전파(Feed Forward)과정이라고 할수있고, 던진 공이 도착한 지점을 확인하고 거꾸로 던질 위치를 수정하는 과정을 역전파(Backpropagation)과정이라고 할 수 있다.

초록색이 입력값, 파란색이 계산값인데, 처음부터 입력값을 넣으면서 계산하고,

계속 조절을 해나가면서 구하는 과정을 순전파 과정이라고 한다.

이런 식으로 구했었음.

 

위의 그림은 초기 w값이며, 밑의 그림은 갱신된 w값이다. 이런 표시로 지워진 것을 확인할 수 있다.

이렇게 w값을 거꾸로 지워서 다시 갱신시켜서 학습하는 방법을 역전파 과정이라고 한다.

코드로 구한 과정. keepdims는 keep dimension으로 reshape 등 행렬 차원을 명시해야하기 때문에 쓰는 것이라고 하는데..다음 시간에 다시할 것 같다.

 

가중치 초기화

1. 가중치(w) 초기값은 모두 0이어도 안되고, 모두 동일한 값으로 초기화되서도 안된다.

가중치의 초기값이 0이되면, 행렬 symmentric형태가 나온다.

symmetric matrix

또한 역전파 단계에서 뉴런이 모두 동일한 그래디언트(공간에 대한 기울기) 값을 가지게 되고, 뉴런 개수가 아무리 많아도 하나뿐인 것처럼 작동한다. 따라서 각 뉴런은 가중치에 따라 비대칭(랜덤)이어야 한다.

 

2. 가중치 초기값은 큰 난수이면 안된다.

활성화 함수가 sigmoid인 경우 큰 난수 초기값일 시에 그래디언트 소실이 발생하여 어딘가로 확 가버린다. 

또한 활성화 함수가 ReLU인 경우, 절대값이 큰 음수 초기값일 경우 dead ReLU가 되고, 절대값이 큰 양수인 경우 그래디언트 폭주가 일어난다. 따라서 가중치 초기값을 작고 랜덤하게 설정해야 한다.

 

P.S. 어떤 사람은 w초기화를 랜덤*0.01을 한다고 하고, 또 어떤 경우는 다르다고 함.

 

3. 작은 난수라고 해도 표준정규분포를 따르는 값으로 설정하면 안된다.

N(0,1)인 값으로 랜덤 초기화 했을 경우, tanh 함수를 활성화 함수로 사용할 경우에 -1과 1로 쏠리는 현상이 발생한다고 한다.

이렇게 가중치 초기값이 너무 작거나, 어디 쏠리거나 하는 문제 때문에 이쪽 분야가 한참 침체되었지만, 많은 연구로 인해 적당한 가중치 초기화 방법들이 생겼다고 한다.

 

연구된 가중치 초기화 방법들

1. Xavier Initialization (for Sigmoid)

각 레이어의 출력에 대한 분산이 입력에 대한 분산과 같으며, 역전파에서 레이어를 통과하기 전과 후의 그래디언트 분산이 동일해야 한다는 주장을 뒷받침하여 만들어진 초기화 방법이다. 특히 Sigmoid함수를 사용할 때 적합하고, 텐서플로에서는 tf.contrib.xavier._initializer 모듈을 제공하므로 이를 이용해 w초기값을 저장해서 쓰면된다. 

2. He Initialization (for ReLU)

Xavier Initialization은 ReLU에서 레이어가 많아질수록 0으로 쏠리는 현상이 발생한다.

따라서 다른 방법으로 고르게 분포하는 방법이 연구되었으며, 자세한 설명은 생략.

마찬가지로 텐서플로에서는 tf.keras.initializers.he_normal이나 tf.keras.initialzers.he_uniform을 제공하므로 갖다 쓰면 된다.

 

'EVI$I0N > 2019-1' 카테고리의 다른 글

[디지털포렌식] #04  (0) 2019.05.20
[와이어샤크] #04  (0) 2019.05.20
[웹보안] #04  (0) 2019.05.13
[디지털포렌식] #03  (0) 2019.05.13
[와이어샤크] #03  (0) 2019.05.06