BERT 개념이해 #6 GeLU

BERT 개념이해 #5 GeLU #

#2026-03-04


#1 GELU가 필요한 이유: Linear만 쌓으면 “아무리 깊어도 한 장짜리”가 된다

먼저 가장 중요한 사실부터 다시 확인해보자. Linear는 입력을 섞어서 새 벡터를 만들지만, 그 자체는 어디까지나 선형 변환이다. 선형 변환을 두 번 연속으로 하면 어떤 일이 생기냐면, 겉보기에는 레이어가 두 개지만 실제로는 하나의 큰 행렬로 합쳐진다. z = W₂(W₁x)는 결국 z = (W₂W₁)x가 된다. 레이어를 10개 쌓아도 마찬가지다. 결국 모델은 “직선으로만” 세상을 나누는 수준에서 벗어나지 못한다. 언어는 직선으로 나뉘지 않는다. “it”이 누구를 가리키는지, “not … because …” 같은 구조가 어떤 의미를 만드는지, 이런 건 선형 결합만으로는 충분히 표현하기 어렵다. 그래서 Linear와 Linear 사이에 “한 번 꺾어주는 장치”, 즉 비선형 활성화 함수가 반드시 필요하다. GELU는 트랜스포머에서 그 역할을 맡는 대표적인 비선형 함수다.

문제: Linear만 쌓으면
  Layer 1: y = W₁x
  Layer 2: z = W₂y = W₂W₁x = Ax  ← 하나의 Linear!

  10개를 쌓아도 여전히 선형 모델
  → "직선"으로만 분류 경계를 그릴 수 있음

해결: 비선형 함수 삽입
  Layer 1: y = f(W₁x)   ← f: 비선형 함수
  Layer 2: z = g(W₂y)
  → 더 이상 합쳐지지 않음
  → 복잡한 비선형 경계 학습 가능

활성화 함수를 가장 직관적으로 이해하는 방법은 ‘게이트’라고 생각하는 것이다. Linear가 재료를 섞어서 어떤 신호를 만들어냈다면, 활성화 함수는 그 신호를 보고 “이 신호를 다음으로 얼마나 보낼까?”를 결정한다. 완전히 보내기도 하고, 완전히 막기도 하고, 그 중간 정도만 보내기도 한다. 이 게이팅이 있어야 모델은 “조건부 규칙”을 만들 수 있다. 예를 들어 “이 특징이 일정 수준 이상이면 강하게 반응하고, 그렇지 않으면 반응하지 않는다” 같은 규칙은 선형만으로는 만들기 어렵지만, 활성화 함수가 들어가면 가능해진다. 언어에서 이런 조건부 판단은 너무 흔하다. 그래서 트랜스포머의 FFN에서 활성화 함수는 사실상 “복잡한 패턴을 만드는 엔진”에 가깝다.

ReLU는 아주 단순하다. 입력이 0보다 크면 그대로 통과시키고, 0보다 작으면 0으로 만들어버린다. 그래서 마치 스위치를 ON/OFF 하는 느낌이다. 이 단순함 덕분에 빠르고 강력하지만, 동시에 부작용이 있다. 음수 영역은 완전히 차단되니까 음수에 담긴 정보는 사라진다. 그리고 어떤 뉴런이 계속 음수만 출력하게 되면 영원히 0만 내놓는 “죽은 뉴런”이 될 수 있다. 또한 x=0에서 함수가 꺾이기 때문에 미분이 매끈하지 않다.

GELU는 같은 “통과/차단” 목적을 가지면서도 더 부드럽게 작동한다. 음수라고 해서 무조건 0으로 만들지 않는다. 대신 “음수면 대부분 막되, 아주 약하게는 남겨둔다”는 식으로 처리한다. 그래서 경계가 매끈하고, 음수 신호도 조금은 흐르게 해서 정보가 완전히 끊기지 않는다. ReLU가 칼로 자르는 느낌이라면, GELU는 볼륨을 서서히 줄이는 느낌이다.

#

#2 주요 활성화 함수 비교

ReLU(x) = max(0, x)

장점: 단순, 빠름, 그래디언트 소실 감소
단점:
  x < 0이면 항상 0 → "죽은 뉴런(dead neuron)" 문제
  x=0에서 미분 불연속 (경사 하강에 문제)
  음수 입력에 대한 정보 완전 소실
Sigmoid(x) = 1 / (1 + e^(-x))

단점:
  |x|가 크면 그래디언트 ≈ 0 → 그래디언트 소실
  출력 범위 (0,1): 항상 양수 → 편향 이동(bias shift)
GELU(x) = x · Φ(x)
  Φ(x): 표준 정규분포의 누적 분포 함수(CDF)

특징:
  ReLU처럼 양수를 통과시키지만 경계가 부드러움
  음수도 조금은 통과 (완전히 막지 않음)
  x = -0.17 근처에서 살짝 음수 가능

#

#3 GELU의 한 줄 정의: “입력 x에 통과 확률 Φ(x)를 곱한 값”

GELU의 핵심 수식은 GELU(x) = x · Φ(x)다. 여기서 Φ(x)는 표준정규분포의 누적분포함수(CDF)다. CDF는 “정규분포에서 값이 x 이하일 확률”이니까, x가 작으면 Φ(x)는 0에 가깝고, x가 크면 Φ(x)는 1에 가까워진다.

이걸 게이트로 해석하면 아주 자연스럽다. 입력 x가 크고 의미 있는 신호라면, Φ(x)가 1에 가까워져서 거의 x를 그대로 통과시킨다. 입력 x가 음수로 내려가면 Φ(x)가 0에 가까워져서 거의 막는다. 그런데 완전히 ‘딱’ 막는 게 아니라, -1 같은 값에서도 Φ(-1)이 약 0.16 정도니까 아주 약하게는 통과시킨다. 그래서 GELU는 “크면 거의 통과, 작으면 거의 차단, 경계는 부드럽게”라는 성질을 가지게 된다.

GELU(x) = x · Φ(x)
        = x · P(X ≤ x)  where X ~ N(0,1)
        = x · (1/2)[1 + erf(x/√2)]

erf: 오차 함수 (error function)
  erf(x) = (2/√π) ∫₀ˣ e^(-t²) dt

Φ(0) = 0.5 이므로:
  GELU(0) = 0 × 0.5 = 0
  GELU(양수): 점점 x에 가까워짐 (Φ→1)
  GELU(음수): |x|×Φ(x) → 0 (Φ→0이지만 x도 음수)

GELU를 더 직관적으로 이해하는 방법은 확률적 해석이다. “입력 x가 주어졌을 때, 이 뉴런이 켜질 확률이 Φ(x)다”라고 생각해보자. x가 2이면 Φ(2)는 0.98쯤이라 거의 항상 켜진다. x가 0이면 Φ(0)=0.5라 반반이다. x가 -2이면 Φ(-2)는 0.02쯤이라 거의 꺼진다. 그러면 x · Φ(x)는 “켜질 확률만큼만 평균적으로 남는 값”, 즉 기대값처럼 해석된다. 그래서 GELU는 ‘확률적으로 게이팅하는 것’을 연속 함수 하나로 매끈하게 표현한 형태가 된다.

이 관점은 Dropout과도 잘 맞는다. Dropout은 확률적으로 뉴런을 꺼서 일반화를 돕는데, GELU는 입력 크기에 따라 확률이 바뀌는, 더 “데이터 적응적인” 게이팅이라고 볼 수 있다. 같은 확률 개념이지만 Dropout은 학습 규제 목적이고, GELU는 표현력 목적이라는 차이가 있다.

GELU의 직관:
  입력 x가 있을 때, 이 뉴런을 켤 확률 = Φ(x)

  Φ(-2) ≈ 0.02 → 2% 확률로 통과 (거의 차단)
  Φ(-1) ≈ 0.16 → 16% 확률로 통과 (조금 통과)
  Φ(0)  ≈ 0.50 → 50% 확률로 통과 (절반)
  Φ(1)  ≈ 0.84 → 84% 확률로 통과 (거의 통과)
  Φ(2)  ≈ 0.98 → 98% 확률로 통과 (통과)

GELU(x) = x × (통과 확률) = 기대값

이는 Dropout과의 연결:
  Bernoulli(Φ(x))로 마스킹 → 기댓값이 GELU
  입력이 클수록 → 더 많이 통과 (데이터 적응적)

#

#4 “음수도 조금 통과”가 왜 도움이 되나: 정보 손실을 완전히 만들지 않기 위해서다

언어 모델에서 음수 값이 의미 없는 값이냐 하면 그렇지 않다. 어떤 차원에서는 “특정 속성이 있음”이 양수, “반대 속성이 있음”이 음수로 표현될 수 있다. ReLU는 음수면 전부 0으로 잘라버리니까, “반대 속성” 신호가 통째로 사라질 수 있다. GELU는 음수 영역에서도 아주 조금은 통과시키기 때문에, 그런 신호가 완전히 죽지 않는다. 그리고 학습 관점에서도, ReLU는 음수 영역에서는 기울기가 0이라 업데이트가 끊기기 쉬운데, GELU는 부드럽게 변화하므로 학습이 더 안정적으로 진행되는 경향이 있다.

# GELU vs ReLU 비교

       x = -2   -1    0    0.5    1      2
ReLU:   0     0    0    0.5   1     2    ← 음수 완전 차단
GELU:  -0.05 -0.16  0    0.35  0.84   1.95 ← 음수도 조금 통과

핵심 차이:
  x = -1:
    ReLU: 0 (완전히 차단)
    GELU: -0.159 (약 16% 통과)
    → 작은 음수 신호도 약간 전달

  x가 매우 음수 (x ≪ 0):
    ReLU: 항상 0 (죽은 뉴런)
    GELU: ≈ 0 (차단하지만 확률적 개념으로)

#

#5 BERT에서 GELU가 쓰이는 위치: FFN의 “비선형 조합 공장” 한가운데

트랜스포머 블록을 떠올리면 Self-Attention이 먼저 나오고, 그 다음에 FFN이 나온다. Self-Attention은 토큰들 사이에서 정보를 어디서 얼마나 가져올지 정하고 섞는 단계다. 반면 FFN은 그 섞인 정보를 가지고 “토큰별로” 복잡한 조합을 만드는 단계다. 여기서 768을 3072로 확장하는 이유는 조합 공간을 크게 만들기 위해서였고, 그 확장된 3072 차원에서 GELU가 작동한다. 즉 GELU는 “확장된 공간에서 수많은 중간 특징들을 켰다 껐다 하며” 비선형 조합을 만들고, 다시 768로 압축될 때 유용한 특징만 남도록 돕는다. 그래서 BERT에서 GELU는 사실상 FFN이 단순한 두 번의 Linear가 아니라 “진짜 표현력을 갖는 모듈”이 되게 만드는 핵심 부품이다.

EnhancedClassifier에서도 같은 논리로 GELU를 쓴다. 768→256으로 줄인 뒤 바로 4로 보내면 너무 직선적인 분류가 되기 쉬운데, GELU를 끼우면 중간층에서 비선형 경계를 만들 수 있어 분류기가 더 유연해진다.

[MLP Sublayer (FFN)]
  Linear  : 768 → 3,072
  → GELU   ← 비선형성 추가
  Linear  : 3,072 → 768
  → Dropout
  → Add (residual)
  → LayerNorm

[EnhancedClassifier]
  Dropout
  Linear  : 768 → 256
  → GELU   ← 비선형성 추가
  Dropout
  Linear  : 256 → 4
왜 FFN에서 GELU를 쓰는가:
  Self-Attention: 선형 변환만 (Q·K는 선형, Softmax는 비선형이지만 정규화 역할)
  FFN: Self-Attention이 놓친 비선형 패턴 포착 담당
  → 반드시 비선형 활성화가 필요
  → GELU가 ReLU보다 성능이 좋음 (BERT 논문 실험 결과)

#

#cf 왜 BERT는 ReLU가 아닌 GELU를 쓰는가

실험 결과 (BERT 논문):
  BERT + ReLU  → GLUE score: 79.3
  BERT + GELU  → GLUE score: 80.5

이유 (추정):
  1. 부드러운 경계:
     ReLU는 x=0에서 꺾임 → 미분 불연속 → 학습 불안정
     GELU는 모든 점에서 미분 가능 → 부드러운 최적화

  2. 음수 정보 보존:
     음수 입력도 작은 신호로 전달
     → "별로 중요하지 않은 특징"도 완전히 버리지 않음

  3. 확률적 해석의 자연스러움:
     신호가 중요할수록 더 많이 통과
     → 데이터에 적응적인 게이팅

#

#7 정리

GELU는 Linear만으로는 만들 수 없는 비선형성을 제공해서, 트랜스포머가 복잡한 언어 패턴을 학습할 수 있게 한다. ReLU처럼 양수는 잘 통과시키되, 경계가 부드럽고 음수도 조금 남겨서 정보가 완전히 끊기지 않는다. 수식으로는 x · Φ(x)라는 형태라 “통과 확률을 곱하는 게이트”로 해석할 수 있고, 이 확률적 직관 덕분에 트랜스포머의 FFN에서 특히 자연스럽게 작동한다. 결국 GELU는 트랜스포머에서 “비선형 조합을 만들고 학습을 매끈하게 하는 핵심 스위치”라고 보면 된다.

  • GELU = 입력값에 따라 통과 확률이 달라지는 부드러운 게이팅
  • 수식: GELU(x) = x · Φ(x) (Φ: 표준 정규 CDF)
  • ReLU와 달리 음수 입력도 일부 통과 → 죽은 뉴런 문제 없음
  • 모든 점에서 미분 가능 → 부드러운 역전파
  • BERT에서 FFN(768→3072→768)과 EnhancedClassifier(768→256→4)에서 사용
  • ReLU 대비 BERT 성능 더 높음 (BERT 논문 실험 결과)
  • 학습 가능한 파라미터 없음 (순수한 함수)