4.5 KiB
title | date | tags | categories | mathjax | ||||
---|---|---|---|---|---|---|---|---|
IA : Deep Learing | 2023-10-24 |
|
|
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 CC-BY.
En 1943, les travaux de Mc Culloch et 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.
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.
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...
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.
Dans le schéma ci-dessus:
- 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\)
- 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\)