본문 바로가기

ML&DL/Deep Learning

더 깊은 네트워크를 위한 Activation function(활성화 함수)

Activation function의 필요성

앞선 포스팅을 통해 perceptron은 fully-connected layer(=dense layer=linear layer)와 sigmoid로 이루어져 있다는 것을 알고있다. perceptron을 아주 많이 쌓게 되면 그것을 DNN(Deep Neural Network)이라고 부른다. 만약 DNN을 이루고 있는 요소 중 sigmoid 함수가 없다면 어떨까? fully-connected layer를 100개를 쌓아도 10000개를 쌓아도 사실 한 층을 쌓은 것과 다를 바 없게 된다. 어차피 선형함수 하나로 표현할 수 있기 때문이다. 그러므로 층을 깊게 쌓는 것이 의미를 갖기 위해서는 sigmoid와 같은 non-linear한 activation function이 필요하다.

 

Sigmoid보다 ReLU가 더 좋다.

많은 딥러닝 모델들이 activation function으로 대부분 ReLU를 쓰고 있다. 그 이유를 알아보자. Sigmoid 함수는 값이 어느정도 작으면 0으로 수렴하고 어느정도 크면 1로 수렴한다. 이는 node를 켜고 끄는 개념을 위해서 도입되었으나 실제로 DNN에 적용하면 문제가 발생한다. 그 이유는 함수가 0에서 1사이의 값을 가지기 때문이다. 이것을 적용하면 계속 0.~값이 나오게 되고 chain rule을 적용했을 때 이 값이 계속 곱해져나가며 gradient가 사라지는 vanishing gradient문제가 발생한다. 결론적으로 학습이 되지 않는다. 

(추가적인 문제점으로는 계산량이 많다는 것과 중앙값이 0이 아닌 0.5라는 점이 있다.)

 

 

이를 해결한 activation function이 ReLU이다. 생각보다 굉장히 간단하다. 0보다 작은 값이 나오면 아예 노드를 꺼버리고 그렇지 않으면 그 값을 그대로 가져가도록 한다.

 

 

그럼 relu는 linear인데 어떻게 non-linearity를 줄 수 있나? 라는 의문이 생기게 된다. Multi-layer의 activation으로 ReLU를 사용하게 되면 단순히 Linear한 형태에서 더 나아가 Linear한 부분 부분의 결합의 합성함수가 만들어진다. 그래서 linear한 결합구간구간을 최종적으로 봤을 때 non-linear한 성질을 가진다.

 

하지만 역시 ReLU에도 문제점이 존재한다. 0보다 작은 값을 가질 때 아예 0으로 만들어버린다는 것이다. 어쩌면 0보다 작은 값도 유의미한 정보를 가질 수 있기 때문에 이 값을 약하게 살려보자라는 취지의 여러가지 ReLU의 변형 함수들도 등장하였다.