Ceci est un mémo pour moi pendant que je lis Introduction aux applications de traitement du langage naturel en 15 étapes. Cette fois, au chapitre 3, étape 10, notez vos propres points.
Au chapitre 8, nous avons développé à partir d'un simple perceptron et introduit un perceptron multicouche, et au chapitre 9, nous avons implémenté un classificateur multi-classes. Le chapitre 10 vise à améliorer le réseau neuronal.
--Difficulté à approfondir la couche du réseau neuronal
10.1 Deep Neural Networks
À l'origine, un réseau neuronal avec trois couches ou plus était appelé profond.
Pour ajouter plus de couches, ajoutez simplement plus de couches avec model.add
.
article | Solution |
---|---|
Facile à surapprendre | ・Early stopping ・ S'il y a plusieurs couches, la puissance expressive du réseau neuronal est élevée, il est donc facile de suradapter les données d'entraînement. ・ Répétez l'entraînement en unités d'époque, mais arrondissez l'entraînement avant que la précision des données de test ne diminue. ・Dropout ・ Certaines unités sont ignorées au hasard à un certain rythme pendant l'apprentissage, et toutes les unités sont utilisées lors de la prédiction. ・ Il est difficile de surapprendre car le nombre d'unités valides dans un apprentissage est petit. ・ Une méthode de prédiction similaire à l'ajout de plusieurs réseaux de neurones a le même effet que l'apprentissage d'ensemble. |
L'apprentissage ne se passe pas bien | ・Batch normalization ・Changement de covariable interneSe produit ・手前の層の重みの更新のせいで、後ろの層の重みの更新が妨げられる ・データの分布が平均0で分散1になるよう正規化する ・新たな層として追加したり、層中の活性化関数の前で実行したりする |
Augmentation de la quantité de calcul | Apprenez un réseau neuronal à l'aide d'un GPU qui peut traiter en parallèle à grande vitesse |
EarlyStopping
model.fit(X, y,
epochs = 100,
validation_split = 0.1,
callbacks = [EarlyStopping(min_delta = 0.0, patience = 1)])
#époques: faites-le suffisamment grand pour qu'il ne se termine pas avant d'arrondir avec Early Stop
# validation_Split: vous pouvez spécifier le rapport entre les données d'entraînement et les données de validation et les données d'entraînement d'entrée.
#callbacks: les callbacks spécifiés dans la liste sont appelés séquentiellement pendant l'apprentissage.
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(..)
#L'argument du constructeur de suppression ignore les unités
BatchNormalization
model = Sequential()
#Ajouté en tant que nouveau calque
model.add(Dense(.., activation = 'relu'))
model.add(BatchNormalization(0.5))
#Ajouté avant la fonction d'activation
model.add(Dense(..))
model.add(BatchNormalization(0.5))
model.add(Activation('relu')
model.add(Dense(.., activation = 'softmax')
model.compile(..)
Le gradient est obtenu en différenciant la fonction d'erreur avec le poids, la valeur de poids est mise à jour dans la direction opposée du gradient et l'apprentissage du réseau neuronal est avancé.
--Solution optimale globale: La solution optimale que vous souhaitez trouver. Le poids avec la plus petite erreur parmi les poids possibles (solution optimale) --Solution optimale locale: solution partiellement optimale, mais il existe d'autres solutions les plus appropriées
article | Contenu |
---|---|
Taille du lot | -Taille du lot à l'apprentissage, Keras par défaut à 32 ・ Il existe de nombreuses puissances de 2, mais il ne s'agit que d'une convention, mais il est logique de rechercher de petites valeurs de manière dense et de grandes valeurs de manière éparse. |
Optimizer | -Adam, un retardataire, est souvent utilisé, mais selon le problème, un simple SGD peut être le meilleur. ・ Réglez le taux d'apprentissage ci-dessous |
Taux d'apprentissage | -Keras Adam par défaut à 0 pour le pourcentage de poids mis à jour à la fois.001 |
Fonction d'activation | ・ ReLU est largement utilisé(Rectified Linear Unit)Cependant, la version améliorée de Leaky ReLU et SeLU(Scaled Exponential Unit)Il y a également place à considérer. -Leaky ReLU: Lorsque l'entrée est 0 ou moins, convertir avec une fonction linéaire avec une petite pente ・ ELU: Si l'entrée est égale ou inférieure à 0, convertissez en soustrayant 1 de la fonction exponentielle. |
Régularisation/Amortissement de la charge | ・ Pour éviter un apprentissage excessif, contraignez le poids pour qu'il ne devienne pas trop grand et ajoutez la norme suivante à la fonction de perte. ・ Norme L1: somme des valeurs absolues de chaque élément de poids ・ Norme L2: somme des carrés de chaque élément de poids ・ Norme L∞: valeur absolue maximale de chaque élément de poids |
Initialisation du poids | ・ Keras par défaut est initialisé avec des nombres aléatoires ・ Il est également possible de spécifier la distribution |
Fonction d'activation
model = Sequential()
model.add(Dense(.., activation = 'selu'))
model.add(Dense(.., activation = LeakyReLU(0.3)))
model.add(Dense(.., activation = 'softmax')
model.compile(..)
Régularisation
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(..)
Initialisation du poids
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 (): Distribution normale de Glolot, également connue sous le nom de distribution normale de Xavier (j'ai entendu celle-ci). La valeur initiale de Xavier convient à la fonction sigmoïde et à la fonction tanh, mais lors de l'utilisation de ReLU comme fonction d'activation, ** la valeur initiale de He spécialisé pour ReLU ** semble être meilleure.
Recommended Posts