ReLU (Rectified Linear Unit)
ReLU(정류 선형 유닛)는 max(0, x)를 출력하여 양수 입력은 그대로 통과시키고 음수 입력은 0으로 만듭니다. 그래디언트, 죽은 ReLU, 변형 및 PyTorch 코드를 다룹니다.
정류 선형 유닛(ReLU)은 활성화 함수 f(x) = max(0, x)입니다. 양수 입력은 변경 없이 전달하고 나머지 입력에는 0을 출력합니다. 이 간단한 비교 연산만으로도 신경망(NN)은 곡선 형태의 패턴을 학습하는 데 필요한 비선형성을 거의 추가 연산 없이 얻습니다. Vinod Nair와 Geoffrey Hinton이 2010년에 ReLU를 사용하고 ReLU를 기반으로 한 합성곱 신경망(CNN) AlexNet이 2012년 ImageNet 대회에서 우승한 뒤, ReLU는 딥러닝의 기본 은닉 계층 활성화 함수가 되었습니다. SiLU와 GELU 같은 최신 활성화 함수도 여전히 ReLU를 기준으로 평가합니다.
ReLU의 작동 방식#
ReLU의 도함수는 양수 입력에서 1, 음수 입력에서 0입니다. 정확히 0일 때 도함수는 정의되지 않으며 PyTorch와 같은 프레임워크에서는 0을 사용합니다. 이 두 값이 ReLU의 주요 특성을 설명합니다.
- 계산 비용이 낮음: 순전파는 0과 비교하는 연산이고 역전파는 마스크 연산이므로, 시그모이드나 tanh처럼 지수 연산이 필요하지 않습니다.
- 양수 입력에서 포화되지 않음: 기울기가 정확히 1인 활성 유닛은 기울기를 그대로 전달하므로, 오차 신호가 여러 계층을 거슬러 올라가도 줄어들지 않습니다. 이는 포화 함수가 일으키는 기울기 소실 문제를 완화합니다.
- 희소 활성화: 모든 음수 입력은 정확히 0이 되므로 특정 시점에는 계층의 일부만 활성화됩니다. 무작위로 초기화한 가중치에서는 주어진 입력에 대해 계층 유닛의 약 절반이 0을 출력합니다.
- 구간별 선형: ReLU로 구성된 네트워크는 입력에 대해 구간별 선형 함수를 계산하며, 유닛이 켜지거나 꺼지는 지점에서 여러 선형 영역이 연결됩니다.
아래 PyTorch 예제는 nn.ReLU를 적용하고 autograd를 사용해 같은 지점의 기울기를 계산합니다.
import torch
from torch import nn
relu = nn.ReLU()
# Inputs on both sides of zero, tracked so PyTorch can compute gradients
x = torch.tensor([-2.0, -0.5, 0.0, 0.5, 2.0], requires_grad=True)
y = relu(x)
# Backpropagate a gradient of 1 from each output to its input
y.sum().backward()
print(f"Output: {y.tolist()}")
print(f"Gradient: {x.grad.tolist()}")출력 [0.0, 0.0, 0.0, 0.5, 2.0]과 기울기 [0.0, 0.0, 0.0, 1.0, 1.0]을 표시합니다. 양수 입력은 기울기를 그대로 유지한 채 통과하며, 음수 입력과 0에는 기울기가 전혀 전달되지 않습니다. 이 특성이 ReLU의 희소성과 주요 실패 원인의 바탕입니다.
Dying ReLU 문제#
학습 데이터의 모든 예제에서 입력이 음수인 ReLU 유닛은 0을 출력하고 기울기도 0을 받으므로 가중치가 더 이상 바뀌지 않아 사실상 죽은 상태가 됩니다. 유닛은 대개 높은 학습률로 인해 큰 가중치 업데이트가 발생해 편향이 크게 음수가 될 때 죽습니다. 죽은 유닛 몇 개는 영향이 작지만 잘못 조정된 학습 실행은 계층의 상당 부분을 비활성화할 수 있습니다. ReLU 계층의 초기 가중치를 적절히 조정하는 He 초기화와 적절한 학습률 및 배치 정규화를 함께 사용하면 대부분의 유닛을 활성 상태로 유지할 수 있습니다. 기울기가 0에 도달하지 않도록 하는 Leaky 변형은 이 문제를 없앱니다.
ReLU 변형#
- Leaky ReLU: 음수 입력에 일반적으로 0.01인 작은 고정 기울기를 곱해 비활성 유닛에도 기울기가 전달되도록 합니다.
- PReLU: 학습 중에 음수 기울기를 학습합니다. Kaiming He와 동료들은 He 초기화를 제안한 논문에서 2015년에 PReLU를 소개했습니다.
- ReLU6: 출력값을 6으로 제한하는 min(max(0, x), 6)을 사용해 저정밀 연산에서 활성값을 잘 표현할 수 있는 범위로 유지합니다. MobileNetV1과 MobileNetV2에서 사용됩니다.
- ELU: 음수 영역을 −1에서 포화되는 매끄러운 지수 곡선으로 대체해 활성값의 평균을 0에 가깝게 만듭니다.
- SiLU 및 GELU: x · σ(x)와 x · Φ(x) 형태의 매끄러운 곡선으로, 큰 입력에서는 ReLU처럼 동작하지만 작은 음수 값은 통과시키며 0에서 꺾이지 않습니다. 요소당 연산 비용은 더 높지만, GELU 논문은 평가한 모든 비전, 언어, 음성 작업에서 ReLU보다 성능이 향상되었다고 보고했습니다.
ReLU, 시그모이드, tanh 비교#
ReLU가 등장하기 전에는 은닉 계층에서 시그모이드나 tanh를 사용했습니다. 두 함수 모두 포화됩니다. 입력값이 큰 양수 또는 음수이면 곡선이 평평해지고 도함수가 0에 가까워집니다. 시그모이드의 도함수는 가장 가파른 지점에서도 0.25를 넘지 않습니다. 이러한 도함수를 여러 계층에서 곱하면 초기 계층에 전달되는 기울기가 부족해집니다. AlexNet 논문에서 ReLU를 사용한 4계층 CNN은 CIFAR-10에서 tanh 유닛을 사용한 동일한 네트워크보다 6배 빠르게 학습 오류율 25%에 도달했습니다. 시그모이드와 tanh는 값의 범위 제한이 중요한 곳에서 계속 사용됩니다. 시그모이드는 출력 계층에서 확률을 나타내거나 순환 셀의 게이트에 사용되며, tanh는 순환 은닉 상태에 사용됩니다.
최신 모델의 ReLU#
ResNet과 같은 시기의 대부분의 CNN은 전체 계층에서 ReLU를 사용하며, 2017년의 원래 Transformer는 피드포워드 계층에서 ReLU를 사용했습니다. 이후 많은 모델이 더 매끄러운 함수를 채택했습니다. BERT와 비전 Transformer는 GELU를, 최신 대규모 언어 모델 다수는 SwiGLU를 사용합니다. 반면 속도와 하드웨어 지원이 중요한 경우에는 여전히 ReLU를 많이 사용합니다. YOLO26은 기본적으로 Conv 블록에서 SiLU를 사용하며, 모델 YAML의 activation: nn.ReLU() 줄은 학습 전에 모든 Conv 블록의 활성화 함수를 ReLU로 바꿉니다. 이는 SiLU가 아닌 ReLU를 기본 지원하는 AMD Zynq UltraScale+ DPU와 같은 가속기에 적합합니다. PyTorch에서 nn.ReLU(inplace=True)은 결과로 입력 텐서를 덮어써 별도의 출력 텐서에 필요한 메모리를 절약합니다.










