굴러가는 분석가의 일상

딥러닝의 구조 #2 [활성화 함수] 본문

Deep Learning 이해

딥러닝의 구조 #2 [활성화 함수]

G3LU 2023. 11. 9. 13:38

본 게시물은 공부목적으로 작성 되었으며,  밑바닥부터 시작하는 딥러닝 참고하였습니다.  

퍼셉트론의 원리

활성화 함수에 Deep-Dive하기 앞서, 퍼셉트론의 원리에 대해 간략하게 알아보겠습니다. 

 

퍼셉트론 동작원리

 

그림과 같이 퍼셉트론의 동작은 x1,x2, 1 이라는 3개의 신호가 뉴런에 입력되고, 각 신호에 가중치를 곱한 후, 다음 뉴런으로 전달되게 됩니다. 이러한 신호들의 합이 0을 넘으면 1을 출력하고, 그렇지 않는다면 0을 출력하게 됩니다. 

 

이를 통해 단층 퍼셉트론 구조는 활성화 함수로 계단 함수를 사용한다는 것을 파악할 수 있습니다. 또한, 비선형적/선형적 영역을 구분하기 위해, Sigmoid 함수 등 여러가지의 활성화 함수가 소개 되었습니다. 


활성화 함수란?

 

"퍼셉트론에서 활성화 함수로 계단 함수를 이용한다?" 그렇다면, 도대체 활성화 함수는 무엇일까? 

 

 

 

 

가중치가 달린 입력 신호와 편향의 총합을 계산하고, 이를 a라고 하겠습니다. 그리고 a를 함수에 넣어 y를 출력하는 흐름입니다.

 

즉, 입력신호의 총합을 출력 신호로 변환하는 함수를 활성화 함수라고 합니다. 


선형 함수 vs. 비선형 함수

 

활성화 함수를 설명할 때 비선형 함수와 선형 함수라는 용어가 자주 등장합니다. 이때 선형 함수는 곧은 1개의 직선으로 그릴 수 있는 함수이고, 비선형 함수는 직선 1개로 그릴 수 없는 함수를 뜻합니다. 

 

그렇다면, 신경망 (다층 퍼셉트론)에서 선형 함수/비선형 함수 중 어떤 것을 사용해야 할까요??? 

 

신경망을 구축하는데, 선형 함수를 사용하게 된다면, 신경망의 층을 깊게 구성하는 이유가 없어지기 때문입니다.  즉, "은닉층이 없는 네트워크"와 똑같은 기능을 한다는 것 입니다. 예시를 통해 알아보도록 하겠습니다. 

 

활성화 함수가 3층으로 이루졌다면, 이와 같이 표현할 수 있습니다. 

 

 

이처럼, 1층으로 구성된 네트워크와 다른점이 없다는 것입니다.

 

※ 모델의 복잡도를 극대화하기 위해서, 반드시 비선형 함수를 사용해야만 층을 쌓는 혜택을 볼 수 있습니다. 


활성화 함수 종류 

즉, 활성화 함수는 전달 함수에서 전달받은 값을 출력할 때, 일정 기준에 따라 출력 값을 변화시키는 것 (비선형 함수) 입니다. 비선형 함수인 Sigmoid, ReLU 등 알아보도록 하겠습니다. 

 

Sigmoid (시그모이드) 

 

시그모이드 함수는 선형 함수의 결과를 0~1 사이에서 바선형 형태로 변형합니다. 주로 Logistic Regression와 같은 문제를 확률적으로 표현하는데 사용 되었습니다. 하지만, 시그모이드 함수는 다층 신경망의 결정적인 혁신입니다. 다층 신경망 같은 경우, 학습을 할때 Backpropagation (오류역전파) 알고리즘을 통해 Gradient Descent (경사하강법)을 사용하게 됩니다. 이때 경사하강법에는 활성화 함수가 differentiable (미분)이 가능해야 합니다. 하지만 시간에 흐름에 따라, 딥러닝의 Layer 수가 점차 증가하면서 발생하는 Vanishing Gradient (기울기 소실) 문제로 인하여 딥러닝에서는 효율적이지 않게 되었습니다. 

 

Hyperbolic Tangent (하이퍼볼릭 탄젠트)

 

하이퍼볼릭 탄젠트는 선형 함수의 결과를 -1~1 사이에서 비선형 상태로 변형해줍니다. Sigmoid 함수에서 결괏값의 평균이 0이 아닌 양수로 편향된 문제를 해결하였지만, 여전히 Vanishing Gradient 문제를 해결하지는 못했습니다. 

 

ReLU (렐루) 


렐루 함수는 주로 Hidden Layer (은닉층)에서 사용됩니다. 입력(x)가 음수일 때는 0을 출력하고, 양수일 때는 x를 출력하게 됩니다. Gradient Descent에 영향을 주지 않아 학습 속도가 상대적으로 빠르고, Hyperbolic Tangent 및 Sigmoid와 같이 Vanishing Gradient 문제가 발생하지 않는 장점을 가지고 있습니다. 하지만 ReLU 함수 또한 문제점을 가지고 있습니다. 음수일 때 항상 0을 출력하기 때문에 학습 능력이 급속하게 감소합니다. 이를 해결하기 위해 탄생한 것이 Leaky ReLU 함수입니다. 

 

 Leaky ReLU

 

ReLU함수와 Leaky ReLU의 차이점을 한번 생각해보시길 바랍니다!!! 생각보다 굉장히 간단합니다! 

 

Softmax (소프트맥스) 

 

 

Softmax 함수는 입력 값을 0~1사이에 출력되도록 정규화하여 출력 값들의 총합이 항상 1이 되도록 합니다. 소프트맥스 함수는 딥러닝에서출력 노드로 많이 활용되는 활성화 함수 중에 하나입니다. 다항 분포의 posterior 추정이 가능하므로, multi-class 문제에 적절하게 사용될 수 있다는 장점이 있습니다. 

 

Softmax 함수의 수식은 다음과 같습니다. 

 

 

이처럼 소프트맥스는 지수함수 (exponential function)으로 표현 되어있습니다. 그렇다면 도대체 왜 상수를 e로 사용하는 것 일까요? 

  • 단순히 미분 값이 CLEAN & 꺨끔 → Gradient Descent 용이 
  • 입력 벡터의 구분 (큰 값은 크게, 작은 값은 작게) 

Pytorch 사용한 ReLU 및 Softmax 구현

import torch.nn

class Net(torch.nn.Module):
    def __init__(self,n_feature, n_hidden, n_output):
        super(Net,self).__init__()
        #Hidden Layer (은닉층) 
        self.hidden = torch.nn.Linear(n_feature, n_hidden)
        self.relu = torch.nn.ReLU(inplace=True)
        #Input Layer (출력층) 
        self.out = torch.nn.Linear(n_hidden,n_output)
        self.softmax = torch.nn.Softmax(dim = n_output)
    def forward(self, x):
        x = self.hidden(x)
        #은닉층을 위한 렐루 활성화 함수
        x = self.relu(x)
        x = self.out(x)
        #출력층을 위한 렐루 활성화 함수
        x = self.softmax(x)
        return x