🤖 AI/ML

ReLU

Rectified Linear Unit

가장 널리 쓰이는 활성화 함수. 음수를 0으로 변환.

📖 상세 설명

ReLU(Rectified Linear Unit, 정류 선형 유닛)는 딥러닝에서 가장 널리 사용되는 활성화 함수입니다. 수식은 f(x) = max(0, x)로, 입력이 양수면 그대로 출력하고, 음수면 0을 출력합니다. 단순하지만 효과적이어서 현대 신경망의 기본 구성 요소가 되었습니다.

ReLU는 2010년 Nair와 Hinton이 제안했으며, 2012년 AlexNet의 성공으로 널리 채택되었습니다. 이전에 사용되던 Sigmoid, Tanh 함수는 기울기 소실(Vanishing Gradient) 문제가 있었지만, ReLU는 양수 영역에서 기울기가 1로 일정하여 이 문제를 크게 완화했습니다.

ReLU의 핵심 장점은 계산 효율성과 기울기 전파입니다. max(0, x) 연산은 매우 빠르고, 양수 영역에서 기울기가 1이므로 깊은 네트워크에서도 학습이 잘 됩니다. 또한 희소성(Sparsity)을 유도하여 네트워크의 표현력을 높입니다.

실무에서는 기본 ReLU 외에도 Leaky ReLU, PReLU, ELU, GELU 등 변형이 많이 사용됩니다. 특히 Transformer 기반 모델에서는 GELU가 표준이 되었고, CNN에서는 여전히 ReLU가 기본입니다. Dying ReLU 문제를 인지하고 적절한 초기화와 정규화를 함께 사용하는 것이 중요합니다.

💻 코드 예제

다양한 활성화 함수의 PyTorch 구현 및 비교입니다.

import torch
import torch.nn as nn
import matplotlib.pyplot as plt

# 입력 범위
x = torch.linspace(-3, 3, 100)

# 활성화 함수들
activations = {
    "ReLU": nn.ReLU(),
    "LeakyReLU": nn.LeakyReLU(0.1),  # 음수 기울기 0.1
    "ELU": nn.ELU(alpha=1.0),
    "GELU": nn.GELU(),  # Transformer에서 사용
    "SiLU/Swish": nn.SiLU(),  # x * sigmoid(x)
}

# 각 활성화 함수 적용
results = {name: fn(x) for name, fn in activations.items()}

# 신경망에서의 사용 예시
class ConvBlock(nn.Module):
    def __init__(self, in_ch, out_ch, activation="relu"):
        super().__init__()
        self.conv = nn.Conv2d(in_ch, out_ch, 3, padding=1)
        self.bn = nn.BatchNorm2d(out_ch)

        # 활성화 함수 선택
        if activation == "relu":
            self.act = nn.ReLU(inplace=True)
        elif activation == "gelu":
            self.act = nn.GELU()
        elif activation == "leaky":
            self.act = nn.LeakyReLU(0.1, inplace=True)

    def forward(self, x):
        return self.act(self.bn(self.conv(x)))

# 모델에서 활성화 함수 확인
model = nn.Sequential(
    ConvBlock(3, 64, "relu"),
    ConvBlock(64, 128, "relu"),
)
print(f"ReLU 활성화 함수 사용 블록: {model}")

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"CNN은 ReLU가 기본이지만, Transformer는 GELU를 씁니다. 모델 아키텍처에 맞는 활성화 함수를 선택해야 해요."
💬 면접에서
"ReLU의 장점은 계산 효율성과 기울기 소실 완화입니다. 단점은 Dying ReLU 문제인데, Leaky ReLU나 적절한 초기화로 해결할 수 있어요."
💬 기술 토론에서
"GELU는 x * Phi(x) 형태로 부드러운 곡선을 가져 Transformer에서 더 좋은 성능을 보입니다. GPT와 BERT 모두 GELU를 사용해요."

⚠️ 흔한 실수 & 주의사항

Dying ReLU 무시: 학습률이 너무 높으면 뉴런이 영구적으로 0을 출력하게 됩니다. He 초기화와 적절한 학습률을 사용하세요.
출력층에 ReLU 사용: 회귀 문제에서 음수 예측이 필요한 경우 출력층에 ReLU를 쓰면 안 됩니다. 출력층은 태스크에 맞게 선택하세요.
BatchNorm과 함께 사용: BatchNorm은 입력을 정규화하여 Dying ReLU를 방지합니다. Conv-BN-ReLU 순서가 일반적입니다.

🔗 관련 용어

📚 더 배우기