[PYTHON] Concernant la fonction d'activation Gelu

Récemment, Swish et Mish sont connus comme la tendance de la fonction d'activation. Je n'ai pas d'article japonais expliquant Gelu, je voudrais donc résumer ma propre compréhension. Une explication de ceci mènera probablement à une compréhension de Swish. Papier: https://arxiv.org/abs/1606.08415

Définition gelu

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

Gelu est défini comme ci-dessus. Où $ \ Phi (x) $ est la fonction de distribution cumulative de la distribution normale (distribution gaussienne). $ erf () $ est une fonction d'erreur. C'est une fonction idéale, mais en général, la fonction d'erreur ne peut pas être calculée par la fonction élémentaire, donc une approximation est faite.

\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}

Tracons ce Gelu et son approximation et considérons la différence avec la fonction relu. Où Gelu idéal et Gelu approximatif 1 sont à peu près égaux. D'autre part, on peut voir que Gelu approximate 2 est légèrement différent de Gelu idéal. Ici, nous pouvons voir que la fonction Swish avec $ \ beta = 1.702 $ équivaut à Gelu environ 2. Donc, si vous pouvez comprendre pourquoi Gelu a un avantage, c'est pourquoi Swish a un avantage. Dans cet article, la fonction Swish avec β = 1 est appelée SiLU.

Cependant, il convient de noter que la fonction Gelu exacte est différente de la fonction Swish, bien que la fonction Swish avec $ \ beta = 1,702 $ soit égale à approximative Gelu 2.

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()

Devinez pourquoi Gelu est avantageux

Regardons à nouveau le graphique Gelu-Relu. A ce moment, Gelu-Relu devient un graphe avec deux vallées. Et le gradient devient 0 près de $ x = ± 1 $. Gelu est une abréviation pour GAUSSIAN ERROR LINEAR UNITS. En déduisant de ce qui précède, il semble que cette fonction d'activation ait une composante de gradient qui rapproche l'entrée de la fonction de 1 ou -1. (Le terme qui favorise la soi-disant régularisation est inclus dans la fonction d'activation)

activity_regularizer(Régularisation de la sortie de la couche intermédiaire)L1,Je voudrais envisager une comparaison avec la régularisation L2. Le composant de fonction de perte à ajouter dans ce cas est\lambda |x|, \lambda x^2Est. Lorsque cette fonction de perte est ajoutée, la sortie s'approche de zéro à n'importe quelle valeur, mais si la sortie devient trop petite, la fonction de perte d'origine augmentera plus que la fonction de perte supplémentaire, de sorte que l'amplitude de la sortie finira par être quelque part. Ce sera équilibré. Considérant la différence de Gelu-Relu comme une fonction de perte supplémentaire, lorsque la sortie est trop proche de zéro, cette fonction a un composant qui tente d'augmenter la sortie. C'est un terme introuvable dans les régularisations L1 et L2 de activity_regularizer.

Comparaison avec Mish

La différence entre Gelu et Swish et Relu de Mish avec $ \ beta = 1 $ était la suivante. Mish est positif et négatif, et la taille et l'emplacement de la vallée sont différents. Mish est proche de $ \ beta = 1,0 $ Swish dans la région négative, mais se sent proche de Gelu approximativement 2 ($ \ beta = 1,702 $ Swish) dans la région positive. (À propos, si vous trompez la raison pour laquelle Mish est biaisé vers la région négative, plus la valeur de convergence de la valeur négative est grande, plus la proportion d'entrées qui prennent une valeur positive lorsqu'elles sont régularisées. J'ai pensé.) 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()

Résumé:

Gelu a affiché le composant de variante de la fonction Relu. Je ne sais pas si c'est une bonne interprétation car je ne trouve pas d'article qui le représente comme une variation de la fonction Relu, mais dans ce cas, je comprends que Gelu a un composant de gradient qui rapproche l'entrée de 1 ou -1. Cela apparaît dans l'article Mish avec le mot auto régularisé, mais je pense que c'est le cas.

Recommended Posts

Concernant la fonction d'activation Gelu
Quelle est la fonction d'activation?
Pourquoi la fonction d'activation doit être une fonction non linéaire
Je souhaite utiliser la fonction d'activation Mish
La première «fonction» GOLD
À propos de la fonction Déplier
À propos de la fonction enumerate (python)
Qu'est-ce que la fonction de rappel?
Comment utiliser la fonction zip
Avertissement de tri dans la fonction pd.concat
Introduction et mise en œuvre de la fonction d'activation
Précautions lors de l'utilisation de la fonction urllib.parse.quote
[Python] Faire de la fonction une fonction lambda
Pensez grossièrement à la fonction de perte