Avril 2019
Volume 34, numéro 4
[Intelligence artificielle]
Comment les réseaux neuronaux apprennent-ils ?
Par Frank La La | Avril 2019
Dans mon article précédent (« Présentation détaillée de réseaux neuronaux, » msdn.com/magazine/mt833269), j’ai exploré la structure de base des réseaux neuronaux et créé à partir de zéro avec Python. Après avoir examiné les structures de base communes à tous les réseaux neuronaux, j’ai créé un exemple d’infrastructure pour calculer la somme pondérée et les valeurs de sortie. Neurones eux-mêmes sont simples et effectuer des fonctions mathématiques de base pour normaliser leurs sorties comprise entre 1 et 0 ou -1 et 1. Ils deviennent puissants, toutefois, lorsqu’ils sont connectés entre eux. Neurones sont disposés en couches dans un réseau neuronal et chaque neurone transmet les valeurs à la couche suivante. Valeurs d’entrée en cascade vers l’avant via le réseau et affectent la sortie dans un processus appelé propagation vers l’avant.
Cependant, exactement comment les réseaux neuronaux savoir ? Quel est le processus et que se passe-t-il à l’intérieur d’un réseau neuronal quand elle apprend ? Dans l’article précédent, le focus était sur la propagation de vers l’avant de valeurs. Pour les scénarios d’apprentissage supervisé, les réseaux neuronaux peuvent exploiter un processus appelé rétropropagation.
Rétropropagation, perte et époques
Rappelez-vous que chaque neurone dans un réseau neuronal prend les valeurs d’entrée multipliés par un poids pour représenter la puissance de cette connexion. Rétropropagation permet de découvrir les poids corrects doivent être appliqués aux nœuds dans un réseau neuronal en comparant les sorties d’actuel du réseau avec les sorties souhaités ou correctes. La différence entre le résultat souhaité et la sortie actuelle est calculée par la fonction de perte ou le coût. En d’autres termes, la fonction de perte indique la précision est de notre réseau neuronal à l’élaboration de prédictions pour une entrée donnée.
La formule pour calculer la perte est dans Figure 1. Ne soyez pas effrayer par les calculs, il ne fait ajouter des carrés de toutes les différences. En règle générale, poids et biais sont affectées initialement des valeurs aléatoires, ce qui souvent produisent une valeur élevée de perte lors du démarrage former un réseau neuronal.
Figure 1 le coût, ou la perte, fonction
L’algorithme ajuste ensuite chaque poids pour réduire la différence entre la valeur calculée et la valeur correcte. Le terme « rétropropagation » vient du fait que l’algorithme revient et ajuste les poids et biais après le calcul d’une réponse. Plus la perte pour un réseau, plus les prédictions qu'il devient le plus petite. Le processus d’apprentissage, puis, peuvent être évalué en tant que la réduction des résultats de la fonction de perte. Chaque cycle de correction de la propagation et rétropropagation vers l’avant pour réduire la perte est appelée une époque. En bref, rétropropagation vise à trouver les mieux d’entrée poids et biais à obtenir un résultat plus précis ou à « minimiser la perte. » Si vous pensez que cela ressemble gourmande en ressources, il est. En fait, de calcul power n’était pas tant que relativement récemment à concrétiser ce processus pour une utilisation large.
Descente de gradient, de taux d’apprentissage et de descente de Gradient stochastique
L’ajustement des pondérations dans chaque époque ? Sont ils aléatoirement ajustées ou existe-t-il un processus ? C’est là un grand nombre de débutants commencer à être confondues, qu’il y a un grand nombre de termes inconnus levée autour, telles que la descente de gradient et taux d’apprentissage. Toutefois, il est vraiment pas très compliqué lorsque expliqué correctement. La fonction de perte réduit la complexité liée à un réseau neuronal jusqu'à un nombre qui indique la façon dont ils n’ont pas le réseau neuronal, la réponse provient de la réponse souhaitée. Considérer les sortie de réseau neuronal en tant qu’un seul nombre nous permet de réfléchir à ses performances en termes simples. L’objectif est de trouver la série de poids qui produit la valeur la plus basse de la perte ou la valeur minimale.
Ce traçage sur un graphique, comme dans Figure 2, montre que la fonction de perte possède sa propre courbe et des dégradés utilisables comme guide pour ajuster les poids. La pente de la courbe de la fonction perte sert de guide et pointe vers la valeur minimale. L’objectif est de rechercher la valeur minimale sur toute la courbe, qui représente les entrées dont le réseau neuronal est plus précis.
Graphique de la figure 2 de la fonction de perte avec une courbe Simple
Dans Figure 2, l’ajout de plus pour l’atteigne poids faible point, puis commence à monter à nouveau. La pente de la ligne révèle la direction vers ce point le plus bas sur la courbe, qui représente la perte la plus basse. Lors de la courbe est négatif, ajouter à la pondération. Lors de la courbe est positif, soustraire les poids. La quantité spécifique ajoutées ou soustraites pour les poids est appelée le taux d’apprentissage. Déterminer qu'un taux d’apprentissage idéale est autant un art qu’elle est une science. Trop grand et l’algorithme peut dépasser la valeur minimale. Trop faible et la formation trop longue. Ce processus est appelé descente de Gradient. Les lecteurs qui sont plus familiers avec les subtilités de calcul seront affiche ce processus pour qu’il est : détermination de la dérivée de la fonction de perte.
Toutefois, est rarement, le graphique d’une fonction de perte aussi simple que celui de Figure 2. Dans la pratique, il existe plusieurs pics et des creux. Le défi devient alors comment rechercher la plus basse des points faibles (minimal global) et pas obtenir trompés en bas des points les plus proches (minima locaux). La meilleure approche dans ce cas consiste à choisir un point sur la courbe de manière aléatoire, puis effectuez le processus de descente de gradient décrit précédemment, par conséquent, le terme « Descente de Gradient stochastique. » Pour une extraordinaire explication des concepts mathématiques sur ce processus, regardez la vidéo YouTube, « jambage descendant dégradé, comment en savoir plus de réseaux neuronaux | Apprentissage profond, chapitre 2, » à youtu.be/IHZwWFHWa-w.
La plupart du temps, ce niveau de l’architecture de réseau neuronal a été en grande partie extraits par les bibliothèques telles que Keras et TensorFlow. Comme dans n’importe quel effort d’ingénierie logicielle, connaître les notions de base toujours vous aide à face à des défis dans le champ.
Placer la théorie de mettre en pratique
Dans l’article précédent, j’ai avais créé un réseau neuronal à partir de zéro pour traiter les chiffres MNIST. La base de code qui en résulte pour amorcer le problème a été très utiles pour illustrer le fonctionnement interne des architectures de réseau neuronal, mais il était difficile d’avancer. Il existe tellement infrastructures et bibliothèques maintenant qui effectuent la même tâche avec moins de code.
Pour commencer, ouvrez un bloc-notes Jupyter et entrez ce qui suit dans une cellule vide et exécutez-la pour importer toutes les bibliothèques requises :
import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import to_categorical
import matplotlib.pyplot as plt
Notez que la sortie de cette cellule indique que Keras est à l’aide d’un backend TensorFlow. Étant donné que l’exemple de réseau neuronal MNIST est donc courant, Keras inclut en tant que partie de l’API et même fractionne les données en un jeu d’apprentissage et un jeu de test. Écrire le code suivant dans une nouvelle cellule et exécutez-la pour télécharger les données et lisez-le dans les variables appropriées :
# import the data
from keras.datasets import mnist
# read the data
(X_train, y_train), (X_test, y_test) = mnist.load_data()
Une fois que la sortie indique que les fichiers sont téléchargés, utilisez le code suivant à examiner la formation brièvement et de tester le jeu de données :
print(X_train.shape)
print(X_test.shape)
La sortie doit lire que le jeu de données x_train a 60 000 éléments et le jeu de données x_test a 10 000 éléments. Ces contrôles se composent d’une matrice de 28 x 28 de pixels. Pour afficher une image à partir des données MNIST particulière, utilisez MatPlotLib pour restituer une image avec le code suivant :
plt.imshow(X_train[10])
La sortie doit ressembler à un manuscrit « 3 ». Pour voir ce qui est à l’intérieur du jeu de données de test, entrez le code suivant :
plt.imshow(X_test[10])
La sortie indique un zéro. N’hésitez pas à faire des essais en modifiant le numéro d’index et le jeu de données pour Explorer les jeux de données d’image.
Mise en forme les données
Comme avec n’importe quel projet de science des données ou d’intelligence artificielle, les données d’entrée doivent être redessinées en fonction des besoins des algorithmes. Les données d’image doivent être mis à plat dans un vecteur unidimensionnel. Comme chaque image 28 x 28 pixels, le vecteur unidimensionnel sera 1 par (28 x 28) ou 1 par 784. Entrez le code suivant dans une nouvelle cellule et exécutez (Notez que cela ne génère pas de texte de sortie) :
num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32')
X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')
Plage de valeurs de pixels compris entre zéro et 255. Pour pouvoir les utiliser, vous devez normaliser les valeurs entre zéro et un. Pour ce faire, utilisez le code suivant :
X_train = X_train / 255
X_test = X_test / 255
Puis entrez le code suivant pour examiner les données ressemblent maintenant :
X_train[0]
La sortie révèle un tableau de 784 valeurs entre zéro et un.
La tâche consistant à prendre dans différentes images de chiffres manuscrits et détermination que qu’ils représentent le numéro de classification. Avant de générer le modèle, vous devrez fractionner les variables cibles en catégories. Dans ce cas, vous savez qu’il y a 10, mais vous pouvez utiliser la fonction to_categorical dans Keras pour qui soit déterminée automatiquement. Entrez le code suivant et exécutez-le (la sortie doit afficher 10) :
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
num_classes = y_test.shape[1]
print(num_classes)
Créer, former et tester le réseau neuronal
Maintenant que les données a été mise en forme et préparées, il est temps pour générer les réseaux neuronaux à l’aide de Keras. Entrez le code suivant pour créer une fonction qui crée un réseau neuronal séquentiel avec trois couches avec des neurones de la couche d’entrée de num_pixels (ou 784) :
def classification_model():
model = Sequential()
model.add(Dense(num_pixels, activation='relu', input_shape=(num_pixels,)))
model.add(Dense(100, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
return model
Comparez ce code au code à partir « à partir de zéro » méthodes de mon dernier article. Vous pouvez remarquer les nouveaux termes comme « relu » ou « softmax » référencée dans les fonctions d’activation. Jusqu'à présent, j’ai exploré uniquement la fonction d’activation sigmoïde, mais il existe plusieurs types de fonctions d’activation. Pour l’instant, n’oubliez pas que toutes les fonctions d’activation compresser une valeur d’entrée en affichant une valeur comprise entre 0 et 1 ou -1 et 1.
Avec l’ensemble de l’infrastructure en place, il est temps de générer, former et noter le modèle. Entrez le code suivant dans une cellule vide et exécutez-le :
model = classification_model()
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, verbose=2)
scores = model.evaluate(X_test, y_test, verbose=0)
Comme le réseau neuronal s’exécute, notez que la valeur de perte tombe à chaque itération. En conséquence, améliore également la précision. En outre, notez la durée pendant laquelle chaque époque nécessaire à l’exécution. Une fois terminé, entrez le code suivant pour afficher les pourcentages de précision et d’erreur :
print('Model Accuracy: {} \n Error: {}'.format(scores[1], 1 - scores[1]))
La sortie révèle une précision supérieure à 98 % et une erreur de 1,97 pour cent.
Conserver le modèle
Maintenant que le modèle a été formé à un haut degré de précision, vous pouvez enregistrer le modèle pour une utilisation ultérieure éviter de devoir effectuez à nouveau l’apprentissage. Heureusement, Keras facilite cette procédure. Entrez le code suivant dans une nouvelle cellule et exécutez-le :
model.save('MNIST_classification_model.h5')
Cette opération crée un fichier binaire qui est d’environ 8 Ko et qui contient les valeurs optimales de poids et biais. Le chargement du modèle est également facile avec Keras, comme suit :
from keras.models import load_model
pretrained_model = load_model('MNIST_classification_model.h5')
Ce fichier h5 contient le modèle et peut être déployé avec le code pour mettre en forme et de préparer les données d’image d’entrée. En d’autres termes, le processus de longue durée d’apprentissage d’un modèle ne doit être effectuée qu’une fois. Référencement du modèle prédéfini ne nécessite pas le processus gourmand en ressources de formation et, dans le système de production final, le réseau neuronal peut rapidement être implémenté.
Pour résumer
Réseaux neuronaux peuvent résoudre les problèmes qui ont confounded algorithmes traditionnels depuis des décennies. Comme nous l’avons vu, leur structure simple masque la complexité true. Réseaux neuronaux fonctionnent en propageant les tendances, les poids et les entrées vers l’avant. Toutefois, il est le processus inverse de la rétropropagation où s’informe le réseau en déterminant les modifications exactes apporter au poids et biais pour produire un résultat exact.
L’apprentissage, dans le sens de la machine, est de minimiser la différence entre le résultat réel et le résultat correct. Ce processus est fastidieux et coûteux de calcul, comme l’atteste le temps que nécessaire à l’exécution via une époque. Heureusement, cette formation ne doit être effectuée qu’une seule fois et pas chaque fois que le modèle est nécessaire. En outre, j’ai exploré à l’aide de Keras pour créer ce réseau neuronal. Bien qu’il soit possible d’écrire le code nécessaire pour créer des réseaux neuronaux à partir de zéro, il est beaucoup plus simple à utiliser les bibliothèques existantes comme Keras, qui prennent en charge les détails pour vous.
Frank La Vigneworks chez Microsoft en tant que Solutions de technologie d’intelligence artificielle professionnel où il aide les entreprises gagnez en efficacité en obtenant le meilleur parti de leurs données avec l’analytique et d’intelligence artificielle. Il a également des hôtes le DataDriven podcast. Blog régulièrement à FranksWorld.com et vous pouvez lui regarder sur son canal YouTube, « De Frank type « télévision World » (FranksWorld.TV).
Merci aux experts techniques suivants d'avoir relu cet article : Andy Leonard