Eine der Initialisierungsmethoden für Gewichtskoeffizienten, auch als "MSRA" bekannt. Es wird in Artikel von Kaiming He et al. verwendet, und es scheint, dass der Autor und Microsoft Research der Ursprung des Namens sind.
HeNormal initialisiert den Gewichtungsfaktor $ W $ mit einer Zufallszahl, die einer Normalverteilung mit einer Standardabweichung von $ \ sqrt {2 / N} $ folgt. Hier ist $ N $ die Größe der Eingabe, dh die Größe des Eingabevektors im Fall von "links.Linear" und die Anzahl der Kanäle x Kernelhöhe x Kernelbreite im Fall von "links.Convolution2D".
Als Methode zum Initialisieren mit HeNormal kann beim Erstellen einer Linkinstanz "math.sqrt (2)" für "wscale" angegeben werden.
Geben Sie beispielsweise "chainer.links.Linear (100, 100, wscale = math.sqrt (2))" an.
Diese Methode wird auch im Network-in-Network-Modell im ImageNet-Beispiel von Chainer (https://github.com/pfnet/chainer/blob/master/examples/imagenet/nin.py) verwendet.
Es stellt sich jedoch heraus, dass sich das Verhalten von wscale
gegenüber Version 1.9.0 unbeabsichtigt geändert hat.
Ich habe bereits ein Problem registriert.
wscale doesn't have backward compatibility
Wenn Sie HeNormal explizit verwenden möchten, sollten Sie es vermeiden, es mit "wscale" anzugeben, bis dieses Problem behoben ist.
Zum Beispiel, wenn Sie beim Veröffentlichen des Ergebnisses mithilfe der Chainer-Implementierung "Mit HeNormal initialisiert" sagen oder wenn Sie HeNormal für die Recherche anderer Teams verwenden und die Initialisierungsmethode für die Reproduktion festlegen möchten. Ich denke, es ist besser, Weight Initializer wie unten beschrieben zu verwenden.
In Chainer können Sie mithilfe des Weight Initializer festlegen, wie der Gewichtskoeffizient initialisiert werden soll. Geben Sie zum Initialisieren mit dem Initializer eine Instanz des Initialisierers in "initialW" des Links an. Beispiel:
class MLP(chainer.Chain):
def __init__(self, n_in, n_units, n_out):
initializer = chainer.initializers.HeNormal()
super(MLP, self).__init__(
l1=L.Linear(None, n_units, initialW=initializer), # n_in -> n_units
l2=L.Linear(None, n_units, initialW=initializer), # n_units -> n_units
l3=L.Linear(None, n_out, initialW=initializer), # n_units -> n_out
)
...