===== Réseaux de Neurones ===== ==== 1. Introduction ==== === Fonctions d'activation === * seuil : f(s) = 0 si s <= k, f(s)=1 si s>k. On dit qu'on a un réseau neuronal //__vraiment symbolique__// * linéaire : f(s) = -1 si s <= -1/k, 1 si s > 1/k, k*s ailleurs * sigmoide : f(s) = \frac{1}{1+e^{-ks}}. Si k est grand, f(s) est proche de 0 ou de 1 pour presque toutes les valeurs de s. On dit qu'on a un réseau neuronal //__relativement symbolique__// * ou autre : gaussienne, à valeurs discrètes, etc; === Architecture === * Deux grandes familles * Réseaux bouclés, tel celui de Hopfield; problèmes de stabilité et apprentissage. * Réseaux à couches, dont couches cachées ou sans couches cachées. * Exemple : perceptron multicouche -- neurones d'entrée, connexions pondérées, couche cachée, neurone(s) de sortie. === Apprentissage === C'est la phase pendant laquelle le réseau est paramétré pour produire la transformation souhaitée. On dit aussi "pour obtenir le comportement désiré." Lorsqu'on tient compte des écarts entre les sorties et les sorties souhaitées pour faire les adaptations et mises au point, on dit que l'apprentissage est __supervisé__. Un aspect de l'apprentissage est d'aboutir à une bonne configuration, un bon nombre de neurones répartis en un bon nombre de couches. Il n'y a pas de méthode automatique pour choisir cet architecture du réseau. Il y a une méthode de construction dynamique en cours d'apprentissage : GNG. La méthode classique suit cette procédure : * on présente une donnée en entrée * on compare la sortie à ce qui serait "juste" * on note l'erreur * si l'erreur n'est pas nulle, on ajuste la pondération des connexions pour minimiser (or seulement réduire?) cette erreur : w(t+1) = w(t) + \Delta w(t) avec une fonction corrective \Delta w() En pratique, on choisit la fonction d'activation (son type, les paramètres viendront de l'apprentissage), le nombre (initial) de neurones et leur répartition en couches, la fonction d'erreur, et un critère d'arrêt. ==== 2. Perceptron ==== Le __perceptron__ est un réseau unidirectionnel très simple, avec une couche de neurones d'entrée connectés à un neurone de sortie. Le mécanisme est simplement l'application des pondérations aux signaux entre les entrées et la sortie et la comparaison de leur somme à un seuil. \displaystyle 1 \times \left(\left(\sum_{i=1}^{n_e} w_i x_i - w_0\right) \geq 0\right). C'est l'équation d'un hyperplan. Donc, cet appareil est limité à une séparation linéaire. Il peut réussir (en 2d) "OR" mais pas "XOR", par exemple. === Procédure Adaline === Aussi connue sous le nom "Widrow-Hoff" ou "delta rule." * On initialise les paramètres (poids, dont w_0) à des valeurs quelconques. * Pour chaque exemple, - on le présente - on calcule les ajustements des poids en fonction des écarts : * \Delta w_j = \epsilon \left(c_i - o_i\right)\left(x_i\right) * w_j (t+1) = w_j(t) + \Delta w_j (t) Logiquement, on augmente le poids si le neurone avant un signal positif mais on n'a pas atteinte le seuil, et on diminue le poids si le neurone avant un signal positif et on a dépassé le seuil alors qu'il ne fallait pas. ^ c(orrecte) | 1 | 1 | 1 | 0 | 0 | ^ o(utput) | 1 | 0 | 0 | 1 | 1 | ^ x(signal) | | 0 | 1 | 0 | 1 | ^ correction | 0 | 0 | +-\$\epsilon\$ | 0 | -\$\epsilon\$ | Si l'échantillon d'entrée n'est pas linéairement séparable, l'algorithme ne convergera pas vers taux d'erreur nul. Remarque: si les poids prennent deux fois les mêmes valeurs sans que le perceptron ait appris alors que tous les exemples ont été présentés signifie que l'échantillon n'est pas linéairement séparable. C'est une bonne méthode lorsque les données sont linéairement séparable; il n'y a pas (d'autre) hypothèse sur les données. Mais si le nombre d'exemples (<2n) est insuffisant par rapport au nombre de variable (=n), les exemples sont très souvent linéairment séparable même si les vrais individus ne le sont pas. ==== 3. Perceptrons Multi-couches ====