--- title: "IA : Deep Learing" date: 2023-10-24 tags: ["IA", "jeux"] categories: ["Intelligence artificielle", "Cours"] mathjax: true --- L'apprentissage profond -- ou *deep learing* -- est une branche de l'intelligence artificielle. Il utilise les réseaux de neurones pour résoudre des tâches complexes. Ces techniques ont permi des progès significatif et rapide dans des domaines tels que la reconnaissances d'écritures, la vision par ordinateur, les traitements automatisés du lancages etc. Il existe deux catégories d'apprentissage profond : * **supervisé**: l'algorithme d'apprentissage est entraîné avec des jeux de données etiquettés afin de produire les résultats attendus; * **non supervisé**: les données ne sont pas étiquetées, c'est à l'algorithme de découvrir les structures sous-jascentes. Ces deux méthodes sont totalement différentes, nou étudirons seulement l'entraînement supervisé dans le cadre de ce cours. ## Un neurone D'abord il y a le neurone biologique en voici un schéma, crédits [Nicolas Rougier][wiki_neurone] CC-BY. ![Schéma de neurone biologique ](./images/Neuron-figure-fr.svg) En 1943, les travaux de [Mc Culloch][mcculloch] et [Pitts][pitts] mène à la publication de l'article *« A logical calculus of the Ideas Immanent in Nervous activity »* dans *Bulletin of Mathematical Biophysics, University of Chicago Press*. Ces travaux mènerons à la définission du **neurone formel*. ### Neurone formel C'est une représentation mathématique et informatique d'un neuronne. ![Schéma de fonctionnement de neurone formel](./images/neurone_formel.svg) Il se compose d'une ou plusieurs **entrées** associés à des **coefficients** (poids). Notre neurone formel calcule la *somme pondérée* des entrées à laquelle il ajoute un **biais** puis envoie la sortie dans une **fonction d'activation**. ### Premiers pas en Python Pour implémenter notre premier neurone formel, nous utiliserons *Python* et la bibliothèque *Numpy*. ```python import numpy as np """ La définition mathématique du neurone x: entrée w: poids b: biais f: fonction d'activation """ def neron(x, w , b, f): x = np.dot(x, w) + b return f(2) # et maintenant nous allons utiliser notre neurone # -- # Définissons les entrées x = np.array([1,2,3,4]) # Nous mettons les poids à 1 w = np.array([1,1,1,1]) # Et notre biais à 1 b = np.array([1]) ## Et on l'utilise neuron(x, w, b, lambda z: np.exp(z)) ``` ### Fonctions d'activation C'est une fonction mathématique appliquée à un signal en sortie de notre neurone. Son nom viens de son équivalent biologique **potentiel d'activation** qui représente le seuil qui entraîne une réponse du neurone une fois atteint. N'importe quel fonction mathématique peut faire l'affaire, on utilisera cependant les fonctions suivants **leurs caractéristiques** : * Linéaire; * Seuil; * ReLU (*Rectified Linear Unit*): \\(f(x) = max(0, z)\\) * Radiale : \\( f(x) = \sqrt{1/2\pi{e}^{(-z^{2}/2)}}\\) ## les réseaux de neurones D'un neurone vers l'infini... ![Exemple d'un réseau de neurones](./images/reseau_neurones.svg) Dans un réseau de neurones, chacun a son propre poid et biais, les paramètres du réseau sont composés de l'ensemble des poids et biais. Tous les neurones d'une même couche ont **les mêmes fonctions**. Le réseaux est organisés en couche. Les **reseaux de neuronnes complètement connectés**, toutes les sorties des neuronnes de la couche 0 sont connectés aux entrées de tous les neurines de la couche 1. ### Application de transformation Les résultats obtenus en sortie de notre réseaux noe sont pas forcément compatibles avec la séparation linéaires. Il est alors possible d'appliquer une **matrice de transformation**, ce qui reviens à appliquer une autre couche à notre réseau. ![Schéma de transformation](./images/transformation.svg) Dans le schéma ci-dessus: 1. La première transformation est \\( W = \begin{pmatrix} +\frac{1}{2} -\frac{1}{2} \\\ -\frac{1}{2} +\frac{1}{2} \end{pmatrix} \\) ce qu nous donne \\(Wx\\) 2. La seconde est \\(g(u) = max\\{0,x\\}\\) ce qu nous donne \\(h(x) = g(Wx)\\) Au final, nous avons \\({w_{2}}^{t}h(x)+ b_{2} = (4 4)h(x) - 1 \implies y = {w_{2}}^{t}h(x)+ b_{2} \\) Ce n'est rien d'autre qu'un réseaux de neurones avec une couche cachée \\(h\\) [wiki_neurone]:https://commons.wikimedia.org/w/index.php?title=User:Nicolas.Rougier [mcculloch]:https://fr.wikipedia.org/wiki/Warren_McCulloch [pitts]:https://fr.wikipedia.org/wiki/Walter_Pitts