Die bis vor wenigen Jahren am häufigsten genutzten Aktivierungsfunktionen in neuronalen Netzen waren symmetrische Funktionen um einen fixen Punkt. Beide Enden näherten sich asymtotisch bestimmten Werten, die jeweils die gleiche fixe Distanz vom Mittelpunkt entfernt waren. Die gebräuchlichste darunter war die hyperbolische Tangens Funktion.

Tanh and softsign activation functions. Quelle: Serengil’s blog.

Fügen wir also eine tanh-Aktivierungsfunktion zu jeden unserer 100 Layer hinzu und analysieren wieder, was danach während des forward-pass passiert.

def tang(x): return torch.tanh(x)

x = torch.randn(512)

for i in range(100):
    a = torch.randn(512, 512) * math.sqrt(1./512)
    x = tanh(a @ x)

x.mean(), x.std()

(tensor(-0.0034, tensor(0.0613))

Die Standardabweichung liegt nun bei etwa 0.06 - also sehr niedrig. Zumindest sind die Gradienten aber nicht vollständig verschwunden.

Auch wenn unsere bisherige Strategie der Initialisierung der Parameter-Matrix für unser neuronales Netz wahrscheinlich sehr einleuchtend und logisch erscheint, war das nicht state-of-the-art vor dem Jahr 2010.

Als Xavier Glorot und Yoshua Bengio das entscheidenden Paper Understanding the difficulty of training deep feedforward neural networks im Jahr 2010 veröffentlichten, war die gängige Vorgehensweise der Parameterinitialisierung die Verwendung einer Normalverteilung im Wertebereich [-1,1] verbunden mit einer Skalierung von $1/\sqrt{n}$.

Jedoch zeigt sich, dass dieser Standardprozess der Initialisierung nicht besonders erfolgreich war. Wir können dies leicht mit einem kleinen Python Script nachprüfen:

x = torch.randn(512)

for i in range(100):
    a = torch.Tensor(512, 512).uniform_(-1, 1)*math.sqrt(1./512)
    x = tanh(a @ x)

x.mean(), x.std()

(tensor(3.7060e-26), tensor(9,9678e-25))

Wenn wir also unser neuronales Netz wiederum über 100 Durchgänge mit dieser Parameterinitialisierung laufen lassen, werden unsere Gradienten unendlich klein.

Diese extrem schwachen Ergebnisse brachten Glorot und Bengio dazu, ihre eigenen Vorstellung der Parameterinitialisierung zu formulieren. In ihrem Paper bezeichneten sie diese als normalized initialization. Heute wird auf diese Initialisierung als Xavier initialization referenziert.

Xavier setzt mit seiner Initialisierung die Parameterwerte eines Layers auf zufällige Werte aus einer Normalverteilung mit folgendem Intervall:

${+/-}{\sqrt{6}/\sqrt{n_i+n_{i+1}}}$

Dabei ist ni die Anzahl an eingehenden Knoten in einen Layer (fan-in) und ni+1 die Anzahl an ausgehenden Knoten (fan-out).

Glorot und Bengio waren davon überzeugt, dass diese Initialisierung der Parameter die Varianz der einzelnen Aktivierungen und Gradienten im Zuge des Back-Propagation Prozesses über alle Layer hinweg konstant halten würde. Sie belegten dies mit einer Untersuchung eines neuronalen Netzes mit 5 Layern.

Varianz der Layer mit Xavier Initialisierung. Quelle: http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf

Im Gegensatz dazu zeigte sich, dass neuronale Netze mit einer “Standard“-Initialisierung viel größere Unterschiede in der Varianz der einzelnen Parameter in den ersten Layern zeigten, als in den letzten.

Varianz der Layer ohne Xavier Initialisierung. Quelle: http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf

Glorot und Bengio zeigten in ihren Untersuchungen, dass neuronale Netze, die nach ihren Vorgaben initialisiert wurden, deutlich schneller und mit einer größeren Genauigkeit konvergierten.

Wir können dies nun wieder an unserem simplen neuronalen Netz nachprüfen:

def xavier(m, h):
    return torch.Tensor(m, h).uniform_(-1, 1)*math.sqrt(6./(m+h))

x = torch.randn(512)

for i in range(100):
    a = xavier(512, 512)
    x = tanh(a @ x)

x.mean(), x.std()

(tensor(0.0011), tensor(0.0831))

Unser Beispiel liefert in etwa die gleiche Performance, wie das von uns vorher selbst abgeleitete Modell der Initialisierung der Parametermatrix, bei der wir die zufälligen Werte aus einer Normalverteilung mit $\sqrt{fan-in}$ normalisiert haben.

Weitere Posts aus dieser Serie:

Quelle: https://towardsdatascience.com/weight-initialization-in-neural-networks-a-journey-from-the-basics-to-kaiming-954fb9b47c79