J'ai essayé de comprendre attentivement la fonction d'apprentissage dans le réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique (deuxième moitié)

introduction

L'apprentissage est une fonction du réseau neuronal (apprentissage profond). J'ai essayé de comprendre à partir de zéro les calculs du modèle qui sont effectués pour augmenter la valeur prédictive du modèle prédictif. Mis en œuvre sans utiliser de bibliothèque d'apprentissage automatique.

Dans l'article précédent, j'ai résumé les implications de l'apprentissage dans les réseaux de neurones, la fonction de perte nécessaire pour améliorer la précision du modèle et le concept de différenciation. https://qiita.com/Fumio-eisan/items/c4b5b7da5b5976d09504   Cette fois, je voudrais résumer la seconde moitié de l'implémentation au réseau de neurones.

Cette fois aussi, j'ai fait référence au manuel d'apprentissage profond d'O'Reilly. C'est très facile à comprendre. https://www.oreilly.co.jp/books/9784873117584/

Le plan est comme suit.

À propos de la méthode de descente de gradient

Dans l'article précédent, nous avons confirmé qu'il est nécessaire de minimiser la fonction de perte afin d'optimiser le modèle. Nous avons également montré que la différenciation des fonctions est le moyen de la minimiser. Pensons maintenant à optimiser les paramètres du modèle en utilisant réellement la différenciation de cette fonction.

En différenciant une fonction, vous pouvez connaître la direction dans laquelle la valeur de cette fonction diminue. La méthode du dégradé avance d'une certaine distance dans la direction du dégradé à partir de l'emplacement actuel. Et cela signifie trouver le même dégradé à la destination et procéder dans le sens du dégradé. ** Aller vers la valeur minimale s'appelle la méthode de descente de gradient, et aller vers la valeur maximale s'appelle la méthode de montée de gradient. ** **

image.png

Ce qui précède est une expression mathématique de la méthode du gradient. η représente le nombre de mises à jour et est appelé le ** taux d'apprentissage **. Affiche le nombre de paramètres mis à jour dans un apprentissage. Si ce taux d'apprentissage est trop faible, il faudra du temps pour s'approcher de la valeur minimale. Au contraire, si le taux d'apprentissage est élevé, la valeur minimale peut être dépassée. Par conséquent, vous devez trouver la bonne valeur pour chaque modèle.   Je vais effectivement le mettre en œuvre. La fonction est celle utilisée dans la première moitié. image.png

Je voudrais trouver la valeur minimale de cette fonction.

nn.ipynb


def gradient_descent(f,init_x, lr=0.01, step_num=100):
    x = init_x
    
    for i in range(step_num):
        grad = numerical_gradient(f,x)
        x -= lr*grad
    
    return x

def function_2(x):
    return x[0]**2+x[1]**2

Maintenant, laissez la valeur initiale être (x0, x1) = (-3,4) et utilisez la méthode du gradient pour trouver la valeur minimale. La vraie valeur minimale est prise lorsque (0,0).

nn.ipynb


init_x = np.array([-3.0,4.0])
gradient_descent(function_2, init_x = init_x, lr =0.1, step_num=100)
array([-6.11110793e-10,  8.14814391e-10])

Lorsque le taux d'apprentissage lr est de 0,1, le résultat ci-dessus est obtenu et on constate que la valeur est presque (0,0). Dans ce cas, on peut dire que l'apprentissage a réussi.

nn.ipynb


init_x = np.array([-3.0,4.0])
gradient_descent(function_2, init_x = init_x, lr =10, step_num=100)
array([-2.58983747e+13, -1.29524862e+12])

Ensuite, voici le cas où le taux d'apprentissage est fixé à 10. La valeur a divergé. Vous pouvez voir que ce n'est pas une bonne expérience d'apprentissage. Cette étude montre que le taux d'apprentissage optimal doit être défini pour chaque modèle.

Gradient dans le réseau neuronal

Appliquez la méthode de recherche du gradient à un réseau de neurones. Dans le réseau neuronal, il est appliqué au gradient de la fonction de perte. Soit L la fonction de perte, et prenons une structure qui se différencie partiellement avec le poids w.

image.png

Implémenter un réseau neuronal

Je souhaite implémenter un réseau neuronal qui exécute la procédure suivante.

  1. Mini lot Certaines données sont extraites aléatoirement des données d'entraînement (mini-batch). Le but est de minimiser la fonction de perte dans ce mini-lot.

  2. Calcul du gradient Trouvez le gradient du paramètre de poids pour réduire la fonction de perte du mini-lot.

  3. Mise à jour des paramètres Met à jour légèrement le paramètre de pondération dans la direction du gradient négatif.

  4. Répéter Répétez les étapes 1 à 3 autant de fois que vous le souhaitez.

Configuration du programme (chargement des modules, etc.)

Maintenant, je voudrais implémenter un réseau neuronal à deux couches qui a en fait une fonction d'apprentissage. Le diagramme des composants du modèle mis en œuvre cette fois est le suivant.   image.png

Lors du réglage des paramètres principalement, cela est décidé par nn.ipynb. De plus, puisque cette fois nous utiliserons l'ensemble de données MNIST, il sera lu à partir de l'URL d'origine de M. Yann et al. Le calcul effectué par le réseau de neurones réel est décrit sur two_layer_net.py. Le réseau est comme illustré dans la figure ci-dessous.

image.png

Puisque MNIST est à l'origine des données d'image de 28 x 28 pixels, 28 x 28 = 784 nombres dimensionnels se trouvent dans la première couche d'entrée. Cette fois, le calque masqué est défini sur 100 et le calque de sortie final est défini sur 10 dimensions pour être craché sous forme de 10 types de nombres. Lors de l'exécution de ce calcul, la fonction sigmoïde, qui est la fonction d'activation, et la fonction softmax, qui est utilisée pour obtenir la probabilité finale, sont calculées en lisant les fonctions décrites dans encore une autre functions.py. Remplacez la valeur de sortie obtenue et l'indice correct des données de l'enseignant dans la fonction de perte. Ensuite, calculez avec la méthode numerical_garadient décrite dans gradient.py pour trouver le gradient du paramètre de poids. Afin de mettre à jour le gradient obtenu avec le paramètre de poids suivant, il est décrit de mettre à jour le nn.ipynb d'origine. La série d'opérations est répétée le nombre de fois.

Même si vous calculez et entraînez simplement un réseau neuronal à deux couches, vous devez charger et calculer autant de méthodes. Vous pouvez voir que ce n'est pas le montant que les humains peuvent faire. Vous constaterez également que vous devez comprendre la structure du programme, y compris les classes et les méthodes.

Jetons maintenant un œil aux parties mises à jour des paramètres de poids et du biais.

nn.ipynb


    #Mettre à jour les paramètres de poids et le biais
    for key in ('W1', 'b1', 'W2', 'b2'):
        network.params[key] -= learning_rate * grad[key] #Le fait est que ce signe est négatif
    
    loss = network.loss(x_batch, t_batch)
    train_loss_list.append(loss)
    

Le but est de ** soustraire la valeur obtenue en multipliant le paramètre de poids et le biais W1, W2, b1 et b2 par le gradient (grad [clé]) et le taux d'apprentissage, respectivement. Lorsque le gradient obtenu par différenciation est une valeur positive, se déplacer dans le sens négatif signifie qu'il est soustrait de la valeur minimale. Et si vous essayez d'inverser ce signe et de le rendre positif?

006.png

L'axe horizontal est le nombre de calculs et l'axe vertical est la valeur de la fonction de perte. Vous pouvez voir que la valeur a augmenté immédiatement. Si vous écrivez le signe moins, ce sera comme ça.

007.png

Vous pouvez voir que la valeur diminue correctement. Vous pouvez désormais créer un réseau de neurones à deux couches sans utiliser la bibliothèque existante d'apprentissage automatique.

À la fin

Cette fois, nous avons modélisé le calcul et l'apprentissage du réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique. En apprenant le modèle, j'ai compris que le concept de la fonction de perte et le gradient (= différenciation de la fonction) sont les points. J'avais également besoin de combiner des classes et des modules pour effectuer des calculs, ce qui était une expérience d'apprentissage pour Python lui-même.

Le programme complet est stocké ici. https://github.com/Fumio-eisan/nn2layer_20200321

Recommended Posts

J'ai essayé de comprendre attentivement la fonction d'apprentissage dans le réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique (deuxième moitié)
J'ai essayé de comprendre attentivement la fonction d'apprentissage dans le réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique (première moitié)
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
(Apprentissage automatique) J'ai essayé de comprendre attentivement l'algorithme EM dans la distribution gaussienne mixte avec l'implémentation.
J'ai essayé de bien le comprendre en implémentant l'algorithme Adaboost en machine learning (+ j'ai approfondi ma compréhension du calcul de tableaux)
J'ai essayé de classer les accords de guitare en temps réel en utilisant l'apprentissage automatique
(Apprentissage automatique) J'ai essayé de comprendre attentivement la régression linéaire bayésienne avec l'implémentation
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
[Python] Deep Learning: J'ai essayé d'implémenter Deep Learning (DBN, SDA) sans utiliser de bibliothèque.
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
J'ai essayé d'approcher la fonction sin en utilisant le chainer
J'ai essayé de comprendre attentivement la machine vectorielle de support (Partie 1: J'ai essayé le noyau polynomial / RBF en utilisant MakeMoons comme exemple).
Essayez de créer un réseau de neurones en Python sans utiliser de bibliothèque
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
[TF] J'ai essayé de visualiser le résultat de l'apprentissage en utilisant Tensorboard
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé d'approcher la fonction sin en utilisant chainer (re-challenge)
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai créé mon propre réseau de neurones à propagation directe à 3 couches et j'ai essayé de comprendre le calcul en profondeur.
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Introduction ~
J'ai essayé de comprendre l'apprentissage supervisé de l'apprentissage automatique d'une manière facile à comprendre, même pour les ingénieurs serveurs 1
J'ai essayé de comprendre l'apprentissage supervisé de l'apprentissage automatique d'une manière facile à comprendre, même pour les ingénieurs serveurs 2
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Implémentation ~
Enregistrez les étapes pour comprendre l'apprentissage automatique
J'ai essayé d'améliorer la précision de mon propre réseau neuronal
J'ai essayé de comprendre l'arbre de décision (CART) pour classer soigneusement
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Battle Edition ~
J'ai essayé Hello World avec un langage OS + C 64 bits sans utiliser de bibliothèque
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
J'ai essayé d'implémenter diverses méthodes d'apprentissage automatique (modèle de prédiction) en utilisant scicit-learn
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
J'ai essayé d'utiliser la bibliothèque de programmation fonctionnelle toolz
Introduction à la création d'IA avec Python! Partie 2 J'ai essayé de prédire le prix de l'immobilier dans la ville de Boston avec un réseau neuronal
J'ai essayé d'extraire le texte du fichier image en utilisant Tesseract du moteur OCR
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé de résumer quatre méthodes d'optimisation de réseau neuronal
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE
[Apprentissage en profondeur] Découvrez comment utiliser chaque fonction du réseau neuronal convolutif [DW jour 3]
[Deep Learning from scratch] J'ai essayé d'expliquer la confirmation du gradient d'une manière facile à comprendre.
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai essayé de trouver la matrice affine dans l'alignement de l'image (correspondance des points caractéristiques) en utilisant la transformation affine
J'ai essayé de prédire le genre de musique à partir du titre de la chanson sur le réseau neuronal récurrent
Osez remplir le formulaire sans utiliser de sélénium
J'ai essayé de mettre en œuvre le modèle de base du réseau neuronal récurrent
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
J'ai essayé de simuler l'optimisation des publicités à l'aide de l'algorithme Bandit
J'ai installé la bibliothèque de machine learning automatique auto-sklearn sur centos7
Réseau de neurones pour comprendre et mettre en œuvre en mathématiques au secondaire
J'ai essayé d'utiliser Tensorboard, un outil de visualisation pour l'apprentissage automatique
J'ai essayé de résumer le code souvent utilisé dans Pandas
J'ai essayé l'apprentissage automatique pour convertir des phrases en style XX
J'ai essayé d'illustrer le temps et le temps du langage C
Je l'ai écrit en langage Go pour comprendre le principe SOLID
J'ai essayé de résumer les commandes souvent utilisées en entreprise