In Schritt 6 wird im Allgemeinen ein Gradientenabstiegsverfahren (ein Verfahren zum Aktualisieren von Gewichten unter Verwendung des Differentialkoeffizienten der Verlustfunktion) angewendet. Daher muss die Verlustfunktion eine teilbare Verteilung haben. Im Folgenden werden die Aktivierungsfunktion, die Verlustfunktion und das Gradientenabstiegsverfahren kurz beschrieben.
Die in der vorherigen Schicht berechneten Eingabewerte werden zunächst entsprechend jedem Gewicht und jeder Vorspannung linear kombiniert. Wenn Sie sie dann als Argumente für die Aktivierungsfunktion verwenden, übergeben Sie den Ausgabewert der Aktivierungsfunktion an die nächste Ebene ... und so weiter ist maschinelles Lernen. Die wichtige Implikation der Aktivierungsfunktion ist also nicht die Form der Formel ("Warum exponentiell, warum fraktional xxx ..." ist ein bedeutungsloses Argument), sondern welcher Wert und wie viel Bereich Es ist wichtig, über auszugeben. Die beiden diesmal verwendeten Arten von Aktivierungsfunktionen sind zusammengefasst.
Wenn x 0 oder mehr ist, hat es eine direkte proportionale Form. Da die Sigmoidfunktion und der Gradient mit zunehmendem Abstand vom Ursprung verschwinden (der Differentialkoeffizient nähert sich 0), besteht das Problem, dass das Lernen stagniert, sobald die Einheit einen großen Wert hat. Es ist bekannt, dass die Rampenfunktion das Problem des Verschwindens des Gradienten empirisch löst.
f(x) = x~~(x>0)
Der Ausgabewert der Funktion liegt zwischen 0 und 1.
f(x) = \frac{1}{1-e^x}
Bewerten Sie die $ n $ -Dimensionsausgabe eines neuronalen Netzwerks mithilfe einer Verlustfunktion. Je kleiner die Differenz ist, desto kleiner ist konzeptionell der Wert der Verlustfunktion im Vergleich zum korrekten $ n $ -Dimensionswert. Daher hat ein gutes neuronales Netzwerk einen kleinen Ausgabewert der Verlustfunktion.
E(w) = -\sum_n^{N} \left( d_n\log y_n + (1-d_n)\log(1-y_n) \right)
Das Aktualisieren des Gewichts mithilfe der Verlustfunktion ist der Schlüssel zum neuronalen Netzwerk. Hier wird ein allgemeines SDG beschrieben. SDG berechnet anhand des Differentialkoeffizienten der Verlustfunktion das Gewicht, das für das nächste Training verwendet werden soll. Für die zu diesem Zeitpunkt verwendeten Parameter
w^{t+1} = w^{t} - \eta\frac{1}{\sqrt{h}}\frac{\partial E(w^{t})}{\partial w^{t}} + \alpha\Delta w
Berechnen Sie nach der obigen Formel. Hier als Überblick Wissen über die Gradientenmethode
Kann erwähnt werden.
Im Allgemeinen wird die Lernmethode des neuronalen Netzwerks unter Berücksichtigung des "Mini-Batch-Lernens" erläutert. Hier wird erklärt, zu welchem Zeitpunkt die Verlustfunktion zum Aktualisieren des Parameters verwendet wird (= Gewicht aktualisieren = Modell aktualisieren).
--Online lernen
L=\frac{1}{N}\sum_{i=1}^{N} l_i
--Mini Batch Learning
Wie oben erwähnt, ist die Mini-Batch-Lernmethode im Allgemeinen weit verbreitet. In der Phase, in der im vorherigen Beispiel 10 Teilmengen verarbeitet werden, wird 1 Epoche gezählt.
PNN BDT wird häufig mit hoher Energie eingesetzt. Es ist stark in kleinen Statistiken, und da es sich im Grunde genommen um ein DT handelt, gibt es viele Vorteile, z. B. zu vermeiden, so weit wie möglich zu einer Black Box zu werden. Da DNN bereits zur Partikelidentifizierung verwendet wurde, haben wir uns entschieden, ein neuronales Netz zu verwenden, um das S / N-Verhältnis in Form von "Verwendung und Verlust" wie in ProfileLL zu verbessern. Das 2016 vorgeschlagene Modell ist Parametrised Neural Network (PNN), das unter Verwendung einer allgemeinen Python-Bibliothek erstellt wird. Die diesmal verwendete Bibliothek ist
uproot
CERN-Bibliothek Ein Python-Modul zum Lesen von Daten im ROOT-Format. Nur das Ändern von ROOT Ntuple in Python DataFrame
ändert nichts an der Struktur. Zeilen entsprechen Ereignissen und Spalten entsprechen jeder Variablen.
import uproot
f = uproot.open("data.root")
print(f.keys())
# ['data;1', 'background;1", ....]
f['data'].pandas.df()
# Btag EventFlavour EventNumber FourBodyMass Jet0CorrTLV ... mass mass_scaled sT sTNoMet signal weight weight_scaled
#entry ...
#9 2.0 8.0 560044.0 1666.098145 542.301636 ... 900 0.352941 #1566.298340 1404.298218 1 0.003898 0.028524
#10 1.0 5.0 560480.0 1606.993896 241.007111 ... 900 0.352941 #1841.925049 1434.105713 1 0.004255 0.031135
#11 2.0 0.0 561592.0 1857.901245 721.780457 ... 900 0.352941 #2444.058105 1910.263306 1 0.002577 0.018855
#15 2.0 5.0 561088.0 1348.327515 174.501556 ... 900 0.352941 #1328.051147 1029.908447 1 0.003360 0.024585
f['data'].pandas.df('EventNumber')
# EventNumber
#entry
#0 2.148751e+08
#1 2.143515e+08
#2 6.018242e+07
#3 2.868989e+07
...
Das Obige ist der Datenrahmen unmittelbar nach dem Lesen und erstellt einen Datenrahmen, der nur die erforderlichen Informationswerte (zu verwendende Eingabeinformationen) von hier aufnimmt. Das Verfahren zum Schneiden des im nächsten Schritt verwendeten Datenrahmens wird kurz beschrieben. Der ursprüngliche Datenrahmen, der von entwurzelt gelesen wird, hat am Ende "mass_scaled", also schneiden Sie ihn mit "X [:,: -1]". Dies ist eine Slicing-Methode, die bedeutet, dass "alle Zeilen und Spalten vom Anfang bis zur letzten sind". Basierend auf dem oben Gesagten werden wir vom nächsten zum Kern übergehen.
from sklearn.utils import shuffle
--Wenn Sie Test- / Trainingsdaten aufteilen, wie Sie sie zufällig sortieren und dann aufteilenEs ist notwendig, den Maßstab (= Anzahl der Stellen) der zu verarbeitenden Daten auszurichten. Die dort verwendete Methode ist sclearn, und dieses Mal verwenden wir "RobustSclaer", das gegen Ausreißer resistent ist. Wenn es überhaupt einen Ausreißer gibt, wird der Durchschnitt / die Streuung der Merkmalsmenge stark vom Ausreißer beeinflusst, sodass die Standardisierung nicht gut funktioniert. Stellen wir uns vor, es wird in Informationen nachgedruckt, die für die Maschine einfach zu handhaben sind, wobei die Art der Daten erhalten bleibt.
--keras.layers: Definiert die Eigenschaften von Ebenen - Input - Dense
x = Input(shape=(n_input_vars,))
d = x
for n in self.layer_size:
d = Dense(n, activation=self.activation)(d)
y = Dense(1, activation="sigmoid")(d)
Model(x, y)
Die diesmal verwendete Gradientenmethode ist eine sehr orthodoxe SGD (Stochastic Gradient Descent: Stochastic Gradient Descent Method). Jedes Gewicht wird mit der Verlustfunktion $ E (w) $ in der folgenden Formel aktualisiert.
w^{t+1} ← w^{t} - \eta \frac{\partial E(w^{t})}{\partial w^{t}} + \alpha \Delta w^{t}
Hier repräsentiert $ \ eta $ die Lernrate (Lernkoeffizient) und $ \ alpha $ den Impuls.
sgd = SGD(lr=self.learning_rate, momentum=self.momentum, nesterov=self.nesterov, decay=self.learning_rate_decay)
compile Unter Verwendung des bisher beschriebenen Wissens (mit mehr Hintergrundwissen) werden die folgenden Schritte unternommen, um ein neuronales Netzwerk in Keras zu trainieren. Zuerst müssen Sie das Modell "kompilieren"
model.compile(...)
fit Nach dem Kompilieren ist fit = das eigentliche Training.
PNN ist dadurch gekennzeichnet, dass theoretische Parameter getrennt von den verwendeten mechanischen Eingabeinformationen als Eingabeinformationen verwendet werden. Es gibt korrekte theoretische Parameter bei der Simulation von Signalereignissen, aber was ist mit den theoretischen Parametern von Hintergrundereignissen? Wenn beispielsweise der Massenparameter als Eingabeinformation verwendet wird, wird beim Training eines Hintergrundereignisses ein Zufallswert ausgewählt und trainiert.
Ich habe stark auf die folgenden Seiten verwiesen. Vielen Dank.
Recommended Posts