GELU (Gaussian Error Linear Unit)
GELU(가우시안 오차 선형 유닛)는 각 입력에 정규 누적 분포 함수를 곱하는 매끄러운 활성화 함수로, BERT, GPT-2, 비전 Transformer에 사용됩니다. 코드도 포함합니다.
가우스 오차 선형 단위(GELU)는 다음과 같이 정의되는 활성화 함수입니다. GELU(x) = x · Φ(x)이며, 여기서 Φ는 표준 정규 분포의 누적 분포 함수입니다. 표준 정규 확률 변수가 입력값보다 작을 확률에 따라 각 입력에 가중치를 적용하므로, 큰 양수 입력은 거의 그대로 통과하고 큰 음수 입력은 거의 0이 되며 0에 가까운 입력은 약 절반으로 축소됩니다. Dan Hendrycks와 Kevin Gimpel은 2016년 논문 Gaussian Error Linear Units (GELUs)에서 GELU를 소개했습니다. GELU는 BERT, GPT-2, GPT-3, 비전 트랜스포머(ViT)와 같은 트랜스포머 모델의 표준 활성화 함수가 되었으며, 각 피드포워드 블록의 두 선형 계층 사이에 배치됩니다.
GELU 작동 방식#
Hendrycks와 Gimpel은 확률적 정규화에서 GELU를 도출했습니다. 각 입력 x에 무작위 마스크를 곱한다고 생각해 보십시오. 이 마스크는 확률 Φ(x)로 입력을 유지하고, 그렇지 않으면 0으로 만듭니다. 이는 입력에 따라 유지 확률이 높아지는 드롭아웃과 비슷합니다. GELU는 이 연산의 기댓값인 Φ(x) · x이므로 입력값에 따라 입력을 부드럽게 조정합니다. 반면 ReLU는 부호에 따라 입력을 급격하게 조정합니다.
결과 곡선에는 학습에 중요한 세 가지 특성이 있습니다.
- 모든 지점에서 매끄러움: GELU와 그 도함수는 연속이며 0에서 꺾이지 않으므로, 역전파 중 가중치가 조금 변해도 출력은 조금만 변합니다.
- 비단조성: 음수 입력의 경우 출력이 먼저 내려갔다가 다시 0을 향해 올라오며, x ≈ −0.75에서 약 −0.17의 최솟값에 도달합니다.
- 음수 입력에 대한 그래디언트: 중간 정도의 음수 입력을 받은 유닛에도 그래디언트가 전달되므로, ReLU 유닛의 학습이 멈추는 상황에서도 계속 학습할 수 있습니다.
Φ에는 오차 함수가 포함되므로 두 가지 근사가 흔히 사용됩니다. tanh 형식인 0.5x(1 + tanh(√(2/π)(x + 0.044715x³)))은 정확한 GELU와의 차이가 약 0.0005 이내이며 GPT-2에서 사용되었습니다. 시그모이드 형식인 x · σ(1.702x)은 차이가 약 0.02 이내이며 OpenAI의 CLIP에서 QuickGELU로 사용됩니다. PyTorch의 nn.GELU는 기본적으로 정확한 형식을 계산하고 approximate="tanh"를 사용하면 tanh 형식을 계산합니다.
import torch
from torch import nn
x = torch.tensor([-3.0, -1.0, -0.75, 0.0, 1.0, 3.0])
# Exact GELU: x * Phi(x), where Phi is the standard normal CDF
exact = nn.GELU()(x)
# Tanh approximation, as used in GPT-2
approx = nn.GELU(approximate="tanh")(x)
print(f"GELU exact: {[round(v, 4) for v in exact.tolist()]}")
print(f"GELU tanh: {[round(v, 4) for v in approx.tolist()]}")
print(f"ReLU: {nn.ReLU()(x).tolist()}")정확한 GELU는 [-0.004, -0.1587, -0.17, 0.0, 0.8413, 2.996]을, tanh 형식은 [-0.0036, -0.1588, -0.17, 0.0, 0.8412, 2.9964]을, ReLU는 [0.0, 0.0, 0.0, 0.0, 1.0, 3.0]를 출력합니다. GELU는 −0.75 근처의 최솟값에서 −0.17을 출력하고, Φ(1) = 0.8413이므로 1을 0.8413에 매핑하며, ±3에서는 ReLU와 거의 일치합니다. 두 GELU 형식은 소수점 넷째 자리에서만 차이가 납니다.
GELU의 사용 사례#
- GPT 모델: OpenAI의 첫 GPT는 2018년에 GELU를 사용했으며 GPT-2와 GPT-3도 이를 유지했습니다.
- BERT: Google의 BERT는 GPT의 뒤를 이어 ReLU 대신 GELU를 선택했으며, 대부분의 BERT 스타일 인코더는 여전히 GELU를 사용합니다.
- 비전 트랜스포머: ViT는 각 인코더 블록의 MLP에서 GELU를 적용하며, ConvNeXt를 비롯한 여러 비전 백본도 이를 따랐습니다. ConvNeXt는 ResNet을 현대화하면서 ReLU를 GELU로 대체했습니다.
- 감지 트랜스포머: Ultralytics 패키지의 RT-DETR에 포함된 AIFI 트랜스포머 인코더는 Baidu의 실시간 감지 트랜스포머로, 두 피드포워드 계층 사이에 GELU를 적용합니다.
최근의 많은 대규모 언어 모델(LLM)은 기본 GELU에서 게이트형 피드포워드 계층으로 전환했습니다. Google의 Gemma는 GELU 활성화 프로젝션에 두 번째 선형 프로젝션을 곱하는 GEGLU를 사용하며, Llama, PaLM, Qwen은 SiLU 기반 SwiGLU를 사용합니다.
GELU와 관련 활성화 함수 비교#
- ReLU: max(0, x)는 연산 비용이 낮고 정확히 0인 출력을 생성하며 0에서 꺾입니다. GELU 논문에서는 테스트한 모든 컴퓨터 비전, 자연어 처리, 음성 작업에서 ReLU와 ELU보다 성능이 향상되었다고 보고했습니다.
- SiLU(Swish): x · σ(x)는 전체적으로 GELU와 같은 형태를 갖지만, 약 −0.28로 더 깊은 최솟값을 가집니다. 트랜스포머에서는 일반적으로 GELU를, 합성곱 감지기에서는 SiLU를 더 많이 사용합니다.
- Leaky ReLU: 음수 입력에 고정된 직선 기울기를 유지합니다. 반면 GELU는 음수 영역에서 곡선을 그리며 0으로 돌아옵니다.
- GEGLU: 게이트형 변형은 학습 가능한 두 번째 프로젝션을 추가합니다. Noam Shazeer가 2020년 T5에서 수행한 비교에서 GEGLU 피드포워드 계층의 검증 로그 주변도는 1.633으로, 매개변수 수가 같을 때 GELU의 1.679와 ReLU의 1.677보다 낮았습니다.










