본문으로 바로가기

GELU 활성화 함수: 공식, 직관, 그리고 딥러닝에서의 활용

GELU는 부드럽고 확률적인 활성화 함수로, 심층 아키텍처에서 ReLU 같은 단순 대안보다 더 나은 성능을 보여주며 BERT와 GPT 같은 트랜스포머 모델의 기본 선택이 되었습니다.
업데이트됨 2026년 5월 4일  · 8분 읽다

활성화 함수는 신경망을 통과할 신호와 차단될 신호를 결정합니다. 잘못 선택하면 모델은 학습이 매우 느리거나 일반화에 실패할 수 있습니다. ReLU는 빠르고 대부분의 작업에 충분히 좋아 오랫동안 합리적인 기본값이었습니다.

GELU(Gaussian Error Linear Unit)는 그 흐름을 바꿨습니다. BERT와 GPT를 포함해 지금까지 구축된 가장 강력한 모델들 뒤에 있는 활성화 함수가 되었습니다.

이 글에서는 GELU의 직관, 공식, 다른 활성화 함수와의 비교, 그리고 실제로 어디에 사용하는지를 다룹니다.

머신 러닝의 활성화 함수가 완전히 처음이라면, 저희의 초보자를 위한 정류 선형 유닛(ReLU) 가이드를 읽어 보세요.

GELU 활성화 함수란?

GELU, 즉 Gaussian Error Linear Unit은 입력의 크기에 따라 부드럽고 확률적인 방식으로 가중치를 부여하는 활성화 함수입니다.

대부분의 활성화 함수는 신호를 통과시킬지 차단할지 이분적으로 결정합니다. 예를 들어 ReLU는 음수는 모두 0으로 만들고 나머지는 그대로 통과시킵니다. GELU는 다르게 작동합니다. 임계값으로 자르지 않고, 입력이 크거나 작은 정도에 따라 부드럽게 스케일합니다. 즉, 작은 음수 값도 출력에 기여할 수 있습니다.

ReLU와의 차이는 GELU가 어디서나 매끄럽고 연속적이라는 점입니다. 0에서의 날카로운 꺾임도, 급격한 전환도 없습니다. 이런 매끄러움은 학습 중에 최적화기가 더 깔끔한 기울기 정보를 얻게 해 도움이 될 수 있습니다.

GELU의 직관

GELU를 모든 입력을 똑같이 대하지 않는 필터라고 생각해 보세요.

ReLU는 단순합니다. 음수는 무엇이든 매번 0으로 만듭니다. 반면 GELU는 “이 입력 값이 얼마나 유용할 가능성이 있는가?”를 묻습니다. 분명히 크고 양수인 값은 거의 변형 없이 통과됩니다. 작거나 음수인 값은 완전히 잘라내지 않고 축소됩니다.

그 결과, 덜 관련 있는 신호를 완전히 버리지 않고 억제하는 부드러운 곡선을 얻게 됩니다.

예를 들어, 채용 지원서를 검토한다고 상상해 보세요. 엄격한 필터는 학위가 없는 사람을 예외 없이 제외합니다. 더 똑똑한 필터는 관련 경험으로 보완할 수도 있다고 보고 기준에 근접한 지원자도 고려합니다. GELU는 더 똑똑한 필터처럼 작동합니다. 엄격하게 잘라내기보다 입력의 크기에 따라 가중치를 부여해 얼마나 통과시킬지 결정합니다.

이러한 점진적이고 확률적인 스케일링이 GELU의 차별점입니다. 급격한 전환도, 죽은 뉴런도 없습니다. 각 입력 값에 대해 부드럽게 통과 또는 억제 결정을 내릴 뿐입니다.

GELU 공식

정확한 GELU 공식은 가우시안 누적분포함수(CDF)에 기반하며, 다음과 같이 표기합니다:

Gaussian cumulative distribution function

Gaussian cumulative distribution function

여기서 x는 입력 값이고, Φ(x)는 표준 정규분포에서 추출한 확률변수가 x 이하일 확률입니다. 쉽게 말해, Φ(x)는 입력 값이 얼마나 “정상적”이고 예상 가능한지를 알려줍니다. GELU는 그 확률을 사용해 입력을 스케일합니다.

입력이 클수록 Φ(x)는 1에 가까워져 입력이 거의 변형 없이 통과합니다. 입력이 작을수록 Φ(x)는 0에 가까워져 입력이 억제됩니다.

실무에서 사용하는 근사식

정확한 공식의 문제는 Φ(x) 계산이 비쌉니다. 폐형식이 없는 오차 함수가 포함되어 대규모 계산에서 느립니다.

딥러닝 프레임워크는 대신 다음 근사식을 사용합니다:

GELU approximation formula

GELU approximation formula

이 근사식은 현대 하드웨어에서 빠르고 잘 지원되는 tanh를 사용합니다. 실무에서 중요한 입력 범위 전반에 걸쳐 결과는 정확한 공식과 거의 동일하기 때문에, PyTorch와 TensorFlow 같은 프레임워크에서 기본으로 사용됩니다.

물론 두 공식을 외울 필요는 없습니다. 하지만 근사식이 존재하는 이유를 알면 코드에서 GELU를 호출할 때 실제로 무슨 일이 일어나는지 이해하는 데 도움이 됩니다.

GELU와 다른 활성화 함수 비교

각 활성화 함수는 입력을 다르게 처리하며, 이러한 차이는 모델 학습 성능에 반영됩니다.

설명을 텍스트로 하기 전에, 시각적으로 보면 다음과 같습니다:

GELU versus other activation functions graph

GELU versus other activation functions graph

Sigmoid

Sigmoid는 모든 입력을 0과 1 사이로 압축합니다. 매끄럽지만 잘 알려진 문제가 있습니다. 바로 기울기 소실입니다. 매우 크거나 작은 입력에 대해 기울기가 0에 가까워져 깊은 층의 학습이 멈춥니다. GELU는 더 넓은 입력 범위에서 유의미한 기울기를 유지하므로 이 문제가 덜합니다.

Tanh

Tanh는 Sigmoid와 비슷하지만 0을 중심으로 하고 출력이 -1과 1 사이입니다. 음수 입력을 Sigmoid보다 잘 처리하지만, 극단에서는 여전히 기울기 소실이 있습니다. GELU는 더 부드러운 출력 곡선을 만들어 깊은 네트워크 전반에 더 나은 기울기 흐름을 제공합니다.

ReLU

ReLU는 빠르고 단순합니다. 양수 입력은 그대로 통과하고 음수 입력은 0으로 만듭니다. 0에서의 날카로운 절단이 이른바 죽은 뉴런 문제를 일으킵니다. 시간이 지나면서 항상 음수 입력만 받는 뉴런은 완전히 업데이트가 중단됩니다. GELU는 음수 입력을 잘라내지 않고 스케일링하여 이를 피합니다.

Leaky ReLU

Leaky ReLU는 음수 입력의 일부를 통과시켜 죽은 뉴런 문제를 완화합니다. ReLU보다 한 단계 나아갔지만, 0에서의 전환은 여전히 날카롭습니다. GELU는 전체적으로 더 부드러운 곡선을 만들어, 기울기 품질이 더 중요한 심층 구조에서 더 잘 작동하는 경향이 있습니다.

요약하면, 이 다섯 가지 활성화 함수의 차이는 다음과 같습니다:

GELU versus other activation functions table

GELU versus other activation functions table

트랜스포머에서 GELU를 사용하는 이유

트랜스포머도 결국 심층 신경망입니다. 네트워크가 깊어질수록 기울기 품질이 더 중요해집니다.

BERT와 GPT 같은 모델은 수십 개의 층을 쌓습니다. 그 깊이에서는 작은 기울기 흐름 문제도 누적됩니다. 활성화 함수가 특정 구간에서 불안정하거나 거의 0에 가까운 기울기를 만든다면, 네트워크의 앞쪽 층은 학습 중 거의 업데이트되지 않아 많은 것을 배우지 못합니다.

GELU는 더 넓은 입력 범위에서 기울기를 부드럽고 0이 아니게 유지해 이를 피합니다. ReLU처럼 0에서 잘라내지 않으므로 출력층 근처만이 아니라 모든 층에서 최적화기가 더 깔끔한 신호를 받습니다.

트랜스포머 아키텍처에 GELU가 잘 맞는 또 다른 이유가 있습니다. 

트랜스포머는 주의(attention) 메커니즘을 통해 양수와 음수를 아우르는 다양한 범위의 활성 값을 생성합니다. 이러한 범위를 부드러운 활성화 함수가 날카로운 전환이 있는 함수보다 더 잘 처리합니다.

원래 BERT 논문에서 저자들은 ReLU 대신 GELU를 선택했고, 벤치마크에서 더 나은 결과를 보고했습니다. GPT도 같은 선택을 따랐습니다. 그 이후로 GELU는 트랜스포머 기반 아키텍처의 기본 활성화가 되었는데, 새롭기 때문이 아니라 이 모델들이 작동하는 규모에서 더 잘 맞기 때문입니다.

실무에서의 GELU

모델에서 GELU를 쓰는 것은 다른 활성화 함수들을 쓰는 것만큼 간단합니다. PyTorch와 TensorFlow 모두 기본 지원합니다.

PyTorch

PyTorch에서는 GELU를 독립 모듈로 적용하거나 모델 정의 안에서 인라인으로 사용할 수 있습니다. 다음은 GELU를 사용하는 간단한 피드포워드 블록입니다:

import torch
import torch.nn as nn

class FeedForwardBlock(nn.Module):
    def __init__(self, input_dim, hidden_dim):
        super().__init__()
        self.fc1 = nn.Linear(input_dim, hidden_dim)
        self.act = nn.GELU()
        self.fc2 = nn.Linear(hidden_dim, input_dim)

    def forward(self, x):
        return self.fc2(self.act(self.fc1(x)))

block = FeedForwardBlock(input_dim=512, hidden_dim=2048)
x = torch.randn(8, 512)
output = block(x)

nn.GELU()는 두 개의 선형 계층 사이에 있으며, 이는 트랜스포머의 피드포워드 서브레이어에서 위치하는 자리와 정확히 같습니다. 첫 번째 프로젝션 이후, 두 번째 프로젝션 이전에 활성화가 적용됩니다.

TensorFlow

TensorFlow에서는 Keras API를 통해 GELU를 사용할 수 있습니다:

import tensorflow as tf
from tensorflow import keras

model = keras.Sequential([
    keras.layers.Dense(2048, input_shape=(512,)),
    keras.layers.Activation("gelu"),
    keras.layers.Dense(512)
])

x = tf.random.normal((8, 512))
output = model(x)

또한 Dense 레이어에 문자열 인수로 직접 전달할 수도 있습니다:

keras.layers.Dense(2048, activation="gelu")

두 방법 모두 동일한 결과를 냅니다.

네트워크에서 GELU의 위치

GELU는 다른 활성화 함수와 같은 위치에 배치합니다. 선형 변환 바로 뒤, 다음 레이어 앞입니다. 트랜스포머 아키텍처에서는 두 개의 밀집 프로젝션 사이에 있는 피드포워드 서브레이어 내부입니다. 다른 심층 네트워크에서는 선형 또는 합성곱 계층 뒤에 배치해 출력을 스케일한 다음 전달합니다.

GELU의 장점

여기까지 읽으셨다면, 다른 활성화 함수와 비교했을 때 GELU의 핵심 장점을 이미 아실 겁니다. 간단히 요약합니다:

  • 부드러운 활성화: GELU는 급격한 전환이 없는 연속적이고 미분 가능한 곡선을 생성해 최적화기가 매 단계 더 깔끔한 정보를 얻습니다.
  • 더 나은 기울기 흐름: GELU는 음수 입력을 0으로 만들지 않으므로 음수 값을 받는 뉴런을 통해서도 기울기가 전파됩니다. 이는 학습 중 뉴런이 죽는 위험을 줄입니다.
  • 심층 모델에서의 성능 향상: 트랜스포머 같은 심층 아키텍처에서는 더 부드러운 기울기의 누적 효과가 단순한 활성화 함수 대비 더 나은 학습 결과로 이어지는 경향이 있습니다.

GELU의 한계

GELU가 모든 상황에 적합한 것은 아닙니다. 알아두어야 할 몇 가지 한계가 있습니다:

  • ReLU보다 계산 비용이 큼: GELU는 오차 함수 또는 tanh 기반 근사식을 포함하며, 둘 다 ReLU의 단순 임계 연산보다 비용이 큽니다. 많은 층을 가진 대형 모델에서는 누적될 수 있습니다.

  • 직관성이 낮음: ReLU처럼 양수는 통과, 음수는 차단과 같이 단순히 이해하기 어렵습니다. GELU의 확률적 스케일링은 해석이 더 어렵습니다.

  • 항상 필요하지는 않음: 얕은 네트워크나 더 단순한 작업에서는 GELU의 이점이 크지 않습니다. ReLU나 Leaky ReLU가 더 낮은 계산 비용으로 비슷하게 잘 동작하는 경우가 많습니다.

결론적으로, 트랜스포머나 다른 심층 아키텍처를 구축한다면 GELU는 훌륭한 기본값입니다. 그 외에는 도입 전에 벤치마크해 보세요.

마치며

GELU는 만능 업그레이드도, ReLU를 대체하는 일괄 해결책도 아닙니다. 특정 문맥—심층 네트워크와 트랜스포머 모델—에서 가치가 있는 신중한 설계 선택입니다.

BERT, GPT 또는 어떤 트랜스포머 기반 모델을 사용하고 있다면, 알든 모르든 이미 GELU를 쓰고 있습니다. 이제 그 이유를 아셨습니다.

그 외의 경우 활성화 함수 선택은 트레이드오프의 문제입니다. 항상 승리하는 단일 함수는 없으며, 각 함수가 무엇을 하는지 이해하는 것이 습관이 아닌 확신을 갖고 선택하는 방법입니다.

여전히 활성화 함수 간의 차이가 혼란스럽다면, 머신 러닝과 MLOps 커리어를 준비할 수 있는 Machine Learning Engineer 트랙에 등록해 보세요.

FAQs

GELU 활성화 함수란 무엇인가요?

GELU(Gaussian Error Linear Unit)는 신경망에서 사용되는 활성화 함수입니다. ReLU와 달리, GELU는 확률적 접근으로 입력의 크기에 따라 부드럽게 스케일합니다. 이는 기울기 품질이 중요한 심층 아키텍처에 더 잘 맞습니다.

GELU는 ReLU와 어떻게 다른가요?

ReLU는 0에서의 단호한 절단으로 모든 음수 입력을 0으로 만들어, 뉴런이 학습을 멈추는 ‘죽은 뉴런’ 문제를 야기할 수 있습니다. GELU는 음수 입력을 잘라내는 대신 점진적으로 축소합니다. 그 결과 기울기 흐름이 더 매끄러워지고 심층 네트워크에서 성능이 향상됩니다.

다른 활성화 함수 대신 언제 GELU를 사용해야 하나요?

GELU는 특히 BERT와 GPT 같은 트랜스포머 기반 모델을 비롯한 심층 아키텍처에서 가장 잘 작동합니다. 얕은 네트워크나 더 단순한 작업에서는 계산 오버헤드가 ReLU에서 전환할 만큼의 이점을 주지 못하는 경우가 많습니다. 기준선으로 ReLU부터 시작하고, 필요하면 테스트하세요.

정확한 GELU 공식과 근사식의 차이는 무엇인가요?

정확한 GELU 공식은 가우시안 누적분포함수를 사용하며, 이는 대규모로 느린 오차 함수 계산을 필요로 합니다. 근사식은 이를 tanh 기반 표현으로 대체해 더 빠르고 현대 하드웨어에서 잘 지원됩니다. 실무에서는 두 결과가 거의 동일해 대부분의 프레임워크가 기본으로 근사식을 사용합니다.

PyTorch와 TensorFlow 모두에서 GELU를 사용할 수 있나요?

네, 두 프레임워크 모두 GELU를 지원합니다. PyTorch에서는 nn.GELU()를 모델 정의 내부의 모듈로 사용할 수 있습니다. TensorFlow에서는 어떤 레이어든 activation 인수에 "gelu" 문자열을 전달하거나, keras.layers.Activation("gelu")를 사용할 수 있습니다.

주제

DataCamp로 학습하세요

courses

Python으로 배우는 차원 축소

4
36.3K
데이터의 차원 축소 개념을 이해하고, Python을 사용해 이를 수행하는 기술을 숙달하세요.
자세히 보기Right Arrow
강좌 시작
더 보기Right Arrow