# Perceptron

Dans cet article, on va découvrir ensemble la base des réseaux de neurones artificiels, souvent appelée **perceptron**, ou plus simplement… **neurone**.

## C’est quoi, un perceptron ?

Le perceptron est un **réseau de neurones artificiels très simple** : il ne contient qu’un seul neurone. À la base, il a été inventé pour **imiter le neurone du cerveau**. D’où le nom.

Dans sa forme la plus simple, un neurone biologique reçoit des signaux d’entrée (via les synapses), les traite, puis transmet une réponse. Le perceptron reproduit ce schéma : il reçoit une entrée, la transforme à l’aide d’une fonction mathématique, puis produit une sortie.

Plus précisément :

* Les **entrées** sont des nombres.
* Chaque entrée est **pondérée**, puis toutes les entrées pondérées sont **additionnées** avec un **biais**.
* Le résultat est ensuite passé à une **fonction d’activation**.
* Le **résultat final**, un nombre, est la **sortie du perceptron**.

<figure><img src="https://3366121826-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fdo9UTLEVhvOrL0zBVbm6%2Fuploads%2FfV8JBIKKOed7BTg7ObP7%2Fimage.png?alt=media&#x26;token=41dfdf74-2952-4ebf-82b2-681a87568f45" alt=""><figcaption><p>Modélisation matématique d'un neurone ou perceptron : <span class="math">x_i</span> les entrées, <span class="math">a_i</span> les poids, <span class="math">f</span> une fonction linéaire, et <span class="math">\phi</span> la fonction d'activation.</p></figcaption></figure>

## Activation, kézako ?

En biologie, les synapses ne transmettent pas toujours un signal. Il faut dépasser un **seuil** pour activer la transmission. Ce principe est reproduit dans les neurones artificiels via une **fonction d’activation**.

La fonction d’activation détermine **dans quelles conditions une sortie est produite**. Plusieurs fonctions existent dans la littérature, les plus connues étant : la fonction de Heaviside (fonction seuil), la fonction sigmoïde, la fonction ReLU, la fonction tanh... bref, il en a plusieurs.

<figure><img src="https://3366121826-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fdo9UTLEVhvOrL0zBVbm6%2Fuploads%2Fs1LV0pyokmMPeHQN365T%2Fimage.png?alt=media&#x26;token=96237a15-1838-4ebf-884d-cf0465af4150" alt=""><figcaption></figcaption></figure>

## Que faire du perceptron ?

Le perceptron est principalement utilisé pour résoudre des **problèmes de classification binaire**. Cela peut paraître abstrait, alors prenons un exemple concret.

## Exemple : Classification de points en bleu ou rouge

Considérons un **nuage de points** dans le plan (voir image ci-dessous). L’objectif est de construire un modèle capable de déterminer si un point est **bleu** ou **rouge**.

<figure><img src="https://3366121826-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fdo9UTLEVhvOrL0zBVbm6%2Fuploads%2FLGfNLfmLtbk1O5lEsQHZ%2Fimage.png?alt=media&#x26;token=58ab0590-5d86-47ac-b691-8a59132b2eb5" alt=""><figcaption></figcaption></figure>

### Analyse et observation

Visuellement, on se rend vite compte qu’il suffit de tracer une **ligne** qui sépare les rouges des bleus. Selon quel côté de la ligne se trouve ton point, il sera bleu ou rouge.

On devine ici un fonctionnement de type **perceptron** :

* La **droite** est définie par une **fonction linéaire** : ax+by+c=0
* Le fait d’attribuer une couleur en fonction de la position par rapport à cette droite revient à **utiliser une fonction d’activation**.
  * Si ax+by+c≥0, on décide que le point est bleu.
  * Sinon, il est rouge.

<figure><img src="https://3366121826-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fdo9UTLEVhvOrL0zBVbm6%2Fuploads%2FzAsK09v0HZy6Lpe38mwi%2Fimage.png?alt=media&#x26;token=46d8e405-7a17-4d77-beed-a5a8a713e0a9" alt=""><figcaption></figcaption></figure>

### Modélisation

1. Chaque point est représenté par ses **coordonnées** : une entrée X=\[x1,x2].
2. La **couleur** du point est codée par un nombre :
   * 1 pour **bleu**,
   * 0 pour **rouge**.
3. Le neurone est défini par : (\[w1,w2],b,ϕ) où :
   * w1,w2 sont les **poids**,
   * b est le **biais**,
   * ϕ est la **fonction d’activation** (ici, la **sigmoïde**).
4. La **prédiction** du neurone est notée ŷ.

### Préparation des données

Nous disposons d’un ensemble de points, chacun associé à une couleur. Nous divisons ce jeu de données en **trois ensembles** :

* **Ensemble d’entraînement** : utilisé pour apprendre à distinguer rouge et bleu.
* **Ensemble de validation** : pour vérifier si le modèle généralise bien.
* **Ensemble de test** : pour tester le modèle sur des données jamais vues.

<figure><img src="https://3366121826-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fdo9UTLEVhvOrL0zBVbm6%2Fuploads%2F4TtmmgUtWLjblls6NENv%2Fimage.png?alt=media&#x26;token=86b38c08-5a61-4f7a-8e1f-7edba5077f90" alt=""><figcaption></figcaption></figure>

### Comment il apprend, ce neurone ?

Entraîner un neurone consiste à **trouver les poids et biais** permettant de faire de bonnes prédictions. On essaye de minimiser la différence entre la réponse attendue et celle trouvée

La méthode la plus répandue, c’est la **descente de gradient**.. La fonction d'écart sera la **binary cross entropy function** (ou **log loss**); celle-ci est adaptée pour de la classification binaire.

Le code complet est sur [mon GitHub](https://github.com/kmanu225/ml-perceptron).

### Résultats et performance

On observe que le neurone agit comme une **droite de séparation**. la plupart des points sont bien classés, mais il y a toujours des erreurs : le modèle est trop simple.

<figure><img src="https://3366121826-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fdo9UTLEVhvOrL0zBVbm6%2Fuploads%2FqNDIXbhALr2UJSpSeBIh%2Fimage.png?alt=media&#x26;token=1540836a-4b82-4f79-bac7-b6fd67373ff2" alt=""><figcaption></figcaption></figure>

#### Et si on ajoute un neurone ?

En ajoutant un **deuxième neurone** (2 neurones en sortie), on obtient quasiment les mêmes résultats. En termes d'explicabilité, on peut supposer que:

* Le **neurone 1** calcule la probabilité que le point soit bleu.
* Le **neurone 2** calcule celle qu’il soit rouge.
* On prend la couleur correspondant à la probabilité la plus élevée.

> Ex : p\_1 > p\_0, alors le point est bleu.

Dans le fond, ces deux probabilités sont liées ($$p\_1 \approx 1-p\_2$$ ) donc le modèle peut se ramener à un seul perceptron d'où la similarité des résultats.

<figure><img src="https://3366121826-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fdo9UTLEVhvOrL0zBVbm6%2Fuploads%2FU2pSz7jBaxoD6Xl787aE%2Fimage.png?alt=media&#x26;token=82a594dc-1bd2-46ae-8a81-e848ed8513bc" alt=""><figcaption></figcaption></figure>

#### Encore un autre neurone

Si on modifie la structure du perceptron, par exemple en ajoutant un **neurone de sortie** (2 neurones en entrée, 1 en sortie), les performances **se dégradent** lorsque l'on réutilise les mêmes paramètres. Le modèle ne correspond pas à notre problème. En générale, la structure du modèle adéquat à la résolution d'un problème s'obtient de façon empirique.

<figure><img src="https://3366121826-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fdo9UTLEVhvOrL0zBVbm6%2Fuploads%2FVK7eotu34L1nQF83Kt6J%2Fimage.png?alt=media&#x26;token=7a774928-df44-495c-968a-c32f26965464" alt=""><figcaption></figcaption></figure>

#### Remarques

Dans la résolution du problème, nous avons eu à effectuer plusieurs choix que je vais expliquer succinctement :

* La modélisation du problème : parvenir à caractériser nos données en objets mathématiques.
* Le choix de la fonction d’activation : chaque fonction d’activation est adaptée à une classe de problèmes.
* Le choix de la fonction d'erreur.
* La méthode de minimisation de la fonction d’erreur. Dans notre cas, nous avons utilisé la méthode de gradient classique.
* La structure du modèle : nous l’avons évoquée brièvement mais le nombre de neurones, ainsi que la façon dont ceux-ci sont interconnectés, a un fort impact sur la résolution du problème. Nous aborderons ce point dans un prochain article sur les réseaux de neurones.

## Pour finir

Cet article vous donne les bases pour mieux comprendre les réseaux de neurones. Le cas d’usage sur le perceptron se généralise facilement aux réseaux de neurones, avec quelques éléments supplémentaires à prendre en compte. Dans un prochain article, j’irai au-delà du perceptron pour parler des réseaux de neurones et des questions que l’on se pose lorsqu’il s’agit de les utiliser.
