|
Les tenseurs
De l'algèbre linéaire... Jusqu'aux boobs !
J'ai commencé à expérimenter depuis peu un aspect
véritablement utile
de l'« IA » :-)
Les modèles génératifs et leurs réseaux de neurones font une utilisation intensive
des tableaux de nombres, qui constituent l'une des structures de base avec lesquelles
ils appréhendent, interprètent, transforment et livrent les données. Si dans ce domaine,
les vecteurs et les matrices sont généralement bien connus, de manière
plus générale il est question de tenseurs.
Mais s'il y a une notion mathématique qui n'est pas comprise, c'est bien celle-là.
De quoi parle-t-on exactement ? Qu'est-ce qu'un tenseur en réalité ?
Y'a-t-il vraiment un rapport avec des « matrices à plusieurs dimensions » ?
Qu'est-ce qu'on peut faire comme « calculs » avec ? Et enfin,
quelle est leur utilisation en informatique, si ce qui est désigné par le terme
« tensors » par les contructeurs de matériel et les fournisseurs
de logiciels en sont vraiment ?
Toutes les formules mathématiques sur cette page sont écrites à l'aide de
jqMath,
pour laquelle un guide est disponible sur mon site !
Formes multilinéaires
On va se placer dans un cadre pratique bien que restreint, c'est à dire celui d'un espace
vectoriel $E$ de dimension finie, sur le corps ℝ des nombres réels, ainsi
qu'aux applications dont l'ensemble de départ est $E^n=E×E×...×E$.
C'est ce qui nous intéresse du point de vue de l'informatique, bien que la théorie
soit extrêmement générale et puisse considérer un produit cartésien d'espaces
très différents, voire de dimension infinie, et pas seulement $E^n$.
Notez qu'en algèbre linéaire et multilinéaire, on
fait généralement l'économie des flèches au-dessus des lettres qui désignent
les vecteurs. :-)
D'un point de vue strict dans ce cadre, un tenseur est alors une
forme multilinéaire. C'est à dire une application :
$$\table T\text " ":, E^n, ⟶, ℝ; ,(u_1, ..., u_n), ⟼, T(u_1, ..., u_n)$$
qui est linéaire par rapport à chacune de ses variables. Chaque $u_k$ est
ici un vecteur de $E$, et si $α ∈ ℝ$ et $v ∈ E$ cela signifie par exemple que :
$$T(u_1 + v, u_2, ..., u_n) = T(u_1, u_2, ..., u_n) + T(v, u_2, ..., u_n)$$
$$T(u_1, αu_2, ..., u_n) = αT(u_1, u_2, ... u_n)$$
On parle de forme n-linéaire pour être plus précis.
L'image par $T$, son « résultat » en quelque sorte, est donc
un nombre réel, un élément de ℝ.
Un des tenseurs les plus simples et que vous connaissez déjà, c'est le produit
scalaire usuel. En algèbre multilinéaire on le note généralement $u|v$ pour ne pas
le confondre avec tous les autres produits, et il vérifie les propriétés ci-dessus.
Un autre exemple, c'est le déterminant d'une famille de $n$ vecteurs d'un
espace de dimension $n$.
Dans le plan $ℝ^2$, si $u = (a, b)$ et $v = (c, d)$ alors on a :
$$u|v=ac+bd$$
$$\det(u,v)=ad-bc$$
Il s'agit donc ici de formes bilinéaires, puisque l'on a deux variables.
Quel lien avec
des matrices multidimentionnelles ? Enfin s'il y en a un...?
D'un point de vue strict, un tenseur à $n$ variables n'est PAS une matrice
à $n$ dimensions. C'est important de le savoir pour raisonner correctement sur
les tenseurs et leurs propriétés. Néanmoins si l'on se donne une base de
l'espace vectoriel $E$, il peut se passer des choses intéressantes.
Considérons dans l'espace vectoriel $E=ℝ^3$ un tenseur trilinéaire quelconque
$T\text " ": (u, v, w) ⟼ T(u, v, w)$. Considérons alors la base canonique
$(e_1, e_2, e_3)$ de $ℝ^3$. On a $e_1 = (1, 0, 0)$, $e_2 = (0, 1, 0)$ et
$e_3 = (0, 0, 1)$. le vecteur $u = (x, y, z)$ de $ℝ^3$ peut donc s'écrire
$xe_1 + ye_2 + ze_3$. Que se passe-t-il si nous reportons cette écriture dans
$T$ et que nous appliquons ses propriétés de multilinéarité ?
$$\table T(u,v,w), =, T(xe_1+ye_2+ze_3,v,w); , =, T(xe_1,v,w) + T(ye_2,v,w) + T(ze_3,v,w); , =, xT(e_1,v,w)+yT(e_2,v,w)+zT(e_3,v,w)$$
Si $v=(x',y',z')$ et $w=(x",y",z")$ on peut poursuivre le développement des
différents membres de l'expression précédente. Par exemple :
$$\table T(e_1,v,w), =, T(e_1,x'e_1+y'e_2+z'e_3,w); , =, x'T(e_1,e_1,w)+y'T(e_1,e_2,w)+z'T(e_1,e_3,w)$$
puis :
$$\table T(e_1,e_1,w), =, T(e_1 e_1,x"e_1+y"e_2+z"e_3); , =, x"T(e_1,e_1,e_1) + y"T(e_1,e_1,e_2) + z"T(e_1,e_1,e_3)$$
et ainsi de suite.
Progressivement, on fait apparaître les nombres $T(e_1,e_1,e_1)$, $T(e_1,e_1,e_2)$, $T(e_1,e_1,e_3)$, $T(e_1,e_2,e_1)$, $T(e_1,e_2,e_2)$, etc. Il s'agit en fait des
images par le tenseur $T$ des vecteurs de la base canonique, avec toutes les
combinaisons possibles. Et c'est là que ca devient intéressant : en raison des propriétés
multilinéaires du tenseur, ces nombres caractérisent entièrement celui-ci
dans cette base. Connaissant tous ces nombres, on peut alors calculer
uniquement par une série de sommes et de produits l'image de trois vecteurs
quelconques, dont on connait les coordonnées dans la base, par le tenseur.
Généralement on note ces nombres par des indices accolés, comme les coefficients
des matrices. Ainsi $T_111 = T(e_1,e_1,e_1)$, $T_212 = T(e_2,e_1,e_2)$, ...
On obtient alors trois tableaux de neuf nombres :
$$[\table T_111,T_112,T_113;T_121,T_122,T_123;T_131,T_132,T_133]\text " ",\text " "[\table T_211,T_212, T_213;T_221,T_222,T_223;T_231,T_232,T_233]\text " ",\text " "[\table T_311,T_312,T_313;T_321,T_322,T_323;T_331,T_332,T_333]$$
Ce ne sont pas des matrices à proprement parler, même si on peut donner un sens à
certaines opérations, comme la somme de deux groupes de ces tableaux. Mais si
l'on prend garde de ne pas se mélanger les pinceaux, nous disposons en effet
d'une sorte de tableau tridimentionnel de nombres qui identifient notre tenseur
de manière unique. De la même façon, la donnée de 27 nombres réels disposés dans
le bon ordre vont caractériser un tenseur trilinéaire de $ℝ^3$ précis.
D'où vient ce
terme de « tenseur » exactement ?
Le mot tensor (en anglais) a initialement été utilisé pour désigner la
norme dans les espaces vectoriels algébriques, c'est à dire ceux disposant
d'une structure d'anneau ou de corps en plus de leur structure d'espace vectoriel,
tel que l'ensemble ℍ des quaternions. Il y a une certaine proximité avec le sens
moderne puisque la norme se définit à partir du produit scalaire dans un espace
euclidien : $∥u∥=√{u|u}$.
C'est en physique que l'on a ensuite réutilisé ce terme et qu'il a acquis sa
signification actuelle. En mécanique du solide, les formes multilinéaires ont
en effet été utilisées pour exprimer les tensions et autres contraintes
s'appliquant sur un objet.
Peut-on représenter
tous les objets de l'algèbre linéaire par un tenseur ? Les vecteurs peuvent-ils
l'être aussi ?
Peut-on établir une correspondance entre les vecteurs de $ℝ^n$ et
un certain tenseur ? La réponse est également oui, mais il faut bien savoir de quoi
en parle. Tous les espaces vectoriels de dimension finie $n$ sont isomorphes à $ℝ^n$,
mais ils ne sont pas $ℝ^n$ pour autant.
Si l'on considère un tenseur à une seule variable sur $ℝ^n$, il s'agit donc
d'une forme linéaire :
$$\table T\text " ":, ℝ^n, ⟶, ℝ; ,u, ⟼, T(u)$$
Or l'espace vectoriel des formes linéaires sur $ℝ^n$ (le dual de $ℝ^n$) dispose lui-même
d'une base canonique $(e_1^*,..., e_n^*)$, constuite à partir de celle de $ℝ^n$, et
constituée des formes coordonnées vérifiant :
$$e_p^*(e_q)=δ_{pq},\text " où "δ_{pq}\text " est le symbole de Kronecker : "δ_{pq}=1\text " si "p=q,\text " 0 sinon"$$
Ces formes linéaires portent ce nom car elles « extraient » d'un vecteur
la coordonnée qui leur correspond. Ainsi en écrivant notre tenseur dans
cette base duale : $T=α_1e_1^*+α_2e_2^*+...+α_n^*e_n^*$, on voit que l'on peut
le caractériser par le tableau :
$$T\text " ~ "[α_1,α_2,...,α_n]$$
Mais il ne s'agit PAS d'un vecteur de $ℝ^n$. Cela est une représentation
possible d'un élément de $L(ℝ^n,ℝ)$ dans une base donnée. Néanmoins il y a bien
sur une forte similarité entre les éléments d'un espace vectoriel et les formes
linéaires qui constituent son dual, pour cette raison les éléments
de $L(ℝ^n,ℝ)$ sont parfois appelés covecteurs de $ℝ^n$.
Mais alors,
vecteur ou tenseur, dans l'absolu ce n'est qu'une liste de nombres...?
Non, mais on peut toujours leur en faire correspondre une, via une base.
Les tenseurs sont des formes multilinéaires, leur ensemble forme un espace vectoriel.
Si on considère les coefficients $T_111, T_112,...$ caractérisant notre tenseur
trilinéaire de $ℝ^3$ vu ci-dessus, on peut les considérer comme les coordonnées
dans une certaine base d'un vecteur de $ℝ^27$ :
$$T\text " ~ "(T_111, T_112,...,T_333)\text " dans une base donnée"$$
Cette opération est d'ailleurs utilisée en informatique, c'est un
« aplatissement » de tenseur.
Mais cette approche seule serait très réductrice. Puisqu'on y est,
une matrice de $M_n(ℝ)$ est aussi un vecteur de l'espace $ℝ^{n^2}$. Or tout
l'intérêt des matrices c'est qu'elles disposent d'autres opérations : on peut
les multiplier, les transposer, (...) ce qui en fait des outils mathématiques
bien plus puissants que les « simples » vecteurs.
Les opérations sur les tenseurs
Tout comme avec les matrices, il existe sur les tenseurs des opérations qui leur
sont spécifiques.
La première est le produit tensoriel.
Prenons un premier tenseur $S\text " ": (u_1,...,u_n) ⟼ S(u_1,...,u_n)$
(forme n-linéaire) et un second
$T\text " ": (v_1,...,v_p) ⟼ T(v_1,...,v_p)$ (forme p-linéaire),
alors on définit leur produit $S⊗T$ par :
$$S⊗T\text " ": (u_1,...,u_n,v_1,...,v_p) ⟼ S(u_1,...,u_n)⋅T(v_1,...,v_p)$$
A noter que le tenseur $S⊗T$ est donc une forme $(n+p)$-linéaire. Il s'agit
d'un produit extérieur, l'objet obtenu ne fait pas partie du même espace
que les objets de départ, et ce même si on avait pris $n=p$. C'est donc
radicalement différent du produit de deux matrices de $M_n(ℝ)$ qui est
aussi une matrice de $M_n(ℝ)$.
Le produit tensoriel dispose toutefois de bonnes propriétés, le rendant
évidemment intéressant. Par exemple, si l'on dispose d'un tenseur $S$ n-linéaire
et de deux tenseurs $T$ et $T'$ étant chacun p-linéaires, alors :
$$(T+T')⊗S=T⊗S+T'⊗S$$
$$S⊗(T+T')=S⊗T+S⊗T'$$
Il permet de généraliser le produit matriciel. A partir de cette opération,
on peut donc construire de nouveaux objets d'une taille bien plus importante
et agissant sur un grand nombre de valeurs.
Notamment, comme on a pu associer une forme linéaire à un vecteur, il est possible
d'associer une matrice à un tenseur bilinéaire. Par suite, on peut définir
une opération, dite produit de Kronecker, dérivée du produit tensoriel
sur les objets associés, et qu'on va noter comme celui-ci. Pour
deux matrices $A$ et $B$ de $M_n(ℝ)$, on va définir $A⊗B$ par blocs, de la manière
suivante :
$$A⊗B=(\table a_{11}B,⋯,a_{1n}B;⋮,⋱,⋮;a_{n1}B,⋯,a_{nn}B)$$
Concrètement, on recopie $n^2$ fois la matrice $B$, et on multiplie chacune de ces
copies par les coefficients de la matrice $A$. Par exemple, pour des matrices
$2×2$ cela donne :
$$(\table a,b;c,d)⊗(\table e,f;g,h)=(\table a⋅(\table e,f;g,h),b⋅(\table e,f;g,h);c⋅(\table e,f;g,h),d⋅(\table e,f;g,h))=(\table ae,af,be,bf;ag,ah,bg,bh;ce,cf,de,df;cg,ch,dg,dh)$$
Ceci illustre bien qu'il s'agit d'un produit extérieur.
Cette opération possède d'excellentes propriétés : $A⊗(B+αC)=(A⊗B)+α(A⊗C)$ mais aussi $(A⊗B)(C⊗D)=AC⊗BD$. Par ailleurs, $A⊗B$
est inversible si et seulement si $A$ et $B$ le sont, auquel cas
$(A⊗B)^{-1}=A^{-1}⊗B^{-1}$.
Il est même possible d'étendre le produit tensoriel à tous les objets de l'algèbre
linéaire. On commence par s'intéresser à celui de deux covecteurs de $ℝ^n$,
parfaitement défini puisqu'il s'agit d'un produit tensoriel de deux formes linéaires,
qu'on va noter ici $f$ et $g$. C'est le tenseur bilinéaire
$f⊗g\text " ": (u,v) ⟼ f(u)g(v)$.
Maintenant si on munit $ℝ^n$ de son produit scalaire usuel :
$$\text "Pour " u=(x_1,...,x_n)\text " et " v=(y_1,...,y_n),\text " alors : " u|v=∑↙{k=1}↖n x_{k}y_{k}$$
Il est possible d'associer, à un vecteur $a∈ℝ^n$ quelconque, le covecteur
$a^*$ tel que $∀u∈ℝ^n, a^*(u)=a|u$. On optient
alors un isomorphisme entre $ℝ^n$ et son dual, ce qui permet alors de parler
d'un « produit tensoriel de deux vecteurs » en remplaçant en fait
ceux-ci par les objets associés. Pour $a∈ℝ^n$ et $b∈ℝ^n$, cela donne
alors, d'après ce qui précède, $a⊗b\text " ": (u,v) ⟼ (a|u)(b|v)$.
Toutes les propriétés du produit tensoriel sont vérifiées.
Il existe également l'opération de contraction. Si l'on dispose
d'un tenseur $T$, n-linéaire, et d'une base $(e_1,...,e_p)$ de notre espace
vectoriel $E$ de dimension finie $p$, alors la contraction de $T$ suivant les indices $q$
et $r$ est l'application $(n-2)$-linéaire :
$$\tr_{qr}(T)\text " ": (u_1,...,u_{q-1},u_{q+1},...,u_{r-1},u_{r+1},...,u_n) ⟼ ∑↙{k=1}↖p T(u_1,...,u_{q-1},e_k,u_{q+1},...,u_{r-1},e_k,u_{r+1},...,u_n)$$
On remplace en fait successivement les $q^{ème}$ et $r^{ème}$ vecteurs dans
l'évaluation de $T$ par les différents vecteurs $e_k$ de la base, et
on somme le tout. On note ce nouveau tenseur $\tr_{qr}$ car il se
trouve justement qu'il généralise la notion de trace d'une matrice. Et
tout comme on peut définir la trace d'un endomorphisme de $E$,
le tenseur $\tr_{qr}(T)$ ainsi défini est indépendant de la base choisie.
*Note* Pour les puristes, oui en effet la contraction
ne s'applique normalement qu'à deux indices correspondant à des espaces
duaux l'un de l'autre dans le cas général. Cependant en considérant à nouveau
l'isomorphisme obtenu plus haut entre $E$ et $E*$ grâce au produit scalaire usuel
défini dans la même base $(e_1,...,e_p)$, on obtient la même notion.
En pratique on est amenés à combiner ces deux opérations : un produit tensoriel
suivi d'une ou plusieurs contractions, ce qu'on appelle
un produit contracté. Noté de manière variable suivant les objets sur
lesquels on l'applique - parfois $⊙$ ou d'autres fois comme le produit usuel -
il permet une grande variété d'opérations sur les tenseurs, et par association
sur les matrices ou les vecteurs. Il est notamment possible de retrouver le
produit matriciel usuel de cette manière.
Si on prend deux matrices carrées $A∈M_n(ℝ)$ et $B∈M_n(ℝ)$ pouvant représenter
chacune un tenseur bilinéaire, alors le produit $AB$ correspond à la contraction suivant
ses indices 2 et 3 du tenseur quadrilinéaire représenté par $A⊗B$. Si l'on
contracte doublement ce même produit $A⊗B$ suivant ses indices $(2,3)$
et $(1,4)$, alors on obtient cette fois un scalaire : $\tr(AB)$.
Si l'on contracte suivant ses deux indices le produit tensoriel bilinéaire
$a⊗b$ de deux vecteurs $a$ et $b$ de $ℝ^n$ comme vu précédemment,
on obtient alors également un scalaire, à savoir $∑↙{k=1}↖n (a|e_k)(b|e_k)=∑↙{k=1}↖n a_{k}b_{k}$, c'est à dire $a|b$.
Utilisation en informatique et en intelligence artificielle
Les informaticiens vont appeler tenseur, de manière très générale,
tout tableau de nombres sur lequel on peut effectuer des opérations.
Il s'agit d'un double abus de langage : d'une part les « vecteurs »
et les « matrices » sont aussi concernés par ce vocable, mais également les
tableaux employant trois indices ou plus. Tous peuvent donc correspondre
à la caractérisation d'un tenseur au sens mathématique, une fois une base définie.
V = [1, 3, 4]
M = [[4, -1, -7],
[0, 12, 1],
[2, 9, -5]]
T = [[[7, 31, -11], [[ -1, 0, 0], [[-20, -9, -4],
[2, -1, 0], [ 2, 48, 1], [ 3, -8, 0],
[4, 6, 0]], [-39, 0, 4]], [ 15, 11, -8]]]
Cela permet de construire des structures de données numériques complexes que l'on
peut toute fois adresser simplement avec des expressions telles que
"V[2]" (= 3) , "M[1,3]" (= -7) ou
"T[2,3,1]" (= -39) .
Par exemple, on peut convertir un fichier de
type image sous forme d'un « tenseur » Image où les
indices 2 et 3 sont les coordonnées d'un pixel, et le premier indice, ayant pour
valeurs possibles 1, 2, ou 3, représente une des composantes colorimétriques R, G et B.
Avec ce codage, Image[2,644,302] représente alors la composante
verte du pixel de coordonnées $(644, 302)$. Si
Image[1,644,302] = 0 , Image[2,644,302] = 255 et
Image[3,644,302] = 255 , alors ce pixel est
cyan.
Pour des données textuelles, on va découper celles-ci en plusieurs éléments
identifiables - appelés tokens - les indexer (au sens propre, leur
donner un numéro d'index) au sein d'un dictionnaire pour pouvoir ensuite
construire un tableau de nombres représentant le texte d'entrée.
Une fois des données de types variés converties ainsi, elles peuvent être
alors présentées à des réseaux de neurones artificiels. Ceux-ci, que l'on
« entraîne » pour concevoir les modèles d'intelligence artificielle,
font un usage très intensif de ces structures et des opérations sur celles-ci,
avec des tailles considérables. Il devient alors intéressant de concevoir
des puces dédiées destinées à travailler avec.
Bien que l'on parle de tenseurs, cela reste le produit matriciel
qui est le plus souvent utilisé de manière intensive par les réseaux de neurones.
Mais toutes les opérations que l'on a vu en 1ère partie sont également
employées, depuis la multiplication d'un tenseur par un scalaire et la somme de matrices
jusqu'au produit tensoriel le plus général, en passant par les cas particuliers tels que
le produit de Kronecker, et de nombreuses formes de produits contractés.
Ce sont toutes ces opérations que les plus récentes de ces puces, apparues après
les GPU et nommées NPU (pour Neural Processing Unit) se destinent à optimiser
de manière encore plus poussée. Bien que les GPU soient capables d'accomplir ces tâches
car la modélisation 3D fait aussi beaucoup appel aux opérations matricielles,
les NPU disposent de mémoires internes très rapides qui permettent de manipuler
les données des réseaux de neurones d'une manière extrêmement efficace.
Alors puisque tout cela est de l'algère multilinéaire, et qu'il ne s'agit
finalement que de sommes et de produits, pourquoi y a-t-il besoin de
puces spécialisées ? On a inventé les microprocesseurs pour faire de l'arithmétique
après tout ?
Alors il faut savoir qu'une « simple » multiplication d'entiers n'est pas
forcément triviale pour un CPU. Sur les tous premiers 8 bits, une telle opération pouvait
prendre plus de 100 cycles d'horloge, et les développeurs évitaient sciemment d'en
faire. Par exemple dans les vieux jeux NES,
il n'y a généralement pas de bonus de type
« dégâts augmentés de $x$ pendant $n$ secondes » ou
« dégâts subis réduits de $y$ pendant $p$ secondes » pour
ces raisons.
A titre de comparaison, les NPU développés par Google (qu'ils appellent TPU, pour
Tensor Processing Unit) sont capables d'effectuer une somme-produit de
matrices 256 × 256 - une opération du type
$A(B+C) \text " avec " A,B,C ∈ M_256(ℝ)$ - en un seul cycle (!!)
Pour cela les GPU et NPU parallélisent massivement les opérations algébriques,
afin de les rendre bien plus rapides qu'avec un CPU, qui lui n'est pas qu'une
simple calculatrice. Un CPU se doit d'être beaucoup plus polyvalent car il
doit aussi gérer les appels système et les entrées-sorties vers les périphériques,
ce qui implique dès lors un mode de fonctionnement plutôt séquentiel.
Le nom de la librairie
TensorFlow
largement utilisée pour l'intelligence artificielle vient du fait que les tenseurs
« circulent » en quelque sorte dans le réseau de neurones,
en suivant de nombreuses modifications de valeurs, de types, mais aussi de tailles,
jusqu'à produire une structure en sortie qui représentera la réponse du modèle d'IA.
Et c'est comme cela que l'on obtient
des boobs !
Et pour les fractales ? Est-ce que ça peut aider ?
La réponse est oui !
On va parler ici essentiellement de
l'ensemble de Mandelbrot, dont
le rendu devient intensif en calcul lorsqu'on
zoome fortement dedans.
L'ensemble de Mandelbrot est défini par l'ensemble des points $c∈ℂ$ pour lesquels
la suite $(z_n)$ : $z_0=0, z_{n+1}={z_n}^2+c$ reste bornée. En traçant diverses lignes
de niveau autour de la frontière de cet ensemble représentant la vitesse de divergence
de la suite, il est possible d'obtenir des images tout à fait exceptionnelles,
qui sont même devenues emblématiques de TheRaphit.com !
Or il est possible d'assimiler l'ensemble des nombres complexes à un
sous-ensemble particulier de $M_2(ℝ)$, par l'application :
$$\table F\text " ":, ℂ, ⟶, M_2(ℝ); ,a+\i b, ⟼, (\table a,-b;b,a)$$
Elle induit un isomorphisme de corps entre ℂ et $F(ℂ)$. En particulier
si on assimile les complexes $z=a+\i b$ et $w=c+\i d$ à leurs matrices
respectives $Z=(\table a,-b;b,a)$ et $W=(\table c,-d;d,c)$ alors :
$$ZW=(\table ac-bd,-ad-bc;ad+bc,ac-bd)$$
ce qui est bien ce que l'on retrouve par un développement algébrique dans ℂ : $zw=(a+\i b)(c +\i d)=ac+\i ad+\i bc+\i^2 bd=(ac-bd)+\i (ad+bc)$. Il y a d'autres propriétés intéressantes : $\det Z=a^2+b^2={|z|}^2$ et aussi $^tZ$ ~ $\ov z$ (conjugaison).
Mais surtout, lorsque vous disposez de puces capable d'accélérer
grandement le calcul tensoriel, manipuler des matrices 2 × 2 pour eux,
c'est piece of cake.
C'est pourquoi je vais prochainement m'intéresser à ce qu'il est possible de faire
à ce niveau. Il n'est pas certain que je trouve immédiatement un traceur de fractales
qui ait été écrit en vue d'être accéléré par les dernières puces... Surtout les NPU, qui
sont particulièrement récents. mais je ne manquerai pas de le signaler car sûr,
ce n'est pas le genre de chose à côté desquelles je vais passer !
Les Mathématiques sur TheRaphit.com
- Les autres pages ajoutées depuis 2025 dans la rubrique -
![[Compteur]](//webcounter.theraphit.com/scripts/Count.cgi?dd=C&frgb=f00000&df=math.dat)
Nombre de visiteurs
depuis le 10 janvier 2000.
[Le retour des fractales !]
[Formules mathématiques & page Web]
Les tenseurs
[Accueil Mathématiques (1997)]
TheRaphit's Web Site - La dernière homepage du Web
[(Tout)2 Evangelion]
[Webzine : La Revue]
[Manga Pink Zone]
Mathématiques
[Nouveautés]
[Zone de téléchargement]
Site créé le 16 janvier 1997
©1997-2025 by TheRaphit
www.theraphit.com
|