Przejdź do głównej treści

Funkcja aktywacji GELU: wzór, intuicja i zastosowanie w głębokim uczeniu

GELU to gładka, probabilistyczna funkcja aktywacji, która przewyższa prostsze alternatywy, takie jak ReLU, w architekturach głębokiego uczenia i stała się domyślnym wyborem w modelach transformatorowych, takich jak BERT i GPT.
Zaktualizowano 4 maj 2026  · 8 min Czytać

Funkcje aktywacji decydują, które sygnały przechodzą przez sieć neuronową, a które nie. Przy błędnym wyborze model uczy się zbyt wolno albo nie potrafi uogólniać. Przez lata rozsądnym domyślnym wyborem był ReLU, bo był szybki i wystarczająco dobry w większości zadań.

GELU (Gaussian Error Linear Unit) to zmienił. To obecnie funkcja aktywacji stojąca za jednymi z najpotężniejszych modeli, w tym BERT i GPT.

W tym artykule omówię intuicję stojącą za GELU, jego wzór, porównanie z innymi funkcjami aktywacji oraz to, gdzie faktycznie warto go używać w praktyce.

Jeśli Pan/Pani dopiero zaczyna z funkcjami aktywacji w uczeniu maszynowym, proszę przeczytać nasz wpis Przewodnik dla początkujących po funkcji Rectified Linear Unit (ReLU).

Czym jest funkcja aktywacji GELU?

GELU, czyli Gaussian Error Linear Unit, to funkcja aktywacji, która waży wejścia na podstawie ich wielkości, stosując gładkie, probabilistyczne podejście.

Większość funkcji aktywacji podejmuje decyzję: przepuścić sygnał albo go zablokować. Na przykład ReLU zeruje wszystko, co ujemne, a resztę przekazuje bez zmian. GELU działa inaczej. Zamiast twardego progu, skaluje wejścia płynnie w zależności od ich wielkości, co oznacza, że nawet niewielkie wartości ujemne mogą wciąż wnosić wkład do wyjścia.

Różnica względem ReLU polega na tym, że GELU jest gładki i ciągły w całej dziedzinie. Nie ma ostrego załamania w zerze ani gwałtownych przejść. Ta gładkość może mieć znaczenie podczas treningu, bo daje optymalizatorowi czytelniejsze informacje o gradientach.

Intuicja stojąca za GELU

Proszę myśleć o GELU jak o filtrze, który nie traktuje wszystkich wejść jednakowo.

ReLU jest toporny — wszystko, co ujemne, jest zawsze zerowane. Z kolei GELU pyta: „na ile prawdopodobne jest, że dana wartość wejściowa będzie użyteczna?”. Wartości wyraźnie duże i dodatnie przechodzą niemal bez zmian. Wartości małe lub ujemne są skalowane w dół, a nie całkowicie odcinane.

W efekcie otrzymujemy gładką krzywą, która tłumi mniej istotne sygnały, nie wyrzucając ich całkowicie.

Proszę wyobrazić sobie przeglądanie stosu podań o pracę. Surowy filtr odrzuciłby wszystkich bez dyplomu, bez wyjątku. Inteligentniejszy filtr uwzględniłby kandydatów „blisko” spełnienia wymagań, bo mogą mieć doświadczenie, które to rekompensuje. GELU działa jak ten inteligentniejszy filtr. Nie wykonuje ostrych cięć, lecz waży każde wejście na podstawie jego wielkości i decyduje, ile z niego przepuścić.

To stopniowe i probabilistyczne skalowanie odróżnia GELU. Nie ma ostrych przejść ani martwych neuronów — jest tylko płynna decyzja „przepuścić czy stłumić” podejmowana dla każdej wartości wejściowej.

Wzór GELU

Dokładny wzór GELU opiera się na skumulowanej dystrybuancie rozkładu normalnego (CDF) i zapisuje się go jako:

Gaussian cumulative distribution function

Skumulowana dystrybuanta rozkładu normalnego

gdzie x to wartość wejściowa, a Φ(x) to prawdopodobieństwo, że zmienna losowa z rozkładu standardowego normalnego jest mniejsza lub równa x. Mówiąc prościej, Φ(x) mówi, na ile dana wartość wejściowa jest „normalna” lub oczekiwana — i to właśnie to prawdopodobieństwo służy w GELU do skalowania wejścia.

Im wyższe wejście, tym bliżej 1 jest Φ(x), co oznacza, że wejście przechodzi niemal bez zmian. Im niższe wejście, tym bliżej 0 jest Φ(x), co oznacza silniejsze tłumienie.

Aproksymacja używana w praktyce

Problem z dokładnym wzorem polega na tym, że obliczanie Φ(x) jest kosztowne. Wymaga funkcji błędu, która nie ma prostego domkniętego wzoru i jest wolna w obliczeniach na dużą skalę.

Frameworki deep learningu stosują zamiast tego taką aproksymację:

GELU approximation formula

Aproksymacja funkcji GELU

Ta aproksymacja wykorzystuje tanh, który jest szybki i dobrze wspierany na nowoczesnym sprzęcie. Wynik jest niemal identyczny z dokładnym wzorem w zakresie wejść istotnym w praktyce, dlatego frameworki takie jak PyTorch i TensorFlow stosują go domyślnie.

Oczywiście nie trzeba zapamiętywać żadnego z tych wzorów. Warto jednak wiedzieć, że istnieje aproksymacja — i dlaczego — aby rozumieć, co faktycznie dzieje się po wywołaniu GELU w kodzie.

GELU a inne funkcje aktywacji

Każda funkcja aktywacji inaczej traktuje wejścia, a te różnice przekładają się na to, jak dobrze uczy się model.

Oto, jak ta różnica wygląda wizualnie, zanim wyjaśnimy ją słownie:

GELU versus other activation functions graph

Wykres: GELU a inne funkcje aktywacji

Sigmoid

Sigmoid sprowadza wszystkie wejścia do zakresu 0–1. Jest gładki, ale ma dobrze znany problem: zanikające gradienty. Dla bardzo dużych lub bardzo małych wejść gradient zbliża się do zera, przez co głębsze warstwy przestają się uczyć. GELU nie ma tego problemu, bo jego gradient pozostaje użyteczny w szerszym zakresie wejść.

Tanh

Tanh jest podobny do Sigmoidu, ale scentralizowany wokół zera, z wyjściami w zakresie od -1 do 1. Lepiej obsługuje wartości ujemne niż Sigmoid, ale nadal cierpi na zanikające gradienty na krańcach. GELU daje gładszą krzywą wyjściową z lepszym przepływem gradientu w głębokich sieciach.

ReLU

ReLU jest szybki i prosty: dodatnie wejścia przechodzą bez zmian, ujemne są zerowane. Ostry próg w zerze powoduje problem „martwych neuronów” — neurony, które przez dłuższy czas otrzymują ujemne wejścia, całkowicie przestają się aktualizować. GELU unika tego, skalując wartości ujemne zamiast je odcinać.

Leaky ReLU

Leaky ReLU rozwiązuje problem martwych neuronów, przepuszczając niewielką część ujemnych wejść. To krok naprzód względem ReLU, ale przejście w zerze nadal jest ostre. GELU daje ogólnie gładszą krzywą, co zwykle lepiej działa w głębokich architekturach, gdzie jakość gradientów ma większe znaczenie.

Podsumowując, oto różnice między tymi pięcioma funkcjami aktywacji:

GELU versus other activation functions table

Tabela: GELU a inne funkcje aktywacji

Dlaczego GELU jest używany w transformatorach

Transformatory to po prostu głębokie sieci neuronowe. A im głębsza sieć, tym bardziej liczy się jakość gradientów.

Modele takie jak BERT i GPT układają dziesiątki warstw jedna na drugiej. Przy takiej głębokości drobne problemy z przepływem gradientów się kumulują. Jeśli funkcja aktywacji generuje niestabilne lub bliskie zeru gradienty w pewnych obszarach, wcześniejsze warstwy sieci ledwo aktualizują się podczas treningu, a więc niewiele się uczą.

GELU unika tego, utrzymując gradienty gładkie i niezerowe w szerszym zakresie wejść. Nie ma progu odcięcia jak w ReLU na granicy zera, więc optymalizator dostaje czytelniejszy sygnał na każdej warstwie, nie tylko blisko wyjścia.

Jest jeszcze jeden powód, dla którego GELU dobrze pasuje do architektur transformatorowych. 

Transformatory przetwarzają wejścia przez mechanizmy uwagi, które generują szeroki zakres wartości aktywacji — dodatnich i ujemnych. Gładka funkcja aktywacji lepiej obsługuje taki zakres niż funkcja z ostrymi przejściami.

Gdy opublikowano oryginalną pracę o BERT, autorzy wybrali GELU zamiast ReLU i uzyskali lepsze wyniki w swoich benchmarkach. GPT poszedł tą samą drogą. Od tego czasu GELU stał się domyślną aktywacją w większości architektur opartych na transformatorach — nie dlatego, że jest nowy, lecz dlatego, że lepiej działa w skali, na jakiej operują te modele.

GELU w praktyce

Korzystanie z GELU w modelach jest tak samo proste jak używanie innych funkcji aktywacji. Zarówno PyTorch, jak i TensorFlow mają wbudowane wsparcie.

PyTorch

W PyTorch można zastosować GELU jako osobny moduł lub inline w definicji modelu. Oto prosty blok feedforward używający 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() znajduje się między dwiema warstwami liniowymi — dokładnie tam, gdzie występuje w podwarstwie feedforward transformatora. Aktywacja działa po pierwszej projekcji i przed drugą.

TensorFlow

W TensorFlow GELU jest dostępny przez API Keras:

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)

Można też przekazać ją bezpośrednio jako argument tekstowy do warstwy Dense:

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

Oba podejścia dają ten sam rezultat.

Gdzie umieścić GELU w sieci

GELU należy w to samo miejsce co każda inna funkcja aktywacji — zaraz po transformacji liniowej i przed następną warstwą. W architekturach transformatorowych oznacza to podwarstwę feedforward, między dwiema projekcjami gęstymi. W innych głębokich sieciach należy go umieszczać po warstwie liniowej lub konwolucyjnej, aby skala wyjście przed przekazaniem dalej.

Zalety GELU

Jeśli Pan/Pani dotarł(a) aż tutaj, zna już najważniejsze atuty GELU w porównaniu z innymi funkcjami aktywacji. Oto krótkie podsumowanie:

  • Gładka aktywacja: GELU tworzy ciągłą, różniczkowalną krzywą bez ostrych przejść, co daje optymalizatorowi czytelniejsze informacje na każdym kroku.
  • Lepszy przepływ gradientu: GELU nie zeruje ujemnych wejść, więc gradienty mogą wciąż propagować się przez neurony otrzymujące wartości ujemne. Zmniejsza to ryzyko „obumierania” neuronów podczas treningu.
  • Lepsza wydajność w głębokich modelach: W głębokich architekturach, takich jak transformatory, skumulowany efekt gładszych gradientów zwykle przekłada się na lepsze wyniki treningu w porównaniu z prostszymi funkcjami aktywacji.

Ograniczenia GELU

GELU nie jest właściwym wyborem w każdej sytuacji. Oto kilka ograniczeń, o których warto pamiętać:

  • Bardziej kosztowny obliczeniowo niż ReLU: GELU obejmuje albo funkcję błędu, albo aproksymację opartą na tanh, z których obie są droższe niż prosta operacja progowa ReLU. W dużych modelach z wieloma warstwami koszt ten może się sumować.

  • Mniej intuicyjny: Takie funkcje jak ReLU są łatwe do zrozumienia — wartości dodatnie przechodzą, ujemne nie. Probabilistyczne skalowanie w GELU trudniej interpretować.

  • Nie zawsze konieczny: W płytkich sieciach lub prostszych zadaniach GELU nie daje istotnych korzyści. ReLU lub Leaky ReLU często sprawdzą się równie dobrze przy niższym koszcie obliczeniowym.

Podsumowując: jeśli buduje Pan/Pani transformator lub inną głęboką architekturę, GELU to solidny domyślny wybór. W pozostałych przypadkach proszę przeprowadzić benchmarki, zanim się Pan/Pani na niego zdecyduje.

Wnioski

GELU nie jest uniwersalnym ulepszeniem ani rozwiązaniem „one-size-fits-all”, które zastępuje ReLU. To przemyślany wybór projektowy, który opłaca się w określonych kontekstach — proszę myśleć o głębokich sieciach i modelach transformatorowych.

Jeśli pracuje Pan/Pani z BERT, GPT lub dowolnym modelem opartym na transformatorach, to i tak używa Pan/Pani GELU — świadomie lub nie. Teraz już Pan/Pani wie, dlaczego.

W pozostałych przypadkach wybór funkcji aktywacji to kwestia kompromisów. Żadna pojedyncza funkcja nie wygrywa zawsze, a zrozumienie działania każdej z nich pozwala podejmować tę decyzję z przekonaniem, a nie z przyzwyczajenia.

Jeśli różnice między funkcjami aktywacji nadal są niejasne, proszę zapisać się na naszą Ścieżkę Machine Learning Engineer, aby przygotować się do pracy w obszarze ML i MLOps.

FAQs

Czym jest funkcja aktywacji GELU?

GELU, czyli Gaussian Error Linear Unit, to funkcja aktywacji używana w sieciach neuronowych. W przeciwieństwie do ReLU, GELU płynnie skaluje wejścia w zależności od ich wielkości, stosując podejście probabilistyczne. Dzięki temu lepiej sprawdza się w głębokich architekturach, w których jakość gradientów ma znaczenie.

Czym GELU różni się od ReLU?

ReLU z twardym progiem w zerze zeruje wszystkie ujemne wejścia, co może powodować, że neurony przestają się uczyć — to tzw. martwe neurony. GELU unika tego, stopniowo skalując wartości ujemne zamiast je odcinać. W efekcie otrzymujemy gładszy przepływ gradientów i lepszą wydajność w głębokich sieciach.

Kiedy stosować GELU zamiast innych funkcji aktywacji?

GELU najlepiej sprawdza się w głębokich architekturach, zwłaszcza w modelach transformatorowych, takich jak BERT i GPT. W płytkich sieciach lub prostszych zadaniach narzut obliczeniowy rzadko uzasadnia przejście z ReLU. Proszę zacząć od ReLU jako punktu odniesienia — zawsze można przetestować inne opcje.

Jaka jest różnica między dokładnym wzorem GELU a aproksymacją?

Dokładny wzór GELU korzysta ze skumulowanej dystrybuanty rozkładu normalnego, co wymaga obliczenia funkcji błędu — operacji wolnej w dużej skali. Aproksymacja zastępuje ją wyrażeniem opartym na tanh, które jest szybsze i dobrze wspierane na nowoczesnym sprzęcie. W praktyce oba podejścia dają niemal identyczne wyniki, dlatego większość frameworków domyślnie używa aproksymacji.

Czy GELU działa zarówno w PyTorch, jak i TensorFlow?

Tak, oba frameworki wspierają GELU. W PyTorch można użyć nn.GELU() jako modułu w definicji modelu. W TensorFlow można przekazać "gelu" jako łańcuch do argumentu activation dowolnej warstwy lub użyć keras.layers.Activation("gelu").

Tematy

Ucz się z DataCamp

course

Dimensionality Reduction in Python

4 godz.
36.3K
Understand the concept of reducing dimensionality in your data, and master the techniques to do so in Python.
Zobacz szczegółyRight Arrow
Rozpocznij kurs
Zobacz więcejRight Arrow