A l'étape 6, une méthode de descente de gradient (une méthode de mise à jour des poids utilisant le coefficient différentiel de la fonction de perte) est généralement adoptée. Par conséquent, la fonction de perte doit avoir une distribution divisible. Dans ce qui suit, la fonction d'activation, la fonction de perte et la méthode de descente de gradient sont brièvement décrites.
Les valeurs d'entrée calculées dans la couche précédente sont d'abord combinées linéairement en fonction de chaque poids et biais. Ensuite, en les utilisant comme arguments de la fonction d'activation, transmettez la valeur de sortie de la fonction d'activation à la couche suivante ... et ainsi de suite, c'est l'apprentissage automatique. Donc, la signification importante de la fonction d'activation n'est pas la forme de la formule ("Pourquoi exponentiel, pourquoi xxx fractionnaire ..." est un argument dénué de sens), mais quelle valeur et quelle plage Il est important de produire à travers. Les deux types de fonctions d'activation utilisées cette fois sont résumés.
Lorsque x est égal ou supérieur à 0, il a une forme proportionnelle directe. Puisque la fonction sigmoïde et le gradient disparaissent au fur et à mesure que la distance à l'origine augmente (le coefficient différentiel s'approche de 0), il existe un problème selon lequel l'apprentissage stagne une fois que l'unité a une valeur élevée. On sait que la fonction de rampe résout empiriquement le problème de la disparition du gradient.
f(x) = x~~(x>0)
La valeur de sortie de la fonction est comprise entre 0 et 1.
f(x) = \frac{1}{1-e^x}
Évaluez la sortie de dimension $ n $ d'un réseau de neurones à l'aide d'une fonction de perte. Conceptuellement, plus la différence est petite, plus la valeur de la fonction de perte est petite par rapport à la valeur de dimension $ n $ correcte. Par conséquent, un bon réseau neuronal a une petite valeur de sortie de la fonction de perte.
E(w) = -\sum_n^{N} \left( d_n\log y_n + (1-d_n)\log(1-y_n) \right)
La mise à jour du poids à l'aide de la fonction de perte est l'élément clé du réseau neuronal. Ici, un ODD général sera décrit. SDG utilise le coefficient différentiel de la fonction de perte pour calculer le poids à utiliser pour la prochaine formation. Pour les paramètres utilisés à ce moment
w^{t+1} = w^{t} - \eta\frac{1}{\sqrt{h}}\frac{\partial E(w^{t})}{\partial w^{t}} + \alpha\Delta w
Calculez selon la formule ci-dessus. Ici, comme une vue d'ensemble des connaissances sur la méthode du gradient
Peut être mentionné.
Généralement, la méthode d'apprentissage du réseau neuronal est expliquée en gardant à l'esprit le "mini-apprentissage par lots". Ici, il est expliqué à quel moment la fonction de perte est utilisée pour mettre à jour le paramètre (= mettre à jour le poids = mettre à jour le modèle).
--Apprentissage en ligne
L=\frac{1}{N}\sum_{i=1}^{N} l_i
--Mini apprentissage par lots
Comme mentionné ci-dessus, la méthode d'apprentissage par mini-lots est généralement largement utilisée. Au stade où 10 sous-ensembles sont traités dans l'exemple précédent, 1 époque est comptée.
PNN Le BDT est souvent utilisé à haute énergie. Il est fort dans les petites statistiques, et comme il s'agit essentiellement d'un DT, il y a de nombreux avantages tels que d'éviter autant que possible de devenir une boîte noire. Puisque le DNN a déjà été utilisé pour l'identification des particules, nous avons décidé d'utiliser un réseau neuronal pour améliorer le rapport S / N sous la forme «d'utilisation et perte» comme dans ProfileLL. Le modèle proposé en 2016 est le PNN (Parametrised Neural Network), qui est construit à l'aide d'une bibliothèque python générale. La bibliothèque utilisée cette fois est
uproot
Bibliothèque CERN Un module Python pour lire les données au format ROOT. Le simple changement de ROOT Ntuple en python DataFrame
ne change pas la structure. Les lignes correspondent aux événements et les colonnes correspondent à chaque variable.
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
...
Ce qui précède est la trame de données immédiatement après la lecture et crée une trame de données qui ne récupère que les valeurs d'informations nécessaires (informations d'entrée à utiliser) à partir d'ici. La méthode de découpage de la trame de données utilisée dans l'étape suivante sera brièvement décrite.
La trame de données d'origine lue par déracinement a mass_scaled
à la fin, alors coupez-la avec X [:,: -1]
. Il s'agit d'une méthode de découpage qui signifie "toutes les lignes, les colonnes sont du début à la dernière". Sur la base de ce qui précède, nous passerons au cœur du suivant.
from sklearn.utils import shuffle
Il est nécessaire d'aligner l'échelle (= nombre de chiffres) des données à traiter. La méthode utilisée ici est sclearn, et cette fois nous utilisons "RobustSclaer", qui résiste aux valeurs aberrantes. S'il existe une valeur aberrante en premier lieu, la moyenne / dispersion de la quantité de caractéristique est grandement affectée par la valeur aberrante, de sorte que la normalisation ne fonctionne pas bien. Pensons-y comme à la réimpression d'informations faciles à gérer par la machine, tout en conservant la nature des données.
--keras.layers: définit les propriétés des calques - Input - Dense --Couche de réseau neuronal entièrement couplée. Tous les perceptrons (nœuds) sont connectés à la couche suivante de perceptrons
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)
La méthode du gradient utilisée cette fois est une SGD très orthodoxe (Stochastic Gradient Descent: stochastic gradient descente method). Chaque poids est mis à jour à l'aide de la fonction de perte $ E (w) $ dans la formule suivante.
w^{t+1} ← w^{t} - \eta \frac{\partial E(w^{t})}{\partial w^{t}} + \alpha \Delta w^{t}
Ici, $ \ eta $ représente le taux d'apprentissage (coefficient d'apprentissage), et $ \ alpha $ représente l'élan.
sgd = SGD(lr=self.learning_rate, momentum=self.momentum, nesterov=self.nesterov, decay=self.learning_rate_decay)
compile En utilisant les connaissances décrites jusqu'à présent (avec plus de connaissances de base), les étapes suivantes sont prises pour former un réseau de neurones dans les keras. Tout d'abord, vous devez "compiler" le modèle
model.compile(...)
fit Ensuite, après la compilation, fit = faire l'entraînement réel.
PNN se caractérise par la prise de paramètres théoriques comme informations d'entrée séparément des informations d'entrée mécaniques utilisées. Il existe des paramètres théoriques corrects dans la simulation des événements de signal, mais qu'en est-il des paramètres théoriques des événements de fond? Par exemple, si le paramètre mass est utilisé comme information d'entrée, une valeur aléatoire est sélectionnée et entraînée lors de l'apprentissage d'un événement d'arrière-plan.
J'ai beaucoup fait référence aux sites suivants. Merci beaucoup.
Recommended Posts