Wie initialisiere ich die Elemente der Filtermatrix?

24

Ich versuche, Faltungs-Neuronale Netze besser zu verstehen, indem ich Python-Code schreibe, der nicht von Bibliotheken (wie Convnet oder TensorFlow) abhängt Durchführen einer Faltung an einem Bild.

Ich versuche, die Implementierungsdetails im Schritt zwischen Feature-Maps in der folgenden Abbildung zu verstehen, in der die Layer eines CNN dargestellt sind.

Faltungsneuronale Netzwerkschichten

Nach diesem Diagramm:

Ein Bild falten

Der Kernel-Matrix-Kernel "springt" über das Bild und erstellt eine Feature-Map, bei der jedes Pixel die Summe aller elementweisen Produkte zwischen jedem Gewicht des Kernels (oder der Filtermatrix) und dem entsprechenden Pixelwert des Eingabebilds ist.

Meine Frage ist: Wie initialisieren wir die Gewichte der Kernel- (oder Filter-) Matrix?

In der obigen Demonstration sind sie einfach Einsen und Nullen, aber ich nehme an, dass dies aus Gründen des Diagramms vereinfacht ist.

Werden diese Gewichte in einem Vorverarbeitungsschritt trainiert? Oder vom Benutzer explizit gewählt?

Kai Kuspa
quelle

Antworten:

19

Normalerweise initialisiert man ein Netzwerk anhand einer zufälligen Verteilung, die normalerweise Null bedeutet, und achtet bei der Auswahl der Varianz darauf. Heutzutage kann man dank fortschrittlicher Optimierungstechniken (unter anderem SGD + Momentum) und Nichtlinearitäten bei der Aktivierung (ReLUs und ReLU-ähnliche Aktivierungen ermöglichen eine bessere Rückproagation von Gradientensignalen, auch in tieferen Netzwerken) die Faltung auf dem neuesten Stand der Technik trainieren neuronale Netze aus einer zufälligen Initialisierung.

Wichtige Eigenschaften sind die folgenden:

  • Warum zufällig? Warum nicht alle auf 0 initialisieren? Ein wichtiges Konzept hier heißt Symmetriebrechen . Wenn alle Neuronen das gleiche Gewicht haben, produzieren sie die gleichen Ausgaben und wir werden keine unterschiedlichen Funktionen lernen. Wir werden keine unterschiedlichen Funktionen lernen, da während des Backpropagation-Schritts alle Gewichtsaktualisierungen exakt gleich sind. Wenn wir also mit einer zufälligen Verteilung beginnen, können wir die Neuronen so initialisieren, dass sie unterschiedlich sind (mit sehr hoher Wahrscheinlichkeit) und eine reichhaltige und vielfältige Merkmalshierarchie erlernen.

  • Warum Null bedeuten? Eine übliche Praxis beim maschinellen Lernen besteht darin, die Eingabedaten auf Null zu zentrieren oder zu normalisieren, so dass die rohen Eingabemerkmale (für Bilddaten wären dies Pixel) im Durchschnitt auf Null liegen.

    Wir haben unsere Daten auf Null zentriert und werden die Gewichte unseres Netzwerks (Matrizen, auf die Sie sich bezogen haben) nach dem Zufallsprinzip initialisieren. Welche Art der Verteilung sollten wir wählen? Die Verteilung der Eingabedaten auf unser Netzwerk bedeutet Null, da wir uns auf Null zentriert haben. Nehmen wir an, wir initialisieren auch unsere Verzerrungsterme mit Null. Wenn wir das Training unseres Netzwerks initialisieren, haben wir keinen Grund, ein Neuron dem anderen vorzuziehen, da alle zufällig sind. Eine Übung ist, unsere Gewichte zufällig so zu initialisieren, dass sie alle erwartungsgemäß keine Aktivierungsleistung haben. Auf diese Weise wird kein Neuron bevorzugt, um "zu aktivieren" (einen positiven Ausgangswert zu haben) als jedes andere Neuron, während gleichzeitig die Symmetrie aufgrund der zufälligen Initialisierung unterbrochen wird. Ein einfacher Weg, dies zu erreichen, besteht darin, eine mittlere Nullverteilung zu wählen.

  • Wie wählen wir die Varianzen aus? Sie möchten die Varianz nicht zu groß wählen, auch wenn sie im Mittel Null ist. Extreme Werte in einer tiefen Netzgewichtung können zu Aktivierungsausgaben führen, deren Größe exponentiell zunimmt, und dieses Problem kann sich mit der Tiefe des Netzwerks verschärfen. Dies kann die Schulung unseres Netzwerks in Mitleidenschaft ziehen. Sie sollten es auch nicht zu klein wählen, da dies das Lernen verlangsamen kann, da wir sehr kleine Gradientenwerte berechnen. Hier besteht also ein Gleichgewicht, insbesondere wenn es um tiefere Netzwerke geht, da wir nicht möchten, dass unsere Vorwärts- oder Rückwärtsausbreitung in der Tiefe exponentiell zunimmt oder abnimmt.

    Es gibt zwei sehr beliebte Initialisierungsschemata für die Gewichtung: Glorot Uniform ( Verständnis der Schwierigkeit beim Trainieren von Deep Feedforward-Neuronalen Netzen ) und He Normal Initializer ( Eintauchen in Gleichrichter: Überlegene Leistung auf menschlicher Ebene bei der ImageNet-Klassifizierung ).

    Sie sind beide mit der Absicht konstruiert, tiefe Netzwerke unter Berücksichtigung des folgenden Grundprinzips zu trainieren (Zitat aus dem Artikel „Tiefer in Gleichrichter eintauchen“):

    "Eine geeignete Initialisierungsmethode sollte es vermeiden, die Größen der Eingangssignale exponentiell zu verringern oder zu vergrößern."

    Grob gesagt initialisieren diese beiden Initialisierungsschemata die Varianz jeder Schicht, so dass die Ausgangsverteilung jedes Neurons gleich ist. In Abschnitt 2.2 des Abschnitts Eintauchen in Gleichrichter finden Sie eine detaillierte Analyse.

Ein letzter Hinweis: Manchmal werden Sie auch feststellen, dass Gaußsche mit einer Standardabweichung von 0,005 oder 0,01 oder einer anderen "kleinen" Standardabweichung über alle Ebenen hinweg verwendet werden. In anderen Fällen werden Sie feststellen, dass die Leute von Hand an den Abweichungen herumspielen und im Grunde genommen eine Kreuzvalidierung durchführen, um eine Konfiguration mit der besten Leistung zu finden.

Indie AI
quelle
1
Aber was ist mit der "X" -Form (von 1 gemacht) des gelben Filters im GIF oben? Ich verstehe, dass ich dies verwenden möchte, um "X" -Formen an einer beliebigen Stelle im Bild zu erkennen, aber woher weiß ich, dass "X" die gewünschte Form ist? Ich habe den Eindruck, dass die Filterform automatisch gelernt wird, aber ich weiß nicht wie. Vielleicht war dies auch die Frage des OP?
Felipe Almeida
2

Ich kann wegen der schlechten Reputation keinen Kommentar abgeben und schreibe dies als Antwort auf Felipe Almeidas Frage. Nach der perfekten Antwort von Indie AI gibt es nicht viel hinzuzufügen. Wenn Sie bestimmte Formen erkennen möchten (z. B. ein X), können Sie einen bestimmten Filter vorab definieren, wie dies bei der Kantenerkennung der Fall ist. Aber das ist das Schöne am tiefen Lernen: Es gibt so viele Ebenen, so viele Filter und so viele Iterationen, dass die Filter fast jede Objektform für sich lernen. Wenn also theoretisch ein X zu erkennen ist, lernt einer der Filter, ein X zu erkennen (als Gelbfilter).

Deadcode
quelle