FR 3149707 A1 20241213 FR 2309178 A 20230901 Quantification de poids dans un réseau de neurones La présente description concerne un circuit (500) configuré pour effectuer une opération de multiplication et accumulation dans une couche d’un réseau de neurones artificiel, l’opération prenant, en entrée, une valeur de donnée d’entrée et un poids, et dans lequel le poids est uniquement à valeur dans un ensemble limité constitué uniquement de la valeur 0, d’une pluralité de valeurs égales à , où est un entier, et d’une pluralité de valeurs, chacune égale au produit de par un nombre impair supérieur ou égal à 3. Figure pour l'abrégé : Fig. 5 Quantification de poids dans un réseau de neurones La présente description concerne de façon générale l’architecture de réseaux de neurones artificiels, et en particulier un circuit ou un procédé pour effectuer des opérations de multiplications et accumulations dans un réseau de neurones. Les opérations effectuées dans chaque couche de réseaux de neurones artificiels, et en particulier dans les couches de convolution, impliquent l’utilisation d’un circuit matériel configuré pour effectuer les opérations de multiplications et d’accumulations (en anglais « Multiply and ACcumulate » - MAC). De tels circuits MAC comprennent généralement un multiplieur, mis en œuvre par de la logique combinatoire, suivi d’un additionneur. Néanmoins, les circuits MAC ont un coût de consommation en énergie et en surface élevé. En particulier, le multiplieur a un rôle important dans la consommation d’énergie et de surface du processeur sur lequel le circuit MAC est implémenté. Lorsque les paramètres, tels que les poids des neurones, sont des valeurs quantifiées vers des valeurs à virgule fixe, des erreurs d’arrondis apparaissent. Il existe un besoin de fournir une représentation des paramètres en des valeurs quantifiées permettant de limiter les erreurs d’arrondis. Il existe un besoin de réduire la consommation, et la surface, nécessaire à l’implémentation matériel de circuits MAC. En particuliers, il existe un besoin de fournir une implémentation simplifiée d’un multiplieur adaptée à une représentation en valeurs quantifiées. Un mode de réalisation prévoit un circuit configuré pour effectuer une opération de multiplication et accumulation dans une couche d’un réseau de neurones artificiel, l’opération prenant, en entrée, une valeur de donnée d’entrée et un poids, et dans lequel le poids est uniquement à valeur dans un ensemble limité constitué uniquement de la valeur 0, d’une pluralité de valeurs égales à , où est un entier, et d’une pluralité de valeurs, chacune égale au produit de par un nombre impair supérieur ou égal à 3. Selon un mode de réalisation, le circuit comprend : - un premier sous-circuit configuré pour effectuer une multiplication d’une valeur de donnée d’entrée par ledit nombre impair, le premier sous-circuit comprenant un premier circuit de décalage configuré pour effectuer une multiplication par 2 et un additionneur ; et - un deuxième sous-circuit configuré pour effectuer une multiplication par la valeur , le deuxième sous-circuit comprenant un deuxième circuit de décalage configuré pour effectuer un décalage de bits. Selon un mode de réalisation, le premier sous-circuit comprend en outre un premier multiplexeur configuré pour fournir à l’additionneur une valeur sélectionnée parmi : une sortie du premier circuit de décalage ; et la valeur 0, dans lequel le premier multiplexeur est configuré pour sélectionner la sortie du premier circuit de décalage si le poids est égal à l’une de ladite pluralité de valeurs égales à la multiplication de par un nombre impair supérieur ou égal à 3. Selon un mode de réalisation, le circuit comprend en outre un deuxième multiplexeur configuré pour fournir au premier sous-circuit une valeur sélectionnée parmi : la valeur de donnée d’entrée ; et la valeur 0, dans lequel le deuxième multiplexeur est configuré pour sélectionner la valeur 0 si le poids est égal à 0. Selon un mode de réalisation, le circuit comprend en outre un troisième sous-circuit configuré pour appliquer, de manière sélective, un signe négatif à une valeur de sortie du premier sous-circuit, le troisième sous-circuit comprenant, par exemple, un inverseur, un additionneur configuré pour ajouter 1, et un troisième multiplexeur configuré contourner, de manière sélective, l’inverseur et l’additionneur. Selon un mode de réalisation, chaque poids est encodé sur au moins 4 bits, les au moins 4 bits comprenant : - un bit encodant le signe du poids ; - au moins un bit indiquant si le poids à pour valeur une valeur parmi la pluralité de valeurs égales au produit de par un nombre impair supérieur ou égal à 3 ; et - au moins deux bits encodant la valeur de . Selon un mode de réalisation, le deuxième circuit de décalage est configuré pour effectuer une multiplication par une puissance de 2, sur la base de la valeur des au moins deux bits encodant un exposant de 2. Selon un mode de réalisation, l’entier est inférieur à 3. Selon un mode de réalisation, ladite pluralité de valeurs égales au produit de la pluralité de valeurs par un nombre impair supérieur ou égal à 3 comprend : - une première pluralité de valeurs égales au produit de la pluralité de valeurs par un premier nombre impair ; et - une deuxième pluralité de valeurs égales au produit de la pluralité de valeurs par un deuxième nombre impair, différent du premier nombre impair. Selon un mode de réalisation, le nombre impair est le nombre 3. Selon un mode de réalisation, le nombre impair est le nombre 3 et/ou le nombre 5 et/ou le nombre 7. Selon un mode de réalisation, la valeur de poids égale à 0 est encodée par une valeur spécifique, par exemple la suite binaire X111, où X est égale à 0 ou 1. Selon un mode de réalisation, la couche est une couche de convolution. Un autre mode de réalisation prévoit un procédé de génération, par un circuit, d’une valeur de sortie pondérée d’un neurone d’une couche d’un réseau de neurones, le procédé comprenant la multiplication d’une valeur de donnée d’entrée par un poids, dans lequel le poids est uniquement à valeur dans un ensemble limité constitué uniquement de la valeur 0, d’une pluralité de valeurs égales à , où est un entier, et d’une pluralité de valeurs, chacune égale au produit de par un nombre impair supérieur ou égal à 3. Un autre mode de réalisation prévoit un procédé d’entrainement d’un réseau de neurones artificiel, comprenant la détermination de poids de neurones, la détermination étant effectuée en sélectionnant chaque poids uniquement dans un ensemble limité constitué uniquement de la valeur 0, d’une pluralité de valeurs égales à , où est un entier, et d’une pluralité de valeurs, chacune égale au produit de par un nombre impair supérieur ou égal à 3. Ces caractéristiques et avantages, ainsi que d'autres, seront exposés en détail dans la description suivante de modes de réalisation particuliers faite à titre non limitatif en relation avec les figures jointes parmi lesquelles : la illustre un exemple d’un réseau de neurones convolutif ; la illustre l’implémentation matérielle d’une opération de multiplication et accumulation ; la illustre une opération de quantification sur 8 bits ; la est un histogramme de valeurs de poids, selon un mode de réalisation de la présente description ; la est un graphique illustrant une quantification gaussienne, selon un mode de réalisation de la présente description ; la est un schéma par blocs illustrant un multiplieur, selon un mode de réalisation de la présente description ; la illustre un test de validation de l’opération de quantification, selon un mode de réalisation de la présente description ; la est un tableau comprenant les résultats des tests de validation ; et la est un graphe représentant plusieurs modes de quantification pour un modèle de réseau de neurone de type VGG. De mêmes éléments ont été désignés par de mêmes références dans les différentes figures. En particulier, les éléments structurels et/ou fonctionnels communs aux différents modes de réalisation peuvent présenter les mêmes références et peuvent disposer de propriétés structurelles, dimensionnelles et matérielles identiques. Par souci de clarté, seuls les étapes et éléments utiles à la compréhension des modes de réalisation décrits ont été représentés et sont détaillés. En particulier, le fonctionnement et l’implémentation des réseaux de neurones artificiels sont connus de la personne du métier et ne sont pas décrits en détail. Sauf précision contraire, lorsque l'on fait référence à deux éléments connectés entre eux, cela signifie directement connectés sans éléments intermédiaires autres que des conducteurs, et lorsque l'on fait référence à deux éléments reliés (en anglais "coupled") entre eux, cela signifie que ces deux éléments peuvent être connectés ou être reliés par l'intermédiaire d'un ou plusieurs autres éléments. Dans la description qui suit, lorsque l'on fait référence à des qualificatifs de position absolue, tels que les termes "avant", "arrière", "haut", "bas", "gauche", "droite", etc., ou relative, tels que les termes "dessus", "dessous", "supérieur", "inférieur", etc., ou à des qualificatifs d'orientation, tels que les termes "horizontal", "vertical", etc., il est fait référence sauf précision contraire à l'orientation des figures. Sauf précision contraire, les expressions "environ", "approximativement", "sensiblement", et "de l'ordre de" signifient à 10 % près, de préférence à 5 % près. La illustre un exemple d’un réseau de neurones convolutif 100. A titre d’exemple, le réseau de neurones 100 illustré est configuré pour effectuer de la reconnaissance d’image. Plus particulièrement, à partir d’une image d’entrée 102, illustrant par exemple un chien, le réseau de neurones 100 est configuré pour estimer des probabilités d’appartenance a une ou plusieurs classes d’objets. Le réseau de neurones 100 est donc configuré pour, par exemple, générer une donnée de sortie 104, par exemple un vecteur, indiquant des probabilités d’appartenance, de l’image d’entrée 102, à des classes, ou catégories, telles que, par exemple, « °chien », « chat », « lions » et « oiseau ». D’autres exemples de traitement d’images et d’autres catégories sont bien sûr possibles. De même, dans d’autres exemples, le réseau de neurones 100 est configuré pour générer un vecteur de sortie 104 comprenant les probabilités d’appartenance de l’image d’entrée 102 vers plus d’une dizaine, ou d’une centaine de classes. L’exemple d’un réseau configuré pour effectuer du traitement d’image n’est bien sûr pas limitatif. De manière générale, le réseau de neurones 100 comprend au moins une couche de convolution. A titre d’exemple, l’image d’entrée 102 est traitée successivement par une suite de couches du réseau de neurones 100. A titre d’exemple, la première couche du réseau 100 est une couche de convolution 106 configurée pour détecter des caractéristiques dans l’image d’entrée 102, telles que par exemple, des contours, des formes, des couleurs et/ou des textures. La couche 106 est par exemple suivie d’une couche de regroupement 108 (en anglais « pooling ») configurée pour réduire les dimensions de l’image et permettre ainsi de réduire le nombre de paramètres et de calculs effectués dans le réseau 100. La couche 108 est par exemple suivie d’une nouvelle couche de convolution 110. La couche 110 est par exemple configurée pour détecter des caractéristiques dans l’image d’entrée 102, telles que par exemple, des contours, des formes, des couleurs et/ou des textures. A titre d’exemple, les caractéristiques détectées par la couche 110 sont des caractéristiques plus fines que celles détectées par la couche 106. Par exemple, la couche 106 va être configurée pour détecter des couleurs et/ou des contours et la couche 110 va être configurée pour détecter des motifs et/ou des textures dans l’image. A titre d’exemple, la couche 110 est suivie d’une nouvelle couche de regroupement 112, elle-même reliée à une couche complétement connectée 114 (en anglais « Fully-connected ») configurée pour combiner les caractéristiques extraites dans les couches précédentes afin de générer le vecteur de sortie 104. Chacune des couches 106, 108, 110, 112 et 114 est associée à un ou plusieurs paramètres, tels que par exemple, des poids associés à chaque neurone d’une couche. La valeur de chaque paramètre, et en particulier de chaque poids est une valeur apprise lors de l’entrainement, ou l’apprentissage, du réseau 100. Une fois les valeurs des paramètres fixées, c’est-à-dire lorsque l’entrainement du réseau 100 est jugé terminé, le réseau 100 est utilisé pour effectuer, par l’intermédiaire de la suite de couches 106 à 114, des opérations d’inférences. En particulier, durant l’exécution du réseau 100 des opérations de type multiplications et accumulation (de l’anglais « Multiply and ACcumulate » - MAC) sont effectuées. Les opérations MAC correspondent, par exemple, à la sommation, sur plusieurs neurones d’une couche, des produits entre une valeur fournie à un neurone et par exemple, le poids associé à ce neurone. En d’autres termes, une opération MAC, sur un nombre N de neurones, N étant un entier supérieur ou égal à 1, correspond à effectuer l’opération suivante : , où est le poids associé au neurone de rang et où est la valeur d’entrée fournie au neurone de rang . La illustre un exemple d’implémentation matérielle 200 d’une opération de multiplication et accumulation. A titre d’exemple, l’implémentation, ou circuit, 200 comprend un multiplieur 202 ( ) configuré pour recevoir deux valeurs d’entrée et pour générer une valeur de sortie correspondante au produit des deux valeurs d’entrée. A titre d’exemple, les deux valeurs d’entrée fournies au multiplieur correspondent respectivement à une valeur d’entrée vers un neurone et le poids associé à ce neurone. Le circuit 200 comprend en outre un additionneur 204 (+). L’additionneur 204 est par exemple relié au multiplieur 202, et le multiplieur 202 est configuré pour fournir la valeur de sortie générée à l’additionneur 204. L’additionneur 204 est, par exemple, en outre relié à une mémoire 206 (ACCU). A titre d’exemple, la mémoire 206 est un registre. A titre d’exemple, l’additionneur 204 est en outre configuré pour lire la valeur stockée dans la mémoire 206 et pour générer une valeur de sortie en l’additionnant à la valeur fournie par le multiplieur 202. L’additionneur 204 est alors, par exemple, configuré pour stocker la valeur générée dans la mémoire 206. A titre d’exemple, le stockage de la valeur générée s’effectue suite à la suppression de la valeur qui a été précédemment lue par l’additionneur 204. Les valeurs manipulées par les circuits MAC tels que le circuits 200 sont des valeurs quantifiées dans des ensemble de valeurs. Les valeurs quantifiées sont, par exemple, à virgule fixe. La illustre une opération de quantification des poids du réseau 100 sur 8 bits. A titre d’exemple, l’apprentissage du réseau 100 est réalisé par un dispositif externe au circuit sur lequel il sera implémenté. A titre d’exemple, le dispositif externe est un dispositif ayant une grande capacité de calcul. Suite à l’apprentissage, les poids sont, par exemple, stockés dans une mémoire 300 (CLOUD AI), externe au circuit sur lequel le réseau 100 sera implémenté. A titre d’exemple, la mémoire 300 est un serveur. A titre d’exemple, les poids stockés dans la mémoire 300 sont des nombres à virgule flottante et sont par exemple codés sur 16 ou 32 bits. A titre d’exemple, avant d’être stockés dans une mémoire d’un dispositif dans lequel sera implémenté le réseau 100, les valeurs de poids apprises sont quantifiées, ou transformées, en des valeurs quantifiées étant des valeurs entières ou en des valeurs à virgules fixes. A titre d’exemple, la quantification est réalisée par un compilateur pour le portage vers un circuit périphérique 302 (EDGE AI). A titre d’exemple le circuit périphérique 302 est configuré pour effectuer des opérations selon des méthodes d’informatiques en périphérie de réseau (en anglais « Edge computing »). A titre d’exemple, le circuit 302 est configuré pour transformer les valeurs de poids transmises par la mémoire 300 en des valeurs entières, et par exemple sur un nombre inférieur à 16 bits, par exemple sur 8 ou 4 bits. A titre d’exemple, le circuit 302 est configuré pour quantifier les valeurs de poids sur 8 bits en effectuant une opération linéaire. A titre d’exemple, pour une valeur à virgule flottante , par exemple codée sur 32 ou sur 16 bits, une valeur entière , par exemple codée sur 8 bits, est telle que , où la valeur S est une constante réelle et positive représentant un facteur d’échelle (en anglais « scaling factor »), la valeur Z est un décalage de la valeur zéro (en anglais « zero offset ») correspondant à la valeur quantifiant la valeur 0. L’opération linéaire ainsi décrite est connue par la personne du métier et est par exemple décrite dans la partie de 2 de la publication « Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference » de B. Jacob, S. Kligys, B. Chen, M. Zhu, M. Tang, A. Howard, H. Adam et D. Kalenichenko. Dans cet exemple, et en relation avec la , les données d’entrée fournies au multiplieur 202 sont, par exemple, des données codées sur 8 bits. Le multiplieur 202 est par exemple alors configuré pour générer, à partir des deux valeurs d’entrées codées sur 8 bits, une valeur codée sur 16 bits. La figure 4A est un histogramme 400 de valeurs de poids, selon un mode de réalisation de la présente description. En particulier, l’histogramme 400 illustre une répartition gaussienne de valeurs appartenant à un ensemble de valeurs entières où . Autrement dit, l’ensemble comprend uniquement, par exemple la valeur 0, les entiers égaux à des puissances de 2, tels que par exemple les valeurs -4, -2, -1, 1, 2, 4, etc., et les entiers égaux aux puissances de 2, multipliés par 3, tels que par exemple, -6, -3, 3, 6 etc. Dans un autre exemple, la valeur 0 n’appartient pas à l’ensemble . Selon un mode de réalisation, le circuit 302 est par exemple configuré pour quantifier la valeur des poids stockés dans la mémoire 300 en des valeurs appartenant à l’ensemble . Selon un mode de réalisation, pour une valeur à virgule flottante, une quantification dite simple vers une valeur appartenant à l’ensemble s’effectue en appliquant une opération telle que , où si est positif et si est négatif et où, pour toute valeur à virgule flottante est la valeur appartenant à la plus proche de la valeur absolue de la valeur . A titre d’exemple, pour , et . Selon un mode de réalisation, chaque circuit, sur lequel le réseau 100 est implémenté, est configuré pour manipuler et stocker les valeurs quantifiées, appartenant à l'ensemble . Selon d’autres modes de réalisation, l’ensemble est remplacé, ou complété, par un ou plusieurs autres ensembles comprenant uniquement des valeurs égales au produit de puissance de 2 par un nombre impair différent de 3, par exemple par 5 et/ou 7, etc. A titre d’exemple, l’ensemble est remplacé par l’ensemble , ou et la quantification s’effectue dans l’ensemble . Dans un autre exemple, la quantification s’effectue uniquement dans l’ensemble . De manière générale, la quantification s’effectue uniquement dans un ensemble, ou dans une union d’ensembles, de la forme , où , étant un nombre entier positif. Cependant, les combinaisons les plus intéressantes au niveau matériel de l’implémentation du circuit MAC sont les valeurs qui sont les sommes de deux puissances de deux. La est un graphique illustrant une quantification gaussienne comme alternative à la quantification décrite en relation avec la , selon un mode de réalisation de la présente description. A titre d’exemple, la quantification vers des valeurs dans s’effectue par des opérations de quantification dite gaussienne. A titre d’exemple, la quantification dans s’effectue sur un nombre de bits, par exemple 4 bits. C’est à dire que, les valeurs quantifiées sont encodées sur un nombre de bits. Pour discrétiser les valeurs de poids sur -bits, il est supposé qu’elles suivent une loi normale centrée et de variance . A titre d’exemple, la valeur de la variance est obtenue statistiquement à partir d’échantillon de valeurs de poids. Un nombre d’intervalle , est défini de sorte que la probabilité d’appartenance d’une variable aléatoire de loi à un intervalle est uniforme, soit égale à , quel que soit l’intervalle. L’intervalle est alors de la forme , l’intervalle de la forme . Les intervalles , sont de la forme . Les bornes sont alors des valeurs dépendantes de et de . La densité d’une loi normale centrée étant symétrique et étant un nombre impair, pour tout , , la valeur 0 est une valeur quantifiée. Pour chaque intervalle , , une valeur est définie telle que : [Math 1] où est la fonction d’erreur. A titre d’exemple, pour p=4 et , les valeurs l k arrondies au centième près valent {-1.83,-1.28,-0.97,-0.73,-0.53,-0.34,-0.17,0,0.17,0.34,0.53, 0.73,0.97,1.28,1.83}. Pour éviter de manipuler des valeurs à virgule flottante, les valeurs , sont transformées linéairement en des valeurs où est un facteur d’approximation et où est un ensemble de valeurs quantifiées, par exemple . A titre d’exemple, la valeur A G peut être obtenue par régression linéaire, La est un schéma par blocs illustrant un circuit multiplieur et accumulateur 500, selon un mode de réalisation de la présente description. Selon un mode de réalisation, les valeurs appartenant à sont codées sur au maximum 4 bits. Un bit, par exemple le bit le plus significatif, est un bit de signe, un autre bit, par exemple le deuxième bit le plus significatif indique si la valeur est, par exemple, un multiple de 3. Enfin, les deux bits restants, par exemple les deux bits les moins significatifs, encodent la valeur de l’exposant . A titre d’exemple, si la valeur est impaire, si la valeur est égale à ou , etc. L’exposant n étant limité sur 2 bits, l’ensemble est alors limité aux valeurs .Ainsi, par exemple, la valeur sur 4 bits 0000 encode, par exemple, la valeur 1, la valeur sur 4 bits 1101 encode, par exemple, -6, etc. Cet exemple de codage sur 4 bits est bien sûr présenté à titre d’exemple et d’autres forme de codages peuvent bien sûr être envisageable. Dans un autre exemple, le bit le moins significatif est le bit de signe et les deux bits les plus significatif encode la valeur de l’exposant . A titre d’exemple, la valeur sur 4 bits X111 encode la valeur 0, où X est un bit de valeur 0 ou 1. De manière générale, dans le cas où la quantification s’effectue uniquement dans un ensemble de forme , le deuxième bit le plus significatif indique par exemple si la valeur est un multiple de ou non. La valeur 0000 codant alors une valeur différente de 0, dans le cas où la personne du métier souhaite que des poids du réseau 100 aient la possibilité d’être nul, elle saura encoder, de manière spécifique, la valeur de poids 0. Selon un mode de réalisation, le circuit MAC 500 comprend un circuit multiplieur 502. Le circuit multiplieur 502 est configuré pour recevoir une valeur d’activation, correspondant à une valeur d’entrée transmise par exemple à un neurone du réseau 100. A titre d’exemple la valeur d’entrée est fournie au circuit multiplieur 502 par l’intermédiaire d’un multiplexeur 504. A titre d’exemple, la valeur d’activation fournie au multiplexeur 504 est une valeur sur 8 bits. A titre d’exemple le multiplexeur 504 est configuré pour fournir au circuit 502 une valeur d’activation, étant égale soit à la valeur 0, soit à une valeur non nulle. A titre d’exemple, le multiplexeur 504 est présent lorsque les activations sont encodées avec un décalage de la valeur zéro. A titre d’exemple, le multiplexeur 504 est omis lorsque les activations ne sont pas encodées avec un décalage de la valeur 0. Dans ce cas les activations sont fournies en entrées du multiplexeur 502. En particulier, le multiplexeur 504 est relié à un multiplexeur 506 du circuit 502. Le multiplexeur 506 est configuré pour sélectionner la valeur 0, ou la valeur d’activation fournie par le multiplexeur 504, sur la base des valeurs des trois bits indiquant si la valeur de poids est un multiple de 3 (M) et indiquant la valeur de l’exposant (EE). A titre d’exemple, si au moins un des trois bits est différent de 1 ( ), le multiplexeur 506 est configuré : pour sélectionner la valeur d’activation, correspondant au cas où la valeur de poids est différente de la valeur 0 ; et pour sélectionner la valeur 0 dans le cas où les trois bits sont encodés à la valeur 1. La valeur sélectionnée par le multiplexeur 506 est alors, par exemple, une valeur sur 8 bits et est transmise à un additionneur 508. La valeur sélectionnée par le multiplexeur 506 est en parallèle fournie à un circuit de décalage 510 ( Ainsi, dans le cas où la valeur de poids est un multiple de 3, la valeur en sortie de l’additionneur 508 correspond à trois fois la valeur d’entrée. Dans le cas où la valeur de poids n’est pas un multiple de 3, sans être la valeur 0, la valeur en sortie de l’additionneur 508 correspond à la valeur d’activation. A titre d’exemple, la valeur générée par l’additionneur 508 est une valeur sur 10 bits. La valeur générée par l’additionneur 508 est alors fournie à un multiplexeur 514 et, en parallèle, à un inverseur 516. L’inverseur 516 est donc configuré pour faire passer les bits ayant pour valeur 1 à la valeur 0, et inversement, de la valeur fournie par l’additionneur 508. La valeur inversée est alors fournie à un additionneur 518. L’additionneur 518 est un additionneur par 1, configuré pour ajouter 1 à la valeur en sortie de l’inverseur 516. L’inverseur 516 et l’additionneur 518 sont donc configurés pour générer, selon la méthode du complément à 2, la valeur opposée de la valeur en sortie de l’additionneur 508. La valeur en sortie de l’additionneur 518 correspond donc à la valeur qui, quand on l’ajoute à la valeur en sortie de l’additionneur 508, résulte en une suite de 0. Autrement dit, La valeur en sortie de l’additionneur 518 correspond à la multiplication de la valeur en sortie de l’additionneur 508 par -1. Le multiplexeur 514 est alors configuré pour sélectionner, sur la base de la valeur du bit (S) indiquant si la valeur du poids est positive ou négative, la valeur en sortie de l’additionneur 508 ou de l’additionneur 518. Par exemple, si la valeur de poids est positive, le multiplexeur 514 sélectionne la valeur en sortie de l’additionneur 508, et si la valeur de poids est négative, le multiplexeur 514 sélectionne la valeur en sortie de l’additionneur 518. Le multiplexeur 514 est alors configuré pour fournir la valeur sélectionnée, par exemple sur 11 bits, à un circuit de décalage, ou décaleur520. Le circuit de décalage 520 est alors configuré pour décaler vers la gauche la valeur reçue sur la base de la valeur des deux bits (EE) indiquant l’exposant. A titre d’exemple, si les deux bits sont égaux à 0, le circuit 520 restitue simplement la valeur en sortie du multiplexeur 514, sans la décaler. De manière générale, le circuit 520 est configuré pour décaler, la valeur fournie, d’un nombre de bits égal à la valeur de . La valeur restituée par le circuit 520 correspond alors au produit de la valeur en sortie du multiplexeur 514 par . A titre d’exemple, la valeur en sortie du circuit 520 est une valeur sur 21 bits. Le multiplieur 502 est, en outre, relié à un additionneur 522 configuré pour lire la valeur en sortie du circuit 520. L’additionneur 522 est en outre configuré pour additionner la valeur en sortie du 520 avec une valeur stockée dans une mémoire 524 (ACCU). L’additionneur 522 est en outre configuré pour transmettre la valeur générée à la mémoire 524. A titre d’exemple, la mémoire 524 est similaire à la mémoire 206. A titre d’exemple, les valeurs manipulées par l’additionneur 522 sont codées sur 21 bits. Les nombres de bits manipulés par les éléments du multiplieur 502 et par l’additionneur 522 sont donnés à titre d’exemple. A titre d’exemple, dans le cas où l’exposant est codé sur un nombre de bits supérieur à 2, la personne du métier saura adapter le nombre de bits manipulés par les différents éléments du circuit 500 au nombre de bit encodant la valeur de poids ainsi que le décalage effectué par le circuit 520. Dans le cas où la valeur de poids appartient à un ensemble du type , ou à l’union de plusieurs ensembles de type , , la personne du métier saura adapter la partie du circuit 502 comprenant les éléments 506, 510, 512 et 508 afin de les remplacer, ou d’ajouter d’autres éléments de manière à effectuer une multiplication par le, ou les, nombres impairs voulus. A titre d’exemple, si l’ensemble considéré est de la forme , un autre multiplexeur pourra être ajouté afin de sélectionner si la valeur de poids est un multiple de 5 ou non, et cet autre multiplexeur pourra être relié à un additionneur et à un circuit de décalage configuré pour décaler, d’au moins un bit vers la gauche la valeur reçue. Le nombre de bit impliqué dans le décalage dépend du nombre de bits utilisé pour encoder la valeur de l’exposant de 2. En fonction de la position de cet autre multiplexeur, le circuit pourra être adapté à l’ensemble sans avoir à ajouter d’autre composant matériel supplémentaire. Dans ce cas, l’ensemble correspondra à (1xA+2xA)+4xA, où un premier multiplexeur choisira d’ajouter la valeur 2xA ou non, de la même manière que le multiplexeur 512, et un deuxième multiplexeur choisira d’ajouter la valeur 4xA ou non. De manière générale, plus l’ensemble considéré comprend des unions d’ensemble de type , plus la représentation s’approchera d’une description en virgule flottante. De manière générale, la partie 502 du circuit comprend un nombre d’additionneurs égal au nombre de « 1 » dans la représentation binaire du nombre impair, moins un. Par exemple, les représentations binaires des impairs 3 et 5 sont « 011 » et « 101 », comprenant deux valeurs « 1 », ainsi la partie 502 adaptée à ou à comprend un additionneur. Par exemple, la représentation binaire de l’impair est « 111 » comprenant trois valeurs « 1 », ainsi la partie 502 adaptée à comprend deux additionneurs. La figure 6 illustre un test de validation de la quantification dans l’ensemble . A titre d’exemple, le test de validation illustré est effectué suite à l’apprentissage des poids d’une couche de convolution d’un réseau par exemple similaire au réseau de neurones 100 décrit en relation avec la . A titre d’exemple, le réseau est un réseau du type CNN (de l’anglais « Convolutional Neural Network »). Un histogramme 600 illustre la répartition des poids (WEIGHT REPARTITION) obtenus, lors de l’apprentissage, pour la deuxième couche du réseau. Plus particulièrement, les poids illustrés dans l’histogramme 600 sont des valeurs à virgule flottante. La répartition des poids forme alors une gaussienne. Un histogramme 602 illustre la répartition de poids quantifiés. A titre d’exemple les poids quantifiés sont les poids obtenus, lors de l’apprentissage, pour la deuxième couche du réseau, puis quantifiés dans l’ensemble . A titre d’exemple, à partir d’un poids à virgule flottante , un poids quantifié est tel que . La répartition des poids quantifiés dans forme aussi une gaussienne. De plus, on remarque que tous les poids quantifiés appartiennent à l’intervalle et peuvent par conséquent être codés sur 4 bits comme décrit en relation avec la . La figure 7 illustre un tableau 700 et un tableau 702 comprenant chacun les résultats de tests de validation. En particulier, les tableaux 700 et 702 comprennent des comparatifs des coûts en consommation d’énergie (POWER ( W)), en surface (AREA ( )) ainsi que la précision du réseau (ACCURACY) pour une quantification linéaire (LINEAR) et une quantification dans , sur 4 bits (SIMPLE ). En particulier, le tableau 700 illustre une comparaison entre une quantification linéaire (LINEAR), par exemple décrite en relation avec la figure 3, sur 8 bits et la quantification dans sur 4 bits. Le tableau 702 illustre une quantification linéaire sur 4 bits et la quantification dans sur 4 bits. La comparaison s’effectue par exemple pour une couche de convolution d’un réseau de neurones similaire au réseau 100 et dans lequel les données d’activation de la couche sont codées, par une quantification linéaire, sur 8 bits. Les quantifications sont alors réalisées pour les poids de neurones de ladite couche, et à partir de valeur à virgule flottante, obtenues par exemple lors de l’apprentissage du réseau. A titre d’exemple la quantification linéaire sur 8 bits permet de quantifier des valeurs à virgule flottante en des entiers appartenant par exemple à l’intervalle . La quantification linéaire sur 4 bits permet de quantifier des valeurs à virgule flottante en des entiers appartenant par exemple à l’intervalle . Plus particulièrement, la quantification linéaire sur 8 bits possède 256 représentations de valeur pour les poids et la quantification linéaire sur 4 bits possède 16 représentations. La quantification dans sur 4 bits possède, comme décrit en relation avec la figure 5, 15 représentations, la valeur 0 incluse. Une colonne de gain (GAIN) dans chaque tableau 700 et 702 comprend les gains en consommation d’énergie, en surface et en précision apportés par la quantification dans par rapport à la quantification linéaire. A titre d’exemple, la surface utilisée par la quantification dans sur 4 bits est calculée à partir de l’implémentation du circuit MAC 500 décrit en relation avec la . A titre d’exemple, sur une technologie de 40nm testée, une quantification linéaire sur 8 bits, respectivement sur 4 bits, demande par exemple 28.1 de consommation, respectivement 20.6 , alors que la quantification dans demande par exemple 17.9 , ce qui représente un gain de 36% dans le premier cas et de 13.1% dans le deuxième cas. De même, la quantification linéaire sur 8 bits, respectivement sur 4 bits, demande par exemple 566.3 de surface, respectivement 369 , alors que la quantification dans demande par exemple 358 , ce qui représente un gain de 37% dans le premier cas et de 3% dans le deuxième cas. La précision dans le cas de la quantification linéaire sur 8 bits est par exemple de 99.06% et de 99.05% dans le cas de la quantification linéaire sur 4 bits. La précision pour la quantification sur est par exemple de 99.37%, soit un gain de 0.31% par rapport à la quantification linéaire sur 8 bits et de 0.32% par rapport à la quantification linéaire sur 4 bits. Bien que la quantification dans et sur 4 bits permette le codage des valeurs de poids uniquement dans un ensemble de 14 valeurs, ou 16 si les valeurs -24 et 24 sont incluses, ou de 15 en incluant la valeur 0, celles-ci sont plus réparties de façon à couvrir plus judicieusement et astucieusement la répartition gaussienne, ce qui se traduit par une précision élevée. En effet, les 16 valeurs décrites par la représentation linéaire sur 4 bits sont trop peu nombreuses et toutes à égale distance les unes des autres ce qui ne convient pas idéalement pour décrire des valeurs réparties selon une loi normale. De plus, les 256 valeurs décrites par la représentation linéaire sur 8 bits, bien que permettant de décrire fidèlement la répartition gaussienne, sont trop nombreuses. En effet, les valeurs de queue, c’est-à-dire les valeurs hautes et basses sont très peu utilisées et le fait de les considérer augmente la surface et la consommation d’énergie sans pour autant apporter un gain de précision notable. La est un graphe 800 représentant plusieurs modes de quantification pour un modèle de réseau de neurones de type VGG (de l’anglais « Visual Geometry Group »). Ce modèle se caractérise par une succession de blocs composés de deux à trois couches de convolution suivies d'une couche dite de maxpooling. Chaque couche de convolution possède un filtre 3 par 3 et les couches de maxpooling sont de taille 2 par 2. A titre d’exemple, un modèle VGG16 à une profondeur de 16 couches et un modèle VGG19 à une profondeur de 19 couches. En particulier, le graphe 800 comprend plusieurs points, chacun associé à un modèle de quantification. L’abscisse de chaque point représente le ratio de consommation (POWER RATIO) et l’ordonnée de chaque point représente la précision obtenue par le réseau VGG. Le ratio de consommation est défini par rapport à la consommation de la quantification linéaire avec 8 bits de poids et 8 bits d’activation. A titre d’exemple, un ratio de 65% signifie que la quantification testée consomme 35% d’énergie en moins que la quantification linéaire sur 8 bits. A titre d’exemple, les paramètres du réseau VGG ont été obtenu par apprentissage et sont, de base des valeurs à virgule flottante (FLOAT). Les différentes quantifications illustrées sont effectuées par exemple sur les poids des couches de convolutions du réseau. A titre d’exemple, un premier apprentissage du réseau s’effectue avec des valeurs en virgule flottante, ensuite un deuxième apprentissage est réalisé, à partir des poids obtenus lors du premier apprentissage, afin de simuler une quantification. Cette technique est connue par la personne du métier sous le nom de QAT (de l’anglais « Quantization Aware Training »). A titre d’exemple, pour chaque point, entre 10 et 20, par exemple 15, entrainements du réseau sont réalisés et la précision maximale est récupérée. A titre d’exemple, des points 801 (Linear_a8_w8), 802 (Linear_a8_w4), 804 (Linear_a6_w8) et 806 (Linear_a6_w4) représentent le ratio de consommation et la précision du réseau VGG pour des quantifications linéaires. En particulier, le point 801 est associé à une quantification linéaire sur 8 bits, et pour laquelle les points d’activation sont aussi sur 8 bits. Le point 802 est associé à une quantification linéaire sur 4 bits, et pour laquelle les points d’activation sont aussi sur 8 bits. La précision apportée par ces deux quantifications est similaire, soit d’environ 99,05%, mais la quantification sur 4 bits est moins couteuse en consommation d’énergie. Les point 804 et 806 sont associés à une quantification linéaire respectivement sur 8 et 4 bits, et pour lesquelles les points d’activation sont aussi sur 6 bits. Des points 808 (Log2_a8_w4), 810 (Log2_a6_w4) et 812 (Log2_a4_w4) sont associés à des quantifications logarithmiques sur 4 bits, et pour lesquelles les points d’activation sont, respectivement, sur 8, 6 et 4 bits. Des points 814 (Simple_ _a8_w4), 816 (Simple_ _a6_w4) et 818 (Simple_ _a4_w4) sont associés à des quantifications simples dans sur 4 bits, telles que décrites en relation avec la , et pour lesquelles les points d’activation sont, respectivement, sur 8, 6 et 4 bits. Des points 820 (Gauss_ _a8_w4), 822 (Gauss_ _a6_w4) et 824 (Gauss_ _a4_w4) sont associés à des quantifications gaussiennes, telles que décrites en relation avec la figure 4B, dans sur 4 bits, et pour lesquelles les points d’activation sont, respectivement, sur 8, 6 et 4 bits. Le graphique 800 montrent que pour les tests effectués, les quantifications linéaires résultent en une moins bonne précision qu’en gardant des valeurs à virgule flottante. Cependant, les quantifications dans , en particulier ayant des points d’activation sur 8 et/ou 6 bits présentent une meilleure précision qu’en gardant des valeurs à virgule flottante. Un avantage des modes de réalisation, est qu’ils permettent d’implémenter un circuit MAC adapté aux opérations exécutées par une ou plusieurs couches d’un réseau de neurones et ayant une surface réduite. Divers modes de réalisation et variantes ont été décrits. La personne du métier comprendra que certaines caractéristiques de ces divers modes de réalisation et variantes pourraient être combinées, et d’autres variantes apparaîtront à la personne du métier. En particulier, l’ensemble sur lequel est effectué la quantification peut varier. En effet bien que l’ensemble sur 4 bits soit principalement décrits, la personne du métier saura adapter l’implémentation du circuit MAC à un ensemble de type , ou à l’union de plusieurs ensembles de type . De même, la personne du métier saura adapter l’encodage des valeurs de et leur traitement par le circuit MAC, lorsque que celles-ci sont encodées sur un nombre supérieur à 4 bits. Enfin, la mise en œuvre pratique des modes de réalisation et variantes décrits est à la portée de la personne du métier à partir des indications fonctionnelles données ci-dessus. En particulier, la personne du métier saura adapter l’implémentation du circuit 502 afin d’effectuer des multiplications par un, ou plusieurs, nombres impairs différents de 3. Circuit (500) configuré pour effectuer une opération de multiplication et accumulation dans une couche d’un réseau (100) de neurones artificiel, le circuit comprenant un circuit multiplieur (502), un additionneur (522) et une mémoire (524), configurés pour réaliser l’opération, l’opération prenant, en entrée, une valeur de donnée d’entrée et un poids, et dans lequel le poids est uniquement à valeur dans un ensemble limité constitué uniquement de la valeur 0, d’une pluralité de valeurs égales à , où est un entier, et d’une pluralité de valeurs, chacune égale au produit de par un nombre impair supérieur ou égal à 3. Circuit (500) selon la revendication 1, comprenant : - un premier sous-circuit configuré pour effectuer une multiplication d’une valeur de donnée d’entrée par ledit nombre impair, le premier sous-circuit comprenant un premier circuit de décalage (510) configuré pour effectuer une multiplication par 2 et un additionneur (508) ; et - un deuxième sous-circuit configuré pour effectuer une multiplication par la valeur , le deuxième sous-circuit comprenant un deuxième circuit de décalage (520) configuré pour effectuer un décalage de bits. Circuit (500) selon la revendication 2, dans lequel le premier sous-circuit comprend en outre un premier multiplexeur (512) configuré pour fournir à l’additionneur (508) une valeur sélectionnée parmi : une sortie du premier circuit de décalage (510) ; et la valeur 0, dans lequel le premier multiplexeur (512) est configuré pour sélectionner la sortie du premier circuit de décalage si le poids est égal à l’une de ladite pluralité de valeurs égales à la multiplication de par un nombre impair supérieur ou égal à 3. Circuit (500) selon la revendication 2 ou 3, comprenant en outre un deuxième multiplexeur (506) configuré pour fournir au premier sous-circuit une valeur sélectionnée parmi : la valeur de donnée d’entrée ; et la valeur 0, dans lequel le deuxième multiplexeur est configuré pour sélectionner la valeur 0 si le poids est égal à 0. Circuit (500) selon l’une quelconque des revendications 2 à 4, comprenant en outre un troisième sous-circuit configuré pour appliquer, de manière sélective, un signe négatif à une valeur de sortie du premier sous-circuit, le troisième sous-circuit comprenant, par exemple, un inverseur (516), un additionneur (518) configuré pour ajouter 1, et un troisième multiplexeur (514) configuré contourner, de manière sélective, l’inverseur et l’additionneur. Circuit (500) selon l’une quelconque des revendications 2 à 5, dans lequel chaque poids est encodé sur au moins 4 bits, les au moins 4 bits comprenant : - un bit (S) encodant le signe du poids ; - au moins un bit (M) indiquant si le poids à pour valeur une valeur parmi la pluralité de valeurs égales au produit de par un nombre impair supérieur ou égal à 3 ; et - au moins deux bits (EE) encodant la valeur de . Circuit (500) selon la revendication 6, dans lequel le deuxième circuit de décalage (520) est configuré pour effectuer une multiplication par une puissance de 2, sur la base de la valeur des au moins deux bits (EE) encodant un exposant de 2. Circuit (500) selon l’une quelconque des revendications 1 à 7, dans lequel l’entier est inférieur à 3. Circuit (500) selon l’une quelconque des revendications 1 à 8, dans lequel ladite pluralité de valeurs égales au produit de la pluralité de valeurs par un nombre impair supérieur ou égal à 3 comprend : - une première pluralité de valeurs égales au produit de la pluralité de valeurs par un premier nombre impair ; et - une deuxième pluralité de valeurs égales au produit de la pluralité de valeurs par un deuxième nombre impair, différent du premier nombre impair. Circuit (500) selon l’une quelconque des revendications 1 à 9, dans lequel le nombre impair est le nombre 3. Circuit (500) selon l’une quelconque des revendications 1 à 9, dans lequel le nombre impair est le nombre 3 et/ou le nombre 5 et/ou le nombre 7. Circuit (500) selon l’une quelconque des revendications 1 à 11, dans lequel la valeur de poids égale à 0 est encodée par une valeur spécifique, par exemple la suite binaire X111, où X est égale à 0 ou 1. Circuit (500) selon l’une quelconque des revendications 1 à 12, dans lequel la couche est une couche de convolution. Procédé de génération, par un circuit (500), d’une valeur de sortie pondérée d’un neurone d’une couche d’un réseau de neurones, le circuit comprenant un circuit multiplieur (502), un additionneur (522) et une mémoire (524), le procédé comprenant la multiplication, par le circuit multiplieur, d’une valeur de donnée d’entrée par un poids, dans lequel le poids est uniquement à valeur dans un ensemble limité constitué uniquement de la valeur 0, d’une pluralité de valeurs égales à , où est un entier, et d’une pluralité de valeurs, chacune égale au produit de par un nombre impair supérieur ou égal à 3. Procédé d’entrainement d’un réseau de neurones artificiel, comprenant la détermination de poids de neurones, la détermination étant effectuée en sélectionnant chaque poids uniquement dans un ensemble limité constitué uniquement de la valeur 0, d’une pluralité de valeurs égales à , où est un entier, et d’une pluralité de valeurs, chacune égale au produit de par un nombre impair supérieur ou égal à 3.