Chargennormalisierung im Faltungs-Neuronalen Netz


73

Ich bin ein Neuling in Faltungs-Neuronalen Netzen und habe nur eine Vorstellung von Feature-Maps und wie Faltung von Bildern durchgeführt wird, um Features zu extrahieren. Ich würde mich freuen, einige Details zur Anwendung der Chargennormalisierung in CNN zu erfahren.

Ich habe dieses Papier https://arxiv.org/pdf/1502.03167v3.pdf gelesen und konnte den BN-Algorithmus verstehen, der auf Daten angewendet wurde, aber am Ende wurde erwähnt, dass eine geringfügige Änderung erforderlich ist, wenn auf CNN angewendet wird:

Für Faltungsebenen möchten wir außerdem, dass die Normalisierung der Faltungseigenschaft entspricht - damit verschiedene Elemente derselben Feature-Map an verschiedenen Orten auf dieselbe Weise normalisiert werden. Um dies zu erreichen, normalisieren wir gemeinsam alle Aktivierungen in einem Minibatch über alle Standorte. In Alg. In 1 lassen wir B die Menge aller Werte in einer Feature-Map über die Elemente eines Mini-Batches und räumliche Standorte hinweg sein. Für einen Mini-Batch der Größe m und Feature-Maps der Größe p × q verwenden wir also den Effekt - aktive Mini-Charge der Größe m ′ = | B | = m · pq. Wir lernen ein Paar von Parametern γ (k) und β (k) pro Merkmalskarte und nicht pro Aktivierung. Alg. 2 wird auf ähnliche Weise modifiziert, so dass die BN-Transformation während der Inferenz dieselbe lineare Transformation auf jede Aktivierung in einer gegebenen Merkmalskarte anwendet.

Ich bin total verwirrt, wenn sie sagen, "dass verschiedene Elemente derselben Feature-Map an verschiedenen Orten auf dieselbe Weise normalisiert werden".

Ich weiß, was Feature-Maps bedeuten, und verschiedene Elemente sind die Gewichte in jeder Feature-Map. Aber ich konnte nicht verstehen, was Ort oder räumlicher Ort bedeutet.

Ich konnte den folgenden Satz überhaupt nicht verstehen. "In Alg. 1 lassen wir B die Menge aller Werte in einer Feature-Map sowohl über die Elemente eines Mini-Batch als auch über räumliche Orte sein."

Ich würde mich freuen, wenn jemand mich kalt ausarbeiten und in viel einfacheren Worten erklären würde

Antworten:


88

Beginnen wir mit den Begriffen. Denken Sie daran, dass die Ausgabe der Faltungsschicht ein 4-Rang-Tensor ist [B, H, W, C], wobei Bdie Stapelgröße, (H, W)die Feature-Map- Größe und Cdie Anzahl der Kanäle ist. Ein Index, (x, y)in dem 0 <= x < Hund 0 <= y < Wein räumlicher Ort ist .

Übliche Batchnorm

So wird das Batchnorm auf übliche Weise angewendet (im Pseudocode):

# t is the incoming tensor of shape [B, H, W, C]
# mean and stddev are computed along 0 axis and have shape [H, W, C]
mean = mean(t, axis=0)
stddev = stddev(t, axis=0)
for i in 0..B-1:
  out[i,:,:,:] = norm(t[i,:,:,:], mean, stddev)

Grundsätzlich werden Mittelwerte H*W*Cund H*W*CStandardabweichungen zwischen BElementen berechnet . Möglicherweise stellen Sie fest, dass verschiedene Elemente an verschiedenen räumlichen Orten ihren eigenen Mittelwert und ihre eigene Varianz haben und nur BWerte erfassen.

Batchnorm in Conv-Schicht

Dieser Weg ist durchaus möglich. Die Faltungsschicht hat jedoch eine besondere Eigenschaft: Filtergewichte werden über das Eingabebild verteilt (Sie können sie in diesem Beitrag ausführlich lesen ). Aus diesem Grund ist es sinnvoll, die Ausgabe auf dieselbe Weise zu normalisieren, sodass jeder Ausgabewert B*H*Wan verschiedenen Stellen den Mittelwert und die Varianz der Werte annimmt.

So sieht der Code in diesem Fall aus (wieder Pseudocode):

# t is still the incoming tensor of shape [B, H, W, C]
# but mean and stddev are computed along (0, 1, 2) axes and have just [C] shape
mean = mean(t, axis=(0, 1, 2))
stddev = stddev(t, axis=(0, 1, 2))
for i in 0..B-1, x in 0..H-1, y in 0..W-1:
  out[i,x,y,:] = norm(t[i,x,y,:], mean, stddev)

Insgesamt gibt es nur CMittelwerte und Standardabweichungen, und jede von ihnen wird über B*H*WWerte berechnet . Das ist es, was sie meinen, wenn sie "effektive Mini-Batch" sagen: Der Unterschied zwischen den beiden besteht nur in der Achsenauswahl (oder äquivalent "Mini-Batch-Auswahl").


2
Gute Antwort, aber ich denke, Sie meinen, wir sollten den Mittelwert und die Varianz von B*H*WWerten nehmen, nicht von B*H*CWerten. Lesen Sie den ersten Absatz nach Batchnorm in der Conv-Ebene . In jedem Fall +1.
Rayryeng

Könnten wir nicht einfach schreiben: out[:,:,:,:] = norm(t[:,:,:,:], mean, stddev)ohne die Schleife? Der Mittelwert und die Varianz werden über die gesamte Charge berechnet und dann auf jedes Element in der Charge separat und nicht sofort angewendet. @ Maxim
Palimboa

Weitere Informationen zum BN für Conv-Layer finden Sie hier - arxiv.org/pdf/1502.03167.pdf im Unterabschnitt 3.2. Der Grund ist, dass wir die Faltungseigenschaften (zum Beispiel die räumliche Translationsinvarianz des Merkmals) beibehalten wollen und daher der Mittelwert über die Achsen von BxHxW berechnet wird
MonsieurBeilto

Grundsätzlich berechnet es H*W*CMittel : Oder berechnet es im ersten Fall nur B Mittel? Für ein kleines Beispiel: Wenn wir 3x2x3 i / p - Mittelwert betrachten dim=(0)ist 2x3. Gleich hier wäre BxHxWxCder Mittelwert von Form HxWxCund würde von jeder Eingabe dieser Charge abgezogen. Bitte klären Sie.
user2736738

Habe ich recht, dass das übliche Batchnorm nicht auf ein vollständig gefaltetes Netzwerk angewendet werden kann? In jeder Charge könnten wir unterschiedliche Formen haben, die eine beliebige Anzahl von gammaund erfordern würden beta, was unmöglich ist. Ist das korrekt?
Vadym B.

4

Einige Klarstellungen zu Maxim's Antwort.

Ich war verwirrt, als ich in Keras sah, dass die von Ihnen angegebene Achse die Kanalachse ist, da es nicht sinnvoll ist, über die Kanäle zu normalisieren, da jeder Kanal in einem Conv-Net als ein anderes "Merkmal" betrachtet wird. Das Normalisieren über alle Kanäle entspricht dem Normalisieren der Anzahl der Schlafzimmer mit einer Größe in Quadratfuß (multivariates Regressionsbeispiel aus Andrews ML-Kurs). Dies ist normalerweise nicht das, was Sie wollen - Sie normalisieren jedes Feature für sich. Das heißt, Sie normalisieren die Anzahl der Schlafzimmer in allen Beispielen mit mu = 0 und std = 1, und Sie normalisieren die Quadratfuß in allen Beispielen mit mu = 0 und std = 1.

Aus diesem Grund möchten Sie C bedeutet und stds, weil Sie einen Mittelwert und std pro Kanal / Feature möchten.

Nachdem ich es selbst überprüft und getestet hatte, erkannte ich das Problem: Hier gibt es ein bisschen Verwirrung / Missverständnis. Die Achse, die Sie in Keras angeben, ist tatsächlich die Achse, die nicht in den Berechnungen enthalten ist. dh Sie erhalten einen Durchschnitt über jede Achse mit Ausnahme der durch dieses Argument angegebenen. Dies ist verwirrend, da es genau das Gegenteil von NumPy ist, bei dem die angegebene Achse diejenige ist, auf der Sie die Operation ausführen (z. B. np.mean, np.std usw.).

Ich habe tatsächlich ein Spielzeugmodell mit nur BN gebaut und dann die BN manuell berechnet - habe den Mittelwert über alle 3 ersten Dimensionen [m, n_W, n_H] berechnet und n_C-Ergebnisse erhalten, berechnet (X-mu) / std (mit Rundfunk) und erhielt identische Ergebnisse wie die Keras-Ergebnisse.

Hoffe das hilft jedem, der so verwirrt war wie ich.


2

Ich bin mir nur zu 70% sicher, was ich sage. Wenn es keinen Sinn ergibt, bearbeiten oder erwähnen Sie es bitte vor dem Downvoting.

Über locationoderspatial location : Sie bedeuten die Position von Pixeln in einer Bild- oder Feature-Map. Eine Feature-Map ist vergleichbar mit einer spärlich modifizierten Version des Bildes, in der Konzepte dargestellt werden.

Über so that different elements of the same feature map, at different locations, are normalized in the same way : Einige Normalisierungsalgorithmen sind lokal, daher hängen sie von ihrer Nähe (Position) und nicht von den Dingen ab, die im Bild weit voneinander entfernt sind. Sie bedeuten wahrscheinlich, dass jedes Pixel, unabhängig von seiner Position, wie das Element einer Menge behandelt wird, unabhängig von seiner direkten speziellen Umgebung.

Info In Alg. 1, we let B be the set of all values in a feature map across both the elements of a mini-batch and spatial locations: Sie erhalten eine flache Liste aller Werte jedes Trainingsbeispiels im Minibatch, und diese Liste kombiniert Dinge unabhängig von ihrem Standort auf der Feature-Map.


Ich wollte meine Idee nur mit einem Beispiel verdeutlichen. Wenn wir also 10 Feature-Maps der Größe 5x5 und eine Mini-Batch-Größe von 20 haben, versuchen wir dann, jede Feature-Map einzeln zu normalisieren? Die neue Mini-Stapelgröße beträgt also = 20 * 25. (25, da die Feature-Map die Größe 5x5 hat). Ich bin verwirrt, wenn die einzelne Feature-Map mit ihrem eigenen Mittelwert und ihrer eigenen Varianz normalisiert wird oder der Mittelwert und die Varianz für alle 10 Feature-Maps gleich sind. Wenn letzteres der Fall ist, wie lautet die neue aktualisierte Mini-Chargengröße?
Akshata Bhat

0
  1. Zunächst müssen wir klarstellen, dass die Tiefe eines Kernels durch die Kanalnummer der vorherigen Feature-Map bestimmt wird und die Anzahl der Kernel in dieser Ebene die Kanalnummer der nächsten Feature-Map (der nächsten Ebene) bestimmt.
  2. Dann sollten wir klarstellen, dass jeder Kernel (normalerweise dreidimensional) nur einen Kanal der Feature-Map in der nächsten Ebene generiert.
  3. Drittens sollten wir versuchen, die Idee zu akzeptieren, dass alle Punkte in der generierten Feature-Map (unabhängig von ihrer Position) von demselben Kernel generiert werden, indem wir auf die vorherige Ebene schieben. Sie könnten also als eine von diesem Kernel erzeugte Verteilung angesehen werden, und sie könnten als Beispiele einer stochastischen Variablen angesehen werden. Dann sollten sie gemittelt werden, um den Mittelwert und dann die Varianz zu erhalten. (es ist nicht starr, hilft nur zu verstehen) Dies ist, was sie sagen, "damit verschiedene Elemente derselben Feature-Map an verschiedenen Orten auf die gleiche Weise normalisiert werden".
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.