인공지능 모델 오픈소스를 보다보면 항상 'ReLU' 가 있는 걸 볼 수 있습니다. 보통 딥러닝을 처음 공부할 때는, sigmoid나 softmax 등 다른 activation function도 많이 배우게 되죠. 근데 왜 대부분 ReLU 를 쓰는 걸까요?
오늘 이 글에서는 왜 ReLU가 많이 쓰이는지, ReLU는 어떤 한계가 있는지를 같이 설명해 보겠습니다. 이 글에서 다뤄볼 내용의 순서는 아래와 같습니다.
Vanishing Gradient 문제
ReLU
Leaky ReLU
ReLU의 의문점
1. Vanishing Gradient 문제
ReLU 전에는 Sigmoid를 활성화 함수로 많이 사용했습니다. 이 때는 위의 그림에서 보이는 것처럼 x 값이 커지거나 작아질수록 미분값(기울기)이 0이 되는 걸 볼 수 있습니다. 아무래도 Sigmoid는 0에서 1로 값이 나오는 형태이다 보니 이럴 수밖에 없었겠죠.
그럼 이런 식으로 미분값이 0이 되면 뭐가 문제일까요? 모델 가중치(weight)가 업데이트 되지 않게 되는 문제가 생깁니다. 즉 학습이 잘 안되는 문제가 생기는 거죠. 이 문제를 해결하기 위해 나온 게 ReLU 입니다.
2. ReLU
ReLU는 수식으로 표현하면 max(x, 0)의 형태인데요. 값(x)이 0보다 크면 그 값 그대로 출력하고, 0보다 작으면 0으로 바꿉니다. 근데 이 상황이면, 미분값인 f'(x)가 양수일 때는 1로 유지되는데 음수일 때는 계속 0인 걸 볼 수 있습니다. 이 말은 즉 어떤 layer의 모든 노드 미분값이 0이 나오게 된다면? weight 업데이트가 안되는 문제가 생긴다는 얘깁니다. 이걸 Knockout 이라고도 하는데 결국 Sigmoid와 비슷한 문제죠. 이 문제를 해결하기 위해 나온 게 LeakyReLU입니다.
3. LeakyReLU
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 적용 시 잘되는 경우 많았음 → 쓰다보니 잘돼서 다들 사용
왜 음수를 버렸을까?
제가 생각해봤을 때는 2가지 이유인 것 같습니다.
1) 중요한 건 살리자 : 모델 학습 중에도 해당 layer의 어떤 부분(weight)이 중요한가에 집중하게 된다. 그래서 위의 히트맵 이미지처럼 중요한 부분이 더 강조되게 된다. (모든 레이어의 모든 weight는 동등하게 중요한 게 아님) 그래서 가장 중요한(값이 큰) weight를 강조하려고 양수를 살린 것 같습니다.
2) 중요하지 않은 건 버리자
: 사람인지 아닌지 분류하는 Task 라고 한다면, 돌고래가 나왔을 때 이건 noise로 봐야 합니다. 하지만 이런 모든 것들을 고려해서 -로 계산하기에는 고려할 게 너무 많습니다. 그래서 계산 효율성 때문에 버린 것 같아요.
저는 그동안 "대부분 ReLU를 많이 쓰니까" ReLU를 썼던 것 같습니다. 물론 인공지능 분야가 경험적으로 결정된 영역도 많습니다. 하지만 왜 그렇게 됐는지 이유를 알지 못하면 더 개선하기도 어렵습니다. 그래서 당연하다고 느끼는 것도 이렇게 한번씩 스터디 해보면 도움이 많이 되는 것 같아요. 접근 방법을 알았으니 앞으로도 이런식으로 하면, 더 실력이 업그레이드 될 것 같습니다.