• Projets00
  • AI Academy13
  • Veille07 entrées ces 7 derniers jours
  • Outils00
Profil
Déposer un projet
ProjetsAI AcademyVeilleOutilsProfilDéposer
Le cours
14/59
Lecture10 min

De la grille au vecteur

Mettre une image à plat pour la donner au modèle, et ce qui devient invisible en chemin.

Une image est un carré de pixels, quand le modèle qu'on va écrire attend une simple liste de nombres alignés, et il faut donc mettre l'image à plat avant de la lui donner. On peut le faire sans rien perdre, ce qui règle la question la plus évidente et en laisse une autre, beaucoup moins évidente. Qu'est-ce que le modèle cesse de voir, une fois l'image mise à plat ?

À gauche, l'image de test numéro zéro, un sept, dessinée en cases pleines dans une grille de vingt-huit sur vingt-huit, cotée X appartenant à l'ensemble des tableaux vingt-huit sur vingt-huit à coefficients entre zéro et un. Une flèche horizontale part de la grille vers la droite ; elle porte le mot vec au-dessus et la formule k égale vingt-huit fois i moins un, plus j, au-dessous. À droite, une colonne de ronds : x un, x deux et x trois, blancs et nuls ; trois points de suspension ; x deux cent trente et un, gris foncé, de valeur zéro virgule huit sept zéro cinq huit huit, et x deux cent trente-deux, presque noir, de valeur zéro virgule neuf neuf six zéro sept huit, tous deux cerclés de brique ; trois points encore ; enfin x sept cent quatre-vingt-trois et x sept cent quatre-vingt-quatre, blancs et nuls. Une accolade embrasse la colonne entière et porte la cote sept cent quatre-vingt-quatre. Sous elle, x appartient à l'ensemble des vecteurs à sept cent quatre-vingt-quatre coordonnées comprises entre zéro et un.
Le rang kkk ne se lit pas sur l'image. Il se calcule.

À gauche, la grille est l'image de test n°0, la même qu'à la page 2, et la flèche du milieu porte le nom de l'opération, vec\mathrm{vec}vec, avec au-dessous la règle qui donne le rang, k=28(i−1)+jk=28(i-1)+jk=28(i−1)+j.

La colonne de droite a 784 cases, ce que rappelle l'accolade, et la figure n'en dessine que quelques-unes, parce que 784 ronds empilés ne tiendraient pas sur la page.

Les deux ronds cerclés de brique sont x231x_{231}x231​ et x232x_{232}x232​, qui viennent des pixels de la ligne 9, colonnes 7 et 8. La règle se vérifie en prenant i=9i=9i=9 et j=7j=7j=7, ce qui donne 28×(9−1)+7=23128\times(9-1)+7=23128×(9−1)+7=231, puis 232232232 pour le pixel voisin de la colonne 8. Deux pixels voisins sur une même ligne ont donc des rangs qui se suivent, et c'est le seul voisinage que la colonne conserve.

Les ronds du haut et du bas, enfin, sont blancs : x1x_{1}x1​, x2x_{2}x2​ et x3x_{3}x3​ valent 0, comme x783x_{783}x783​ et x784x_{784}x784​, puisque ce sont les pixels vides du pourtour de l'image.

Des octets aux réels

L'octet d'un pixel est un entier de [ ⁣[0,255] ⁣][\![0,255]\!][[0,255]], où 000 est le blanc du papier et 255255255 le noir plein de l'encre, et voici la division annoncée page 2, écrite une fois pour toutes.

Xbrut∈M28,28([ ⁣[0,255] ⁣]),X=1255 Xbrut∈[0,1]28×28X_{\text{brut}}\in\mathcal{M}_{28,28}\big([\![0,255]\!]\big),\qquad X=\frac{1}{255}\,X_{\text{brut}}\in[0,1]^{28\times 28}Xbrut​∈M28,28​([[0,255]]),X=2551​Xbrut​∈[0,1]28×28
La division est faite coefficient par coefficient, et le diviseur est 255255255 parce que c'est la valeur du noir plein, celle qui doit tomber sur 111.

L'aplatissement

Aplatissementflattening

L'application vec:M28,28(R)→R784\mathrm{vec}:\mathcal{M}_{28,28}(\mathbb{R})\rightarrow\mathbb{R}^{784}vec:M28,28​(R)→R784 qui range les coefficients d'une matrice bout à bout, ligne après ligne. Sa réciproque vec−1:R784→M28,28(R)\mathrm{vec}^{-1}:\mathbb{R}^{784}\rightarrow\mathcal{M}_{28,28}(\mathbb{R})vec−1:R784→M28,28​(R) replie un vecteur en grille.

x=vec(X)∈[0,1]784,xk=Xij  avec  k=28 (i−1)+j,(i,j)∈[ ⁣[1,28] ⁣]2\mathbf{x}=\mathrm{vec}(X)\in[0,1]^{784},\qquad x_{k}=X_{ij}\ \text{ avec }\ k=28\,(i-1)+j,\quad (i,j)\in[\![1,28]\!]^{2}x=vec(X)∈[0,1]784,xk​=Xij​  avec  k=28(i−1)+j,(i,j)∈[[1,28]]2
(3.1)
x\mathbf{x}x est un vecteur colonne, de dimension 784×1784\times 1784×1. La formule est bijective : à chaque kkk de [ ⁣[1,784] ⁣][\![1,784]\!][[1,784]] correspond exactement un couple (i,j)(i,j)(i,j).

La formule vérifiée aux quatre coins

Pixel (i,j)(i,j)(i,j)28 (i−1)+j28\,(i-1)+j28(i−1)+jRang kkk

(1,1)(1,1)(1,1), coin haut gauche

28×0+128\times 0+128×0+1

111

(1,28)(1,28)(1,28), coin haut droit

28×0+2828\times 0+2828×0+28

282828

(28,1)(28,1)(28,1), coin bas gauche

28×27+128\times 27+128×27+1

757757757

(28,28)(28,28)(28,28), coin bas droit

28×27+2828\times 27+2828×27+28

784784784

Les quatre coins donnent bien les rangs extrêmes, et aucun rang n'est atteint deux fois.
Les quatre pixels dont le tableau vient de donner les rangs partent s'y ranger. Ce que le modèle recevra n'est plus une grille : c'est cette colonne, et l'ordre y est tout ce qui reste de la géométrie.

Une grille de vingt-huit cases sur vingt-huit occupe le centre de l'écran ; un sept manuscrit y est dessiné, chaque case plus ou moins sombre selon l'encre qu'elle porte. Quatre cases s'entourent l'une après l'autre d'un cadre couleur brique, et la valeur de chacune s'inscrit à droite, l'une sous l'autre : deux cent vingt-deux, deux cent cinquante-quatre, soixante-sept, deux cent cinquante-cinq. La grille glisse alors vers la gauche en se réduisant, et une longue colonne de ronds vides se dresse à sa droite, du haut jusqu'au bas de l'image. Les quatre cases encadrées quittent la grille l'une après l'autre et filent vers leur hauteur dans cette colonne, où un trait brique marque leur arrivée ; chaque fois, une phrase s'écrit à côté : ligne neuf, colonne sept, rang deux cent trente et un ; ligne neuf, colonne huit, rang deux cent trente-deux ; ligne dix, colonne sept, rang deux cent cinquante-neuf ; ligne treize, colonne vingt, rang trois cent cinquante-six. Toutes les autres cases encrées s'envolent ensuite à leur tour, par paquets, du haut de la grille vers le bas, et chacune laisse une petite marque grise à sa hauteur le long de la colonne, qui se couvre peu à peu d'un pointillé serré. Le sept reste entier dans la grille : rien ne s'en efface. Une accolade se pose enfin le long de la colonne, et sous elle s'écrit sept cent quatre-vingt-quatre égale vingt-huit fois vingt-huit.

0:00 / 0:21

vec\mathrm{vec}vec est linéaire, puisqu'elle se contente de ranger les nombres sans en calculer aucun, et elle est bijective, puisque la correspondance k↔(i,j)k\leftrightarrow(i,j)k↔(i,j) l'est. Une application linéaire et bijective entre deux espaces vectoriels s'appelle un isomorphisme.

C'est cet isomorphisme qui réalise l'identification notée M28,28(R)≅R784\mathcal{M}_{28,28}(\mathbb{R})\cong\mathbb{R}^{784}M28,28​(R)≅R784, où le signe ≅\cong≅ se lit « s'identifie à », et dont le chapitre se sert partout ensuite. On le nomme plutôt que de l'omettre parce qu'une matrice n'est pas un vecteur : ce sont deux objets distincts, et vec\mathrm{vec}vec est l'application qui va de l'un à l'autre.

Ce que l'aplatissement coûte

Matrice de permutationpermutation matrix

Une matrice P∈Mn(R)P\in\mathcal{M}_{n}(\mathbb{R})P∈Mn​(R), c'est-à-dire carrée à nnn lignes et nnn colonnes, dont chaque ligne et chaque colonne comporte exactement un coefficient égal à 111, tous les autres étant nuls, et PxP\mathbf{x}Px est le vecteur x\mathbf{x}x dont les coordonnées ont été permutées.

Elle vérifie PTP=InP^{\mathsf{T}}P=I_{n}PTP=In​, et cela se voit sur les coefficients. Le coefficient (i,j)(i,j)(i,j) de PTPP^{\mathsf{T}}PPTP s'obtient en multipliant terme à terme les colonnes iii et jjj de PPP puis en sommant, et chaque colonne ne porte qu'un seul 111 : la somme vaut 111 quand les deux colonnes portent leur 111 sur la même ligne, ce qui n'arrive que pour i=ji=ji=j, et 000 partout ailleurs.

Un aplatissement ne coûte rien par lui-même : il ne coûte que dès lors qu'un modèle lit son résultat, et il faut donc en poser un. On prend la boîte à une seule étape annoncée page 1, celle qui range un tableau WWW de dix lignes et 784784784 colonnes avec dix nombres b\mathbf{b}b, et qui répond Wx+bW\mathbf{x}+\mathbf{b}Wx+b, soit dix nombres, un par chiffre possible.

Ses nombres à elle sont le couple θ=(W,b)\boldsymbol{\theta}=(W,\mathbf{b})θ=(W,b), et ils sont bien moins nombreux que les 101 770 de la page 1, qui comptait la boîte à deux étapes. La page 6 construit celle-ci pièce par pièce et dit ce que chacun de ses nombres fait ; ce qui suit n'a besoin que de sa forme.

DérivationL'aplatissement ne perd aucune information, et le modèle ne voit pas l'ordre des coordonnées (proposition 1)
1

Hypothèses

  • ·

    vec:M28,28(R)→R784\mathrm{vec}:\mathcal{M}_{28,28}(\mathbb{R})\rightarrow\mathbb{R}^{784}vec:M28,28​(R)→R784 est l'application définie en (3.1)(3.1)(3.1).

  • ·

    P∈M784(R)P\in\mathcal{M}_{784}(\mathbb{R})P∈M784​(R) est une matrice de permutation fixe, la même pour toutes les images.

  • ·

    Le modèle est x↦Wx+b\mathbf{x}\mapsto W\mathbf{x}+\mathbf{b}x↦Wx+b avec W∈M10,784(R)W\in\mathcal{M}_{10,784}(\mathbb{R})W∈M10,784​(R) et b∈R10\mathbf{b}\in\mathbb{R}^{10}b∈R10.

2

Chaîne de dépendances

X \rightarrow \mathbf{x} \rightarrow P\mathbf{x} \rightarrow W'(P\mathbf{x})+\mathbf{b}'

3

Propriétés utilisées

  • ·

    Linéarité et bijectivité de vec\mathrm{vec}vec

  • ·

    PTP=I784P^{\mathsf{T}}P=I_{784}PTP=I784​ pour toute matrice de permutation

  • ·

    Associativité du produit matriciel

4

Étapes

  1. Premier point : rien n'est perdu. vec\mathrm{vec}vec est linéaire et bijective, donc c'est un isomorphisme d'espaces vectoriels. Sa réciproque vec−1\mathrm{vec}^{-1}vec−1 reconstruit XXX à partir de x\mathbf{x}x exactement.

    Un isomorphisme est inversible : aucune information ne peut disparaître.

  2. Second point : l'ordre des coordonnées n'est pas visible. On pose W′=WPTW'=WP^{\mathsf{T}}W′=WPT et b′=b\mathbf{b}'=\mathbf{b}b′=b, et on calcule ce que le modèle de paramètre θ′=(W′,b′)\boldsymbol{\theta}'=(W',\mathbf{b}')θ′=(W′,b′) répond à l'entrée permutée PxP\mathbf{x}Px.

  3. W′(Px)+b′=(WPT)(Px)+b=W(PTP)x+bW'(P\mathbf{x})+\mathbf{b}'=(WP^{\mathsf{T}})(P\mathbf{x})+\mathbf{b}=W(P^{\mathsf{T}}P)\mathbf{x}+\mathbf{b}W′(Px)+b′=(WPT)(Px)+b=W(PTP)x+b

    Substitution de W′W'W′ et b′\mathbf{b}'b′, puis associativité.

  4. =W I784 x+b=Wx+b=W\,I_{784}\,\mathbf{x}+\mathbf{b}=W\mathbf{x}+\mathbf{b}=WI784​x+b=Wx+b

    PTP=I784P^{\mathsf{T}}P=I_{784}PTP=I784​.

  5. Les dimensions se vérifient : W∈M10,784W\in\mathcal{M}_{10,784}W∈M10,784​ et PT∈M784,784P^{\mathsf{T}}\in\mathcal{M}_{784,784}PT∈M784,784​ donnent W′∈M10,784W'\in\mathcal{M}_{10,784}W′∈M10,784​, donc W′W'W′ est bien un paramètre admissible de la même famille.

5

Résultat

∀ x∈R784,(WPT)(Px)+b=Wx+b\forall\,\mathbf{x}\in\mathbb{R}^{784},\quad (WP^{\mathsf{T}})(P\mathbf{x})+\mathbf{b}=W\mathbf{x}+\mathbf{b}∀x∈R784,(WPT)(Px)+b=Wx+b
6

Interprétation

Une permutation fixe des 784 pixels, la même pour toutes les images, ne change rien à ce que cette famille peut apprendre : pour tout modèle qui marche sur les images d'origine, il existe un modèle de la même famille qui rend exactement les mêmes sorties sur les images permutées, donc qui obtient le même score, quelle que soit la façon dont on mesure ce score.

Or un modèle qui verrait le voisinage serait dérangé par une permutation, puisqu'elle sépare des pixels qui se touchaient. Celui-ci ne l'est pas du tout, et le voisinage lui est donc invisible : il ne sait pas que deux pixels côte à côte le sont. C'est cela, et rien d'autre, que « l'aplatissement détruit la géométrie » veut dire.

Ce que ce résultat ne dit pas

  • ·

    L'argument vaut pour une permutation fixe. Une permutation tirée au hasard pour chaque image détruirait bel et bien de l'information, et la proposition ne dit rien de ce cas.

  • ·

    Il ne se limite pas non plus au modèle ci-dessus : il vaut aussi pour le réseau complet de la page 10, où seule la première matrice change et où toutes les étapes suivantes restent intactes.

  • ·

    Il ne dit pas que l'aplatissement est une erreur : il dit ce qu'il rend invisible.

Ce que ce constat prépare

Rendre la grille de nouveau visible demande de partager un même nombre entre des pixels voisins, au lieu d'en attacher un à chaque pixel séparément. C'est ce que fait une convolution, et elle a son chapitre. Ici, on note simplement ce que cette famille de modèles ne voit pas.

Sur l'image de test numéro 000, un 777, les pixels (9,7)(9,7)(9,7) et (10,7)(10,7)(10,7) sont l'un au-dessus de l'autre dans la grille, et leurs rangs valent k=28×8+7=231k=28\times 8+7=231k=28×8+7=231 et k=28×9+7=259k=28\times 9+7=259k=28×9+7=259, soit 28 rangs d'écart dans le vecteur. Ils portent tous deux de l'encre, les octets 222222222 et 676767, et rien dans x\mathbf{x}x ne signale qu'ils sont voisins.

Deux pixels voisins sur une même ligne, eux, gardent des rangs consécutifs, mais cela ne rattrape rien : le modèle ne lit pas davantage la proximité des rangs que celle des cases.

Vérification rapide n° 9

L'aplatissement se manipule à la main avant d'être utilisé cent fois.

  1. a

    Donner le rang kkk de la coordonnée xkx_kxk​ correspondant au pixel (i,j)=(17,4)(i,j)=(17,4)(i,j)=(17,4).

  2. b

    Donner le rang du pixel immédiatement au-dessus de celui-là dans la grille, puis l'écart entre les deux rangs.

  3. c

    Justifier cet écart directement par la formule k=28 (i−1)+jk=28\,(i-1)+jk=28(i−1)+j, sans énumérer.

Aucune réponse à cliquer : il y a un calcul à faire.

Leçon suivante
PrécédenteLe problème, et le jeuSuivanteUn neurone, et ce qu'il regarde