Un réseau de neurone fait ses opérations sur des tenseurs. (addition, multiplication, tanh, ...) On va donc chercher d'abord à tout bien implémenter pour les tenseurs.
On a souvent tendance à ne pas comprendre ce qu'est un tenseur initialement, mais il faut imaginer ces objets comme la généralisation des scalaires/vecteurs/matrices a n dimensions.
Pour la définition d'un tenseur, je renvoie à l'excellent post de "Robot Chinwag" sur le sujet. Cependant, vous pouvez vous arrêter avant la partie "Tensor Calculus" (et tout ce qu'il y a après) car on va utiliser des principes différents, cette partie ne sera donc pas utile pour nous.
D'orénavant, on posera T l'espace des tenseurs, et T(N) celui des tenseurs d'ordre N.
Par exemple:
Consideˊrons un tenseur A∈R3×2×2⊂T(3). On peut le voir comme deux matrices empileˊes :A=[[a111a121a112a122],[a211a221a212a222],[a311a321a312a322]].Autrement dit, Ak,i,j deˊsigne l’eˊleˊment situeˊaˋ la position (i,j) dans la k-ieˋme matrice.
On note également dA(i) la dimension d'ordre i.
Dans ce cas, on a dA(1)=3 et dA(i)=2 pour i∈{2,3}
Avec i,j les indices des 2 dernières dimensions. L'indice z représente l'indice de "batch", soit le reste des dimensions précédentes.
Si les dimensions d'un tenseur sont i1,...,iN, alors il faut considérer z comme i1,...,iN−2.
Un concept important pour les tenseurs est celui du broadcast.
Il était déjà expliqué dans le post de "Robot Chinwag", mais je vais mettre des examples afin de rendre la notion plus compréhensible.
Un exemple simple peut être lorsqu'on multiplie un vecteur par un scalaire. Cela peut se voir comme le broadcast du scalaire sur la shape du vecteur puis une multiplication élément par élément. Ex:
[123]∗3=[123]∗[333]=[1∗32∗33∗3]=[369]ouˋ∗ deˊsigne le produit eˊleˊment par eˊleˊment (Hadamard)
Voici un exemple plus avancé:
Soient A∈R3×1etB∈R1×4.A=123,B=[10203040].Lors d’une opeˊration eˊleˊment-par-eˊleˊment (par ex. C=A+B ), les deux tenseurs sont broadcasteˊs pour obtenir :A′=123123123123,B′=101010202020303030404040.Ainsi, C=A+B=111213212223313233414243.
Vous pourrez trouver le code pour broadcaster dans la section suivante, si cela vous aide à mieux comprendre.
On supposera maintenant que pour chaque opération (multiplication, addition, etc etc...) On broadcastera les tenseurs afin que leur shapes correspondent si c'est possible).
Soient A,B∈T(N)×T(M), t.q dA(N−1)=dB(M−1) On deˊfinit leur produit scalaire par : ⟨A,B⟩=Tr(A⊤B)=azjibzij
Si vous avez toujours du mal avec cette notation, malgré le post de "Robot Chinwag", je vous conseille de regarder d'autres resources sur la notation d'Einstein et même sur einsum (fonction PyTorch). (En gros ici, on somme sur les indices z)