Dies ist ein Memo für mich, während ich Einführung in Anwendungen zur Verarbeitung natürlicher Sprache in 15 Schritten lese. Notieren Sie sich diesmal in Kapitel 3, Schritt 10 Ihre eigenen Punkte.
In Kapitel 8 haben wir uns aus einem einfachen Perzeptron entwickelt und ein mehrschichtiges Perzeptron eingeführt. In Kapitel 9 haben wir einen Klassifikator für mehrere Klassen implementiert. Kapitel 10 zielt darauf ab, das neuronale Netzwerk zu verbessern.
10.1 Deep Neural Networks
Ursprünglich wurde ein neuronales Netzwerk mit drei oder mehr Schichten als tief bezeichnet.
Um weitere Ebenen hinzuzufügen, fügen Sie einfach weitere Ebenen mit model.add
hinzu.
Artikel | Lösung |
---|---|
Leicht zu überlernen | ・Early stopping ・ Wenn es viele Schichten gibt, ist die Ausdruckskraft des neuronalen Netzwerks hoch, so dass es leicht ist, sich an die Trainingsdaten anzupassen. ・ Wiederholen Sie das Training in Epocheneinheiten, aber runden Sie das Training ab, bevor die Genauigkeit der Testdaten abnimmt. ・Dropout ・ Einige Einheiten werden beim Lernen mit einer bestimmten Rate zufällig ignoriert, und alle Einheiten werden bei der Vorhersage verwendet. ・ Es ist schwierig zu überlernen, da die Anzahl der Einheiten, die in einem Lernen gültig sind, gering ist. ・ Eine Vorhersagemethode, die dem Hinzufügen mehrerer neuronaler Netze ähnelt, hat den gleichen Effekt wie das Lernen von Ensembles. |
Lernen geht nicht gut | ・Batch normalization ・Interne KovariatenverschiebungTritt ein ・手前の層の重みの更新のせいで、後ろの層の重みの更新が妨げられる ・データの分布が平均0で分散1になるよう正規化する ・新たな層として追加したり、層中の活性化関数の前で実行したりする |
Erhöhter Rechenaufwand | Lernen Sie ein neuronales Netzwerk mit einer GPU, die mit hoher Geschwindigkeit parallel verarbeitet werden kann |
EarlyStopping
model.fit(X, y,
epochs = 100,
validation_split = 0.1,
callbacks = [EarlyStopping(min_delta = 0.0, patience = 1)])
#Epochen: Machen Sie es groß genug, damit es nicht endet, bevor Sie mit Early Stopping abrunden
# validation_split: Sie können das Verhältnis von Trainingsdaten und Validierungsdaten zu den eingegebenen Trainingsdaten angeben.
#Rückrufe: Die in der Liste angegebenen Rückrufe werden während des Lernens nacheinander aufgerufen.
Dropout
model = Sequential()
model.add(Dense(..))
model.add(Dropout(0.5))
model.add(Dense(..))
model.add(Dropout(0.5))
model.add(Dense(..))
model.add(Dropout(0.5))
model.add(Dense(.., activation = 'softmax')
model.compile(..)
#Das Dropout-Konstruktorargument ignoriert Einheiten
BatchNormalization
model = Sequential()
#Als neue Ebene hinzugefügt
model.add(Dense(.., activation = 'relu'))
model.add(BatchNormalization(0.5))
#Vor der Aktivierungsfunktion hinzugefügt
model.add(Dense(..))
model.add(BatchNormalization(0.5))
model.add(Activation('relu')
model.add(Dense(.., activation = 'softmax')
model.compile(..)
Der Gradient wird erhalten, indem die Fehlerfunktion mit dem Gewicht differenziert wird, der Gewichtswert in der entgegengesetzten Richtung des Gradienten aktualisiert wird und das Lernen des neuronalen Netzwerks vorangetrieben wird.
Artikel | Inhalt |
---|---|
Chargengröße | - Die Stapelgröße beim Lernen beträgt standardmäßig 32 ・ Es gibt viele Zweierpotenzen, aber dies ist nur eine Konvention, aber es ist sinnvoll, dicht nach kleinen Werten und spärlich nach großen Werten zu suchen. |
Optimizer | -Adam, ein Nachzügler, wird oft verwendet, aber je nach Problem kann ein einfacher SGD der beste sein. ・ Stellen Sie die Lernrate unten ein |
Lernrate | -Keras Adam ist standardmäßig 0 für den Prozentsatz der Gewichte, die gleichzeitig aktualisiert werden.001 |
Aktivierungsfunktion | ・ ReLU ist weit verbreitet(Rectified Linear Unit)Die verbesserte Version von Leaky ReLU und SeLU(Scaled Exponential Unit)Es gibt auch Raum für Überlegungen. -Leaky ReLU: Wenn der Eingang 0 oder weniger ist, konvertieren Sie mit einer linearen Funktion mit einer kleinen Steigung ・ ELU: Wenn die Eingabe 0 oder weniger ist, konvertieren Sie durch Subtrahieren von 1 von der Exponentialfunktion. |
Regulierung/Lastdämpfung | ・ Um ein Überlernen zu vermeiden, beschränken Sie das Gewicht so, dass es nicht zu groß wird, und fügen Sie der Verlustfunktion die folgende Norm hinzu. ・ L1-Norm: Summe der Absolutwerte jedes Gewichtselements ・ L2-Norm: Summe der Quadrate jedes Gewichtselements ・ L∞ Norm: Maximaler absoluter Wert jedes Gewichtselements |
Gewichtsinitialisierung | ・ Keras Standard wird mit Zufallszahlen initialisiert ・ Es ist auch möglich, die Verteilung anzugeben |
Aktivierungsfunktion
model = Sequential()
model.add(Dense(.., activation = 'selu'))
model.add(Dense(.., activation = LeakyReLU(0.3)))
model.add(Dense(.., activation = 'softmax')
model.compile(..)
Regulierung
model = Sequential()
model.add(Dense(.., activation = 'relu',
kernel_regularizer = regularizers.l2(0.1)))
model.add(Dense(.., activation = 'softmax',
kernel_regularizer = regularizers.l2(0.1)))
model.compile(..)
Gewichtsinitialisierung
model = Sequential()
model.add(Dense(.., activation = 'relu',
kernel_initializer = initializers.glorot_normal()))
model.add(Dense(.., activation = 'softmax',
kernel_initializer = initializers.glorot_normal()))
model.compile(..)
glorot_normal (): Glolots Normalverteilung, auch als Xaviers Normalverteilung bekannt (ich habe diese gehört). Der Anfangswert von Xavier ist für die Sigmoidfunktion und die Tanh-Funktion geeignet, aber wenn ReLU als Aktivierungsfunktion verwendet wird, scheint der Anfangswert von He, der auf ReLU spezialisiert ist, besser zu sein.
Recommended Posts