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

Le réseau complet, et son compte

Le réseau écrit une fois pour toutes, et le compte des nombres que personne ne réglera à la main.

Le réseau à ReLU de la page 9 lit les chiffres bien mieux que tout ce qui précède, et il reste à l'écrire en entier une bonne fois. Jusqu'ici chaque modèle a été posé à la main, un cas à la fois, avec ses dimensions écrites en clair. Peut-on écrire une seule fois la formule d'un réseau quelconque, puis compter d'un coup combien de nombres il faudrait régler ?

À gauche, une grille carrée de vingt-huit sur vingt-huit pixels portant un sept manuscrit en encre sombre. Une flèche mène à trois colonnes de ronds vides, alignées de gauche à droite. La première montre quatre ronds séparés par trois points de suspension, et porte dessous le nombre sept cent quatre-vingt-quatre et la mention une par pixel. La deuxième est bâtie de même et porte dessous cent vingt-huit. La troisième montre ses dix ronds, et porte dessous le nombre dix et la mention une par chiffre. Chaque rond d'une colonne est relié par un filet gris pâle à tous les ronds de la colonne suivante. Le huitième rond de la dernière colonne est plein, en brique ; une flèche en part et mène à un grand chiffre sept en brique, sous lequel se lit le chiffre lu.
La même image qu'à la page 1. Cette page-ci nomme chacun de ses traits.

L'architecture générale

L∈N∗, L≥2,d0=784,dL=10,dl∈N∗  pour l∈[ ⁣[1,L−1] ⁣]L\in\mathbb{N}^{*},\ L\geq 2,\qquad d_{0}=784,\quad d_{L}=10,\quad d_{l}\in\mathbb{N}^{*}\ \text{ pour } l\in[\![1,L-1]\!]L∈N∗, L≥2,d0​=784,dL​=10,dl​∈N∗  pour l∈[[1,L−1]]
(10.1)
LLL est le nombre d'étapes de calcul, l'entrée non comptée, et dld_{l}dl​ le nombre de neurones de l'étape lll. Les étapes 111 à L−1L-1L−1 s'appellent les couches cachées, parce que rien n'entre ni ne sort du réseau chez elles. d0d_{0}d0​ et dLd_{L}dL​ sont imposés par la tâche, 784784784 pixels en entrée et 101010 classes en sortie, quand les dld_{l}dl​ intermédiaires sont choisis. Le réseau de la page 9 est le cas L=2L=2L=2 avec d1=h=128d_{1}=h=128d1​=h=128. On demande L≥2L\geq 2L≥2 parce qu'il faut deux étapes pour qu'une activation ait un entre-deux où se glisser. Le modèle de la page 6 est le cas L=1L=1L=1, que (10.1)(10.1)(10.1) écarte pour cette raison. (10.2)(10.2)(10.2) le décrirait sans peine, la ligne ReLU\mathrm{ReLU}ReLU y devenant vide, et le compte (10.3)(10.3)(10.3) s'y applique tel quel : le tableau plus bas l'instancie.
a[0]=x∈[0,1]784z[l]=W[l]a[l−1]+b[l]∈Rdll∈[ ⁣[1,L] ⁣]a[l]=ReLU(z[l])∈R≥0dll∈[ ⁣[1,L−1] ⁣]a[L]=softmax(z[L])∈ΔdL−1∘\begin{aligned}\mathbf{a}^{[0]}&=\mathbf{x}\in[0,1]^{784}\\ \mathbf{z}^{[l]}&=W^{[l]}\mathbf{a}^{[l-1]}+\mathbf{b}^{[l]}\in\mathbb{R}^{d_{l}} && l\in[\![1,L]\!]\\ \mathbf{a}^{[l]}&=\mathrm{ReLU}\big(\mathbf{z}^{[l]}\big)\in\mathbb{R}_{\geq 0}^{d_{l}} && l\in[\![1,L-1]\!]\\ \mathbf{a}^{[L]}&=\mathrm{softmax}\big(\mathbf{z}^{[L]}\big)\in\Delta^{\circ}_{d_{L}-1}\end{aligned}a[0]z[l]a[l]a[L]​=x∈[0,1]784=W[l]a[l−1]+b[l]∈Rdl​=ReLU(z[l])∈R≥0dl​​=softmax(z[L])∈ΔdL​−1∘​​​l∈[[1,L]]l∈[[1,L−1]]​
(10.2)
W[l]∈Mdl,dl−1(R)W^{[l]}\in\mathcal{M}_{d_{l},d_{l-1}}(\mathbb{R})W[l]∈Mdl​,dl−1​​(R) et b[l]∈Rdl\mathbf{b}^{[l]}\in\mathbb{R}^{d_{l}}b[l]∈Rdl​. L'exposant entre crochets désigne une couche : ce n'est ni une puissance, ni un numéro d'exemple.
Trois colonnes de ronds, reliées par des faisceaux de filets gris très pâles où chaque rond d'une colonne rejoint tous les ronds de la suivante. La première colonne montre quatre ronds et trois points de suspension, sous une accolade cotée sept cent quatre-vingt-quatre, et porte le nom x. La deuxième est bâtie de même, cotée cent vingt-huit, et porte le nom a exposant un. La troisième montre ses dix ronds, étiquetés de zéro à neuf, sous une accolade cotée dix, et porte le nom a exposant deux. Au-dessus du premier faisceau : W exposant un appartient à l'ensemble des matrices à cent vingt-huit lignes et sept cent quatre-vingt-quatre colonnes, b exposant un est un vecteur de cent vingt-huit réels, et l'activation est ReLU. Au-dessus du second : W exposant deux appartient à l'ensemble des matrices à dix lignes et cent vingt-huit colonnes, b exposant deux est un vecteur de dix réels, et l'activation est le softmax. En pied, cent un mille sept cent soixante-dix paramètres, une précision de test de zéro virgule neuf huit un quatre, et cent quatre-vingt-six erreurs sur dix mille.
Les deux couches ne diffèrent que par leurs dimensions et leur fonction d'activation.

Instancié en 784→128→10784\rightarrow 128\rightarrow 10784→128→10 avec ReLU\mathrm{ReLU}ReLU, c'est le réseau de la page 9. Entraîné avec le même protocole que les précédents et un pas η=0,5\eta=0{,}5η=0,5, il atteint 0,98140{,}98140,9814 de précision de test, soit 186186186 erreurs sur 10 00010\,00010000, et c'est le chiffre qui manquait depuis la page 7 : le plafond de 0,91930{,}91930,9193 n'était pas celui de la tâche, mais celui d'une famille de fonctions.

Les dimensions vérifiées, ligne à ligne, pour 784→128→10784\rightarrow 128\rightarrow 10784→128→10

LigneProduitRésultat

z[1]=W[1]a[0]+b[1]\mathbf{z}^{[1]}=W^{[1]}\mathbf{a}^{[0]}+\mathbf{b}^{[1]}z[1]=W[1]a[0]+b[1]

(128×784)(784×1)+(128×1)(128\times 784)(784\times 1)+(128\times 1)(128×784)(784×1)+(128×1)

128×1128\times 1128×1

a[1]=ReLU(z[1])\mathbf{a}^{[1]}=\mathrm{ReLU}(\mathbf{z}^{[1]})a[1]=ReLU(z[1])

composante par composante, (9.2)(9.2)(9.2)

128×1128\times 1128×1

z[2]=W[2]a[1]+b[2]\mathbf{z}^{[2]}=W^{[2]}\mathbf{a}^{[1]}+\mathbf{b}^{[2]}z[2]=W[2]a[1]+b[2]

(10×128)(128×1)+(10×1)(10\times 128)(128\times 1)+(10\times 1)(10×128)(128×1)+(10×1)

10×110\times 110×1

a[2]=softmax(z[2])\mathbf{a}^{[2]}=\mathrm{softmax}(\mathbf{z}^{[2]})a[2]=softmax(z[2])

R10→Δ9∘\mathbb{R}^{10}\rightarrow\Delta^{\circ}_{9}R10→Δ9∘​, (6.3)(6.3)(6.3)

10×110\times 110×1

D'où vient l'écriture matricielle

(10.2)(10.2)(10.2) tient en quatre lignes, mais elle n'est pas tombée d'un coup. Elle se construit en cinq temps à partir de (4.1)(4.1)(4.1), la préactivation d'un neurone, et chaque temps est un rangement, pas un calcul nouveau.

Les cinq temps

TempsCe qu'on rangeCe qu'on obtient

1

Les dl−1d_{l-1}dl−1​ activations de la couche précédente, empilées

a[l−1]∈Rdl−1\mathbf{a}^{[l-1]}\in\mathbb{R}^{d_{l-1}}a[l−1]∈Rdl−1​, vecteur colonne

2

Les dl−1d_{l-1}dl−1​ poids du neurone jjj, mis en ligne

(wj[l])T\big(\mathbf{w}^{[l]}_{j}\big)^{\mathsf{T}}(wj[l]​)T, de dimension 1×dl−11\times d_{l-1}1×dl−1​

3

Les dld_{l}dl​ lignes empilées les unes sous les autres

W[l]∈Mdl,dl−1(R)W^{[l]}\in\mathcal{M}_{d_{l},d_{l-1}}(\mathbb{R})W[l]∈Mdl​,dl−1​​(R)

4

Le produit W[l]a[l−1]W^{[l]}\mathbf{a}^{[l-1]}W[l]a[l−1]

(dl×dl−1)(dl−1×1)=dl×1(d_{l}\times d_{l-1})(d_{l-1}\times 1)=d_{l}\times 1(dl​×dl−1​)(dl−1​×1)=dl​×1 : les dld_{l}dl​ sommes pondérées, toutes ensemble

5

Les dld_{l}dl​ biais, puis l'activation

z[l]=W[l]a[l−1]+b[l]\mathbf{z}^{[l]}=W^{[l]}\mathbf{a}^{[l-1]}+\mathbf{b}^{[l]}z[l]=W[l]a[l−1]+b[l], puis a[l]=ReLU(z[l])\mathbf{a}^{[l]}=\mathrm{ReLU}(\mathbf{z}^{[l]})a[l]=ReLU(z[l])

Le temps 4 est le seul qui mérite un regard : la coordonnée jjj du produit est ∑kWjk[l]ak[l−1]\sum_{k} W^{[l]}_{jk}a^{[l-1]}_{k}∑k​Wjk[l]​ak[l−1]​, c'est-à-dire exactement (4.1)(4.1)(4.1) écrite pour le neurone jjj.
Cinq panneaux, de gauche à droite, reliés par de petites flèches. Le premier, un neurone, montre un rectangle plat coté un sur sept cent quatre-vingt-quatre pour w transposée, un rectangle haut et étroit coté sept cent quatre-vingt-quatre sur un pour x, un carré pour b, et un carré de brique pour z. Le deuxième, cent vingt-huit neurones, empile quatre rectangles plats, chacun portant w indice j transposée x plus b indice j, avec des points de suspension avant le dernier, sous une accolade cotée cent vingt-huit. Le troisième montre un bloc rectangulaire unique, W exposant un, coté cent vingt-huit sur sept cent quatre-vingt-quatre, barré de quelques traits horizontaux pâles qui rappellent les lignes empilées. Le quatrième écrit z exposant un égale W exposant un fois x plus b exposant un, chaque facteur dessiné à sa forme et coté, et note dessous que a exposant un est le ReLU de z exposant un. Le cinquième écrit de même z exposant deux égale W exposant deux fois a exposant un plus b exposant deux, avec les dimensions dix sur cent vingt-huit puis cent vingt-huit sur un, et note que a exposant deux est le softmax de z exposant deux.
Le produit final est exactement 128128128 fois la ligne (4.1)(4.1)(4.1), écrite une seule fois. L'exemple est écrit en colonne ; le calcul par lots les empile en lignes, et WWW passe à droite, transposée.

Ce que devient cette ligne sur plusieurs images

En pratique on ne donne pas les images une par une, mais par paquets de BBB, qu'on appelle des lots. Les BBB vecteurs s'empilent alors en lignes dans une matrice A[l−1]A^{[l-1]}A[l−1] à BBB lignes et dl−1d_{l-1}dl−1​ colonnes, et (10.2)(10.2)(10.2) se transpose en bloc : Z[l]=A[l−1](W[l])T+1B(b[l])TZ^{[l]}=A^{[l-1]}\big(W^{[l]}\big)^{\mathsf{T}}+\mathbf{1}_{B}\big(\mathbf{b}^{[l]}\big)^{\mathsf{T}}Z[l]=A[l−1](W[l])T+1B​(b[l])T, où 1B\mathbf{1}_{B}1B​ est la colonne de BBB uns qui recopie le même biais sur toutes les lignes.

Les dimensions se vérifient : (B×dl−1)(dl−1×dl)=B×dl(B\times d_{l-1})(d_{l-1}\times d_{l})=B\times d_{l}(B×dl−1​)(dl−1​×dl​)=B×dl​, et Z[l]Z^{[l]}Z[l] a bien une ligne par exemple. C'est la seule transposition mentale du chapitre, le formalisme écrivant x\mathbf{x}x en colonne quand le calcul par lots empile les exemples en lignes, et rien du calcul lui-même n'a changé.

Cette écriture n'est pas seulement plus courte que 128128128 sommes écrites l'une après l'autre. Les bibliothèques de calcul et le matériel spécialisé sont optimisés pour une opération, le produit de matrices : une part de ce qu'on appelle une nouvelle architecture matérielle pour l'IA est un produit matriciel plus rapide. Écrire le réseau sous cette forme n'est donc pas un choix de notation, c'est le choix de l'opération qui sera effectivement exécutée.

Le compte des paramètres

p=∑l=1L(dl dl−1⏟W[l]+dl⏟b[l])p=\sum_{l=1}^{L}\Big(\underbrace{d_{l}\,d_{l-1}}_{W^{[l]}}+\underbrace{d_{l}}_{\mathbf{b}^{[l]}}\Big)p=l=1∑L​(W[l]dl​dl−1​​​+b[l]dl​​​)
(10.3)
La formule vient de (10.1)(10.1)(10.1) et (10.2)(10.2)(10.2) seules : une matrice dl×dl−1d_{l}\times d_{l-1}dl​×dl−1​ a dldl−1d_{l}d_{l-1}dl​dl−1​ coefficients, un vecteur de Rdl\mathbb{R}^{d_{l}}Rdl​ en a dld_{l}dl​.

La formule instanciée quatre fois · cours/lecon2/mesures.py, section 9

    p = somme sur l de ( d_l * d_{l-1} + d_l )

    architecture                 detail                          p
    784 -> 10                    10x784+10                        7850
    784 -> 128 -> 10             128x784+128 + 10x128+10        101770
                                 part dans la premiere matrice    98.6 %
    784 -> 16 -> 16 -> 10        16x784+16 + 16x16+16 + 10x16+10    13002
                                 part dans la premiere matrice    96.5 %
    784 -> 32 -> 32 -> 32 -> 10  32x784+32 + 32x32+32 + 32x32+32 + 10x32+10    27562
                                 part dans la premiere matrice    91.0 %

Lecture

  • ·

    101 770=100 352+128+1 280+10101\,770=100\,352+128+1\,280+10101770=100352+128+1280+10. Le programme recalcule ce total en parcourant θ\boldsymbol{\theta}θ, et le compare au compte écrit à la main : les deux concordent.

  • ·

    98,6 %98{,}6\,\%98,6% des paramètres sont dans W[1]W^{[1]}W[1], la matrice qui touche les pixels. La couche de sortie, celle qui décide, en porte 1,3 %1{,}3\,\%1,3%.

  • ·

    784→16→16→10784\rightarrow 16\rightarrow 16\rightarrow 10784→16→16→10 donne 13 00213\,00213002 : c'est l'architecture dont la page 11 mesure la précision.

  • ·

    La part de la première matrice descend le long du tableau, de 98,6 %98{,}6\,\%98,6% à 96,5 %96{,}5\,\%96,5% puis 91,0 %91{,}0\,\%91,0% : plus les couches suivantes portent de coefficients, moins celle qui touche les pixels pèse dans le total.

Une longue barre horizontale partagée en quatre segments, presque entièrement occupée par un segment noir qui porte la mention quatre-vingt-dix-huit virgule six pour cent ; les trois autres segments se réduisent à un liseré à son extrémité droite. Une seconde barre, dessous, reprend ce liseré seul et l'étale sur toute la largeur : les mille quatre cent dix-huit coefficients restants s'y partagent en un segment gris pour b exposant un, un long segment de brique pour W exposant deux, et un mince segment pour b exposant deux. Un trait en pointillé relie les deux barres. Sous elles, une table donne pour chaque bloc ses dimensions, son nombre de coefficients et sa part : W exposant un, cent vingt-huit sur sept cent quatre-vingt-quatre, cent mille trois cent cinquante-deux coefficients, quatre-vingt-dix-huit virgule six pour cent ; b exposant un, cent vingt-huit coefficients, zéro virgule un pour cent ; W exposant deux, dix sur cent vingt-huit, mille deux cent quatre-vingts coefficients, un virgule trois pour cent ; b exposant deux, dix coefficients, zéro virgule zéro pour cent. La dernière ligne totalise cent mille trois cent cinquante-deux plus cent vingt-huit plus mille deux cent quatre-vingts plus dix, soit cent un mille sept cent soixante-dix.
Un réseau se compte par ses matrices : les deux vecteurs de biais n'en font que 138138138.

$h=128$ n'est justifié par rien

Ni le nombre de couches cachées, ni leur taille ne sont dérivés dans ce chapitre. h=128h=128h=128 a été posé, et L=2L=2L=2 aussi. Ce ne sont pas des valeurs optimales, et rien ici ne dit comment on les choisirait : la page 11 mesure d'ailleurs une architecture à deux couches cachées de 161616 neurones, qui fait moins bien, sans que cette page puisse dire pourquoi. Dette, chapitre 3.

Vérification rapide n° 19

La formule générale s'applique sans énumérer les couches.

  1. a

    Donner ppp pour l'architecture 784→32→32→32→10784\rightarrow 32\rightarrow 32\rightarrow 32\rightarrow 10784→32→32→32→10, en appliquant (10.3)(10.3)(10.3).

  2. b

    Quelle part de ce total est dans la première matrice ?

  3. c

    Pour une architecture 784→d1→10784\rightarrow d_{1}\rightarrow 10784→d1​→10, montrer que la première matrice porte plus de la moitié des paramètres quel que soit d1d_{1}d1​, et dire vers quelle part elle tend quand d1d_{1}d1​ grandit.

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

Régler ces nombres à la main

La page 5 a construit un neurone entièrement à la main, avec ses 171171171 coefficients non nuls posés en trois lignes, quand le réseau complet en compte 101 770101\,770101770. En décidant d'un nombre par seconde et sans jamais s'arrêter, il faudrait 28,328{,}328,3 heures pour tous les poser.

Encore faudrait-il savoir quelle valeur donner à chacun, ce que personne ne sait faire au-delà de quelques neurones dont on a dessiné le motif soi-même.

Que personne ne les ait écrits est aussi la raison de ne pas traiter le réseau comme une boîte noire : personne ne sait ce que ces 101 770101\,770101770 nombres contiennent, et la seule façon de le savoir est de les regarder, comme la page 4 a regardé un gabarit. La page 11 le fait sur la couche cachée, et ce qu'elle trouve n'est pas ce qu'on attendait.

fθ:R784→Δ9∘,θ∈R101 770f_{\boldsymbol{\theta}}:\mathbb{R}^{784}\rightarrow\Delta^{\circ}_{9},\qquad \boldsymbol{\theta}\in\mathbb{R}^{101\,770}fθ​:R784→Δ9∘​,θ∈R101770
(10.4)
Tout ce chapitre n'a fait que décrire cette fonction : ses ensembles, sa forme, ses paramètres, et ce qu'elle peut ou ne peut pas séparer. Il n'a rien dit de la façon dont θ\boldsymbol{\theta}θ est choisi.
Leçon suivante
PrécédenteCasser la ligne droiteSuivanteCe que la couche cachée a appris