Pytorch로 시작하는 딥러닝 입문(06-06. 비선형 활성화 함수: Activation function)

2024. 3. 12. 21:28딥러닝 모델: 파이토치

비선형 활성화 함수는 입력을 받아 수학적 변환을 수행하고 출력을 생성하는 함수이다. 앞서 배운 시그모이드 함수, 소프트맥스 함수가 대표적인 활성화 함수 중 하나이다. 

여기서는 인공신경망의 은닉층에서 왜 활성화 함수로 시그모이드 함수를 사용하는 것을 지양해야 하는지를 알아보고, 은닉층에서 주로 사용되는 함수인 ReLU 함수와 그 외의 다른 활성화 함수들을 소개한다. 

♣ 활성화 함수의 특징: 비선형 함수(Nonlinear function)

활성화 함수의 특징은 선형 함수가 아닌 비선형 함수여야 한다는 점이다. f(x) = Wx+b 와 같은 함수에서 W와 b는 상수이다. 이 식은 그래프를 그리면 직선이 그려진다. 이와 다르게 비선형 함수는 직선 1개로는 그릴 수 없는 함수를 의미한다. 

 

인공신경망의 능력을 높이기 위해서는 은닉층을 계속 추가해야 한다. 그런데 선형 함수를 활성화 함수로 사용하게 되면 은닉층을 쌓을 수가 없다. 

 

예를 들어 활성화 함수로 선형 함수를 선택하고, 층을 계속 쌓는다고 가정하자. 활성화 함수는 f(x) = Wx 라고 가정한다. 

여기에 은닉층을 두 개 추가한다고 하면 출력층을 포함해서 y(x) = f(f(f(x)))가 된다. 이를 식으로 표현하면 W×W ×W ×x 이다. 그런데 W의 세제곱값을 k라고 정의하면 y(x) = kx 와 같이 새롭게 표현할 수 있다. 즉, 선형 함수로는 은닉층을 여러 번 추가하더라도 1회 추가한 함수와의 차이를 줄 수 없는 것이다. 

 

선형 함수를 사용한 은닉층을 1회 추가한 것과 연속으로 추가한 것이 차이가 없는 것은 맞지만, 선형 함수를 사용한 층이 아무 의미가 없는 것은 아니다. 학습 가능한 가중치가 새로 생긴다는 점에서 분명히 의미가 있다. 이와 같이 선형 함수를 사용한 층을 활성화 함수를 사용하는 은닉층과 구분하기 위해 선형층(linear  layer) 또는 투사층(projection layer) 등으로 표현한다. 활성화 함수를 사용하는 일반적인 은닉층은 비선형층(nonlinear layer)라고 표현한다. 

 

 

♣ 시그모이드 함수(Sigmoid function)과 기울기 소실

시그모이드 함수를 사용한 인공 신경망이 있다고 가정해보자. 

 

*input의 형태는 1*4이므로 각 feature에 맞는 가중치가 필요해서 가중치는 4개. 

 

인공 신경망에서의 학습 과정은 다음과 같다. 

  • 입력에 대해 순전파(forward propagation) 연산
  • 순전파 연산을 통해 나온 예측값과 실제값의 오차를 손실함수를 통해 계산
  • 손실(loss)을 미분을 통해서 기울기(gradient)를 구하고, 이를 통해 역전파(back propagation) 수행

시그모이드 함수의 문제점은 미분을 해서 기울기(gradient)를 구할 때 발생한다. 

 

시그모이드 함수의 출력값이 0 또는 1에 가까워지면 그래프의 기울기가 완만해진다. 기울기가 완만해지는 구간을 주황색, 그렇지 않은 구간을 초록색으로 나타내보자. 

 

주황색 부분은 기울기를 계산하면 0에 가까운 아주 작은 값이 나온다. 그런데 역전파 과정에서 0에 가까운 아주 작은 기울기가 곱해지면 앞단에는 기울기가 잘 전달되지 않는다. 이러한 현상을 기울기 소실(Vanishing Gradient) 문제라고 한다. 

시그모이드 함수를 사용하는 은닉층의 개수가 다수가 될 경우에는 0에 가까운 기울기가 계속 곱해지면 앞단에서는 기울기를 거의 전파받을 수 없게 된다. 따라서 매개변수 W가 업데이트 되지 않기 때문에 학습이 되지 않는다. 

위의 그림을 보면 출력층과 가까운 은닉층에서는 기울기가 잘 전파되지만 앞단으로 갈수록 기울기 소실 문제로 인해 기울기가 제대로 전파되지 않는 모습을 보여준다. 이 때문에 시그모이드 함수를 은닉층에서 사용하는 것은 지양한다. 

 

또 다른 단점은 시그모이드 함수의 중심값이 0이 아니라 0.5이며 시그모이드 함수의 출력값은 항상 양수라는 점이다. 따라서 시그모이드 함수로 학습하면 값이 지그재그로 움직이는 경향을 보일 수 있다. 이를 해결하기 위해 제안된 것이 하이퍼볼릭탄젠트 함수이다. 

 

 

♣ 하이퍼볼릭탄젠트 함수(Hyperbolic tangent function)

하이퍼볼릭탄젠트 함수는 입력값을 -1과 1 사이의 값으로 변환한다. 그래프를 살펴보자. 

 

 하이퍼볼릭탄젠트 함수는 -1과 1에 가까운 출력값을 출력하는데, 시그모이드 함수와 같은 문제가 발생한다. 하지만 시그모이드 함수와 달리 y축에서 0을 중심으로 하고 있고, 이 때문에 반환값의 변화폭이 더 크다. 그래서 시그모이드 함수보다는 기울기 소실 증상이 적다. (기울기 소실이 아예 없는 것은 아님)

 

 

♣ 렐루 함수(ReLU)

인공 신경망에서 가장 많이 쓰이는 함수로, 수식은 f(x) = max(0, x)이다. 

ReLU 함수는 음수를 입력하면 0을 출력하고, 양수를 입력하면 입력값을 그대로 반환한다. 특정 양수값에 수렴하지 않으므로 깊은 신경망에서 시그모이드 함수보다 훨씬 더 잘 작동한다. 뿐만 아니라 시그모이드 함수와 하이퍼볼릭탄젠트 함수처럼 어떤 연산이 필요한 것이 아니라 단순 임계값이므로 연산 속도도 빠르다. 

 

하지만 여전히 문제점이 존재하는데, 입력값이 음수이면 기울기도 0이 된다는 것이다. 그리고 이 뉴런은 회생하는 것이 매우 어렵기 때문에 이 문제를 죽은 렐루(dying ReLU) 라고 한다. 

 

ReLU 함수는 주로 VGG, DenseNet 등의 인공신경망에서 사용된다. 주로 인공신경망의 앞, 중간 단계에서 사용한다. 

 

 

 

♣ 리키 렐루(Leaky ReLU)

죽은 렐루를 보완하기 위해 ReLU의 변형 함수들이 등장하기 시작했다. Leaky ReLU는 입력값이 음수일 경우 0이 아니라 0.001과 같은 매우 작은 수를 반환하도록 되어 있다. 수식은 f(x) = max(ax, x)로 매우 간단하다. a는 하이퍼파라미터로 Leaky 정도를 결정하며, 일반적으로 0.01의 값을 가진다. 여기서 말하는 Leaky 정도는 입력값이 음수일 때의 기울기를 말한다. 

 

위의 그래프에서 새는 모습을 확실히 보여주기 위해 a를 0.1로 잡았다. 위와 같이 음력값이 음수라도 기울기가 0이 되지 않으면 ReLU는 죽지 않는다. 

 

 

 

♣ 소프트맥스 함수

은닉층에서 ReLU 함수를 사용하는 것이 일반적이지만, 그렇다고 시그모이드 함수나 소프트맥스 함수는 사용하지 않는다는 의미는 아니다. 로지스틱 회귀나 소프트 맥스 회귀를 분류 문제의 출력층에 적용하여 사용한다. 출력층에서 나온 각 클래스로 분류될 확률값을 softmax에 넣어주면 이 값들이 normalize 된다. 

소프트맥스 함수는 시그모이드 함수처럼 출력층의 뉴런에서 주로 사용하는데, 시그모이드 함수가 두 가지 선택지 중 하나를 고르는 이진분류 문제에 사용된다면 소프트맥스 함수는 다중 클래스 분류 문제에 주로 사용된다. 

 

 

♣ 출력층의 활성화 함수와 오차 함수의 관계

은닉층의 활성화 함수로는 ReLU 함수 또는 ReLU 변형 함수를 사용한다. 이와 달리 출력층에서는 문제에 따라 사용하는 활성화 함수와 비용 함수가 다르다. 

*주의할 점: nn.CrossEntropyLoss는 소프트맥스 함수를 이미 포함하고 있다. 

 

 

 

♣ Pytorch로 구현하는 activation function

https://colab.research.google.com/drive/1xF3Ocku16GZ3YEdwMyEjH4d0zRvB1ras

 

Google Colab Notebook

Run, share, and edit Python notebooks

colab.research.google.com