[PYTHON] 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é)

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.

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.

Qu'est-ce que l'apprentissage dans un réseau de neurones

L'apprentissage dans un modèle consiste à rapprocher la valeur prédite de la bonne réponse ou à augmenter le taux de réponse correct. Prenons l'exemple de la reconnaissance d'image. MNIST, un système de reconnaissance des nombres bien connu, distingue les nombres manuscrits. image.png

Sur cette image, n'importe quel humain peut voir 5 (le cerveau apprend et reconnaît). Ensuite, réfléchissons à ce qui est nécessaire pour créer un algorithme permettant à un ordinateur de reconnaître cela 5. Afin de reconnaître 5 à partir de "l'image" de 5, il est nécessaire de trouver une "quantité de caractéristiques" qui peut être identifiée comme 5 à partir de l'image. La quantité de fonctionnalités est écrite en anglais sous le nom de sélection de fonctionnalités. Traduit littéralement, cela signifie «choisir une caractéristique». Si vous le remplacez par l'image de 5, il aura des fonctionnalités telles que «première barre horizontale», «ligne verticale» et «arc à environ 270 degrés avec la gauche ouverte». Le flux d'extraction de ces quantités de caractéristiques et d'apprentissage des caractéristiques extraites est l'algorithme qui fait reconnaître 5 par l'ordinateur.   La fonction de recherche (= extraction) d'entités est appelée un convertisseur. Ces convertisseurs bien connus comprennent SIFT, SURF et HOG. Pour plus d'informations, veuillez visiter l'URL ci-dessous. Cette URL est le matériel de 2011 et semble être une technologie développée depuis les années 2000.

https://www.slideshare.net/lawmn/siftsurf

Ensuite, la quantité de caractéristiques peut être utilisée pour convertir les données d'image en un vecteur, et le vecteur peut être entraîné par une fonction appelée discriminateur utilisée dans l'apprentissage automatique. Les discriminateurs bien connus incluent la machine à vecteurs de support (SVM) et la méthode de proximité K (KNN).

Ici, il est nécessaire de juger et de sélectionner le convertisseur de manière appropriée par "personnes" en fonction des caractéristiques. D'autre part, la gamme couverte par le réseau de neurones comprend également ce convertisseur. En d'autres termes, le convertisseur lui-même qui recherche des fonctionnalités est également un algorithme qui peut être entraîné.

image.png

Le concept est illustré ci-dessus. En augmentant la zone que l'ordinateur juge, le réseau neuronal interprète les données données telles qu'elles sont et tente de trouver le modèle du problème. On peut comprendre qu'il s'agit d'un algorithme avec un plus grand sens de l'intelligence artificielle.

Qu'est-ce qu'une fonction de perte

Ensuite, je résumerai l'idée de distinguer les données concrètement prédites et les données correctes. Nous introduisons une fonction appelée fonction de perte pour indiquer si elle est proche de la bonne réponse.

Erreur de somme des carrés

La fonction de perte la plus connue est l'erreur quadratique moyenne. Il est exprimé par la formule ci-dessous.

image.png

yk indique la sortie du réseau neuronal, tk indique les données de l'enseignant (données de réponse correctes) et k indique le nombre de dimensions (nombre) des données. À partir de la formule, nous pouvons voir que plus les réponses sont correctes, plus cette valeur est petite. J'aimerais l'écrire facilement dans un programme.

nn.ipynb


import numpy as np

def mean_squared_error(y,t):
    return 0.5*np.sum((y-t)**2)

t = [0,0,1,0,0,0,0,0,0,0]
y = [0.1,0.1,0.6,0.1,0.1,0,0,0,0,0]
y1 = [0.1,0.1,0.1,0.1,0.6,0,0,0,0,0]
print(mean_squared_error(np.array(y),np.array(t)))
print(mean_squared_error(np.array(y1),np.array(t)))
0.10000000000000003
0.6000000000000001

Les éléments de ce tableau correspondent aux nombres "0", "1" et "2" dans l'ordre à partir du premier index. Où y est la sortie du réseau neuronal. La valeur convertie par la fonction softmax représente la probabilité. On dit que la probabilité de déterminer qu'il s'agit du nombre 2 est de 0,6. De plus, t sont les données des enseignants. En d'autres termes, la bonne réponse est le chiffre 2. Lorsque la somme des carrés des erreurs a été calculée pour chacun des y et y1, y était plus proche. On peut voir que la valeur fournie par y peut exprimer correctement que l'élément avec le nombre 2 a la probabilité la plus élevée.

Erreur d'entropie croisée

Une autre fonction d'erreur est l'erreur d'entropie croisée. image.png

log est basé sur la logarithmique naturelle. Puisque tk est l'étiquette de réponse correcte, 1 n'est émis que lorsque la réponse est correcte. Par conséquent, cette fonction est calculée pour produire le logarithme naturel correspondant à l'étiquette de réponse correcte de 1. Voici le résultat de la mise en œuvre réelle.

nn.ipynb



def cross_entropy_error(y,t):
    delta = 1e-7
    return -np.sum(t*np.log(y+delta))

print(cross_entropy_error(np.array(y),np.array(t)))
print(cross_entropy_error(np.array(y1),np.array(t)))
0.510825457099338
2.302584092994546

Ici, une valeur minute (0,0000001) est ajoutée dans le calcul dans le journal. Ceci est ajouté pour éviter que le calcul ne reste bloqué car il diverge à moins l'infini lorsqu'il devient log (0). En regardant le résultat, si la sortie y de l'étiquette correcte est petite, elle sera de 2,3, mais si la sortie y est élevée, elle sera de 0,5.

But du réglage de la fonction d'erreur

La fonction de perte peut être transformée en un modèle avec une précision de prédiction élevée en minimisant la valeur obtenue. Par conséquent, il est nécessaire de trouver un paramètre qui réduit la fonction de perte. À ce stade, le paramètre est mis à jour en utilisant la valeur différenciée de ce paramètre comme indice. La différenciation permet de connaître le gradient de la fonction. Les contenus de base de la différenciation sont omis ici.

image.png

Si la valeur de ce gradient est positive, déplacez le paramètre (a sur la figure) dans le sens négatif pour approcher la valeur minimale. Au contraire, si la valeur du gradient est négative, vous pouvez imaginer déplacer le paramètre dans le sens positif pour approcher la valeur minimale.

Mettre en œuvre la différenciation des fonctions

Maintenant, je voudrais réfléchir à la différenciation des fonctions. Il existe deux approches pour différencier une fonction: (1) la résolution analytique et (2) la résolution discrète (en prenant la différence). Si vous déplacez votre main et le faites par un humain, vous le faites en (1), mais en le résolvant par programme, (2) est pratique. Cette fois, nous mettrons en œuvre le concept de différence centrale illustré dans la figure ci-dessous.

Cette fois, je voudrais trouver la valeur discrètement différenciée de cette fonction.

image.png

nn.ipynb


import numpy as np
import matplotlib.pyplot as plt

def numerical_diff(f,x):
    h =1e-4 #0.0001
    return (f(x+h)-f(x-h))/(2*h)

def function_1(x):
    return 0.01*x**2 + 0.1*x
numerical_diff(function_1,5)
0.1999999999990898

image.png

La courbe attachée est la fonction d'origine et la ligne droite est le gradient à x = 5.

Mettre en œuvre une différenciation partielle

Ensuite, envisagez d'effectuer une différenciation partielle de la fonction à deux variables illustrée ci-dessous.

image.png

Si vous dessinez la fonction d'origine, ce sera un graphique en trois dimensions comme indiqué ci-dessous.

image.png

nn.ipynb


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

La différenciation partielle fait référence à la détermination de la variable à différencier et au traitement d'autres valeurs numériques comme des constantes pour effectuer la différenciation. Différenciez partiellement x0 et trouvez la valeur lorsque x0 = 3, x1 = 4.

nn.ipynb


def function_tmp1(x0):
    return x0*x0 +4.0**2.0

numerical_diff(function_tmp1,3.0)
6.00000000000378

Nous la définissons comme une fonction avec une seule variable et différencions cette fonction. Cependant, dans ce cas, il est nécessaire d'effectuer un traitement tel que l'affectation de valeurs autres que les valeurs utilisées comme variables une par une. Considérez que vous voulez différencier x0 et x1 ensemble. Cela peut être mis en œuvre comme suit:

nn.ipynb


def numerical_gradient(f,x):
    h =1e-4
    grad = np.zeros_like(x)
    
    for idx in range(x.size):
        tmp_val =x[idx]
        x[idx] =tmp_val + h
        fxh1 = f(x)
        
        x[idx] = tmp_val -h
        fxh2 = f(x)
        
        grad[idx] = (fxh1-fxh2)/(2*h)
        x[idx] = tmp_val
    
    return grad

numerical_gradient(function_2,np.array([3.0,4.0]))
array([6., 8.])

J'ai expliqué plus tôt que cette valeur différenciée indique le gradient de la fonction d'origine. En outre, envisagez de tracer cette valeur différenciée sous forme de vecteur. Pour plus de commodité, il est illustré ci-dessous avec un signe moins.

image.png

Vous pouvez voir que la flèche pointe vers (x0, x1) = (0,0). Cela conduit à améliorer la précision du modèle en trouvant la valeur minimale dans la discussion de la fonction de perte. ** Il s'avère que cette opération différentielle permet de trouver la valeur minimale de la fonction de perte, conduisant à l'optimisation du modèle! ** **

À la fin

Cette fois, j'ai avancé au point de comprendre que cette opération différentielle conduit à une amélioration de la précision du modèle. En regardant le contenu de l'apprentissage, qui est le cœur du réseau neuronal, j'ai approfondi ma compréhension. Dans la seconde moitié de l'article, j'aimerais bien comprendre l'apprentissage en procédant réellement à l'implémentation sur le réseau neuronal.

La seconde moitié est là. https://qiita.com/Fumio-eisan/items/7507d8687ca651ab301d

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 (première 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 (deuxième moitié)
J'ai essayé de comparer la précision des modèles d'apprentissage automatique en utilisant kaggle comme thème.
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
[Python] Deep Learning: J'ai essayé d'implémenter Deep Learning (DBN, SDA) sans utiliser de bibliothèque.
(Apprentissage automatique) J'ai essayé de comprendre attentivement l'algorithme EM dans la distribution gaussienne mixte avec l'implémentation.
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Introduction ~
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Implémentation ~
(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"
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é de prédire la présence ou l'absence de neige par apprentissage automatique.
Une introduction approximative à la bibliothèque de traduction automatique neuronale
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).
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai fait une fonction pour vérifier le modèle de DCGAN
[TF] J'ai essayé de visualiser le résultat de l'apprentissage en utilisant Tensorboard
J'ai essayé un peu le comportement de la fonction zip
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai essayé d'approcher la fonction sin en utilisant chainer (re-challenge)
Application correspondante, j'ai essayé de prendre des statistiques de personnes fortes et j'ai essayé de créer un modèle d'apprentissage automatique
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
J'ai essayé d'automatiser la construction d'un environnement pratique à l'aide de l'API SoftLayer d'IBM Cloud
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé d'obtenir une liste de noms AMI en utilisant Boto3
Comment utiliser l'apprentissage automatique pour le travail? 01_ Comprendre l'objectif de l'apprentissage automatique
Je souhaite créer un service d'apprentissage automatique sans programmation! API Web
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 transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
Enregistrez les étapes pour comprendre l'apprentissage automatique
J'ai essayé d'estimer la similitude de l'intention de la question en utilisant Doc2Vec de gensim
Je ne veux pas l'admettre ... Représentation dynamique du système de Neural Network
Django super introduction par les débutants Python! Partie 3 J'ai essayé d'utiliser la fonction d'héritage de fichier de modèle
J'ai essayé d'améliorer la précision de mon propre réseau neuronal
J'ai essayé de classer les accords de guitare en temps réel en utilisant l'apprentissage automatique
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
J'ai essayé de comprendre l'arbre de décision (CART) pour classer soigneusement
J'ai essayé d'effectuer une analyse de cluster de clients à l'aide des données d'achat
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
Je souhaite créer un service d'apprentissage automatique sans programmation!
J'ai essayé l'histoire courante de prédire la moyenne Nikkei à l'aide du Deep Learning (backtest)
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
J'ai essayé de prédire la détérioration de la batterie lithium-ion en utilisant le SDK Qore
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
[Python] J'ai essayé de juger l'image du membre du groupe d'idols en utilisant Keras
J'ai essayé d'organiser les index d'évaluation utilisés en machine learning (modèle de régression)