본문 바로가기
AI/[DLBasic]모두의 딥러닝(딥러닝의 기본)

[DLBasic] 10 - 1. ReLU : Better non-linearity

by 쵸빙 2020. 1. 19.

     이번 시간부터는 시그모이드보다 더 좋은 ReLU를 배워보도록 하겠다.

 

XOR을 해결하기 위한 NN에서의 sigmoid

     이전에 XOR을 해결하기 위한 NN으로 시그모이드 함수가 쓰였었고, 이런 함수들을 network에서는 activation function이라고 부른다. 그 이유는 network는 서로 연결이 되어있는 구조로, 하나의 값이 그 다음 값으로 전달될 때 어느 값 이상이면 active가 되고 작으면 active가 되지 않기 때문이다.

Layer 2 XOR Neural Network

     2단일 때 구현은 간단하게 위처럼 각각의 weight과 bias를 구해서 L2를 구하고 hypothesis에 넣었다.

 

Layer 3 NN

     위와 같이 3단일 때에도 마찬가지이다. 각각의 weight의 의미는 layer 1에서는 입력 2개, 출력 5개이고

layer 2에서는 입력 5개, 출력 4개, layer 3에서는 입력 4개, 출력 1개로 설정하겠다는 것이다.

또 x와 W1, b1으로 L2를 구하고 그 L2와 W2, b2로 L3를 구하고 그 L3와 W3, b3로 hypothesis를 구하는 것이다.

 

layer 9일 때

     이번에는 9단일 때를 알아보도록 하자. 입력, 출력 모두 5개씩으로 통일하고 서로 연결한 뒤 시그모이드를 사용해서 결과를 구해보았다.

위의 결과를 tensorflow의 tensorboard로 시각화할 수 있다.

   

tensorboard visualization

     복잡한 네트워크를 설계할 때 이렇게 보드로 설계하면 한 눈에 보면서 잘 되는지 확인할 수 있다.

Poor Result

     그런데 9단까지 연결을 했는데 2개보다 떨어지는 결과가 나온다. 왜 이런 일이 벌어질까?

 

tensorboard에서의 cost와 accuracy 통계

     이렇게 backpropagation을 사용할 때 2, 3단의 결과는 잘 학습이 되는데 9, 10단이 넘어가면서 학습이 안 되는 문제점을 발견했다.

 

     저번 시간에 배웠듯이 backpropagation은 전체를 미분하기 어렵기 때문에 각각을 미분해서 점점 곱해나갔다.

직전의 미분값과 현재 local의 미분값을 곱해서 앞으로 넘기는 것이었다.

만약 y가 다른 곳에서 전달된 값이라고 할 때 시그모이드 함수를 거쳐서 0에서 1 사이의 값이 나왔을 텐데 그 시그모이드 함수를 거치기 전의 값이 많이 왜곡될 수도 있다는 문제점이 생긴다. 이렇게 왜곡된 값들이 chain rule을 적용하기 때문에 0.01 * 0.01 이런 식으로 곱해지면서 점점 더 작아지면서 최종 미분 값은 0.00000.... 이런 식으로 점점 더 0에 가까워져서 최종 값에 점점 영향을 미치지 못하게 된다.

 

Vanishing Gradient

     위에서 설명한 문제점을 'Vanishing Gradient'라고 한다. 경사 기울기가 점점 사라진다는 것이다.

최종단 근처에 있는 경사나 기울기는 영향이 있지만 입력단과 가까울수록 최종단에 영향을 거의 미치지 않는다.

그래서 Neural Network가 다시 침체기에 들어서게 된다.

 

그동안의 model의 문제점

     이 문제를 해결하기 위해 분석한 결과 Hinton 교수님은 non-linearity를 위한 잘못된 방법을 적용했다는 문제를 발견하게 된다. 즉, sigmoid를 사용한 것이 잘못된 것이다. 

sigmoid 함수

     시그모이드 함수는 입력값이 무엇이 주어지든 결과가 1보다 작은 양수가 나오므로 곱해지면서 점점 0으로 더 가까이 간다는 문제점이 있었다.

ReLU 함수

    그래서 1보다 작아지지 않게 하려고 만든 것이 ReLU 함수이고, 위에서 보는 것과 같이 매우 단순한 모양을 가지고 있다. 0보다 작으면 비활성화시키고 0보다 클 때 그 값에 비례한 값을 내놓는 것이다.

 

     ReLU는 Rectified Linear Unit의 줄임말이고, 시그모이드 함수 자리에 대신 쓰면 된다.

코드를 작성할 때는 위와 같이 쓰면 된다. ReLU의 구현도 max(0, x)의 형식으로 간단하게 쓸 수 있다.

 

     맨 처음에 나왔던 문제점을 과연 ReLU가 해결했는지 직접 실험해보자. 9단으로 아까와 똑같이 설정하고 시그모이드 함수 대신 ReLU를 사용하지만 맨 마지막 단에서는 0에서 1 사이의 값을 구하기 위해 시그모이드 함수를 사용한다는 것에 주의하자.

 

ReLU의 결과

     결과는 위와 같이 0.5에 비해서 매우 나은 결과인 1.0이 나온 것을 볼 수 있다.

 

     accuracy와 cost 모두 결과가 잘 나오고 있고, 잘 학습이 되는 것을 확인할 수 있다.

 

     할 때마다 결과가 조금 다르긴 하지만 ReLU를 쓰면 시그모이드 함수에 비해서 cost function 결과가 빨리 떨어진다.

 

ReLU 대신 나온 활성화 함수들

     ReLU가 잘 작동하는 것을 보고 Leaky ReLU 등 다른 활성화 함수들도 시도되었다.

Maxout, ELU 모두 조금씩 다른 형태이다. 시그모이드의 단점도 좀 보완해보기 위해 tanh 함수도 가끔 사용된다고 한다.

 

     각각의 방법들의 결과를 비교해본 결과 시그모이드는 아예 수렴이 되지 않고, 기타 방법들이 매우 선전하고 있다.