---
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
