새소식

딥러닝, 머신러닝

딥러닝 Activation Function, 왜 ReLU만 쓰나요?

  • -

인공지능 모델 오픈소스를 보다보면 항상 'ReLU' 가 있는 걸 볼 수 있습니다. 보통 딥러닝을 처음 공부할 때는, sigmoid나 softmax 등 다른 activation function도 많이 배우게 되죠. 근데 왜 대부분 ReLU 를 쓰는 걸까요?

 

 

오늘 이 글에서는 왜 ReLU가 많이 쓰이는지, ReLU는 어떤 한계가 있는지를 같이 설명해 보겠습니다. 이 글에서 다뤄볼 내용의 순서는 아래와 같습니다.

 

  1. Vanishing Gradient 문제
  2. ReLU
  3. Leaky ReLU
  4. ReLU의 의문점

 

 

1. Vanishing Gradient 문제

sigmoid, softmax (activation function 종류)

 

ReLU 전에는 Sigmoid를 활성화 함수로 많이 사용했습니다. 이 때는 위의 그림에서 보이는 것처럼 x 값이 커지거나 작아질수록 미분값(기울기)이 0이 되는 걸 볼 수 있습니다. 아무래도 Sigmoid는 0에서 1로 값이 나오는 형태이다 보니 이럴 수밖에 없었겠죠.

 

 

그럼 이런 식으로 미분값이 0이 되면 뭐가 문제일까요? 모델 가중치(weight)가 업데이트 되지 않게 되는 문제가 생깁니다. 즉 학습이 잘 안되는 문제가 생기는 거죠. 이 문제를 해결하기 위해 나온 게 ReLU 입니다.

 

 

 

2. ReLU

ReLU  (activation function 종류)

ReLU는 수식으로 표현하면 max(x, 0)의 형태인데요. 값(x)이 0보다 크면 그 값 그대로 출력하고, 0보다 작으면 0으로 바꿉니다. 근데 이 상황이면, 미분값인 f'(x)가 양수일 때는 1로 유지되는데 음수일 때는 계속 0인 걸 볼 수 있습니다. 이 말은 즉 어떤 layer의 모든 노드 미분값이 0이 나오게  된다면? weight 업데이트가 안되는 문제가 생긴다는 얘깁니다. 이걸 Knockout 이라고도 하는데 결국 Sigmoid와 비슷한 문제죠. 이 문제를 해결하기 위해 나온 게 LeakyReLU입니다.

 

 

 

3. LeakyReLU

LeakyReLU  (activation function 종류)

import torch.nn as nn

nn.LeakyReLU(negative_slope=0.05)

 

pytorch 코드로는 이런 식으로 작성되는데요. 음수의 기울기를 받아서 음수값을 얼마나 반영할지 결정합니다. 그래서 LeakyReLU는 음수값도 반영할 수 있기 때문에 ReLU의 문제점을 해결하게 되죠.

 

 

하지만 "그래도 왜?" 대부분 ReLU를 쓰는 걸까요? 사실 ReLU의 Knockout 문제가 실제로 생기는 경우가 거의 없다고 합니다. 또한 연산 비용도 LeakyReLU에 비해 훨씬 낮죠.

 

 

이런 걸 보면 인공지능은 수학이 중요하긴 한데 "경험적인 영역이 되게 크다"는 느낌도 드네요.

 

 

 

4. ReLU의 의문점

"음수값은 정말 의미가 없을까?"

 

저는 이런 의문이 들었습니다. 그래서 관련 히스토리를 좀 찾아봤더니 이런 결론이 나왔습니다.

 

 

  • 왜 다 ReLU를 쓸까?
    : 2012년 AlexNet이 챌린지 우승 → AlexNet은 ReLU를 썼고, 이후 ReLU 적용 시 잘되는 경우 많았음 → 쓰다보니 잘돼서 다들 사용

  • 왜 음수를 버렸을까?

Heatmap, 레이어 히트맵

제가 생각해봤을 때는 2가지 이유인 것 같습니다.

 

1) 중요한 건 살리자
: 모델 학습 중에도 해당 layer의 어떤 부분(weight)이 중요한가에 집중하게 된다. 그래서 위의 히트맵 이미지처럼 중요한 부분이 더 강조되게 된다. (모든 레이어의 모든 weight는 동등하게 중요한 게 아님) 그래서 가장 중요한(값이 큰) weight를 강조하려고 양수를 살린 것 같습니다.

 

2) 중요하지 않은 건 버리자

: 사람인지 아닌지 분류하는 Task 라고 한다면, 돌고래가 나왔을 때 이건 noise로 봐야 합니다. 하지만 이런 모든 것들을 고려해서 -로 계산하기에는 고려할 게 너무 많습니다. 그래서 계산 효율성 때문에 버린 것 같아요.

 

 

 

저는 그동안 "대부분 ReLU를 많이 쓰니까" ReLU를 썼던 것 같습니다. 물론 인공지능 분야가 경험적으로 결정된 영역도 많습니다. 하지만 왜 그렇게 됐는지 이유를 알지 못하면 더 개선하기도 어렵습니다. 그래서 당연하다고 느끼는 것도 이렇게 한번씩 스터디 해보면 도움이 많이 되는 것 같아요. 접근 방법을 알았으니 앞으로도 이런식으로 하면, 더 실력이 업그레이드 될 것 같습니다. 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.