GELU aktivasyonu nedir?


18

Ben geçiyordu Bert kağıt kullanan Gelu (Gauss hata Doğrusal Birimi) olarak denklemi devletler bu da

G,ELU(x)=xP(Xx)=xΦ(x).
0.5x(1+tbirnh[2/π(x+0.044715x3)])

Denklemi basitleştirebilir ve nasıl yaklaştığını açıklayabilir misiniz?

Yanıtlar:


19

GELU işlevi

N ( 0 , 1 ) , yani Φ ( x ) kümülatif dağılımınıN-(0,1) aşağıdaki gibi genişletebiliriz : GELU ( x ) : = x P ( X x ) = x Φ ( x ) = 0,5 x ( 1 + erf ( xΦ(x)

GELU(x):=xP(Xx)=xΦ(x)=0.5x(1+erf(x2))

Bunun bir denklem (veya bir ilişki) değil bir tanım olduğunu unutmayın . Yazarlar bu öneri için bazı gerekçeler sunmuşlardır, örneğin stokastik bir benzetme , ancak matematiksel olarak bu sadece bir tanımdır.

İşte GELU'nun konusu:

Tanh yaklaşımı

Bu tür sayısal yaklaşımlar için, anahtar fikir benzer bir işlevi (öncelikle deneyime dayanarak) bulmak, parametreleştirmek ve daha sonra orijinal işlevden bir dizi noktaya sığdırmaktır.

erf(x) in tanh ( x )' a çok yakın olduğunu bilmektanh(x)

ve erf ( x'in ilk türevierf(x2)Tan'inkinedenk gelir(tanh(2πx)dex=0ise,2π ,

tanh(2π(x+birx2+bx3+cx4+dx5))
(ya da noktalarının bir kümesine daha fazla terim) olan(xben,erf(xben2)).

Bu işlevi (-1.5,1.5) ( bu siteyi kullanarak ) arasında 20 örneğe yerleştirdim ve işte katsayılar:

Ayarlayarak bir=c=d=0 , b olarak tahmin edilmiştir 0.04495641 . Daha geniş bir aralıktan daha fazla örnekle (yalnızca bu alana 20 izin verilir), b katsayısı kağıdın 0.044715 daha yakın olacaktır . Sonunda aldık

Gelu(x)=xΦ(x)=0.5x(1+erf(x2))0.5x(1+tanh(2π(x+0.044715x3)))

~10-8x[-10,10]

2π

0.5x(1+tanh(0.797885x+0.035677x3))

Pariteden yararlanma

erff(-x)=-f(x)tanhpol(x)tanhx

erf(-x)tanh(pol(-x))=tanh(-pol(x))=-tanh(pol(x))-erf(x)

x2x40.23x20x2

Sigmoid yaklaşımı

erf(x)2(σ(x)-12)~10-4x[-10,10]

Veri noktaları oluşturmak, işlevlere uymak ve ortalama kare hatalarını hesaplamak için bir Python kodu:

import math
import numpy as np
import scipy.optimize as optimize


def tahn(xs, a):
    return [math.tanh(math.sqrt(2 / math.pi) * (x + a * x**3)) for x in xs]


def sigmoid(xs, a):
    return [2 * (1 / (1 + math.exp(-a * x)) - 0.5) for x in xs]


print_points = 0
np.random.seed(123)
# xs = [-2, -1, -.9, -.7, 0.6, -.5, -.4, -.3, -0.2, -.1, 0,
#       .1, 0.2, .3, .4, .5, 0.6, .7, .9, 2]
# xs = np.concatenate((np.arange(-1, 1, 0.2), np.arange(-4, 4, 0.8)))
# xs = np.concatenate((np.arange(-2, 2, 0.5), np.arange(-8, 8, 1.6)))
xs = np.arange(-10, 10, 0.001)
erfs = np.array([math.erf(x/math.sqrt(2)) for x in xs])
ys = np.array([0.5 * x * (1 + math.erf(x/math.sqrt(2))) for x in xs])

# Fit tanh and sigmoid curves to erf points
tanh_popt, _ = optimize.curve_fit(tahn, xs, erfs)
print('Tanh fit: a=%5.5f' % tuple(tanh_popt))

sig_popt, _ = optimize.curve_fit(sigmoid, xs, erfs)
print('Sigmoid fit: a=%5.5f' % tuple(sig_popt))

# curves used in https://mycurvefit.com:
# 1. sinh(sqrt(2/3.141593)*(x+a*x^2+b*x^3+c*x^4+d*x^5))/cosh(sqrt(2/3.141593)*(x+a*x^2+b*x^3+c*x^4+d*x^5))
# 2. sinh(sqrt(2/3.141593)*(x+b*x^3))/cosh(sqrt(2/3.141593)*(x+b*x^3))
y_paper_tanh = np.array([0.5 * x * (1 + math.tanh(math.sqrt(2/math.pi)*(x + 0.044715 * x**3))) for x in xs])
tanh_error_paper = (np.square(ys - y_paper_tanh)).mean()
y_alt_tanh = np.array([0.5 * x * (1 + math.tanh(math.sqrt(2/math.pi)*(x + tanh_popt[0] * x**3))) for x in xs])
tanh_error_alt = (np.square(ys - y_alt_tanh)).mean()

# curve used in https://mycurvefit.com:
# 1. 2*(1/(1+2.718281828459^(-(a*x))) - 0.5)
y_paper_sigmoid = np.array([x * (1 / (1 + math.exp(-1.702 * x))) for x in xs])
sigmoid_error_paper = (np.square(ys - y_paper_sigmoid)).mean()
y_alt_sigmoid = np.array([x * (1 / (1 + math.exp(-sig_popt[0] * x))) for x in xs])
sigmoid_error_alt = (np.square(ys - y_alt_sigmoid)).mean()

print('Paper tanh error:', tanh_error_paper)
print('Alternative tanh error:', tanh_error_alt)
print('Paper sigmoid error:', sigmoid_error_paper)
print('Alternative sigmoid error:', sigmoid_error_alt)

if print_points == 1:
    print(len(xs))
    for x, erf in zip(xs, erfs):
        print(x, erf)

Çıktı:

Tanh fit: a=0.04485
Sigmoid fit: a=1.70099
Paper tanh error: 2.4329173471294176e-08
Alternative tanh error: 2.698034519269613e-08
Paper sigmoid error: 5.6479106346814546e-05
Alternative sigmoid error: 5.704246564663601e-05

2
Yaklaşım neden gereklidir? Sadece erf fonksiyonunu kullanamazlar mıydı?
SebiSebi

8

Φ(x)=12erfc(-x2)=12(1+erf(x2))
erf
erf(x2)tanh(2π(x+birx3))
için bir0.044715.

Büyük değerler için x, her iki işlev de [-1,1]. Küçük içinxilgili Taylor dizisi

tanh(x)=x-x33+Ö(x3)
ve
erf(x)=2π(x-x33)+Ö(x3).
Oyuncu değişikliği, anlıyoruz
tanh(2π(x+birx3))=2π(x+(bir-23π)x3)+Ö(x3)
ve
erf(x2)=2π(x-x36)+Ö(x3).
Denklem katsayısı x3, bulduk
bir,04553992412
gazeteye yakın 0.044715.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.