Exercices Réseaux Neurones (8.5)

Exercice 44

Exercice pas facile sur le perceptron tel qu'il a été défini historiquement. Parfois, on utilise le terme perceptron pour désigner un seul neurone.

  1. Pour (a) l'idée est de considérer des cellules d'association entre neurones symétriques x1 et xn, x2 et xn-1, ... de considérer une fonction qui sort 1 si et seulement si les deux entrées sont égales et une cellule de sortie qui calcule un and de toutes ces cellules d'association. Pour (b), avec un diamètre limité de 1, on peut considérer des cellules d'association pour x1, x1 et x2, x1 et x2 et x3, x2 et x3 et X4, ..., réfléchir aux fonctions d'association à considérer et à leur combinaison dans une cellule de sortie. Pour (c), il faut s'inspirer de la figure 8.12 (et pas 44 !).
  2. Il faut choisir astucieusement les exemples de figure connexes qu'il doit reconnaître et qui vont le forcer à reconnaître une figure non connexe bien choisie.

Exercice 45

L'exercice introduit par l'exemple la méthode permettant de montrer que toute fonction Booléenne est calculable par PMC.

Avec la forme normale disjonctive de la fonction f, il suffit, en s'inspirant des exercices sur le or, le and et le xor, de construire trois neurones linéaires à seuil. Le premier sort 1 si et seulement si x=1 et y=0, le second sort 1 si et seulement si x=y=z=1 (c'est le and à trois entrées), le troisième sort 1 si et seulement si x=y=z=0 (c'est la négation du and à trois entrées). Enfin de construire un neurone linéaire à seuil qui calcule le or à trois entrées qui combine les trois sorties des trois neurones précédents.

Exercice 46

L'exercice poursuit l'exercice précédent avec l'exemple de la fonction parité et introduit le fait que le nombre de neurones dans la couche cachée peut être grand.

  1. Pour d=2, la fonction parité vaut 1 si x1=x2=0 ou x1=x2=1. Cette fonction n'est pas linéairement séparable donc n'est pas calculable par un neurone linéaire à seuil. Vous pouvez le vérifier graphiquement car les quatre points ne sont pas linéairement séparables. Vous pouvez le démontrer en vous inspirant de l'exercice 33.
  2. Pour d=3, il suffit de considérer la somme des quatre monômes ayant 0 ou 2 entrées à 1. On obtient parité(x,y,z) = non(x) non(y) non(z) + non(x) y z + x non(y) z + x y non(z). Pour d=4, il suffit de considérer la somme des huit monômes ayant 0 ou 2 ou 4 entrées à 1 qui correspondent aux quadruplets (0,0,0,0), (1,1,0,0), (1,0,1,0), (1,0,0,1), (0,1,1,0), (0,1,0,1), (0,0,1,1) et (1,1,1,1). Par exemple, le monôme correspondant à (0,1,0,1) est non(x) y non(z) t.
  3. Pour d=3, on définit quatre neurones linéaires à seuil pour les quatre monômes. Le premier sort 1 si et seulement si x=y=z=0, le second sort 1 si et seulement si x=0 et y=z=1, le troisième sort 1 si et seulement si x=1 et y=0 et z=1, le quatrième sort 1 si et seulement si x=y=1 et z=0. Enfin, il suffit de construire un neurone linéaire à seuil qui calcule le or à quatre entrées qui combine les quatre sorties des trois neurones précédents. Pour d= 3, on a donc construit un PMC à deux couches avec une couche cachée contenant 4 neurones et une couche de sortie avec un neurone. Pour d= 3, on construirait un PMC à deux couches avec une couche cachée contenant 8 neurones et une couche de sortie avec un neurone. Pour d=n, on généralise la construction. On a 2^n monômes possibles. Parmi eux on a la moitié soit 2^(n-1) ayant un nombre pair d'entrées à 1, on construirait donc un PMC à deux couches avec une couche cachée contenant 2^(n-1) neurones et une couche de sortie avec un neurone. On peut noter que cette construction mène à une couce cachée ayant un nombre exponentiel de neurones dans la couche cachée. Cette construction n'est pas réaliste dès que n devient grand. Par exemple, pour n=100, on aurait 2^99 neurones dans la couche cachée qui a pour ordre de grandeur 10^30 !
  4. Pour d=3, on construit dans la couche cachée trois neurones. Le premier sort 1 si au moins une des entrées vaut 1, il suffit de prendre des poids égaux à 1 pour x1, x2 et x3 et un poids de -0.5 pour x0=1. Le deuxième sort 1 si au moins deux entrées valent 1, il suffit de prendre des poids égaux à 1 pour x1, x2 et x3 et un poids de -1.5 pour x0=1. Le troisième sort 1 si au moins trois des entrées valent 1, il suffit de prendre des poids égaux à 1 pour x1, x2 et x3 et un poids de -2.5 pour x0=1. Pour la sortie, il faut combiner les sorties des trois neurones précédents. Il suffit de choisir des poids de -1, +1 et -1 dans l'ordre des trois neurones de la couche cachée et de prendre un poids de 0.5 pour l'entrée x0=1. Vérifiez la correction de ce PMC. On peut généraliser cette construction à d=n quelconque avec n neurones dans la couche cachée avec des poids de 1 pour les n entrées et des poids respectifs de -0.5, -1.5, ..., -n+0.5 pour l'entrée x0=1. Pour le neurone de sortie, on généralise la construction précédente en alternant des poids de -1 et +1 et un poids de 0.5 pour l'entrée supplémentaire x0=1. Cette construction mène à un PMC ayant deux couches, n neurones dans la couche cachée et un neurone de sortie.

Exercice 47

L'exercice présente le schéma de la preuve que toute fonction Booléenne est calculable par un PMC avec une couche cachée.

Toute fonction Booléenne sur n variables x1, ..., xn peut être mise sous forme normale disjonctive, c'est-à-dire sous la forme d'une somme (un or) de produits (des and) constitué avec les variables ou leur négation. Pour vous en persuader, imaginez un tableau contenant, en ligne, toutes les valeurs possibles des variables x1, ..., xn (il y a 2^n lignes) et une colonne qui contient la valeur de la fonction considérée. On considère les 1 de cette colonne et pour chacune des lignes correspondantes on écrit le monôme. Par exemple, supposons que n=5 et que notre fonction vale 1 pour les 5-uplets (0,0,1,1,1), (1,0,1,0,1) et (1,0,0,1,1) et eux seulement. Alors la fonction peut s'écrire comme la somme des trois monômes correspondants à savoir non(x1) non(x2) x3 x4 x5, x1 non(x2) x3 non(x4) x5 et x1 non(x2) non(x3) x4 x5. Avec cette forme normale disjonctive de la fonction, on construit un PMC avec une couche cachée constitué d'autant de neurones qu'il y a de monômes et un neurone calcule un monôme. Il suffit alors d'ajouter un neurone de sortie qui calcule le or des sorties de ces neurones.

On peut noter que la forme normale disjonctive peut contenir entre 0 et 2^n neurones et donc que cette construction peut mener à une couche cachée de taille exponentielle. Nous avons vu dans l'exercice précédent qu'une autre construction peut mener à un PMC de plus petite taille. Cependant, il a été démontré que toute fonction Booléenne est calculable par un PMC à une couche cachée mais qu'il existe des fonctions pour lesquelles tout PMC qui la calcule doit contenir un nombre exponentiel de neurones. C'est pour cette raison qu'il peut être utile de considérer des PMCs à plusieurs couches qui peuvent nécessiter moins de neurones.

Exercice 48

L'exercice illustre différentes fonctions d'activation des neurones.

Les questions 1, 2 et 3 n'en sont pas.

Pour la question 4, considérons les vecteurs d'entrée x0=(1,0,0), x1=(1,0,1), x2=(1,1,0) et x3=(1,1,1). La somme pondérée des entrées avec le vecteur de poids (-1.5,1,1) est respectivement de -1.5, -0.5, -0.5, 0.5. Donc un neurone linéaire à seuil avec la fonction de Heaviside sort respectivement 0, 0, 0 et 1. Un neurone sigmoide sort respectivement 0.18, 0.38, 0.38 et 0.62. Un neurone ReLU sort respectivement 0, 0, 0 et 0.5.

Exercice 49

L'exercice illustre comment calculer les sorties d'un PMC avec des opérations tensorielles (ici matricielles car des tenseurs de dimension au plus 2).

  1. On calcule dans un premier temps le produit entre la transposée de la matrice W1 avec la matrice X. La transposée de la matrice W1 est une matrice à trois lignes et 4 colonnes où chaque ligne représente le vecteur des poids d'un neurone. Sa première ligne est (-0.5,1,-1,0) qui est le vecteur de coefficients du premier neurone de la couche cachée. Sa deuxième ligne est (-2.5,1,1,1) qui est le vecteur de coefficients du deuxième neurone de la couche cachée. Sa troisième ligne est (0.5,-1,-1,-1) qui est le vecteur de coefficients du troisième neurone de la couche cachée. Si on multiplie cette matrice par X, on obtient une matrice à trois lignes et huit colonnes. Chaque colonne représente la sortie des trois neurones sur l'entrée correspondante. Par exemple, on obtient en première colonne (-0.5,-2.5,0.5) qui sont les sorties des trois neurones lorsqu'on fait passer l'entrée (0,0,0) représentée par le vecteur (1,0,0,0), on obtient en seconde colonne (-0.5,-1.5,-0.5) qui sont les sorties des trois neurones lorsqu'on fait passer l'entrée (0,0,1) représentée par le vecteur (1,0,0,1), etc. A cette matrice, on applique ensuite la fonction g=Heaviside en appliquant la fonction à chacune des composantes. On obtient une matrice à 3 lignes et huit colonnes avec pour colonnes (0,0,1), (0,0,0), (0,0,0), (0,0,0), (1,0,0), (1,0,0), (0,0,0), (0,1,0) où chaque colonne représente la sortie de la première couche (3 valeurs car 3 neurones) pour chacune des entrées possible. Il reste à appliquer les calculs de la seconde couche. On considère la transposée du vecteur w2 qui est une matrice à 1 ligne et 4 colonnes égale à (-0.5,1,1,1). On multiplie par la matrice des entrées obtenue en ajoutant à la matrice sortie de la première couche une première ligne avec des 1 (pour représenter l'entrée x0=1). On obtient une matrice à 1 ligne et 8 colones égale à (0.5,-0.5,-0.5,-0.5,0.5,0.5,-0.5,0.5). On applique enfin la fonction g=Heaviside et on obtient le vecteur de sortie égal à (1,0,0,0,1,1,0,1).
  2. Vous pouvez vérifier que cette fonction correspond bien à la fonction de l'exercice 45.
  3. Il suffit de remplacer en sortie de la première couche la fonction de Heaviside par la fonction sigmoide, de recalculer le produit de la transposée de w2 par la matrice de sortie et d'appliquer la fonction sigmoide au résultat.

Exercice 50

Cet exercice introduit la résolution de problème par réseaux de neurones. Il pose de nombreuses questions abordées dans le chapitre 6 méthodologie.

  • Choix des entrées. Les réseaux de neurones manipulent des valeurs numériques or le problème crx contient des attributs discrets.
    • Pour l'attribut A1, on peut choisir de coder a par 0 et b par 1 et considérer une entrée x1 qui représente A1.
    • L'attribut A2 est continu, on peut le représenter par une entrée x2 qui prend la valeur de A2. Mais ceci peut poser problème car les échelles de valeur peuvent être très différentes. Il est donc conseillé de normaliser l'attribut A2 par une méthode présentée dans le chapitre 6. On procède de même pour A3.
    • L'attribut A4 est discret et a quatre valeurs. Une première solution serait de représenter A4 par une entrée x2 qui vaut 0, 1, 2 ou 3 en codant u par 0, y par 1, l par 2 et t par 3. Si on normalise dans [0,1], on prendrait une entrée x2 qui vaut 0, 0.33, 0.66 ou 1 en codant u par 0, y par 0.33, l par 0.66 et t par 1. Une seconde solution est de représenter A4 par quatre entrées x41, x42, x43 et x44 et de coder u par (1,0,0,0), y par (0,1,0,0), l par (0,0,1,0) et t par (0,1,1,1). Une troisième solution est de représenter A4 par deux entrées x41, x42 et de coder u par (0,0), y par (0,1), l par (1,0) et t par (1,1). Le choix n'est pas simple. Si il existe un ordre "naturel" sur les valeurs u,y,l et t, on choisira plutôt la première solution. Sinon, on choisira plutôt une des deux autres solutions.
    • L'attribut A6 est un attribut discret qui possède 14 valeurs ! On peut le représenter par 14 entrées qui valent 0 ou 1, ou par 4 entrées qui valent 0 ou 1 car avec quatre entrées Booléennes on peut encoder 16 valeurs. On peut le représenter par une entrée continue 0, ..., 13 et normaliser.
    • En conclusion, pour des problèmes de ce type, le codage des entrées pose déja des questions et de nombreux choix sont possibles. Ceci fait dire à certains qu'il vaut mieux réserver les réseaux de neurones à des problèmes associés à des signaux (images, son, video) et à des textes plutôt qu'à des problèmes où les attributs ont été construits manuellement et peuvent être de différents types. Les exercices 54, 55 et 56 reviennent sur ces questions de discrétisation et normalisation d'attributs.
  • Choix de la sortie. Le problème est un problème de classification. On peut penser au neurone linéaire à seuil. Mais la fonction Heaviside (ou signe) n'est pas dérivable et donc on ne dispose pas de méthode d'apprentissage adaptée à un PMC. Donc on préférera un neurone sigmoïde.
  • Choix de l'architecture. Le problème ne semble pas complexe donc une couche cachée doit être suffisante. Selon le codage des entrées choisi on dispose de 16 entrées ou plus. Il semble raisonnable de considérer une couche cachée contenant entre 8 et 32 neurones. On peut, par exemple, essayer 8, 12, 16, 20 et 24 en choisissant par validation croisée.

Exercice 51

Cet exercice donne une indication des tailles de réseaux utilisés sur des tâches réelles. Ici, sur la représentation vectorielle de mots pour le traitement du langage naturel.

Une architecture de base contient une matrice de 300 000 x 200 paramètres pour les représentations des mots et une couche de sortie de type softmax de taille 300 000 soit de l'ordre de 60 10^6 paramètres. On utilise plutôt le negative sampling avec des représentations différentes pour les mots et les contextes qui sont combinées dans un produit scalaire puis dans un neurone sigmoïde pour prédire la classe. La taille est de l'ordre de 120 10^6 paramètres mais les calculs et l'apprentissage sont plus simples (rappelons que le softmax nécessite de normaliser et de calculer 300 000 sorties). Au vu du nombre de paramètres à apprendre, on voit qu'il faut un grand nombre d'exemples pour apprendre les paramètres. En effet, l'apprentissage est réalisé sur de très grands corpus textuels comme le Wikipedia corpus ou ukWac corpus en anglais contenant chacun de l'ordre de quelques milliards de mots.

Exercice 52

Cet exercice présente le cas du neurone ReLU et l'extension des formules avec d'autres mesures de perte.

  1. Pour le neurone de sorties, la formule est donnée dans la Section 5.1.4 pour un neurone sigmoïde. Pour un neurone ReLU, on a g(x)=max{0,x} dont la dérivée est 0 sur les négatifs et 1 sur les positifs. On aura donc une valeur nulle si la somme pondérée est négative et pas de mise à jour des poids et pour le cas positif les mêmes formules que pour le neurone linéaire. Avec un pas de gradient petit ou un pas de gradient adaptatif, le problème d'une dérivée nulle et donc de non mise à jour des poids ne va se produire que très rarement sur toutes les entrées et donc le neurone reLU se comporte bien en pratique.
  2. Si on ajoute le terme de régularisation, lorsqu'on calcule la dérivée de E par rapport à un wi, on reprend les formules de l'algorithme de la Section 5.1.4 auquel on ajoute la dérivée du terme de régularisation par rapport à un wi qui est 2 lambda wi.

Exercice 53

Cet exercice est un exercice simpliste de choix d'une architecture. Erratum : l'ensemble T doit plutôt être considéré comme un ensemble de validation permettant de choisir l'architecture. Il faudrait un ensemble test pour estimer ensuite l'erreur réelle.

  1. Les erreurs respectives en apprentissage (mesurées sur A) des PMCs h1, h2 et h3 sont respectivement 1.9%, 1.1% et 0.5%. Les erreurs respectives en validation (mesurées sur T) des PMCs h1, h2 et h3 sont respectivement 4%, 2% et 5%.
  2. On applique les résultats de l'exercice 22. Les intervalles de confiance à 95% pour les erreurs en validation sont respectivement de [2.28%, 5.72%], [ 0.77%, 3.23%] et [3.09%, 6.91%].
  3. Sur l'erreur en validation, on choisirait l'hypothèse h2. On peut constater que l'erreur en apprentissage diminue lorsqu'on complexifie le réseau ce qui est normal car on considère un espace d'hypothèses plus grand avec un risque de sur-spécialisation. L'erreur en validation diminue puis augment car peut être commence-t-on à sur-spécialiser. Notez que si l'erreur en validation de h2 est plus petite, les intervalles de confiance ont des intersections non nulles. Donc on peut se poser la question de la confiance qu'on porte dans le choix de h2. Il existe des tests statistiques pour évaluer cette confiance basés sur des tests d'hypothèse. Ceci sort du cadre de notre ouvrage mais il faut être conscient que des études réelles nécessiteraient des tests statistiques plus approfondies.