
활성화 함수는 왜 ReLU로 정착했나
- 21연쇄 법칙으로 기울기를 되돌리는 역전파
- 22활성화 함수는 왜 ReLU로 정착했나읽는 중
- 23SGD에서 Adam까지, 옵티마이저는 무엇을 개선해왔나
- 24신경망 학습을 안정시키는 가중치 초기화와 BatchNorm, Dropout
- 25Accuracy 99%가 거짓말일 때 보는 Precision과 Recall
신경망의 한 층은 두 단계로 나뉜다. 선형 변환 로 입력을 섞고, 활성화 함수 를 씌워 를 내보낸다. 앞쪽 절반은 어느 층이나 똑같다. 층을 깊게 쌓을 수 있느냐 없느냐는 뒤에 붙는 하나가 결정한다.
비선형이 없으면 깊이도 없다
가 항등 함수라면, 즉 를 그대로 내보낸다면 2층짜리 신경망의 출력은 이렇게 전개된다.
, 로 묶으면 다. 두 층을 쌓았는데 결과는 한 층짜리 선형 변환과 같다. 선형 함수를 아무리 합성해도 선형이라서, 100층을 쌓아도 표현력은 한 층과 동일하다.
비선형 활성화 함수는 이 붕괴를 막는 장치다. 그렇다면 어떤 비선형 함수를 골라야 하는가. 그 답은 30년에 걸쳐 바뀌었다.
시그모이드가 세운 벽
출력이 로 떨어지고 어디서나 매끄럽게 미분된다. 도함수도 깔끔하다.
문제는 이 도함수의 크기다. 에서 최댓값을 갖는데 그 값이 다. 1보다 한참 작다.
역전파는 연쇄 법칙으로 기울기를 뒤로 보내면서 층마다 활성화 함수의 도함수를 곱한다. 곱해지는 수가 매번 0.25 이하라면 기울기는 층을 거슬러 올라갈수록 기하급수적으로 줄어든다.
10층만 거슬러 올라가도 기울기가 백만분의 1이 된다. 앞쪽 층의 가중치는 사실상 업데이트되지 않고 학습이 그 자리에 멈춘다. 이것이 기울기 소실(Vanishing Gradient) 이고, 2000년대까지 깊은 신경망을 실용화하지 못한 가장 큰 원인이었다.
게다가 0.25는 최선의 경우다. 가 조금만 커져도 시그모이드는 0이나 1에 붙어버리고 도함수는 0으로 수렴한다. 이 상태를 포화(saturation) 라 한다.
시그모이드에는 문제가 두 개 더 있다. 출력이 항상 양수라 다음 층이 받는 입력의 부호가 한쪽으로 쏠리고, 그러면 한 뉴런에 들어오는 가중치들의 기울기가 모두 같은 부호가 되어 최적화 경로가 지그재그를 그린다. 그리고 계산은 비교 연산보다 비싸다. 수백만 뉴런에 매 순전파마다 적용되면 무시하기 어려운 비용이 된다.
은닉층에 시그모이드를 쓸 이유는 없다. 이진 분류의 출력층에서만 쓴다.
tanh는 4배 나은 출발점이었다
시그모이드를 위아래로 늘려 원점 대칭으로 만든 함수다. 출력이 이라 부호 쏠림이 사라지고, 도함수도 커진다.
최댓값이 1이니 시그모이드의 4배다. 그만큼 기울기가 덜 줄어든다. 하지만 위 그림의 가운데 칸이 보여주듯 가 2.5만 넘어도 도함수가 0.03 아래로 떨어진다. 포화의 벽 자체는 그대로 남아 있다. ReLU 이전까지 은닉층의 기본값이었지만, 깊은 망에서는 결국 같은 곳에서 막혔다.
ReLU가 벽을 통과한 방법
2012년 AlexNet이 ImageNet 대회를 압도하며 딥러닝 시대를 열었을 때, 그 성공의 조용한 지분을 가진 함수다. 양수면 그대로 통과시키고 음수면 0으로 자른다. 도함수는 에서 1, 에서 0이다. 에서는 미분이 정의되지 않지만 구현에서는 0이나 1 하나로 처리한다.
이 단순한 정의가 두 가지를 동시에 해결한다.
기울기가 줄지 않는다. 양의 구간에서 도함수가 정확히 1이므로 층을 몇 개 거치든 이다. 시그모이드가 10층에서 로 사라지는 자리에서 ReLU는 기울기 크기를 그대로 넘긴다.
계산이 거의 공짜다. 지수도 나눗셈도 없고 비교 하나면 끝난다. GPU에서 병렬화하기에도 이보다 나은 형태가 없다. 부수 효과로 입력의 절반 가까이가 0이 되면서 층의 표현이 자연히 희소해진다.
Dying ReLU
대가도 있다. 에서 도함수가 0이라, 어떤 뉴런의 입력이 모든 데이터에서 음수가 되는 상태에 빠지면 그 뉴런은 기울기를 한 방울도 받지 못한다. 가중치가 갱신되지 않으니 그 상태에서 나올 방법도 없다. 영구히 죽은 뉴런이 되는 것이다.
학습률이 크면 한 번의 큰 업데이트가 뉴런을 이 상태로 밀어넣기 쉽다. 학습률을 낮추거나, 아래의 Leaky ReLU 계열로 바꾸는 것이 표준 대응이다.
은닉층은 ReLU에서 시작한다
기울기 보존과 계산 비용, 두 축에서 동시에 유리한 함수는 여전히 ReLU다. 다른 함수는 ReLU로 학습이 안 될 때 꺼내는 카드다.
음의 구간을 되살리는 계열
죽은 뉴런을 막는 가장 직관적인 수정은 음의 구간에 아주 작은 기울기를 남기는 것이다. Leaky ReLU가 그렇게 한다.
음수 입력에서도 도함수가 이므로 갱신량이 0이 되지 않고, 뉴런이 음의 영역에서 되돌아 나올 길이 열린다. PReLU는 이 를 상수로 두지 않고 역전파로 학습시킨다. 층마다 적절한 누출량을 망이 직접 정하는 셈이다.
ELU는 꺾인 직선 대신 지수 곡선으로 음의 구간을 처리한다.
가 작아질수록 에 부드럽게 수렴하므로 출력 평균이 0에 가까워지고, 그만큼 층 사이 신호가 안정된다. 대신 를 계산해야 해서 ReLU의 속도 이점을 일부 반납한다. ELU에 고정 상수 두 개(, )를 곱한 SELU는 조건이 맞으면 층 출력이 스스로 정규화되는 성질을 갖지만, 완전 연결 망과 특정 초기화를 요구해서 CNN이나 트랜스포머에서는 쓰이지 않는다.
부드럽게 여닫는 GELU와 Swish
ReLU는 0을 기준으로 통과와 차단을 이분법으로 가른다. GELU(Gaussian Error Linear Unit) 는 그 경계를 확률로 문지른다.
는 표준정규분포의 누적분포함수다. 입력에 “이 값이 통과할 만큼 큰가”의 확률을 곱하는 구조라, 가 크면 거의 그대로 나가고 작으면 거의 0이 된다. 정규분포 CDF를 매번 계산하는 비용이 부담이라 실전에서는 근사식을 쓴다.
경계 부근이 매끄러워 미세한 입력 차이가 출력 차이로 남고, 가 살짝 음수인 구간에서 출력이 아주 조금 음수가 되는 비단조 구간을 갖는다. BERT, GPT, ViT를 비롯한 트랜스포머 계열에서 사실상 기본값이다.
Swish는 같은 발상을 더 싸게 구현한다. 정규분포 CDF 자리에 시그모이드를 넣는다.
가 크면 이라 항등 함수처럼, 작으면 이라 차단처럼 동작한다. EfficientNet 계열의 비전 모델에서 ReLU를 대체해 성능 향상을 보였다.
한눈에 비교
| 함수 | 정의 | 출력 범위 | 도함수 최댓값 | 기울기 소실 | 계산 비용 |
|---|---|---|---|---|---|
| Sigmoid | 0.25 | 심각 | 높음 | ||
| Tanh | 1 | 있음 | 높음 | ||
| ReLU | 1 | 없음 () | 매우 낮음 | ||
| Leaky ReLU | 1 | 없음 | 매우 낮음 | ||
| ELU | 또는 | 1 | 없음 | 중간 | |
| GELU | 약 | 약 1.13 | 없음 | 중간 | |
| Swish | 약 | 약 1.10 | 없음 | 중간 |
출력층은 다른 문제다
여기까지는 은닉층 이야기다. 출력층의 활성화 함수는 기울기 흐름이 아니라 출력이 무엇을 의미해야 하는가로 정해진다.
다중 클래스 분류에는 Softmax를 쓴다. 개의 점수를 모두 양수로 만든 뒤 합이 1이 되도록 나눠서 확률로 바꾼다.
이면 는 각각 7.389, 2.718, 1.105이고 합이 11.212다. 나누면 가 된다.
Softmax 출력층에는 교차 엔트로피 손실이 짝을 이룬다. 두 함수를 합쳐서 미분하면 중간 항이 모두 상쇄되고 이 형태만 남기 때문이다.
예측에서 정답을 뺀 값이 그대로 기울기가 된다. 구현이 짧아지는 것은 물론이고, 지수와 로그가 서로를 지워서 수치적으로도 안정적이다.
Softmax를 직접 구현한다면 지수를 취하기 전에 최댓값을 빼야 한다. 가 조금만 커도 가 부동소수점 범위를 넘어 inf가 되는데, 모든 원소에서 같은 상수를 빼면 분모와 분자가 함께 나뉘어 결과는 그대로이면서 지수의 크기만 눌린다. NumPy로는 np.exp(z - np.max(z)) 한 줄이다.
무엇을 언제 쓰나
| 자리 | 선택 | 근거 |
|---|---|---|
| 은닉층 기본 | ReLU | 기울기 보존과 계산 비용 |
| 죽은 뉴런이 의심될 때 | Leaky ReLU, PReLU | 음의 구간에도 기울기 |
| 트랜스포머 계열 | GELU | 경계 부근의 부드러운 게이팅 |
| 이진 분류 출력층 | Sigmoid | 값 하나를 확률로 |
| 다중 분류 출력층 | Softmax | 개 확률의 합이 1 |
| 회귀 출력층 | 없음 | 실수 전 범위가 필요 |
PyTorch의 nn.Linear도 TensorFlow의 Dense도 기본값은 활성화 없음이다. 어느 쪽이든 직접 지정하지 않으면 선형 층만 쌓이고, 이 글 첫머리의 붕괴가 그대로 일어난다.
마치며
활성화 함수를 고르는 문제는 결국 “역전파에서 곱해질 수를 얼마로 둘 것인가”의 문제였다. 시그모이드는 그 수의 상한이 0.25였고, 그래서 깊이가 곧 학습 불가능을 뜻했다. tanh가 상한을 1로 올렸지만 포화 구간은 남았다. ReLU는 필요한 구간에서 그 수를 정확히 1로 고정해 문제를 없앴고, 대신 반대편 절반을 완전히 포기했다. Leaky ReLU와 GELU는 포기한 절반을 조금씩 되찾는 서로 다른 방식이다.
활성화 함수를 정했다면 다음 질문은 계산된 기울기를 어떤 규칙으로 파라미터에 반영할 것인가다. 학습률 하나로 모든 파라미터를 똑같이 움직이는 방식에는 한계가 있다.
함께 보면 좋은 글
- 역전파 : 활성화 함수의 도함수가 층마다 곱해지는 과정
- 옵티마이저 : 전달된 기울기를 어떤 규칙으로 쓸지의 문제
- 신경망 학습 안정화 : 초기화와 정규화로 층 사이 신호 크기를 잡는 법
- 로지스틱 회귀 : 시그모이드가 확률로 해석되는 자리
참고자료
- Glorot, Bordes, Bengio, Deep Sparse Rectifier Neural Networks (AISTATS 2011)
- He et al., Delving Deep into Rectifiers (arXiv 1502.01852)
- Hendrycks, Gimpel, Gaussian Error Linear Units (arXiv 1606.08415)
- Ramachandran et al., Searching for Activation Functions (arXiv 1710.05941)
- CS231n, Neural Networks Part 1