[PYTHON] In Bezug auf die Aktivierungsfunktion Gelu

In letzter Zeit sind Swish und Mish als Trend der Aktivierungsfunktion bekannt. Es gibt keinen japanischen Artikel, der Gelu erklärt, daher möchte ich mein eigenes Verständnis zusammenfassen. Eine Erklärung dafür wird wahrscheinlich zu einem Verständnis von Swish führen. Papier: https://arxiv.org/abs/1606.08415

Gelu Definition

Gelu = x \Phi (x) = x * \frac{1}{2}[1+erf(\frac{x}{\sqrt{2}})]

Gelu ist wie oben definiert. Dabei ist $ \ Phi (x) $ die kumulative Verteilungsfunktion der Normalverteilung (Gaußsche Verteilung). $ erf () $ ist eine Fehlerfunktion. Dies ist eine ideale Funktion, aber im Allgemeinen kann die Fehlerfunktion nicht durch die Elementarfunktion berechnet werden, so dass eine Annäherung vorgenommen wird.

\begin{align}
Gelu &= 0.5x(1+tanh[\sqrt{\frac{2}{\pi}}(x+0.044715x^3)])\\
Gelu &= x\sigma (1.702x)\\
Swish &= x\sigma (\beta x)\\
\end{align}

Zeichnen wir dieses Gelu und seine Annäherung und betrachten den Unterschied zur Relu-Funktion. Wobei Gelu ideal und Gelu ungefähr 1 ungefähr gleich sind. Andererseits ist zu sehen, dass sich Gelu ungefähr 2 geringfügig vom Gelu-Ideal unterscheidet. Hier können wir sehen, dass die Swish-Funktion mit $ \ beta = 1.702 $ Gelu ungefähr 2 entspricht. Wenn Sie also herausfinden können, warum Gelu einen Vorteil hat, dann hat Swish einen Vorteil. In dieser Arbeit wird die Swish-Funktion mit β = 1 als SiLU bezeichnet.

Es ist jedoch zu beachten, dass sich die genaue Gelu-Funktion von der Swish-Funktion unterscheidet, obwohl sie der Swish-Funktion von $ \ beta = 1.702 $ und der Gelu-Funktion von ungefähr 2 entspricht.

gelu.py


import matplotlib.pyplot as plt
import numpy as np
from scipy import special

x = np.arange(-6, 6, 0.05)
y1 = np.array([i if i>0 else 0 for i in x])                  # Relu
y2 = x*0.5*(1+special.erf(np.sqrt(0.5)*x))                   # Gelu ideal
y3 = x*0.5*(1+np.tanh(np.sqrt(2/np.pi)*(x+0.044715*x*x*x)))  # Gelu approximate 1
y4 = x/(1+np.exp(-1.702*x))                                  # Gelu approximate 2

plt.plot(x, y1, label="Relu")
plt.plot(x, y2, label="Gelu ideal")
plt.plot(x, y3, label="Gelu approximate 1")
plt.plot(x, y4, label="Gelu approximate 2")
plt.legend()
plt.show()

plt.plot(x, y2-y1, label="Gelu ideal - Relu")
plt.plot(x, y3-y1, label="Gelu approximate 1 - Relu")
plt.plot(x, y4-y1, label="Gelu approximate 2 - Relu")
plt.legend()
plt.show()

Ratet mal, warum Gelu vorteilhaft ist

Schauen wir uns noch einmal das Gelu-Relu-Diagramm an. Zu diesem Zeitpunkt wird Gelu-Relu ein Graph mit zwei Tälern. Und der Gradient wird 0 in der Nähe von $ x = ± 1 $. Gelu ist eine Abkürzung für GAUSSIAN ERROR LINEAR UNITS. Aus dem Obigen geht hervor, dass diese Aktivierungsfunktion eine Gradientenkomponente aufweist, die die Eingabe der Funktion näher an 1 oder -1 bringt. (Der Begriff, der die sogenannte Regularisierung fördert, ist in der Aktivierungsfunktion enthalten.)

activity_regularizer(Regularisierung der Zwischenschichtausgabe)L1,Ich möchte einen Vergleich mit der L2-Regularisierung in Betracht ziehen. Die in diesem Fall hinzuzufügende Verlustfunktionskomponente ist\lambda |x|, \lambda x^2Ist. Wenn diese Verlustfunktion hinzugefügt wird, nähert sich der Ausgang bei jedem Wert Null. Wenn der Ausgang jedoch zu klein wird, erhöht sich die ursprüngliche Verlustfunktion stärker als die zusätzliche Verlustfunktion, sodass die Größe des Ausgangs schließlich irgendwo liegt. Es wird ausgeglichen sein. Wenn man die Differenz von Gelu-Relu als zusätzliche Verlustfunktion betrachtet, hat diese Funktion eine Komponente, die versucht, die Ausgabe zu erhöhen, wenn der Ausgang zu nahe bei Null liegt. Dies ist ein Begriff, der in der L1- und L2-Regularisierung von activity_regularizer nicht vorkommt.

Vergleich mit Misch

Der Unterschied zwischen Gelu und Swish und Mish's Relu mit $ \ beta = 1 $ war wie folgt. Misch ist positiv und negativ, und die Größe und Lage des Tals sind unterschiedlich. Mish liegt im negativen Bereich nahe bei $ \ beta = 1,0 $ Swish, fühlt sich aber im positiven Bereich nahe bei Gelu ungefähr 2 ($ \ beta = 1,702 $ Swish). (Übrigens, wenn Sie den Grund täuschen, warum Mish in Richtung des negativen Bereichs voreingenommen ist, ist der Anteil der Eingaben, die einen positiven Wert annehmen, wenn er reguliert wird, umso größer, je größer der Konvergenzwert des negativen Werts ist. Ich dachte.) gelu_Figure_1-3.png

gelu.py


y5 = x/(1+np.exp(-1.0*x))                                    # Swish (beta=1.0)
y6 = x*np.tanh(np.log(1+np.exp(x)))                          # Mish

plt.plot(x, y2-y1, label="Gelu ideal - Relu")
plt.plot(x, y4-y1, label="Gelu approximate 2 - Relu")
plt.plot(x, y5-y1, label="Swish (beta=1.0) - Relu")
plt.plot(x, y6-y1, label="Mish - Relu")
plt.legend()
plt.show()

Zusammenfassung:

Gelu zeigte die Variantenkomponente aus der Relu-Funktion an. Ich weiß nicht, ob es eine gute Interpretation ist, da ich keinen Artikel finden kann, der sie als Abweichung von der Relu-Funktion darstellt, aber in diesem Fall verstehe ich, dass Gelu eine Gradientenkomponente hat, die die Eingabe näher an 1 oder -1 bringt. Dies erscheint in der Mish-Zeitung mit dem Wort "selbst reguliert", aber ich denke, das ist es.

Recommended Posts

In Bezug auf die Aktivierungsfunktion Gelu
Was ist die Aktivierungsfunktion?
Warum die Aktivierungsfunktion eine nichtlineare Funktion sein muss
Ich möchte die Aktivierungsfunktion Mish verwenden
Die erste GOLD "Funktion"
Informationen zur Entfaltungsfunktion
Über die Aufzählungsfunktion (Python)
Was ist die Rückruffunktion?
Verwendung der Zip-Funktion
Sortierwarnung in der Funktion pd.concat
Einführung und Implementierung der Aktivierungsfunktion
Vorsichtsmaßnahmen bei Verwendung der Funktion urllib.parse.quote
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Denken Sie grob über die Verlustfunktion nach