Rapport de Projet de Fin D'étude 27
Rapport de Projet de Fin D'étude 27
Rapport de Projet de Fin D'étude 27
pour l’embarqué
Emrick Sinitambirivoutin
taux de compression possible tout en gardant un niveau sants par l’intermédiaire de Bus de communica-
de précision acceptable pour une cible embarquée. tions.
Même si la plus part des systèmes sur puce respectent
2. LES CONTRAINTES DE L’EMBARQUÉ cette organisation générique, l’architecture réelle d’un
système est directement liée à l’application pour
2.1. Architecture générale des systèmes em- laquelle elle a été conçue. Ainsi, l’implémentation de
barqués ces différentes parties va varier d’un système à l’autre.
Alors que pour des applications nécessitant de grosses
Afin de mieux comprendre les contraintes auxquelles capacités de calculs sans réelles contraintes énergétiques
sont soumis les systèmes embarqués et les probléma- l’accent sera mis sur la maximisation du nombre
tiques liées à l’implémentation de réseaux de neurones d’opérations par cycles d’horloge, des applications pour
sur celles ci, nous allons d’abord nous intéresser à l’ar- des cibles embarquées vont par exemple privilégier la
chitecture matérielle des systèmes embarqués. Nous ver- consommation énergétique du circuit en minimisant le
rons ensuite les problématiques liées à la mémoire et à coût des accès mémoire.
la consommation de ces systèmes. Pour un système embarqué, les contraints principales
sont la consommation, la surface (le coût) et
2.2. Architecture matérielle la performance. Afin de répondre au mieux à
ces contraintes, les processeurs que l’on retrouve
L’architecture de la plus part des systèmes embarqués aujourd’hui dans nos nos téléphones, nos tablettes
reposent sur le modèle proposée par John Von Neumann ou encore nos montres connectées sont généralement
en 1946. composés d’un ou plusieurs cœurs afin de garantir de
bonnes performances, d’une mémoire avec différents
niveaux de hiérarchie afin de minimiser les accès
coûteux (en temps et en énergie) et de coprocesseurs
dédiés à des tâches spécifiques afin de limiter la
consommation et d’optimiser les performances.
Ce modèle d’architecture scinde les composants d’un FIGURE 2. Nvidia Tegra K1 Architecture
système sur puce en quatre parties distinctes :
— L’unité arithmétique et logique (UAL) : Elle Ces processeurs sont globalement adaptés à des
réalise les opérations arithmétiques et logiques sur applications usuelles telles que le visionnage de vidéo
une ou deux opérandes qui lui sont transmises par en ligne, la gestion de jeux vidéos standards (sans
l’unité de contrôle. réalité virtuelle ou Intelligence Artificielle) ou encore
— L’unité de contrôle : Elle réalise le séquençage l’affichage de contenu interactif mais s’avèrent être peu
des opérations de manière à effectuer celles ci dans performants pour des applications de Deep Learning.
l’ordre indiqué dans le programme. En effet, ces algorithmes, (expliqués de manière plus
— La mémoire : Elle contient toutes les données détaillée en Annexe A et B) utilisent des modèles très
nécessaires à l’exécution du programme (Données volumineux et nécessitent beaucoup de calculs. Pour
+ Programme). pouvoir gérer ces modèles sur des systèmes embarqués,
— Les entrées sorties : Elles permettent au pro- il faut donc à la fois diminuer la taille des modèles afin
cesseur de communiquer avec d’autres compo- de minimiser les accès mémoires et optimiser les calculs
Compression des réseaux de neurones pour l’embarqué 3
nécessaires lors de la phase d’inférence en utilisant des accès mémoire sont nécessaires comme on peut le voir
circuits dédiés ou des algorithmes plus efficaces. dans la Figure 4.
3.1. L’élagage
L’élagage, plus présent dans la littérature sous le nom
de « prunning », est un procédé consistant à éliminer les
poids de faible importance dans le réseau afin de réduire
sa taille, d’augmenter ses performances et de diminuer
FIGURE 5. Exemple de réseau : Deux couches
sa consommation lors du processus d’inférence. La
convolutives (32 Filtres 3 × 3 × 1 pour la 1ère et 14 filtres
3 × 3 × 32 pour la 2ème) et une couche conventionnelle de grande majorité des méthodes de pruning s’appliquent
128 Neurones après la phase d’apprentissage et la plupart du temps
le réseau repasse par une petite phase d’apprentissage
afin d’améliorer la précision du modèle élagué. De
Pour pouvoir limiter la consommation il faut donc nombreuses études ont été réalisées sur le sujet et la
limiter au maximum ces accès et trouver un bon flot plupart d’entre elles tendent à montrer que ce type
de traitement des données pour pouvoir optimiser la de méthode de réduction impacte peu la précision du
gestion de ceux ci en cache. modèle et que cela peut parfois contribuer à améliorer
la généralisation de ceux-ci. Cependant, afin de garantir
3. LA SUPPRESSION DES POIDS DE une baisse mineure de la précision du modèle, il faut
FAIBLE IMPORTANCE pouvoir déterminer de façon efficace les poids les moins
« importants » du modèle. Plusieurs méthodes vont
La première approche pour pouvoir réduire la taille être détaillées dans ce paragraphe avec chacune leurs
d’un modèle est de chercher à diminuer son nombre contraintes et leurs avantages. Dans tous les cas, ces
de paramètres en supprimant les paramètres de faible méthodes permettent de réduire significativement la
importance. C’est donc cette première approche que taille du réseau et ce sans perte de précision importante.
nous allons explorer dans cette partie. Un critère sera
particulièrement important pour valider l’efficacité de 3.2. Les niveaux de granularité
ces méthodes : la précision du modèle obtenu. La
précision, ou taux de reconnaissance dans le domaine Il existe différents niveaux de granularité possibles
de la reconnaissance d’image, est le critère le plus pour pouvoir effectuer un pruning : le pruning Intra
important d’un modèle, c’est lui qui indique le taux de Kernel, le pruning de Kernel ou encore le prunning
bonnes classifications de celui-ci sur un grand nombre de Filtres (ou de Feature map). Les différents types
d’échantillons de données de test. On suppose alors de prunning sont détaillés à titre d’exemple dans la
qu’un modèle avec une précision de 90% est capable de Figure 7. Le pruning Intra Kernel consiste à supprimer
bien classifier 9 échantillons sur 10 dans le cas général. des poids dans les filtres mais en les conservant. Le
Si les données sont des images d’animaux par exemple, prunning de Kernel quant à lui consiste à supprimer
cela voudra donc dire que sur 10 images, le modèle est des canaux entiers des Filtres. Enfin le pruning de Filtre
capable de correctement identifier l’animal qui se trouve consiste à supprimer un filtre en entier, ce qui a par la
sur l’image 9 fois sur 10. Les procédés de réduction même occasion l’effet de supprimer une feature map et
Compression des réseaux de neurones pour l’embarqué 5
les canaux de tous les filtres suivants associés à cette et sélectionne les poids à supprimer en utilisant la
feature map. On remarque que le niveau de granularité méthode de Monte Carlos Séquentielle (connue aussi
le plus grossier (pruning de filtre) retire beaucoup plus sous le nom de filtre particulaire ou SMC). Les poids
de poids que le niveau de granularité le plus fin (pruning sont ensuite stockés dans des matrices et organisés de
intra kernel). manière spécifique afin de ne pas tenir compte des
zéros et d’effectuer le calcul de convolution comme
une multiplication matricielle. Le réseau est ensuite ré-
entrainé afin de regagner la précision perdue lors du
prunning.
Soient π l le réseau de prunning (C’est ce modèle qui boucle F or consiste à calculer le gradient pour la rétro-
va s’occuper de sélectionner les filtres pertinents) et θl propagation dans le réseau de prunning à partir des M
ses paramètres. Soient f le modèle de départ (le modèle Rewards et décisions obtenus précédemment.
que l’on veut élaguer. On considère ici que f a déjà été
appris et donc que l’élagage est réalisé avant la phase
d’inférence), Wl l’ensemble des poids de ce modèle pour
le l-ième layer et fb le modèle obtenu après élagage.
Soient Xtrain un échantillon de donnée utilisé pour
l’apprentissage et Xval l’ensemble des valeurs associées.
On note ∇θl L le gradient calculé lors de la rétro-
propagation dans π l et R la fonction de récompense.
Ces fonctions ne sont pas détaillés ici car elles ne sont
pas importante pour comprendre l’algorithme. Elles
peuvent être retrouvées dans [7].
Nous allons désigner ici « cluster », le sous ensemble 4.2.1. Méthode scalaire
de valeurs considéré pour la quantification. On distingue Nous nous plaçons dans le cadre d’une quantification
deux grandes approches pour construire ces clusters : La scalaire, il s’agit donc ici de trouver les poids les plus
quantification scalaire et la quantification vectorielle. représentatifs de l’ensemble des poids du modèle.
— Quantification scalaire : Ce type de quanti-
fication est dite "scalaire" car les clusters sont 4.2.2. Voici les principales approches scalaires pos-
construits à partir de valeurs scalaires. Des valeurs sibles [4] :
représentatives sont choisies parmi l’ensemble des — L’approche aléatoire : Elle consiste à choisir
valeurs des poids et les clusters sont construits des valeurs aléatoire dans l’ensemble des valeurs
en associant à chacune de ces valeurs représenta- possibles.
tives l’ensemble des poids qui s’en rapprochent. — L’approche par densité : Elle consiste à
Ces poids prennent alors la valeur de la valeur re- initialiser les poids de manière linéaire par
présentative du cluster. Par exemple pour un en- rapport à la fonction de répartition associée à la
semble de valeurs S = [1, 2, 2, 14, 13, 15, 14, 3, 0], distribution des poids.
si l’on choisi comme valeurs représentatives a = 2 — L’approche linéaire : Elle consiste à choisir les
et b = 14, on va rassembler dans le cluster a (Ca ) poids de manière linéaire entre xmin et xmax.
l’ensemble des valeurs qui vont être représentées
par a et l’on fera de même pour le cluster b (Cb ).
Par exemple on peut construire :
Ca = {S0 , S1 , S2 , S7 , S8 }
Cb = {S3 , S4 , S5 , S6 }
On aura alors S = {2, 2, 2, 14, 14, 14, 14, 2, 2}.
— Quantification vectorielle : Ce type de quan-
tification est dite "vectorielle" car à la différence
de la quantification scalaire, on considère que l’en-
semble des valeurs est dans un espace vectoriel de
dimension > 1. La principale différence par rap-
port à la quantification scalaire est que plutôt que
de commencer par chercher des valeurs représen-
tatives de l’ensemble des poids, on commence par
subdiviser l’ensemble des poids en sous ensembles
et ce sont dans ces sous ensembles que la quantifi- FIGURE 15. Répartition des poids du modèle en fonction
cation va avoir lieux. L’intérêt des cette méthode de leurs valeurs (courbe de répartition et courbe de
vient du fait qu’il est plus précis de déterminer distribution cumulée) et valeurs représentatives choisies en
les éléments représentatifs d’un sous ensemble que fonctions de différentes méthodes d’initialisation (cf légende)
les éléments représentatifs de tout l’ensemble des
poids. De manière plus formelle, la quantification Le travail réalisé dans [4] montre que l’initialisation
vectorielle revient à faire une projection de notre linéaire est la plus efficace en terme de précision. En
espace vectoriel de départ vers un espace vecto- effet, les gros poids jouent un rôle plus important que
riel de plus petite dimension, réduisant ainsi le les poids faible dans le modèle mais ils sont moins
nombre de valeurs que peuvent prendre les poids. nombreux. Mais les méthodes d’initialisation aléatoire
Comme nous l’avons évoqué, l’efficacité de cette et par densité, sélectionnant peu ces gros poids du
méthode repose sur deux critère : le choix des valeurs fait de leur faible occurrence, sélectionnent peu de
représentatives et le choix de la manière d’associer les représentants pour ces gros poids alors même qu’ils
poids à une valeur représentative donnée. Nous allons ont un rôle plus important dans le modèle. Elles ne
donc nous intéresser aux méthode permettant de faire permettent donc pas de reproduire fidèlement le modèle.
ces choix. L’initialisation linéaire quand à elle n’est pas affectée
par ce problème de répartition et permet donc d’être
plus fidèle au modèle initiale.
4.2. Choix des clusters
4.2.3. Méthode vectorielle
Il existe plusieurs approches pour déterminer les La quantification vectorielle n’est pas beaucoup
valeurs représentatives de l’ensemble des poids et ce utilisée pour quantifier les réseaux neuronaux, en effet
choix est capital car il permet de préserver la précision comme les différents blocs de données (Feature Map,
du modèle étudié. En effet, une quantification qui ne Filtres) ont des dimensions différentes d’un layer à
respecterait pas assez finement la répartition des poids l’autre il est difficile de trouver une méthode générique
des modèles ne permettrait pas de préserver la précision permettant la réduction des espaces vectoriels associés
de celui-ci. alors même qu’ils sont différents.
10 E. Sinitambirivoutin
4.3. Association des poids à des valeurs significativement. Cependant, l’étude montre, comme
représentatives illustré sur la Figure 17 qu’en combinant pruning et
quantification, il est possible d’avoir un meilleur ratio
4.3.1. Méthode par K-Means
et d’atteindre les 3% (diviser la taille par 30).
La méthode de K-Means clustering (partitionnement
en k-moyennes) consiste à associer chacun des points
d’un ensemble de N valeurs à un cluster Ci selon
un certain critère. La valeur K représente le nombre
de clusters considérés. On a généralement KN . Par
exemple étant donnés des points et k clusters, le
problème est de diviser les points en k groupes, de façon
à minimiser une certaine fonction. Si on considère la
distance d’un point à la moyenne des points de son
cluster, la fonction à minimiser est la somme des carrés
de ces distances. L’initialisation de départ à pour but
de fixer la valeur moyenne initiale de chaque cluster, FIGURE 17. Perte de précision en fonction du ratio de
l’algorithme ajuste ensuite cette moyenne en fonction compression pour le prunning, la quantification et les deux
des valeurs dans le cluster. en même temps
Cette méthode est utilisée dans [4]. Ils partition-
nement les n valeurs originales des poids W =
{w1 , w2 , ..., wn } en k clusters C = {c1 , c2 , ..., ck }, de ma- 4.4. Méthode par décomposition
nière à minimiser :
La méthode par K-Means présenté précédemment
k X
X est efficace mais nécessite beaucoup de calculs pour
2
arg min kw − ci k (4) être appliquée à une couche (ensemble des filtres qui
C i=1 w∈ci la compose) entière et plus généralement à toutes les
Les poids d’un cluster sont alors représentés par la couches du modèle. Une approche plus performante
valeur moyenne de celui ci. présentée dans [9] propose de subdiviser l’ensemble des
poids en différents sous ensemble afin d’approximer
la recherche de la meilleur valeur représentative (le
plus proche voisin obtenu avec k-Means). Nous allons
détailler comment s’applique cette méthode pour
chaque type de layer (de convolution ou non) puis
comment l’appliquer dans l’ensemble du réseau.
irréalisable du fait de l’impossibilité de pouvoir formuler dans le modèle et il est intuitif de se dire que plus ce
mathématiquement le processus de décision d’un bruit sera important, plus la précision du modèle va
réseau neuronal. Une approche plus fructueuse consiste diminuer. Afin de mieux quantifier ce phénomène il est
à mesurer l’erreur introduite par la quantification nécessaire de bien modéliser l’effet du bruit induit par
afin de la diminuer ou même de la limiter. Nous la quantification sur la précision du modèle.
allons donc nous intéresser à l’étude théorique de
la quantification à virgule fixe afin de comprendre 4.5.2. Modélisation de la propagation de l’erreur de
comment la quantification affecte la précision des quantification
valeurs puis nous verrons comment cette erreur de Comme nous l’avons vu, la quantification induit
quantification se propage dans le modèle. nécessairement une erreur car elle ne permet pas d’avoir
la même résolution sur les valeurs qu’un codage flottant.
4.5.1. Étude théorique de la quantification à virgule Cependant pour connaître le véritable impact de la
fixe quantification sur le modèle il faut pouvoir comprendre
On retrouve une étude théorique sur la quantification comment cette erreur se propage dans celui ci.
dans [10]. Elle s’intéresse à la formalisation de la Si l’on considère la multiplication entre un poids w et
quantification permettant de passer de modèles à une activation a que l’on quantifie en w a avec une
b et b
coefficients flottants à des modèles à virgule fixe. La erreur de quantification respective nw et na , on obtient
représentation en virgule fixe est un type de donnée alors :
correspondant à un nombre qui possède (en base deux
ou en base dix) un nombre fixe de chiffres après la
virgule. Les nombres en virgule fixe sont utiles pour w.b
b a = (w + nw ).(a + na )
avoir une bonne précision de calcul sans devoir utiliser = w.a + w.na + nw .a + nw .na (8)
une représentation flottante des nombre qui demande ' w.a + w.na + a.nw
plus d’octets pour être stockée.
Lorsque l’on représente un nombre flottant par une On a alors que le rapport signal bruit γw.a de ce
représentation en virgule fixe, il faut tenir compte de produit satisfait la relation :
trois paramètres interdépendants : La taille en bits
(bit-width), la résolution (step-size) et l’intervalle de 1 1 1
= + (9)
valeurs possibles. La relation entre ces paramètres est γw.a γw γa
la suivante :
Ainsi, on en déduit que l’introduction de quantifica-
tion de manière indépendante sur les poids et les acti-
Range ≈ Stepsize.2Bitwidth (6)
vations reviens à additionner leurs rapports bruit signal
La résolution est directement dépendante de la lorsqu’on en fait le produit.
distribution des valeurs que l’on doit quantifier. Il faut Par un raisonnement analogique on a que lors de
donc préalablement étudier la distribution des valeurs l’inférence dans un layer l, le calcul de l’activation
l+1 l
que l’on souhaite quantifier. wi,j aj introduit le rapport signal bruit suivant :
L’objectif finale est de déterminer le nombre de bits
fractionnels nécessaires pour coder nos valeurs ce qui
1 1 1 1 1
peut être obtenue avec le calcul suivant : = + = + (10)
γw(l+1) al γwl+1 γalj γw(l+1) γa(l)
i,j j i,j
Exemple :
La construction de l’arbre se fait en ordonnant
dans un premier temps les symboles par fréquence
d’apparition. Successivement les deux symboles de plus
FIGURE 25. Détail de la réduction du réseau AlexNet faible fréquence d’apparition sont retirés de la liste et
avec Prunning et Quantification [11]
rattachés à un nœud dont le poids vaut la somme des
fréquences des deux symboles. Le symbole de plus faible
poids est affecté à la branche 1, l’autre à la branche 0 et
d’y associer les poids qui s’en rapprochent, et la quan-
ainsi de suite en considérant chaque nœud formé comme
tification à virgule fixe avec comme représentation ter-
un nouveau symbole, jusqu’à obtenir un seul nœud
naire comme cas extrême qui repose sur la détermina-
parent appelé racine. Le code de chaque chaque symbole
tion de bons niveaux de seuils afin de séparer l’espace
correspond à la suite des codes le long du chemin allant
des poids en 3 groupes représentés par des valeurs gé-
de ce caractère à la racine. Ainsi, plus le symbole est
nériques comme {−1, 0, 1} ou spécifiques comme on l’a
"profond" dans l’arbre, plus le mot de code sera long.
vu dans [11]. Aussi, même s’il n’existe pas de relation
Soit la phrase suivante : "COMME CHARMANT E".
formelle entre le bruit induit par la quantification et la
Voici les fréquences d’apparitions des lettres :
précision du modèle après quantification, la minimisa-
tion du bruit induit par celle ci est un paramètre déter- M A C E H O N T R
minant pour garantir un bon taux de précision du mo- 3 2 2 2 2 1 1 1 1 1
dèle après quantification. L’étude de la propagation du
rapport signal bruit détaillé dans [10] permet de mieux l’arbre correspondant est détaillé dans la Figure 26 :
comprendre l’impacte de la quantification sur les dif-
férentes couches du réseaux et donc de trouver des al-
gorithmes qui minimisent au maximum ce bruit. Enfin,
l’architecture présentée dans [15] montre que lorsque
l’on conçoit des architectures adaptées à la quantifica-
tion réalisée, la phase d’inférence peut être considéra-
blement optimisée.
méthode reste sa grande sensibilité aux erreurs, en effet Le codage effectif est réalisé en remplaçant le mot
le changement d’un seul bit perturbe complètement le POMME par un nombre flottant lui correspondant.
décodage de tous les bits suivants. Pour cela, le mot va se voir affecter un intervalle compris
entre 0 et 1 où chaque valeurs comprises entre les deux
5.2. Codage Arithmétique intervalles stockera la même information, à savoir le mot
POMME.
Le codage arithmétique (comme le Codage de L’algorithme appliqué est le suivant : le mot
Huffman) est un code à longueur variable, un symbole commence avec un intervalle de [0,1[. Puis pour chaque
de taille fixe (en bits) sera codé par un nombre variable lettre croisée, on applique la formule suivante :
de bits, de préférence inférieur ou égal à sa taille — La borne inférieure (BI) du mot est modifiée
originale. On ne modifie donc pas la densité de symboles avec le résultat du calcul BI + (BS − BI) ×
mais leur codage afin de réduire l’espace qu’ils occupent. Borne_Inf rieure_Lettre
Ce qui différencie le codage arithmétique des autres — La borne supérieure (BS) du mot est modifiée
codages sources est qu’il code le message par morceaux avec le résultat du calcul BI + (BS − BI) ×
(théoriquement il peut coder un message entier de taille Borne_Suprieure_Lettre
quelconque mais dans la pratique on ne peut coder que On récapitule dans le tableau suivant les calculs :
des morceaux d’une quinzaine de symboles en moyenne)
et représente chacun de ces morceaux par un nombre n Lettre Borne Inférieur Borne Supérieur
(flottant) là où Huffman code chaque symbole par un 0.0 1.0
code précis. Le problème qui en résulte pour le codage P 0. 0.2
Huffman est qu’un caractère ayant une probabilité très O 0.04 0.08
forte d’apparition sera codé sur au moins un bit. Le M 0.056 0.072
codage arithmétique fait mieux, par exemple, si on M 0.0624 0.0688
cherche à coder un caractère représenté à 90 %, la taille E 0.06752 0.0688
optimale du code du caractère sera de 0,15 bit alors que
Huffman codera ce symbole sur au moins 1 bit, soit 6 On a alors que tout nombre flottant entre 0.06752 et
fois trop. C’est cette lacune que le codage arithmétique 0.0688 est le format compressé du mot "POMME"
comble grâce à un algorithme proche du codage par
intervalle. Décompression :
Nous allons maintenant décompresser la valeur
représentative de "POMME". Prenons par exemple la
5.2.1. Exemple :
valeur 0.068.
Pour mieux comprendre la compression arithmétique,
Le principe de la décompression est très simple. Celle-
nous allons utiliser un exemple afin de décrire les étapes
ci suit les deux étapes suivantes qui se répètent jusqu’à
du codage et du décodage. Codons le mot "POMME"
l’obtention du mot :
à l’aide du codage arithmétique.
— La prochaine lettre du mot est celle dont
l’intervalle contient le nombre du mot actuel (Ex :
Compression : 0.068 est dans l’intervalle de P donc la première
La première étape consiste à décompter chaque lettre lettre est P).
du mot. Nous avons donc 1 ‘P’, 1 ‘0’, 2 ‘M’ et 1 ‘E’. — On modifie le nombre représentant le mot à l’aide
Nous en générons alors une probabilité de présence dans du calcul ( nombre du mot – borne inférieure de
le mot soit 40% de chance de trouver un M et 20% de la lettre)/probabilité de la lettre .
chance pour les autres lettres. Enfin, on affecte à chaque (Ex : nombre du mot = 0.068−0.0 = 0.34).
0.2
lettre un intervalle entre 0 et 1 de la manière suivante : Le tableau suivant montre les différentes étapes de la
— La lettre ‘P’ a une probabilité de 20% (soit 0.2). décompression :
Son intervalle est donc [0.0, 0.2[
— La lettre ‘O’ a une probabilité de 20% (soit 0.2). Mot récupéré Lettre Nouveau code
Son intervalle est donc [0.2, 0.4[ P P 0.34
— La lettre ‘M’ à une probabilité de 40% (soit 0.4). PO O 0.7
Son intervalle est donc [0.4, 0.8[ POM M 0.75
— La lettre ‘E’ a une probabilité de 20% (soit 0.2). POMM M 0.875
Son intervalle est donc [0.8, 1[ POMME E
On obtient dès lors le tableau suivant :
Conclusion
Lettre Probabilité Intervalle
P 2/10 [0.0, 0.2[ Les méthodes de codage de poids présentées dans
O 2/10 [0.2, 0.4[ cette section permettent de réduire encore d’avantage
M 4/10 [0.4, 0.8[ l’espace nécessaire pour stocker les poids du modèle.
E 2/10 [0.8, 1[ Cependant, celles ci nécessitent de pouvoir coder
16 E. Sinitambirivoutin
et décoder les poids à la volée. Un composant devait permettre une transmission progressive de
matériel dédié est donc nécessaire afin de pouvoir l’image afin qu’elle soit reconstruite par niveaux
tirer pleinement partie de ces modes de compressions. de résolution croissant. Les premières données
Nous n’avons pas présenté d’architectures pouvant permettraient d’avoir une image partiellement
implémenter ces algorithmes de codage et décodage flou et la qualité du rendu s’améliorerait au fur
dans cette étude du fait du manque de temps mais et à mesure de la transmission. Les applications
une étude des différentes architectures possibles serait visées étaient principalement pour le domaine du
toute à fait pertinente afin de limiter l’impacte de Web.
ces opérations sur les performances du modèle. Enfin, — Permettre le codage par régions d’intérêts :
la question de la tolérance aux fautes qui n’a pas Les images ont très souvent des zones plus
été détaillée ici est tout aussi importante. Même si importantes que d’autres, nécessitant une meilleur
la compression arithmétique est plus tolérante aux résolution. La norme devait donc permettre de
erreurs que la compression de Huffman, il serait compresser ces régions avec des contraintes de
intéressant de mieux formaliser l’impact des erreurs sur qualité et de résolution supérieurs aux autres
la compression/décompression des coefficients. régions.
— Être robuste aux erreurs de bits : La
6. UNE APPROCHE À EXPLORER : norme devait garantir la robustesse aux erreurs
JPEG2000 de bits lors du codage et décodage des données
compressé. En effet des portions du code codant
Cette partie s’intéresse a la norme de compression
les données de départ peuvent être perdues ou
d’image JPEG2000 qui succède à la norme JPEG du
altérées lors de la transmission. Jpeg 2000 devait
fait de ces meilleurs performances et fonctionnalités.
donc intégrer dans sa conception un système
L’objectif ici, plus que de présenter cette norme
approprié permettant de détecter et de compenser
extrêmement performante, est d’en faire un parallèle
ces erreurs dans la mesure du possible afin de
avec notre problématique originale : la compression
ne pas trop altérer le résultat du décodage des
des modèles de réseaux de neurone pour l’embarqué.
données.
En effet, même si aucune étude ne s’est penchée sur
d’éventuelles analogies possibles entre cette norme et
la compression des réseaux de neurones, nous verrons 6.2. Fonctionnement de JPEG 2000 :
qu’elle répond à des problématiques très similaires
Le processus de codage suit un schéma classique
à celles qui nous intéressent. Nous tacherons donc
de modification des propriétés statistiques des données
d’explorer la possibilité de la mise en place d’une
source par un changement de modèle (synthèse) colori-
méthode similaire pour la compression de réseaux
métrique par une transformée, avant quantification des
neuronaux.
coefficients issus de cette transformée puis codage en-
tropique. Les nouveautés par rapport à JPEG du point
6.1. Présentation de la norme :
de vue compression sont l’utilisation d’une transformée
JPEG 2000, est une norme commune à l’ISO, la CEI en ondelettes, qui offre une scalabilité naturelle, mais
et l’UIT-T de compression d’images produite par le surtout d’un algorithme de codage entropique très so-
groupe de travail Joint Photographic Experts Group. phistiqué. Celui-ci est fortement basé sur l’algorithme
Cette norme avait pour but de formaliser et de synthé- EBCOT de David Taubman. Il consiste en un regrou-
tiser une méthode permettant de compresser des images pement et une modélisation des coefficients ondelettes
avec uu taux de compression important tout en permet- qui fournissent à un codeur arithmétique adaptatif un
tant de retrouver une bonne qualité d’image après dé- train binaire possédant les propriétés statistiques adé-
compression mais permettant également de répondre à quates.
d’autres problématiques dont celles présentées ici fai- Il s’ensuit une étape d’allocation de débit qui
saient parties : permet de respecter le débit cible, et dont le travail
— Permettre la compression sans perte et est facilité par le partitionnement du train binaire
avec perte : La norme devait permettre une formé par EBCOT. La dernière étape est la mise en
méthode de compression à la volée sans perte pour forme syntaxique du codestream JPEG 2000, avec la
des applications dans le domaine du médical par formation des paquets, puis la syntaxe haut niveau,
exemple où la perte n’est pas toujours tolérée, ou particulièrement abondante dans JPEG 2000.
avec perte pour des applications moins critiques. Dans la norme JPEG 2000 un codestream est
Elle devait cependant permettre les deux pour l’ensemble des données formées par les données images
des applications comme l’archivage par exemple compressées regroupées dans des paquets ainsi que la
où la qualité est vitale pour le stockage mais pas syntaxe de haut niveau : en-têtes de pavés, en-tête
nécessaire pour l’affichage. principal. Les métadonnées du format de fichier JP2
— Permettre une résolution dynamique grâce ne font pas partie du codestream. JP2 encapsule le
à une transmission progressive Jpeg 2000 codestream JPEG 2000 dans un format de fichier.
Compression des réseaux de neurones pour l’embarqué 17
Les réseaux de neurones ont commencé à être étudié dans les années 1950 par les neurologues Warren McCulloch
et Walter Pitts qui publièrent à la fin des années 1950 un article fondateur : What the frog’s eye tells the frog’s
brain Il posèrent le cadre théorique du neurone formel et laissaient envisager les applications de ce type de modèle
en informatique.
Avec ce type de modèle, les classifications obtenues ne sont plus le résultat de fonctions mathématiques complexe
basé sur la logique formelle mais simplement une réponse du modèle résultant des coefficients synaptiques, du seuil
de chaque neurone et la façon de les ajuster. L’adaptabilité du modèle à différentes situations est alors possible grâce
a un mécanisme permettant mécanisme permettant de les calculer et de les faire converger si possible vers une valeur
assurant une classification aussi proche que possible de l’optimale. C’est ce qu’on nomme la phase d’apprentissage
du réseau.
Avec ce type de modèle, les classifications obtenues ne sont plus le résultat de fonctions mathématiques complexe
basé sur la logique formelle mais simplement une réponse du modèle résultant des coefficients synaptiques, du seuil
de chaque neurone et la façon de les ajuster. L’adaptabilité du modèle à différentes situations est alors possible grâce
a un mécanisme permettant mécanisme permettant de les calculer et de les faire converger si possible vers une valeur
assurant une classification aussi proche que possible de l’optimale. C’est ce qu’on nomme la phase d’apprentissage
du réseau.
PERCEPTRON
En 1957, Frank Rosenblatt met en place le premier réseau de neurones à une couche capable d’apprendre. Inspiré
par les travaux du physiologiste canadien Donald Hebb, il met au point un algorithme permettant au réseau d’ajuster
ses poids en fonction de données d’apprentissage.
Compression des réseaux de neurones pour l’embarqué 19
On suppose ici qu’on dispose d’une base d’apprentissage et on souhaite déterminer les valeurs des poids synaptiques
et de seuil pour que le perceptron apprenne celle ci. On suppose que le seuil θ définit le poids synaptique w0 = −θ
d’un neurone d’entrée dont la valeur x0 est toujours égale à 1. On initialise aléatoirement la valeur de ceux-ci.
L’action du perceptron peut alors se réécrire :
p
X
f : (x1 , x2 , ..., xp ) 7→ H( wj xj ) ∈ {0, 1} (12)
j=0
Ensuite, pour chaque exemple (x1 , ..., xp ) de la base d’apprentissage, la réponse fournie et la réponse attendue
sont comparé. Si elles sont égales, les poids synaptiques ne sont pas modifiés. En revanche si la réponse fournie est
0 alors que celle attendue est 1, on ajoute 1 aux poids synaptiques des neurones d’entrée activés : ceci a pour effet
d’accroître leur influence. A contrario, si la réponse fournie est 1 alors que celle attendue est 0, on retire 1 aux poids
synaptiques des neurones d’entrée activés. L’algorithme d’apprentissage se poursuit jusqu’à ce que tous les éléments
de la base d’apprentissage soient étudiés sans qu’aucun poids synaptiques ne soient modifiés. Cependant, ce réseau
sera très vite abandonné du fait de ces limitations. En effet, ce modèle ne fonctionne que si la base d’apprentissage
est séparable linéairement.
PERCEPTRON MULTICOUCHE
Une nouvelle génération de réseaux de neurones capables de traiter avec succès des phénomènes non linéaires
apparaît en 1986. Introduit par David Rumelhart et par Yan LeCun, ces systèmes reposent sur la rétro propagation
du gradient de l’erreur dans des systèmes à plusieurs couches.
Au lieu de calculer la valeur effective du gradient, on calcul ses dérivés partiels par rapport à chaque valeurs, la
fonction f à chaque nœud est facile à différencier, on connaît donc se résultat de manière triviale.
20 E. Sinitambirivoutin
Couches de convolution
La couche de convolution est basée sur la même analogie que les couches neuronales classiques, à la seule différence
que plutôt que de prendre toute l’image en entrée, les neurones ne vont être connecté qu’à une zone spécifique de
l’image d’entrée. De même un neurone va être connecté aux différents canaux de l’image. Une couche de convolution
est ensuite constituée d’un ensemble de neurones ayant pour entrée une zone spécifique de l’image, une zone est
parfois connectée à plusieurs neurones.
22 E. Sinitambirivoutin
Une des particularités qui rendent ses réseaux si performants vient du fait que l’on considère que plusieurs neurones
partagent les même poids. En effet, étant donné qu’on observe une image, il paraît raisonnable de considérer que
si l’on regarde une caractéristique de l’image à une position (x0,y0), il est intéressant de regarder cette même
caractéristique à une position (x1,y1) et plus généralement sur toute l’image. Partant de cette hypothèse on peut
considérer l’ensemble des poids des neurones d’une certaine couche non plus comme des poids synaptiques mais
comme des filtres qui vont parcourir l’image.
Implémentation algorithmique
La convolution est en faite implémentée comme
une multiplication matricielle. La matrice contenant
les donnée de l’image d’entrée est composée des
valeurs de celle-ci ré agencées de manière à simplifier
le calcul de la convolution. De manière analogue,
la matrice contenant les filtres est composé des
coefficients des filtres agencés de manière spécifique.
Les blocs de taille 3x3 qui devaient être convolués
avec les filtres sont directement recopiés en ligne
dans la matrice (Pour une image d’entrée à trois
dimension, les vecteurs de chacune des 3 dimensions
sont concaténés pour formé la ligne). Les filtres
3x3 sont quand à eux recopié dans une colonne de
la matrice représentative des filtres. Ainsi, lorsque
l’on effectue une multiplication matricielle entre ces
deux matrices, on multiplie une ligne de la matrice
contenant les données d’entrées et une colonne de la matrice contenant les filtres ce qui revient à faire une convolution
entre le filtre considéré et la zone de l’image associée à cette ligne. Le résultat finale est le résultat de la convolution
de toute l’image par chacun des filtres.
Couches de pooling
Cette couche a pour but de réduire la taille des feature map (activation résultant du passage par une couche
de convolution). Elle permet non seulement de diminuer le nombre de paramètre des couches suivantes mais aussi
d’éviter le surapprentissage. Cette couche dépends de deux paramètres : La taille du pooling et le pas du pooling.
Il peut être implémenté à l’aide de différentes fonctions :
— Max Pooling : On prend le maximum des valeurs de la zone de pooling (comme dans la figure d’exemple).
— Average Pooling : On prend la moyenne des valeurs.
— L2-Norme Pooling : On prend la norme L2 des valeurs.
Couche ReLU
La couche de ReLU permet d’appliquer une fonction non linéaire en sortie de la couche. Sans cette couches
de séparation, les différentes couches de convolution ne serraient pas distinctes, elles serraient simplement une
combinaison linéaire de convolution et donc formeraient de manière formelle une seule et même couche.
Compression des réseaux de neurones pour l’embarqué 23