Nachdem wir in den letzten beiden Posts - Xavier Initialisierung) und Parameter Initialiserung die Auswirkungen verschiedener Möglichkeiten der Initialisierung der Parametermatrix in neuronalen Netzen betrachtet haben, wenden wir uns in diesem Post einer weiteren Technik zu: Kaiming Initialisierung.

Grundsätzlich macht es Sinn, bei Aktivierungsfunktionen wie tanh, die symmetrisch rund um den Nullpunkt sind und Ergebnisse im Wertebereich von [-1, 1] liefern, die Ausgaben der Aktivierungen für jeden Layer auf einen Mittelwert von 0 mit einer Standardabweichung von 1 zu normalisieren. Genau das macht die Xavier Initialiserung!

Doch was ist, wenn wir nun eine ReLU Aktivierungsfunktion verwenden?

Relu activation function ReLU activation function. Quelle: Sarkar’s blog

Prüfen wir das wieder mit unserem kleinen neuronalen Netz und etwas Python Code:

def relu(x): return x.clamp_min(0.)

mean, var = 0., 0
for i in range(10000):
    x = torch.randn(512)
    a = torch.randn(512, 512)
    y = relu(a @ x)
    mean += y.mean().item()
    var += y.pow(2).mean().item()

mean/10000, math.sqrt(var/10000)

(9.027289896678925, 16.01248299986557)

Wenn wir also ReLU als Aktivierungsfunktion verwenden, nähert sich die Standardabweichung jedes Layers in etwa dem Wert von $\sqrt(512)/\sqrt(2)$.

math.sqrt(512/2)

16.0

Wenn wir nun die Werte der Parametermatrix a mit genau diesem Wert skalieren, erhalten wir im Mittel eine Standardabweichung von 1.

mean, var = 0., 0.
for i in range(10000):
    x = torch.randn(512)
    a = torch.randn(512, 512)
    y = relu(a @ x)
    mean += y.mean().item()
    var += y.pow(2).mean().item()

mean/10000, math.sqrt(var/10000)

(0.5636869582474232, 0.999786368072371)

Wenn wir also die Standardabweichung der Parameter für jeden Layer rund um 1 halten können, können wir zusätzliche Layer in unser neuronales Netz aufnehmen, ohne Gefahr zu laufen, dass die Gradienten explodieren oder verschwinden (exploding / vanishing gradients problem).

Diese Analyse, wie man die Parameter von tiefen neuronalen Netzen (deep neural nets) am erfolgreichsten durchführen kann, brachte Kaiming He et. al. dazu, ihr eigenens Schema der Initialisierung zu publizieren. In ihrem Paper [Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification] (https://arxiv.org/pdf/1502.01852.pdf) präsentierten sie ein Initialisierungsschema, das besonders für tiefe neuronale Netze mit asymmetrischen, nicht-linearen Aktivierungsfunktionen geeignet ist.

Sie zeigten, dass tiefe Netze (im konkreten Fall ein deep-convolutional-neural-net mit 22 Layern) unter folgenden Initialisierungsbedingungen schneller konvergieren:

  • Erstelle einen Tensor von der Größe der Parametermatrix des jeweiligen Layers. Fülle diesen Tensor mit Zufallswerten aus einer Standard-Normalverteilung.
  • Multipliziere nun jeden dieser Werte mit $\sqrt(2)/\sqrt(n)$, wobei n der Anzahl von der eingehenden Verbindungen in einen Knoten ist (fan-in).
  • Bias-Tensoren werden mit 0 initialisiert.

Setzen wir diese Anweisungen nun wieder für unser neuronales Netz um:

def kaiming(m, h):
    return torch.randn(m, h)*math.sqrt(2./m)

x = torch.randn(512)

for i in range(100):
    a = kaiming(512, 512)
    x = relu(a @ x)

x.mean(), x.std()

(tensor(0.2789), tensor(0.4226)))

Vergleichen wir dies nun mit dem Einsatz einer Xavier Initialisierung:

x = torch.randn(512)

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

x.mean(), x.std()

(tensor(5.3571e-16), tensor(7.7803e-16))

Durch den Einsatz einer Xavier Initialisierung reduzierten wir die Gradienten auf nahezu 0 bei 100 Layern.

Zufällig fanden Kaiming e.a. heraus, dass noch tiefere Netze (30-layer Convolutional-Neural-Net) in Kombination mit einer ReLU-Aktivierungsfunktion überhaupt nicht mehr lernten während des Trainingsprozesses. Wurden die Parameter jedoch nach den oben angeführenten Anweisungen initialisiert, konnte die Lernfähigkeit des Netzes ausgebaut werden.

Kaiming initialization with deep neural networks Konvergenz eines 30-Layer CNN mit Kaiming Initialisierung. Quelle: Kaiming e.a.

Schlussfolgerung

Aus den Überlegungen, die wir nun allesamt angestellt und mit unserem kleinen neuronalen Netz geprüft haben, können wir ableiten, dass für jedes neuronale Netz (insbesondere im Bereich Computer Vision), das ReLU-Aktivierungen (oder entsprechende wie leaky ReLUs) verwendet, die Intialisierung nach Kaiming auf jeden Fall erfolgverpsrechend ist und mit hoher Wahrscheinlichkeit bessere Ergebnisse liefert, als andere Methoden der Initialisierung.

Lesen Sie auch die vorherigen Posts dieser Serie:

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