Réseaux de neurones pour enfants: expliquez le plus simplement possible

Bonjour à tous. Ce n'est un secret pour personne que presque tous les articles de notre blog sont publiés pour lancer tel ou tel cours. Le prochain article pourrait être programmé pour le lancement du cours "Réseaux neuronaux en Python", mais étant donné la simplicité du matériel, je ne veux pas l'associer au cours, mais simplement le poster en tant que matériel bonus, comme un petit tutoriel pour les plus petits. Prédisant les questions, je veux dire immédiatement que cet article n'est pas lié au cours et n'a pas été écrit par le professeur. Si vous souhaitez en savoir plus sur le cours, vous pouvez le faire sur la page correspondante .




Bonjour à tous! Aujourd'hui, je veux parler de la façon dont les réseaux de neurones sont organisés, mais c'est si simple que même les débutants qui ne maîtrisent que les bases de Python peuvent comprendre.

Que sont les réseaux de neurones et l'intelligence artificielle en général?


Dans la philosophie de l'IA, il existe deux types d'intelligence artificielle - forte et faible. La théorie de l'intelligence artificielle forte suggère que les ordinateurs peuvent acquérir la capacité de penser et d'être conscients d'eux-mêmes en tant que personne distincte (enfin, quelque chose comme ce qui s'est passé à Detroit devenu humain). La théorie de l'intelligence artificielle faible suggère qu'un tel intellect ne peut pas ou est très difficile à construire, et alors que la science est capable de créer des réseaux de neurones qui ne répètent que partiellement le travail des réseaux de neurones de créatures vivantes. Mais la philosophie ne s'applique tout simplement pas à la science parce que rien ne peut y être prouvé, nous ne nous concentrerons donc pas sur cela. Les réseaux de neurones faibles occupent désormais une position dominante en Data Science et sont largement utilisés: dans la reconnaissance d'images visuelles, l'achat intelligent de biens,même le système OBS du véhicule - donc commencer à apprendre l'IA est désormais plus que pertinent.

Que sont les réseaux de neurones?


Les réseaux de neurones sont des modèles mathématiques du fonctionnement de véritables réseaux de neurones des êtres vivants. Il suffit de simplement transférer le modèle mathématique dans un programme (et pour cette raison, Python est si largement utilisé dans la programmation de réseaux de neurones, si pratique pour programmer des solutions à des problèmes mathématiques. En fait, les réseaux de neurones peuvent être écrits dans presque tous les langages de programmation qui prennent en charge tout type de mathématiques Même sur Scratch, qui a été créé à l'origine pour enseigner les rudiments de la programmation aux jeunes étudiants (vous pouvez le voir ici ).

Concepts de base des réseaux de neurones


Il existe de nombreux algorithmes pour le fonctionnement des réseaux de neurones (et maintenant le côté mathématique de ce problème est activement développé). La solution classique pour les débutants est la méthode de rétropropagation, une méthode de calcul de gradient utilisée pour mettre à jour les poids d'un perceptron multicouche. Dans la forme sous laquelle il est généralement étudié par les débutants (avec une fonction d'activation sigmoïde), le réseau neuronal est assez lent, mais relativement précis.

Le programme que nous allons écrire s'appelle un immense tronçon du réseau neuronal.

Avant de passer à sa description, discutons de ce que font les réseaux de neurones en général.

Que font les réseaux de neurones, s'ils sont simplifiés?


Si nous simplifions un peu le concept de réseaux de neurones, alors un réseau de neurones qui est enseigné sur la base d'un enseignement avec un enseignant, après une formation sur le principe de "stimulus - réaction", indiquant les bonnes réponses, peut fonctionner avec des étrangersLes données. En d'autres termes, si vous avez proposé un certain ensemble de mots au réseau neuronal d'entrée (par exemple, un ensemble de critiques sur la recherche de films, positifs et négatifs, dans n'importe quel format, au moins txt, au moins json, la question se trouve uniquement dans le programme de traitement de ces données). Pour créer avec succès un réseau de neurones, vous aurez besoin de deux ensembles de données: un ensemble de test avec lequel vous pouvez évaluer les performances du réseau de neurones créé et un ensemble de formation dans lequel les données sont marquées comme positives / négatives pour lui (et cela pose le problème de la classification des mégadonnées car c'est une longue et occupation morne). Après avoir formé le réseau de neurones (ce qui peut prendre beaucoup de temps et de ressources informatiques, selon la dimension des données, leur traitement, et le plus souvent le plus important, les algorithmes utilisés), il pourra essayerpour prédire avec une certaine précision un examen positif ou négatif est venu à son entrée. Mais les réseaux de neurones (ainsi qu'une personne réelle) ont un certain pourcentage d'erreur. La tâche de l'optimisation est de la rendre minimale, mais la question de l'évaluation de la qualité des réseaux de neurones ne risque de ne jamais aller nulle part. Par exemple, ils vous donnent une photo d'un hot-dog et vous dites avec certitude qu'il s'agit d'un hot-dog. Mais que faire si la photo est floue? Noir et blanc? Tourné par mauvaise visibilité? Ici, vous pouvez déjà affirmer avec seulement un certain degré de probabilité, même si vous avez préparé ou mangé beaucoup de hot-dogs dans votre vie.



Commencer à programmer notre réseau de neurones jouets


OK allons-y. Il n'y aura pas de données de test et d'entraînement dans notre réseau de neurones jouets, notre réseau de neurones jouets essaiera de trouver le rapport entre toutes les données.

Arrêtez. Et à quoi ça sert? La même chose se trouve dans une expression mathématique simple.
Sans aucun doute. Cependant, j'ai maintenant pris cette expression pour montrer le processus d'apprentissage d'un réseau neuronal. Supposons que nous soyons confrontés à la tâche de découvrir quel est le facteur de conversion entre les pouces et les centimètres. Combien de centimètres prend un pouce? Pour une personne qui connaît les mathématiques au moins en cinquième année (ou même plus tôt), il n'est pas difficile de se rappeler quel coefficient de traduction est de 2,54.

Mais pour l'instant, nous allons oublier cela pendant un moment et imaginer que nous devons créer un algorithme simple qui calculera universellement ce paramètre. Cependant, le problème est également que les réseaux de neurones ne sont pas des constantes avec des valeurs de coefficient prédéfinies, sinon ils n'auraient pas de formation «en direct».

Au total, nous sommes dans la position d'un enfant qui vient de s'asseoir devant un ensemble de cubes et va les prendre en main pour la première fois et construire la première tourelle de sa vie. Il ne sait qu'approximativement le fonctionnement de la physique des objets; il sait, tout comme nous, qu'un certain rapport spécifique existe (dans son cas, c'est la gravité). Alors, que fera l'enfant?

Il prendra et mettra au hasard des dés. De la même manière, nous ne pouvons que deviner au hasard quel coefficient nous aurons (et les vrais réseaux de neurones adultes le font aussi, seulement généralement guidés par la génération de nombres dans une distribution normale).
Juste au hasard, supposons que le coefficient de couplage en pouces et en centimètres (commençons par l'appeler poids , comme dans les réseaux de neurones adultes) sera, par exemple, de 2,4. Ensuite, nous obtenons l'expression mathématique la plus compliquée:

1 * 2.4 = 2.4

Super, nous avons presque deviné, et nous avons un résultat. Mais c'est incorrect, et ce qui est normal pour le processus d'apprentissage, nous avons une erreur. Comme dans le système nerveux avec rétroaction, nous devons en quelque sorte répondre à l'erreur. Mais vous devez d'abord comprendre sa taille. Comme je l'ai déjà dit, lors de la formation de réseaux de neurones avec un enseignant, les données sont d'abord exécutées sur des données balisées et ensuite envoyées à la classification pour des données similaires, mais sans étiquette. Nous savons également ce que nous devons obtenir le résultat correct, en conséquence, je peux calculer l'erreur:

t_target = 2.54
t_now = 2.40
e = t_target - t_now
//  ,   0.14

Maintenant, nous savons à quel point. Mais que faire? Naturellement, notre réseau de neurones jouets devrait lire les données aussi bas que possible. Et c'est une autre caractéristique sous-marine des réseaux de neurones qui se manifeste - le plus souvent, ils ont un facteur de perte pendant la formation, la partie de la science des données, appelée optimisation , est engagée dans la minimisation de l'erreur .

Mais maintenant, ce n'est pas ça. Sans aucun doute, nous devons commencer à changer le coefficient de couplage par une étape, mais par quoi? Évidemment, vous n'avez pas besoin d'être trop grand, sinon notre coefficient de couplage se révélera inexact et pas trop petit, sinon nous devrons entraîner le réseau neuronal pendant assez longtemps. Il n'y a pas d'option 100% correcte pour trouver cette étape, le plus souvent ces paramètres dans un réseau neuronal réel sont sélectionnés de manière plus intuitive que sur la base d'une formule ou d'un algorithme (bien que cela soit également possible). Maintenant, nous pouvons sélectionner au hasard la valeur de notre étape (dans le langage des réseaux de neurones, notre étape est appelée learning_rate), par exemple, la valeur 0,05 fonctionnera de manière optimale. En outre, vous devez convenir du nombre de fois que l'indentation au rythme d'apprentissage se produira.. Le nombre de ces retraits sera appelé époque, comme dans les réseaux de neurones adultes. Maintenant, armé de toutes ces connaissances, vous pouvez essayer d'écrire un petit programme Python qui exécutera notre programme de réseau de neurones jouets.

import random

#    Python  random,        

inches = 40  #    40    101, 6 
centimetre = 101.6

#  ,        , learning rate  

def kid_neuro(epoch, lr, accur):
    W_coef = random.uniform(0, 2)  #     
    print("    : ", W_coef)
    for i in range(epoch):  #    
        Error = centimetre - (inches * W_coef)
        print("  ", Error)  #      
        if Error > 0:
            W_coef += lr  #    ,    

        if Error < 0:
            W_coef -= lr  #   ,    

        if Error < accur:
            print("  ", W_coef)
            return  #  ,      

epoch = int(input("epoch: "))  #      ""
lr = float(input("enter learning rate: "))  #   
accur = float(input("enter accurancy:  "))  #   ,     ,         

kid_neuro(epoch, lr, accur)  #    -

Je laisse le lecteur essayer de faire fonctionner seul le réseau neuronal de ces enfants avec divers paramètres. Il s'avère assez bien à l'époque = 100-, taux d'apprentissage = 0,01, précision = 0,1.

Malgré l'inutilité apparente de ce programme, nous avons examiné avec vous le travail et les concepts de base des réseaux de neurones, qui sont également utilisés dans la construction de véritables grands réseaux de neurones, par exemple, dans l'algorithme de rétrogradation.

En bref, ces concepts de base:

  • W — . - , . — , ,
  • lr — learning rate, .
  • epoch ,

En tant que pratique, vous pouvez essayer d'écrire le réseau neuronal de vos propres enfants, qui traduira, par exemple, des kilomètres en miles. Et armé des connaissances acquises dans cet article, vous pouvez facilement venir ici , par exemple , et déjà essayer de démarrer le réseau neuronal de manière plus significative.

Quelques liens utiles que vous pouvez consulter si vous souhaitez continuer à vous renseigner sur les réseaux de neurones:


All Articles