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

La forme vectorielle

Les mêmes équations écrites sans indices, en quatre lignes.

Peut-on écrire tout cela sans un seul indice ?

Une grille carrée de cases, entre crochets, autant de lignes que de colonnes. Chaque case de la diagonale porte phi prime évaluée en la composante de même rang de la somme pondérée de la couche l. Toutes les autres cases portent un zéro, écrit case par case. Les numéros de ligne courent le long du bord gauche de la grille, et les numéros de colonne au-dessus.
Là où la case porte un zéro, pousser une composante de la somme pondérée ne bouge pas l'activation d'en face.

Les identités du retour se sont écrites jusqu'ici avec deux indices et une somme sur les chemins, et elles s'écrivent aussi bien avec des matrices et des vecteurs seuls. Le passage réclame un objet de plus, la jacobienne, et une propriété à démontrer : celle de l'activation par la somme pondérée ne porte que des zéros hors de sa diagonale.

La jacobienne

JacobienneJacobian matrix

Pour f:Rn→Rmf:\mathbb{R}^{n}\rightarrow\mathbb{R}^{m}f:Rn→Rm différentiable en u\mathbf{u}u, la matrice Jf(u)∈Mm,n(R)J_{f}(\mathbf{u})\in\mathcal{M}_{m,n}(\mathbb{R})Jf​(u)∈Mm,n​(R) dont le coefficient de la ligne iii et de la colonne jjj est ∂fi/∂uj\partial f_{i}/\partial u_{j}∂fi​/∂uj​, évaluée en u\mathbf{u}u.

ObjetPour quelle fonctionType

Dérivée partielle ∂fi/∂uj\partial f_{i}/\partial u_{j}∂fi​/∂uj​

Une composante, une variable

Un scalaire

Gradient gradu f\mathrm{grad}_{\mathbf{u}}\,fgradu​f

f:Rn→Rf:\mathbb{R}^{n}\rightarrow\mathbb{R}f:Rn→R

Un vecteur colonne de Rn\mathbb{R}^{n}Rn

Jacobienne Jf(u)J_{f}(\mathbf{u})Jf​(u)

f:Rn→Rmf:\mathbb{R}^{n}\rightarrow\mathbb{R}^{m}f:Rn→Rm

Une matrice m×nm\times nm×n

Quand m=1m=1m=1, la jacobienne est une matrice à une ligne, et le gradient en est la transposée.

Le retour ne demande que deux jacobiennes, et la seconde s'écrit avec la notation diag(u)\mathrm{diag}(\mathbf{u})diag(u) : la matrice carrée dont la diagonale porte les composantes de u\mathbf{u}u et dont tous les autres coefficients sont nuls.

Jz[l](a[l−1])=W[l],Ja[l](z[l])=diag(φ′(z[l]))J_{\mathbf{z}^{[l]}}\big(\mathbf{a}^{[l-1]}\big)=W^{[l]},\qquad J_{\mathbf{a}^{[l]}}\big(\mathbf{z}^{[l]}\big)=\mathrm{diag}\big(\varphi'(\mathbf{z}^{[l]})\big)Jz[l]​(a[l−1])=W[l],Ja[l]​(z[l])=diag(φ′(z[l]))
(5.11)

Pourquoi la seconde est diagonale

DérivationLe retour, écrit sans indices
1

Hypothèses

  • ·

    φ\varphiφ s'applique composante par composante : ai[l]=φ(zi[l])a^{[l]}_{i}=\varphi(z^{[l]}_{i})ai[l]​=φ(zi[l]​), définition page 5.

  • ·

    grada[l] ℓ=(W[l+1])Tδ[l+1]\mathrm{grad}_{\mathbf{a}^{[l]}}\,\ell=\big(W^{[l+1]}\big)^{\mathsf{T}}\boldsymbol{\delta}^{[l+1]}grada[l]​ℓ=(W[l+1])Tδ[l+1], la somme sur les chemins de la page 9 écrite au rang l+1l+1l+1 plutôt qu'au rang lll.

2

Propriétés utilisées

  • ·

    Définition de la jacobienne

  • ·

    Dv=u⊙vD\mathbf{v}=\mathbf{u}\odot\mathbf{v}Dv=u⊙v pour D=diag(u)D=\mathrm{diag}(\mathbf{u})D=diag(u)

3

Étapes

  1. La jacobienne de l'activation est diagonale. ai[l]=φ(zi[l])a^{[l]}_{i}=\varphi(z^{[l]}_{i})ai[l]​=φ(zi[l]​) ne dépend que de zi[l]z^{[l]}_{i}zi[l]​ : sa dérivée par rapport à zj[l]z^{[l]}_{j}zj[l]​ est nulle dès que j≠ij\neq ij=i.

  2. (Ja[l])ij=∂ai[l]∂zj[l]={φ′(zi[l])j=i0j≠i\big(J_{\mathbf{a}^{[l]}}\big)_{ij}=\frac{\partial a^{[l]}_{i}}{\partial z^{[l]}_{j}}=\begin{cases}\varphi'\big(z^{[l]}_{i}\big) & j=i\\[2pt] 0 & j\neq i\end{cases}(Ja[l]​)ij​=∂zj[l]​∂ai[l]​​={φ′(zi[l]​)0​j=ij=i​
  3. Une matrice diagonale multiplie composante par composante. Pour D=diag(u)D=\mathrm{diag}(\mathbf{u})D=diag(u), la iii-ième composante de DvD\mathbf{v}Dv vaut uiviu_{i}v_{i}ui​vi​ : c'est la définition du produit de Hadamard.

    diag(u) v=u⊙v\mathrm{diag}(\mathbf{u})\,\mathbf{v}=\mathbf{u}\odot\mathbf{v}diag(u)v=u⊙v
  4. On compose. La somme sur les chemins a donné grada[l] ℓ=(W[l+1])Tδ[l+1]\mathrm{grad}_{\mathbf{a}^{[l]}}\,\ell=(W^{[l+1]})^{\mathsf{T}}\boldsymbol{\delta}^{[l+1]}grada[l]​ℓ=(W[l+1])Tδ[l+1], et il reste à traverser l'activation.

  5. δ[l]=diag(φ′(z[l])) (W[l+1])Tδ[l+1]=[(W[l+1])Tδ[l+1]]⊙φ′(z[l])\boldsymbol{\delta}^{[l]}=\mathrm{diag}\big(\varphi'(\mathbf{z}^{[l]})\big)\,\big(W^{[l+1]}\big)^{\mathsf{T}}\boldsymbol{\delta}^{[l+1]}=\big[\big(W^{[l+1]}\big)^{\mathsf{T}}\boldsymbol{\delta}^{[l+1]}\big]\odot\varphi'\big(\mathbf{z}^{[l]}\big)δ[l]=diag(φ′(z[l]))(W[l+1])Tδ[l+1]=[(W[l+1])Tδ[l+1]]⊙φ′(z[l])

    Dimensions : (dl×dl) (dl×dl+1) (dl+1×1)→dl×1(d_{l}\times d_{l})\,(d_{l}\times d_{l+1})\,(d_{l+1}\times 1)\rightarrow d_{l}\times 1(dl​×dl​)(dl​×dl+1​)(dl+1​×1)→dl​×1.

4

Résultat

δ[l]=[(W[l+1])Tδ[l+1]]⊙φ′(z[l]),gradW[l] ℓ=δ[l](a[l−1])T,gradb[l] ℓ=δ[l]\boldsymbol{\delta}^{[l]}=\big[\big(W^{[l+1]}\big)^{\mathsf{T}}\boldsymbol{\delta}^{[l+1]}\big]\odot\varphi'\big(\mathbf{z}^{[l]}\big),\qquad \mathrm{grad}_{W^{[l]}}\,\ell=\boldsymbol{\delta}^{[l]}\big(\mathbf{a}^{[l-1]}\big)^{\mathsf{T}},\qquad \mathrm{grad}_{\mathbf{b}^{[l]}}\,\ell=\boldsymbol{\delta}^{[l]}δ[l]=[(W[l+1])Tδ[l+1]]⊙φ′(z[l]),gradW[l]​ℓ=δ[l](a[l−1])T,gradb[l]​ℓ=δ[l]
5

Interprétation

Le produit de Hadamard du chapitre 4 n'était pas une commodité d'écriture : c'est ce que devient un produit matriciel quand la matrice est diagonale, et elle est diagonale parce que l'activation s'applique composante par composante.

Ce que ce résultat ne dit pas

  • ·

    Le softmax, lui, n'a pas une jacobienne diagonale : chacune de ses composantes dépend de toutes les composantes de z[L]\mathbf{z}^{[L]}z[L].

Le contrôle, et son contre-exemple

Mesure 6 · la jacobienne d'une couche cachée, par différences finies, 20 indices

  -- relu · couche cachee 3, indices 1 a 20 --------------------------------
    coefficients hors diagonale       380
    hors diagonale non nuls           0
    module maximal hors diagonale     0.000e+00
    module minimal sur la diagonale   0.000e+00

  -- sigmoide · couche cachee 3, indices 1 a 20 ----------------------------
    coefficients hors diagonale       380
    hors diagonale non nuls           0
    module maximal hors diagonale     0.000e+00
    module minimal sur la diagonale   1.465e-01

Lecture

  • ·

    20×20=40020\times 20=40020×20=400 coefficients, dont 380380380 hors diagonale.

  • ·

    Aucun coefficient hors diagonale n'est non nul, pour les deux activations, et c'est bien ce que la diagonalité annonçait.

  • ·

    Le module minimal sur la diagonale vaut 000 pour ReLU\mathrm{ReLU}ReLU, dont la porte est fermée dès que la préactivation est négative, et 0,14650{,}14650,1465 pour la sigmoïde, dont la dérivée ne s'annule jamais.

Mesure 7 · la même jacobienne pour le softmax de sortie

    couche de sortie, les 10 indices
    coefficients hors diagonale       90
    hors diagonale non nuls           90
    module maximal hors diagonale     2.597e-02
    somme de chaque colonne           4.857e-11

Lecture

  • ·

    10×10=10010\times 10=10010×10=100 coefficients, dont 909090 hors diagonale, et les 909090 sont non nuls.

  • ·

    Le plus grand d'entre eux vaut 2,597⋅10−22{,}597\cdot 10^{-2}2,597⋅10−2 : ce n'est pas du bruit d'arrondi.

  • ·

    Chaque colonne somme à zéro, à 4,857⋅10−114{,}857\cdot 10^{-11}4,857⋅10−11 près : pousser une préactivation redistribue de la probabilité entre les classes sans en créer.

La même grille carrée de cases entre crochets, cette fois pour le softmax de la couche de sortie. Chaque case de la diagonale porte la dérivée d'une composante de la sortie par sa propre somme pondérée, et chaque case hors de la diagonale porte la dérivée d'une composante de la sortie par la somme pondérée d'une autre composante. Aucune case ne porte de zéro.
C'est pourquoi la dernière couche est appariée à l'entropie croisée, qui donne δ[L]=a[L]−y\boldsymbol{\delta}^{[L]}=\mathbf{a}^{[L]}-\mathbf{y}δ[L]=a[L]−y sans traverser cette matrice.
Un tableau de 400400400 coefficients se vide de ses 380380380 cases hors diagonale, qui sont toutes nulles.

Un tableau carré de vingt rangées sur vingt colonnes occupe la hauteur de l'écran, chacune de ses quatre cents cases remplie d'une encre sombre uniforme et séparée de ses voisines par un filet très pâle. Une étiquette posée au-dessus indique que l'activation considérée est la sigmoïde. Les cases commencent alors à s'éteindre par vagues obliques qui traversent le tableau en diagonale, rangée après rangée, laissant derrière elles des cases entièrement vides ; seules celles qui se trouvent sur la diagonale allant du coin supérieur gauche au coin inférieur droit conservent leur encre. Quand la dernière vague est passée, il ne reste qu'une ligne oblique de vingt cases pleines sur un damier vide, et le contour de ces vingt cases passe en couleur brique. À droite du tableau s'inscrivent alors deux cotes, le nombre de coefficients hors diagonale et le nombre de ceux qui ne sont pas nuls, puis une troisième donnant le plus petit module relevé sur la diagonale.

0:00 / 0:10
Le même contrôle sur le softmax : 909090 coefficients hors diagonale, 909090 non nuls, et des colonnes qui somment à zéro.

Un tableau carré de dix rangées sur dix colonnes occupe le centre de l'écran, ses cent cases remplies d'une encre sombre uniforme, sous une étiquette portant le mot softmax. Une vague oblique le traverse exactement comme elle avait traversé le tableau précédent, mais cette fois aucune case ne s'éteint : les cases s'éclaircissent au passage de la vague puis retrouvent toutes leur encre. Les dix cases de la diagonale prennent ensuite un contour brique, tandis que les quatre-vingt-dix autres restent pleines. Trois cotes s'inscrivent à droite du tableau : le nombre de coefficients hors diagonale, le nombre de ceux qui ne sont pas nuls — le même — et le plus grand module relevé hors diagonale. Enfin, les colonnes du tableau s'éclairent l'une après l'autre de gauche à droite, et sous le tableau s'inscrit la somme de chaque colonne, un nombre de l'ordre de dix puissance moins onze.

0:00 / 0:14

Les équations, sans indices

δ[L]=a[L]−yδ[l]=[(W[l+1])Tδ[l+1]]⊙φ′(z[l])gradW[l] ℓ=δ[l](a[l−1])Tgradb[l] ℓ=δ[l]\begin{aligned}\boldsymbol{\delta}^{[L]}&=\mathbf{a}^{[L]}-\mathbf{y}\\ \boldsymbol{\delta}^{[l]}&=\big[\big(W^{[l+1]}\big)^{\mathsf{T}}\boldsymbol{\delta}^{[l+1]}\big]\odot\varphi'\big(\mathbf{z}^{[l]}\big)\\ \mathrm{grad}_{W^{[l]}}\,\ell&=\boldsymbol{\delta}^{[l]}\big(\mathbf{a}^{[l-1]}\big)^{\mathsf{T}}\\ \mathrm{grad}_{\mathbf{b}^{[l]}}\,\ell&=\boldsymbol{\delta}^{[l]}\end{aligned}δ[L]δ[l]gradW[l]​ℓgradb[l]​ℓ​=a[L]−y=[(W[l+1])Tδ[l+1]]⊙φ′(z[l])=δ[l](a[l−1])T=δ[l]​
(5.12)
Quatre lignes, aucun indice de neurone.
Une colonne et une ligne se croisent, et leur croisement remplit case par case le tableau du gradient de la matrice de poids.

Une colonne étroite de cases est posée à gauche de l'écran et une ligne de cases au-dessus, à angle droit l'une de l'autre, désignées l'une par delta et l'autre par a transposé. Entre elles, un grand tableau carré est entièrement vide, ses cases seulement dessinées par un filet très pâle. Une case de la colonne s'éclaire en brique, une case de la ligne s'éclaire en brique, et à l'endroit précis où leur rangée et leur colonne se croisent, une case du tableau se remplit d'encre. Le couple s'éteint, un autre couple s'éclaire ailleurs, et une deuxième case se remplit à son croisement ; la chose se répète plusieurs fois en des points dispersés du tableau. Puis le balayage s'accélère : la case éclairée de la colonne descend rangée après rangée, et à chaque descente toute une rangée du tableau se remplit d'un coup, jusqu'à ce que le tableau soit plein. Deux cotes s'inscrivent enfin à droite, l'une donnant la taille vraie du bloc et son nombre de coefficients, l'autre le nombre de multiplications que tous les produits extérieurs du réseau coûtent.

0:00 / 0:15
ExpressionDimensions des facteursRésultat

(W[l+1])Tδ[l+1]\big(W^{[l+1]}\big)^{\mathsf{T}}\boldsymbol{\delta}^{[l+1]}(W[l+1])Tδ[l+1]

(dl×dl+1)(dl+1×1)(d_{l}\times d_{l+1})(d_{l+1}\times 1)(dl​×dl+1​)(dl+1​×1)

dl×1d_{l}\times 1dl​×1

[⋅]⊙φ′(z[l])\big[\cdot\big]\odot\varphi'(\mathbf{z}^{[l]})[⋅]⊙φ′(z[l])

(dl×1)⊙(dl×1)(d_{l}\times 1)\odot(d_{l}\times 1)(dl​×1)⊙(dl​×1)

dl×1d_{l}\times 1dl​×1

δ[l](a[l−1])T\boldsymbol{\delta}^{[l]}\big(\mathbf{a}^{[l-1]}\big)^{\mathsf{T}}δ[l](a[l−1])T

(dl×1)(1×dl−1)(d_{l}\times 1)(1\times d_{l-1})(dl​×1)(1×dl−1​)

dl×dl−1d_{l}\times d_{l-1}dl​×dl−1​

La troisième ligne a bien la forme de W[l]W^{[l]}W[l], ce que le gradient doit avoir.

Une bibliothèque d'apprentissage écrit ces quatre lignes une fois pour toutes, et ce qui reste à savoir faire est de lire une chaîne de dépendances et de dire, à chaque nœud, si elle se ramifie.

Vérification rapide n° 60

La jacobienne Ja[l](z[l])J_{\mathbf{a}^{[l]}}(\mathbf{z}^{[l]})Ja[l]​(z[l]) est diagonale, mesures 6 et 7.

  1. a

    Pourquoi cette jacobienne est-elle diagonale ?

  2. b

    Qu'est-ce qui cesserait d'être vrai dans la récurrence du signal d'erreur si l'activation mélangeait les composantes ?

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

Leçon suivante
PrécédentePlusieurs neurones par coucheSuivanteCe que la profondeur coûte, ce que l'algorithme économise