Nothing Special   »   [go: up one dir, main page]

Rapport de Projet de Fin D'étude 27

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 23

Compression des réseaux de neurones

pour l’embarqué
Emrick Sinitambirivoutin

Rapport pour le module IRL, ENSIMAG/PHELMA filière SEOC


Encadré par Stéphane MANCINI
Email: emrick.sinitambirivoutin@grenoble-inp.org
stephane.mancini@univ-grenoble-alpes.fr

Les algorithmes de Deep Learning, basés sur l’implémentation de réseaux


de neurones convolutifs, sont de plus en plus utilisés dans les applications
d’Intelligence Artificielle et plus particulièrement dans le domaine de la
reconnaissance d’image (classification d’images, détection d’objets, segmentation).
Ces algorithmes apprennent à partir d’un échantillon de données d’apprentissage
un ensemble de coefficients qui permettent de définir un modèle capable de réaliser
une tache de classification bien précise. Les modèles les plus récents se composent
de plusieurs millions de poids rendant leur transfert de la mémoire vers les unités
de calcul une étape critique de leur implémentation et ce particulièrement dans
le domaine de l’embarqué où les ressources sont limitées. Le but de cette étude
sera d’explorer les méthodes permettant de réduire la taille de ces modèles et
d’optimiser leur exécution afin qu’ils puissent être implémentés sur des cibles
embarquées. Nous nous focaliserons sur la compression de modèles dont les poids
sont déjà appris lors d’une phase d’apprentissage préalable.

Keywords: Intelligence Artificielle ; Deep Learning ; Réseaux de neurones ; Convolutional


Neural Network (CNN) ; Systèmes Embarqués ; Compression/Décompression.

1. INTRODUCTION a réalisé des résultats décisifs dans le défi ImageNet


2015 utilisait un réseau contenant 60 millions de
L’apprentissage profond, plus fréquemment désigné paramètres et était composé de 152 couches. Cette
par l’expression Deep Learning est une branche du nécessité en puissance de calcul et en stockage pose
Machine Learning qui rassemble un ensemble de aujourd’hui un problème majeur dans le développement
modèles d’apprentissage s’inspirant du système cognitif des applications faisant usage de ces techniques. En
humain. Ces modèles reposent sur des réseaux de effet, afin d’exploiter pleinement les potentialités de
neurones qui sont capable d’extraire des représentations celles-ci dans des applications aussi diverses que la
abstraites des données et de les discriminer selon réalité augmentée, les réseaux de capteurs intelligents
certains critères établis lors de la phase d’apprentissage. ou encore la robotique, il est nécessaire d’être capable
Développées dans les années 1980, ces méthodes ont de déployer ces algorithmes sur des appareils portables
longtemps été négligées, mais grâce à l’amélioration de disposant de ressources limitées. Ces appareils ne
la puissance de calcul des ordinateurs, à l’apparition disposent souvent pas de beaucoup de mémoire et
de nouvelles bases de données plus riches, et à de ont une consommation qui doit rester limitée. Les
grands progrès dans les méthodes d’optimisation, ces accès mémoire nécessaires pour la phase d’apprentissage
techniques sont revenues au goût du jour et permettent ou d’inférence de gros réseaux sont très coûteux en
aujourd’hui d’obtenir des performances sans précédents temps et en énergie. Pouvoir stocker les modèles à
dans des domaine comme la reconnaissance d’image proximité des unités de calcul permettrait des gains non
[1] ou la reconnaissance vocale [2]. Cependant, ces négligeables en terme de performance, mais pour cela il
gains obtenus grâce à une augmentation croissante de faut pouvoir rendre les modèles assez légers pour tenir
la complexité des réseaux s’est fait au dépend des en cache et les optimiser pour limiter les accès mémoire.
performances de calcul et de consommation d’énergie Pour ce faire, de nouvelles techniques sont développées
nécessaires à leur implémentation. En effet, les travaux afin de compresser ces réseaux et ce en perdant le
réalisés dans ce domaine s’appuient sur des réseaux minimum de précision possible [4]. Il s’agira dans cette
profonds avec des millions ou même des milliards étude de détailler les méthodes existantes, de comparer
de paramètres, et la disponibilité de GPU avec des leurs avantages, leurs inconvénients et de les combiner
capacités de calcul très élevées joue un rôle clé dans dans la mesure du possible afin d’obtenir le meilleur
leur succès. Par exemple, le modèle ResNet [3] qui
2 E. 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.

FIGURE 1. Schéma Architecture de Von Neumann

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.

2.3. Contraintes mémoire

Lorsque l’on parle de mémoire, deux paramètres


importants sont à prendre en compte : La capacité et
le temps d’accès aux données de celle ci. La capacité
est la quantité d’information que pourra stocker notre
système. Elle est directement reliée à la surface que l’on
pourra lui consacrer sur le circuit. Plus on veut de la
mémoire, plus on a besoin d’espace et donc plus le coût FIGURE 4. Accès mémoires pour une opération
est important. Le temps d’accès aux données quand à lui élémentaire
caractérise le temps qu’il faut au processeur pour aller
chercher une donnée à une adresse précise en mémoire Il faut donc pouvoir avoir accès aux coefficients de
et la placer dans un des registres du processeur en vue la feature map d’entrée (tous les canaux :N × h ×
d’effectuer une opération. Ces deux paramètres sont w), aux poids des filtres (tous les canaux :N × l ×
déterminants pour les performances et dépendent du l) et de disposer de variables de stockage pour les
champ d’application du système embarqué considéré. accumulations. Dans l’exemple présenté Figure 5 si l’on
Mais l’optimisation de l’un d’entre eux doit souvent se considère les paramètres nécessaires pour le calcul de
faire aux dépends de l’autre. convolution de la seconde couche on a :
Afin de palier ce problème, les processeurs ont un N = 32
cache organisé en hiérarchie. L’objectif d’une telle h = w = 28
structuration est d’optimiser les accès mémoire en l=3
disposant des zones mémoires de faibles capacités mais Ce qui donne donc :
à accès rapides à proximité des unités de calcul et des — Paramètres feature map = 32 × 28 × 28 = 25088.
mémoires à grandes capacités avec des temps d’accès — Paramètres du filtre = 3 × 3 × 32 = 288.
plus long plus loin de ces unités avec des technologies Soit déjà plus de 100 Ko pour le calcul d’une
moins rapides et moins coûteuses. convolution d’un seul filtre.
Dans l’état actuel des choses il est donc nécessaire
d’effectuer des allers/retours en mémoire afin de
récupérer les coefficients nécessaires aux calculs alors
même que les coefficients retournés en mémoire sont
parfois à nouveaux nécessaire lors des itérations
suivantes. Il est donc indispensable de réduire la taille
des réseaux en supprimant des filtres ou certains poids
de ceux ci afin d’avoir une gestion plus efficace de ces
coefficients en mémoire.

2.4. Contraintes énergétiques


La consommation d’un système embarqué est
également l’un des critère clé qu’il faut prendre en
FIGURE 3. Hiérachie mémoire d’un SoC compte lors du design de l’architecture. En effet, les
systèmes embarqués sont très souvent alimentés par des
Grâce à cette architecture et à des optimisations batteries et la ressource en énergie n’est pas illimitée. Si
logicielles, ont est capable de s’arranger pour que les le processeur consomme trop, le temps d’utilisation du
données en cours de traitement soient stockées en cache, dispositif va diminuer et cela va affecter l’utilisateur.
au plus proche des UAL (banc de registres ou SRAM), Il se trouve que ce sont justement les accès mémoire
et qu’elles soient chargées dynamiquement au cours de qui s’avèrent être les opérations les plus gourmandes en
l’exécution du programme [5]. Une des problématiques énergie.
d’implémentation des réseaux de neurones vient du Comme nous l’avons vu dans la section précédente,
fait que le nombre de coefficients à stocker est si les modèles utilisés en Deep learning sont si gros
important qu’il est impossible de stocker toutes les qu’ils nécessitent énormément d’accès mémoire.Par
données nécessaires lors de l’exécution d’un calcul exemple, dans AlexNet, afin d’exécuter les 724 millions
(Convolution entre un filtre et une Feature Map d’entrée d’opération MAC, près de 3000 millions d’accès DRAM
par exemple). En effet pour une opération élémentaire sont nécessaires. Or ces accès sont 200 fois plus coûteux
(MAC) nécessaire au calcul d’une convolution, quatre qu’une opération elle même.
4 E. Sinitambirivoutin

FIGURE 6. Comparaison du coût énergétique de


différents accès mémoire

de paramètres doivent donc réussir à supprimer le


maximum de poids sans trop influer sur la précision
des modèles.

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.

3.3.1. Méthode de détermination des poids à enlever :


Cette méthode consiste à utiliser N Filtres particu-
laires. Un filtre particulaire est un masque qui lorsqu’il
est multiplié avec la matrice des poids d’un layer (la
matrice d’un Layer est la matrice contenant tous les co-
efficients de ces filtres agencés de manière à réaliser une
convolution comme une multiplication matricielle. Voir
Section : méthode de stockage des poids) va supprimer
FIGURE 7. Différents niveaux de granularité de pruinning certains d’entre eux et en conserver d’autres.
Chaque particule (masque intermédiaire) xik du filtre
i
Les méthodes de prunning peuvent être séparées en x va être actualisée par la fonction de transition f qui
deux catégories : va perturber la particule de l’itération précédente. Cette
— Le prunning non structuré : Cette méthode perturbation respecte certaines propriétés en fonction
consiste à supprimer les poids sans géométrie du niveau de granularité choisi pour le prunning. On
spécifique et sans contrainte. Elle a l’avantage ajoute ensuite du bruit µ à chaque itération.
d’être plus simple à mettre en place mais elle ne
permet pas de tirer partie de la présence de zéros xik = f (xik−1 ) + µik (1)
dans les matrices de poids une fois le prunning
réalisé. Cette spécificité doit être compensée par zki = h(xik ) + vki (2)
une méthode de stockage de la matrice de poids
La pertinence de la particule xik est évaluée au cours
permettant de ne pas stocker inutilement ces
du temps par une variable d’observation zki . Celle ci
poids nuls pour avoir des gains en calcul. Elle est
évalue sa pertinence en calculant la précision du modèle
appliquée après la phase d’apprentissage.
h(xik ) obtenue avec le pruning réalisé par ce masque.
— Le prunning structuré : Cette méthode
Cette précision est calculée en comparant les résultats
consiste à supprimer les paramètres (et donc
de la classification obtenue avec ce modèle élagué par
à placer des zéros) à des endroits bien précis
rapport aux résultats attendus (vrais labels).
dans la matrice de poids. Cet espacement régulier
A la fin des itérations, chaque particule est
des zéros permet alors de modifier la structure
assignée d’une probabilité résultant de son taux de
de la matrice de poids et donc d’optimiser
reconnaissance obtenu avec l’équation (2). A partir de
l’utilisation de la mémoire et de réduire le nombre
cette distribution de probabilités, un filtre peut être
d’opérations à effectuer. Elle est appliquée après
construit en tenant compte de l’importance de chaque
la phase d’apprentissage.
particules et in fine en fonction de l’importance de
Dans tous les cas, le paramètre déterminant pour
chaque poids du layer.
pouvoir réduire la taille du réseau et gagner en
Le layer est ensuite élagué en utilisant le filtre
performance tout en gardant une bonne précision du
(masque) obtenu.
modèle est la façon dont on détermine les poids à retirer.
Pour ce faire, plusieurs méthodes ont été étudiées
au cours des dernières années, mais nous allons en 3.3.2. Stockage des poids et multiplication matricielle :
présenter deux qui à ce jour semblent être les plus Afin de gagner en performance, les poids sont stockés
prometteuses du fait de leur taux de compression et de manière à implémenter la convolution comme une
de leur faible effet sur la précision des modèles. simple multiplication matricielle.
La Figure 8 illustre le passage de la convolution à
la multiplication matricielle. Les entrées sont recopiées
3.3. Le prunning structuré par filtres particu-
dans la matrice « de convolution par multiplication »
laires
de telle manière que chaque ligne corresponde à une
Cette méthode présentée dans cet article [6] s’inscrit étape de la convolution (la méthode de passage de la
dans les approches dites de prunning structuré. Elle convolution à la multiplication matricielle est détaillée
peut s’appliquer à différents niveaux de granularité dans l’annexe B). Il est intéressant de remarquer que
6 E. Sinitambirivoutin

du taux de réduction du modèle initial.

3.4. Le prunning par apprentissage


Une méthode de prunning « automatisée » est
proposée dans [7]. Leur méthode s’appuie sur la
suppression de filtres par un réseau de neurones qui
prend comme entrée l’ensemble des filtres et qui est
capable de renvoyer en sortie uniquement les filtres les
plus utiles. Dans sa phase d’apprentissage, ce réseau
de neurones apprend les filtres les moins pertinents du
réseau qu’il doit évaluer, en utilisant les données de
tests. Il commence par supprimer naïvement des filtres,
teste la précision du modèle obtenu avec les données de
FIGURE 8. Convolution par multiplication matricielle
tests puis recommence afin de maximiser la précision du
post-pruning
modèle qu’il élague. L’apprentissage s’arrête quand le
taux de précision désiré est atteint. le réseau de neurone
toutes les entrées ne sont pas recopiées dans la matrice. ainsi obtenu est alors capable de supprimer les filtres
En effet, celles qui sont associées à un coefficient qui a non pertinents lors de sa phase d’inférence avec un taux
été supprimé dans le kernel par le prunning (marqué en d’erreur inférieur à celui spécifié.
rouge dans les kernels) ne sont pas recopiées. De même, L’avantage principal de la méthode proposée est
dans la matrice de kernel, seul les poids non supprimés qu’elle est capable de déterminer les filtres à supprimer
sont copiés. de manière efficiente. En effet, pour un layer composé
de 64 filtres, une approche exhaustive nécessiterait
d’étudier 264 possibilité de suppression. Les résultats de
Résultats
leur étude montre que grâce à l’utilisation d’un réseau
neuronal, leur algorithme convergeait vers une solution
optimale bien plus rapidement (200 itérations pour le
prunning de VGG-16 sur CIFAR 10).

3.4.1.Architecture du réseau de neurones de prun-


ning :
— • Si Ml (T ailledesf iltresdulayer) > 24 : Le
réseau est composé de 4 couches de convolutions
entrecoupées de couches de pooling et suivie de
deux couches complètement connectées
— • Si Ml (T ailledesf iltresdulayer) <= 24 : Le
réseau est composé de 2 couches de neurones
complètement connectées.

FIGURE 9. Résultats (Ratio taux d’élagage en fonction 3.4.2. Méthode d’apprentissage :


de la Précision) pour différents niveaux de granularité La méthode d’apprentissage de l’algorithme se
déroule en 2 phases. La première consiste à entraîner
Les résultats de cette publication [6] montrent que le réseau à sélectionner les bons filtres à retirer. Pour ce
le réseau (ici un réseau 3-32-32-32-32-64-10) peut être faire, des filtres sont choisis arbitrairement au début,
réduit de près de 75% en se limitant à une perte de le réseau est élagué en respectant ces choix et la
précision de moins de 1% avec un prunning fait d’abord précision du réseau résultant est évaluée en le testant
sur les filtres puis en Intra kernel. Ces tests ont été sur des données de tests. Lors de la rétro propagation,
réalisés sur la base de donnée CIFAR-10 et MNIST. Elle les gradients sont calculés de manière à minimiser le
met aussi en évidence le fait qu’envisager un prunning taux d’erreur induit par le pruning. Après plusieurs
uniquement pour les filtres entraînerait une trop grosse itérations, le réseau est capable de détecter les filtres
perte en précision du fait de son caractère agressif sur n’affectant pas la précision du modèle, et une fois cette
le modèle avec la méthode employée. Il convient donc phase d’apprentissage terminé, le réseau entraîné prune
de bien fixer le taux de prunning des filtres pour ne pas le layer considéré.
trop perdre en précision. Un des aspects qui n’est pas
détaillé dans cette étude sont les coûts de calculs induit Pour 1 Layer
par la méthode de sélection des poids à supprimer et la L’algorithme présenté ci-dessous implémente la
façon dont le taux de précision est contrôlé en fonction méthode présentée précédemment.
Compression des réseaux de neurones pour l’embarqué 7

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].

FIGURE 11. Taux de prunning et précision après


prunning pour les différents layers (Effectués de manière
indépendante)

Pour tout le réseau


On applique l’algorithme précédent pour chaque
couches mais après chaque élagage, on ré entraîne tout
le réseau jusqu’à avoir un taux d’erreur inférieur à celui
spécifié. Une fois ce taux d’erreur atteint, on passe au
pruning du layer suivant.
On remarque ici que chaque agent de prunning est
caractérisé par ces paramètres θi qui sont appris pour
chaque layer par l’algorithme présenté dans la Figure
10.
L’un des défaut de cet algorithme est qu’il utilise les
mêmes données Xtrain lors de l’apprentissage de l’agent
de prunning et lors de l’affinement (fine tune) de fb ce
qui n’est pas optimal pour la généralisation du modèle.

FIGURE 10. Algorithme de prunning d’un layer

Un tour de boucle W hile représente une itération


de la phase d’apprentissage. La première boucle F or
permet de générer M décisions avec le réseau de pruning
π l . A chaque tour de boucle on prune f avec π l et on
obtient fb. Ensuite fb est entraîné un peu à nouveau puis
on calcul un Reward R(Ali ) associé à cette action de
pruning Ali . On stocke tous les Rewards et les décisions
au cours des M itérations. Cette suite d’opérations
est effectuée M fois de manière à avoir un résultat
statistique et pas juste un résultat isolé. La deuxième FIGURE 12. Algorithme de prunning pour tout le layer
8 E. Sinitambirivoutin

a son importance est la complexité des algorithmes de


prunning mis en place (temps de calcul, coût en énergie,
..)

4. LA DIMINUTION DES VALEURS POS-


SIBLES DES POIDS
Une autre approche pour pouvoir diminuer la taille
des modèles est de réduire l’ensemble des valeurs
possibles des poids et de partager ces valeurs entre
poids. En effet si on partage les valeurs entre poids et
que le nombre de valeurs possibles est réduit, on peut
diminuer l’espace mémoire nécessaire au stockage des
valeurs et éviter de stocker de manière redondante la
même information. Plutôt que de stocker la valeur d’un
poids à son adresse, on va stocker l’adresse de l’endroit
où est stocké sa valeur. On met donc en place un
FIGURE 13. Taux de prunning selon les différents layers dictionnaire qui va regrouper toutes la valeurs possibles
(Effectués de manière interdépendante) et associer à chaque valeur une adresse. Cette adresse
est choisie de manière à être beaucoup plus petite en
3.4.3. Résultats terme d’espace mémoire que la valeur elle même. Par
Les tests de ces algorithmes ont été réalisés sur 4 exemple, si notre modèle à des poids codés sur 8 bits,
réseaux différents (2 pour de la reconnaissance : VGG- 256 valeurs de poids sont possibles et que l’on réduit
16 et ResNet-18 et 2 pour de la segmentation : FCN- l’ensemble de valeurs possibles a 30 valeurs, on pourra
32s et SegNet). Pour pouvoir comparer les résultats alors faire un dictionnaire avec 30 entrée où chaque
obtenus avec les résultats des autres travaux présentés, entrée va être associé à une valeur sur 8 bits. L’adresse
nous ne détaillerons ici que les résultats obtenus pour le de chaque valeur pourra donc être codée sur 5 bits. Si on
réseau VGG-16 testé sur la base d’image CIFAR-10. On avait 1000 poids au total, le passage de valeurs réelles
constate dans les résultats présentés ci dessous, Figure des poids à des valeurs d’adresses du dictionnaire va
14 que le prunning effectué sur VGG-16 permet une nous faire passer de 8000 bits à stocker à 5000+30∗8 bits
diminution significative de l’occupation mémoire et un à stocker soit un gain de mémoire de 35%. De manière
gain en performance de calcul le tout avec une perte plus générale pour n valeurs codées sur b bits, si on
de précision en dessous des limites fixées par la variable établie une quantifications avec k clusters le gain de
b. Ces résultats sont comparés avec ceux d’une autre mémoire sera de :
étude [8] portant sur le prunning ici nommé ICLR.
n log2 (k) + kb
G=1− (3)
nb

4.1. Quantification et partage de poids


La quantification est le procédé qui consiste à
exprimer les poids, les activations ou les termes
FIGURE 14. Résultats obtenus pour différentes
de biais dans un sous ensemble réduit de valeurs,
contraintes de précision (b) en terme de compression, du
nombre d’opérations et d’accélération
valeurs qui, comme ont l’a vu précédemment, sont
choisies de manière à être codées sur moins de bits
possibles afin de réduire l’occupation mémoire. La
quantification a fait l’objet de nombreuses études [9,
Conclusion
10, 11, 12, 13] car elle découle d’une idée intuitive
Les deux études présentées montrent que le prunning qui est souvent utilisée en traitement du signal.
peut permettre de réduire significativement la taille des Plusieurs approches ont été faites : la quantification
réseaux compressés et par la même occasion réduire par simple réduction de l’ensemble de valeurs, la
le nombre de calculs nécessaires lors de l’inférence. La quantification de valeurs flottantes en valeurs entières,
première méthode proposée, bien que très performante, la quantification en valeurs entières ou de manière
est difficile à mettre en place et nécessite une étude plus radicale, la quantification binaire ou ternaire.
fine des résultats pour trouver un compromis entre Tous ces cas présentent cependant des problématiques
la précision et le taux de compression. La deuxième communes, à savoir, comment déterminer les valeurs du
méthode quand à elle est plus performante et permet sous ensemble considéré afin de minimiser le bruit induit
une automatisation complète du processus de prunning. par l’approximation des valeurs initiales et comment
Un sujet qui n’est pas détaillé dans ces études mais qui associer ces valeurs aux valeurs initiales.
Compression des réseaux de neurones pour l’embarqué 9

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.

4.4.1. Pour une couche "fully connected" :


Soit W ∈ RCs ×Ct , avec Cs et Ct les dimensions
respectives de l’entrée et de la sortie du Layer (couche
du réseau). Le vecteur de poids Wct est le ct -ième
vecteur colonne de W . On décide de subdiviser l’espace
0
Cs en M sous-espaces, chacun de dimension Cs =
Cs /M . Chacune des colonnes de W sont ainsi découpées
(m)
en M sous-vecteurs, notés Wct . Un sous-dictionnaire
FIGURE 16. Répartition des valeurs représentatives des
peut être appris pour chaque sous-espace après avoir
clusters à l’initialisation et à la fin du clustering
rassemblé tous les sous vecteurs de celui ci. On
(m)
représente ensuite chaque sous-vecteur Wct par une
La figure 16 montre la valeur représentative finale des
valeur de ce dictionnaire. De manière formelle, pour le
clusters pour une initialisation linéaire. On voit que ces
m-ième sous espace on optimise :
valeurs reflètent bien la répartition initiale des poids.
2
(m) (m)
min B − W (m)

Résultats D (m) ,B (m)
D
F (5)
Les résultats de cette étude montrent que le réseau 0
(m) Cs ×K (m) K×Ct
peut être quantifié avec un ratio de compression D ∈R ,B ∈ {0, 1}
(Nombre de bit du modèle quantifié/ Nombre de bits 0
du modèle initiale) de près de 8% (le nombre de bits où W (m) ∈ RCs ×K représente le m-ième sous-vecteur
du modèle compressé représente 8% du nombre de de tous les vecteurs de poids. Le sous-dictionnaire D(m)
bits initial, soit une division par 10 de la taille du contient ses K représentants et chaque colonne de B (m)
modèle). Cependant, il est difficile de faire mieux avec est un vecteur indiquant quel représentant est utilisé
cette méthode car après le taux d’erreur augmente pour quantifier le sous-vecteur correspondant. Cette
Compression des réseaux de neurones pour l’embarqué 11

optimisation est réalisée par la méthode des K-Means, Résultat


mais étant donné qu’on ne s’intéresse qu’a un sous- Cette méthode permet donc à la fois de diminuer
espace des valeurs et pas à l’espace de toutes les valeurs, l’espace mémoire nécessaire pour stocker les poids
l’algorithme de K-Means est plus performant. Le choix (on détermine un représentant pour un sous vecteur,
de la manière de construire ces sous-espaces n’est pas donc tous les poids de ce sous vecteurs ont la même
anodin. En effet, en plus d’effectuer une quantification, valeur. Ainsi au lieu de stocker cette valeur on stocke
la méthode proposée dans [9] permet grâce à ce simplement son indice dans le dictionnaire contenant
découpage de pré-calculer les produits entre les valeurs toutes les valeurs représentatives du sous espace) et de
représentatives du sous-espace des coefficients et les réduire la complexité de calcul.
valeurs des sous-vecteurs de la feature map d’entrée. Les résultats théoriques en terme de complexité
Ainsi au lieu d’effectuer Cs × Ct opérations on en de calcul et en stockage des couches de convolution
effectue Cs × K + Ct × M . Plus de détails sur cette et des couches traditionnelles sont présentés dans le
méthode seront donnés lors de la présentation de la tableau récapitulatif de la Figure 19. Ces résultats
soutenance. La Figue 18 illustre cette méthode. permettent de comparer les performances théoriques
entre un modèle avant et après quantification.

FIGURE 19. Comparaison du nombre de calcul et de


l’utilisation mémoire des couches de convolutions et des
couches traditionnelles d’un CNN et d’un Q-CNN

Le paramètre important, à savoir M (le nombre


de sous espaces) et K (le nombre de clusters des
sous espaces), sont les paramètres de quantification.
FIGURE 18. Détails de la méthode de pré calcul des Ces résultats théoriques mettent en évidence qu’une
multiplications pour la convolution quantification fine ne pourra se faire qu’au dépend de
l’optimisation des calculs et du stockage. Il est donc
important de connaître l’influence de la quantification
La Figue 18 illustre cette méthode. Les multiplica-
sur la précision du modèle. Des résultats quantitatifs de
tions entre les sous vecteurs de la feature map d’entrées
l’optimisation obtenue par cette méthode sont présentés
et chaque valeur représentatives des sous-dictionnaires
dans le tableau de la Figure 20. On y voit un gain
obtenus lors de la quantification des coefficients sont cal-
significatif en terme de temps de calcul, d’occupation
culées et enregistrées une bonne fois pour toute. Ainsi,
mémoire tout en gardant un taux d’erreur acceptable.
lors du calcul des activations, une simple addition est
nécessaire plutôt que de devoir calculer la multiplication
entre chaque valeurs représentatives des sous vecteurs
de la matrice des coefficients et chaque entrées de la
feature map.

FIGURE 20. Comparaison entre le temps, le stockage, la


4.4.2. Pour un layer de convolution : consommation mémoire et le top5 taux d’erreurs entre les
On applique la même méthode pour les couches de originaux et quantifiés AlexNet et CNN-S
convolution. Cependant celle-ci doit être adaptée car la
matrice de poids n’est plus de dimension 1. En effet,
chaque filtre à trois dimensions : W ∈ Rdk ×dk ×Cs . Il
4.5. Minimisation de l’erreur lors de la
faut donc déterminer une nouvelle façon de subdiviser
quantification à virgule fixe
les poids. Cette méthode est détaillée dans [9]. Là
encore, cette méthode permet de réduire l’occupation Essayer d’établir une relation entre le niveau de
mémoire mais également de réduire le nombre de calculs quantification et l’impacte que celle ci a sur la précision
nécessaires lors de la convolution. du modèle est tentant, pourtant cette démarche est
12 E. Sinitambirivoutin

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

n = −dlog2 (σ × Stepsize(β))e (7)


et finalement dans tout le réseau, si on considère L
Où Stepsize(β) désigne la résolution optimale layers :
pour une résolution donnée correspondent à une
quantification de taille binaire β comme indiqué dans
la figure 21. 1 1 1 1 1 1
= + + +...+ + (11)
γoutput γa(0) γw(1) γa(1) γw(L) γa(L)

Cette étude théorique de l’erreur introduite par la


quantification permet de mettre en évidence de façon
formelle les points suivants :
— La finesse de la quantification impacte
directement l’erreur de quantification : En
effet le nombre de bits utilisés pour coder les
FIGURE 21. Tableau récapitulatifs des résolutions valeurs de quantification étant relié à l’erreur
optimales en fonction des distributions (cf [14] ) introduite par celle ci, il y a donc un impacte
direct de la précision de la quantification sur
Cette quantification aura pour effet de crée du bruit l’erreur.
Compression des réseaux de neurones pour l’embarqué 13

— La quantification de chaque layer contribue vitesse de traitement, de consommation énergétique et


de manière égale à l’erreur de quantifica- de taux d’erreur avec d’autres études [16, 17, 18, 19]
tion globale : Ce résultat est très intéressant est détaillé dans la Figure 23. Ces tests ont été réalisés
car il permet de justifier le fait que la quantifica- sur les données CIFAR10, GT-SRB et SVHN. On
tion peut être faite de manière indépendante dans constate que l’architecture proposé dans [15] est plus
chaque layer et de ce fait permet une quantifica- performante et permet d’avoir un taux d’erreur plus
tion plus précise par rapport à chacun des layers. faible dans son architecture 128 couches.
— La performance du réseau est dominée par
la pire quantification parmi tous les layers :
Ceci découle du fait que l’erreur totale est une
moyenne harmonique de toutes les erreurs des
layers.
— Les fonctions d’activations ont peut d’effet sur
l’erreur.

4.6. Quantification Ternaire


FIGURE 23. Comparaison avec des travaux similaires
La quantification ternaire est un cas de quantification
à virgule fixe poussé à son extrême. Les tentatives Une autre méthode de quantification ternaire plus
de quantifier les poids du réseau en valeur binaire efficace est proposée dans [11]. Plutôt que de quantifier
dégradant trop la précision du réseau, les études ce sont les poids dans {−1, 0, 1} ou dans {−E, 0, E} avec E
plutôt porté sur la quantification ternaire qui permet la moyenne des valeurs absolue des poids, les valeurs
d’avoir des taux d’erreur plus faibles. Ces méthode choisies pour la quantification sont spécifiques à chaque
consistent a fixer des seuils qui vont déterminer si le layer du réseau et les poids d’une couche sont quantifiés
poids considéré doit être codé par −1, 0 ou 1. Cette dans {−Wlp , 0, Wlp } où Wlp et Wlp sont des coefficients
opération est nécessaire non seulement lors du codage flottants appris dans chaque couches. Ces poids sont
des poids mais également lors du calcul de chaque appris durant la phase d’apprentissage du réseau avec
activation puisque ceux ci s’effectuent avec les valeurs une fonction de coût spécifique puis sont utilisés pour
d’entrée qui elles ne sont pas quantifiées de manière la quantification lors de l’inférence.
ternaire. Les résultats obtenus sur les données CIFAR-10 sont
On retrouve dans [15] une étude de ce type récapitulés dans le tableau de la figure 24. On y vois un
de quantification et le design d’une architecture sensible gain en performance pour les modèles de 32.44
hardware spécifique permettant d’optimiser au mieux et 56 couches.
les opérations ternaires nécessaires lors de la phase
d’inférence.

FIGURE 24. Comparaison de la quantification de [11]


avec un modèle équivalent non quantifié

Le taux de compression obtenu sur le réseau AlexNet


FIGURE 22. Implémentation d’un neurone (multiplica-
est détaillé dans le tableau de la Figure 25. Un prunning
teur accumulateur) à été réalisé au préalable pour réduire encore plus la
taille du modèle.
L’implémentation d’un neurone est représenté Figure
Conclusion
22. On remarque en particulier que le calcul du
produit entre l’activation précédente et le poids n’est Les différentes études présentées montrent la perti-
pas recalculé à chaque fois mais simplement récupéré nence de la quantification comme méthode de réduction
dans un dictionnaire qui contient déjà toutes les de la taille des modèles. On constate qu’elle nécessite
valeurs possible pour ce produit (comme la donnée cependant une analyse fine de la répartition des poids
qui arrive est quantifiée et le poids aussi on n’a que du modèle et donc qu’elle implique une phase de traite-
3! = 6 possibilités). Afin d’optimiser encore plus cette ment pré quantification importante afin de quantifier au
architecture celle ci à été conçue afin d’inclure un mieux le modèle. On distingue deux grandes approches :
maximum de parallélisme lors des convolutions. La quantification par clusters, qui vise à trouver les va-
Une comparaison entre les performances en terme de leurs les plus pertinentes de l’ensemble des valeurs et
14 E. Sinitambirivoutin

dans un fichier soit minimale.


Pour calculer le code d’un alphabet et de sa
distribution, on construit un arbre binaire étiqueté par
des 0 et des 1, les feuilles de cet arbre représentant
les caractères tandis que les chemins issus de la racine
constituent les codes correspondants.

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.

5. CODAGE DES POIDS


Une dernière approche pour pouvoir diminuer la taille
des modèles est de changer la façon de coder les poids
de manière à ce que le codage de ceux-ci occupe moins
de mémoire.
FIGURE 26. Arbre de Huffman
5.1. Codage de Huffman
Les codes correspondants à chaque caractère sont
Le codage de Huffman (1952) est une technique tels que les codes des caractères les plus fréquents sont
de compression de données permettant de stocker ou courts et ceux correspondant aux symboles les moins
de transmettre celles ci en utilisant un minimum de fréquents sont longs :
bits afin d’améliorer les performances. Ce codage à
taille variable suppose l’indépendance des caractères du
M A C E H O N T R
message et on doit connaître la distribution probabiliste
00 100 110 010 011 1110 1111 1010 10110 10111
de ceux-ci à une position quelconque dans ce message.
Plus la probabilité d’occurrence d’un caractère dans On aurait donc comme codage
l’ensemble des données est grande, plus son code associé pour "COMME CHARMANT E" :
à celui ci se voit attribué une taille réduite. On code "1101111000001000111011101001011100100010110011010"
chaque caractère par un mot de longueur variable de Soit un mot de 49 bits au lieux de 16 × 8 = 128 soit
49
façon à ce qu’aucun mot ne soit le préfixe d’un autre. un taux de compression de 128 = 0, 382.
La propriété principale des codes de Huffman consiste Cependant, malgré le bon taux de compression de
en ce que la longueur moyenne du codage d’un caractère l’algorithme de Huffman un gros inconvénient de cette
Compression des réseaux de neurones pour l’embarqué 15

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

CONCLUSIONS (ICASSP), 2013 IEEE International Conference on,


pp. 8604–8608. IEEE.
Comme nous avons pu le voir au travers de [3] He, K., Zhang, X., Ren, S., and Sun, J. (2015)
cette étude, la problématique de la compression des Deep residual learning for image recognition. CoRR,
modèles de Deep Learning est un enjeux capitale abs/1512.03385.
afin de permettre l’implémentation de ceux ci sur [4] Han, S., Mao, H., and Dally, W. J. (2015) Deep
des cibles embarqués. C’est un enjeux décisif, car la compression : Compressing deep neural network with
démocratisation de ces algorithmes et le développement pruning, trained quantization and huffman coding.
de leur utilisation dans des applications de plus en CoRR, abs/1510.00149.
plus variées dépendent directement de la possibilité [5] Patterson, D. A. and Hennessy, J. L. (2013) Compu-
de les déployer dans nos téléphones, nos tablettes ter Organization and Design, Fifth Edition : The Hard-
ware/Software Interface, 5th edition. Morgan Kauf-
et plus généralement tous nos appareils connectés.
mann Publishers Inc., San Francisco, CA, USA.
De nombreuses approches ont été présentées avec
[6] Anwar, S., Hwang, K., and Sung, W. (2015) Structured
chacune leurs avantages et leur inconvénients mais pruning of deep convolutional neural networks. CoRR,
comme on peut le voir dans [4], où un pipeline de abs/1512.08571.
compression en trois étapes est présenté (Prunning, [7] Huang, Q., Zhou, Q. K., You, S., and Neumann, U.
Quantification et codage de Huffman) ce n’est qu’en (2018) Learning to prune filters in convolutional neural
combinant ces différentes méthodes que nous pourrons networks. CoRR, abs/1801.07365.
aboutir à un système de compression performant et [8] Li, H., Kadav, A., Durdanovic, I., Samet, H., and
fiable. Cependant, comme nous l’avons évoqué dans Graf, H. P. (2016) Pruning filters for efficient convnets.
la dernière partie de ce rapport, il est important CoRR, abs/1608.08710.
de garder à l’idée que notre problème s’inscrit [9] Wu, J., Leng, C., Wang, Y., Hu, Q., and Cheng, J.
dans le domaine plus général de la compression (2015) Quantized convolutional neural networks for
de données et que plutôt que de vouloir tout mobile devices. CoRR, abs/1512.06473.
réinventer, il serrait judicieux d’explorer les possibilités [10] Lin, D. D., Talathi, S. S., and Annapureddy, V. S.
(2015) Fixed point quantization of deep convolutional
d’adapter certaines technologies analogues comme celles
networks. CoRR, abs/1511.06393.
développées dans le domaine de la compression d’image
[11] Zhu, C., Han, S., Mao, H., and Dally, W. J. (2016) Trai-
à la problématique qui nous intéresse. ned ternary quantization. CoRR, abs/1612.01064.
L’une des lacunes évidente de cet étude est l’absence [12] Gong, Y., Liu, L., Yang, M., and Bourdev, L. D. (2014)
d’étude expérimentale permettant de quantifier l’effica- Compressing deep convolutional networks using vector
cité réelle de ces différentes méthodes sur une base de quantization. CoRR, abs/1412.6115.
tests comparables. De même, une étude quantitative sur [13] Jegou, H., Douze, M., and Schmid, C. (2011)
les potentiels gains en terme de performance et de taux Product quantization for nearest neighbor search.
d’erreurs qu’offrirait une combinaison de ces différentes IEEE transactions on pattern analysis and machine
méthodes aurait été pertinente. intelligence, 33, 117–128.
[14] Shi, Y. Q. and Sun, H. (1999) Image and video compres-
sion for multimedia engineering : Fundamentals, algo-
ACKNOWLEDGEMENTS rithms, and standards. CRC press.
Ce travail de recherche réalisé dans le cadre de [15] Prost-Boucle, A., BOURGE, A., Pétrot, F., Alemdar,
H., Caldwell, N., and Leroy, V. (2017) Scalable High-
l’option d’Initiation à la Recherche en Laboratoire
Performance Architecture for Convolutional Ternary
proposé durant le second semestre de 2ème année à
Neural Networks on FPGA, . Gent, Belgium,
l’Ensimag m’a permis d’explorer et de me confronter September.
aux problématiques de la recherche et par la même [16] Zhao, R., Song, W., Zhang, W., Xing, T., Lin, J.-H.,
occasion de me permettre d’entrevoir en quoi consiste Srivastava, M., Gupta, R., and Zhang, Z. Accelerating
un travail de thèse ou de recherche. Je souhaiterais donc binarized convolutional neural networks with software-
remercier Stéphane MANCINI, sans qui je n’aurais pas programmable fpgas, . New York, NY, USA. ACM.
pu prendre cette option, d’avoir accepté d’être mon [17] Alemdar, H., Caldwell, N., Leroy, V., Prost-Boucle,
tuteur sur ce projet et d’avoir su me guider tout au A., and Pétrot, F. (2016) Ternary neural net-
long de celui ci afin de produire ce travail. works for resource-efficient AI applications. CoRR,
abs/1609.00222.
[18] Umuroglu, Y., Fraser, N. J., Gambardella, G., Blott,
REFERENCES M., Leong, P. H. W., Jahre, M., and Vissers, K. A.
[1] Simonyan, K. and Zisserman, A. (2014) Very deep (2016) FINN : A framework for fast, scalable binarized
convolutional networks for large-scale image recogni- neural network inference. CoRR, abs/1612.07119.
tion. CoRR, abs/1409.1556. [19] Li, Y., Liu, Z., Xu, K., Yu, H., and Ren, F. A 7.663-
[2] Deng, L., Li, J., Huang, J.-T., Yao, K., Yu, D., Seide, F., tops 8.2-w energy-efficient fpga accelerator for binary
Seltzer, M., Zweig, G., He, X., Williams, J., et al. (2013) convolutional neural networks (abstract only), . New
Recent advances in deep learning for speech research York, NY, USA, pp. 290–291. ACM.
at microsoft. Acoustics, Speech and Signal Processing
18 E. Sinitambirivoutin

ANNEXE A : RÉSEAUX DE NEURONES

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.

Algorithme de rétro propagation :


La phase d’apprentissage des réseaux de neurones se résume à actualiser la valeur des poids en fonction de la
sortie obtenue lors de la dernière itération. On cherche à se rapprocher de la solution et pour ce faire on va calculer
le gradient à chaque nœud (neurone) du réseau afin de s’en approcher. Ces gradients sont calculés à partir d’une
fonction de coût qui permet quantifier le niveau de concordance du résultat obtenue avec le résultat attendu. Cette
phase qui consiste à faire remonter les gradients des valeurs de sortie vers les couches précédentes du réseau s’appelle
la rétro-propagation. Il existe plusieurs méthode pour calculer ce gradient, la plus intuitive étant de dériver la fonction
par rapport à chaque variables, mais dans le cas générale il est difficile de les calculer de cette manière. On préfère
donc la méthode suivante :

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

Différents types de fonction d’activation


Même si historiquement la sigmoïde à été très
utilisé, elle est aujourd’hui très peut employée car
elle présente deux désavantages significatifs :
— Elle sature le gradient : Comme la fonction
sature vers 0 et 1, le gradient est presque
nulle aux alentour de ces valeurs. Conséquence,
durant la rétro propagation, le signale transmis
par le neurone précédant est « tuer » lorsque
l’on fait le produit avec le gradient local
— Les sorties de la sigmoïde ne sont
pas centrées sur zéro : Cela impacte la
dynamique de rétro propagation.

FIGURE 27. Fonction Sigmoïde

La fonction tanh est préférée à la fonction sigmoïde


car elle présente les mêmes caractéristiques mais est
centrée en zéro ce qui permet d’éviter les problèmes
qui en découlent.

FIGURE 28. Fonction tanh

La fonction ReLU est devenue très populaire


ces dernières années car elle offre de bonnes
performances lors de l’apprentissage :
— Elle améliore la convergence de gradient
— Elle est moins couteuse en calcul : La
fonction tanh et sigmoïde nécessite des calculs
complexes
Cependant, la fonction ReLU peut parfois tuer
certains neurones lors de l’apprentissage (le gradient
associé à la rétro propagation peut devenir nul et
le rester). Pour palier ce problème, certains utilisent
aujourd’hui une fonction appelé Leaky ReLU (Plutôt
que de fixer la sortie à zéro pour les poids négatifs
il y a une légère pente pour que les termes négatifs
soient non nuls)

FIGURE 29. Fonction ReLU


Compression des réseaux de neurones pour l’embarqué 21

ANNEXE B : RÉSEAUX DE NEURONES CONVOLUTIFS


Les réseaux de neurones convolutifs sont une adaptation des réseaux de neurones spécifiques à l’analyse d’images.
L’hypothèse selon laquelle les entrées ne sont que des images permet de faire certaines simplification dans
l’architecture du réseau en s’inspirant du cortex visuel humain.
Architecture globale

Ils sont généralement composés de 4 types de couches :


— CONV : Les couches CONV sont des couches de convolution, elles vont appliquer des filtres sur l’image afin
d’en extraire des caractéristiques spécifiques plus ou moins complexes.
— RELU : Les couches RELU appliquent une fonction non linéaires aux sorties des couches précédentes elles
sont l’équivalent de l’activation de sortie des neurones formels.
— POOL : Ces couches permettent de réduire la dimension de l’image d’entrée.
— FC : Cette couche est la plus part du temps présente en fin de réseau. C’est une couche de neurones
complètement connectés (type perceptron simple ou multicouche), il permet de déterminer le score de l’image
d’entrée pour chaque sortie en fonction des spécificités observées par le réseau.
Une des couches très intéressantes ici est la couche CONV car c’est cette couche qui fait la particularité de ce type
de réseau, c’est d’ailleurs pour cette raison qu’on appel ces réseaux des réseaux convolutifs.

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

Couche "Fully connected"


Après plusieurs couches de convolution et de max-pooling, le raisonnement de haut niveau dans le réseau neuronal
se fait via des couches entièrement connectées. Les neurones dans une couche entièrement connectée ont des
connexions vers toutes les sorties de la couche précédente (comme on le voit régulièrement dans les réseaux réguliers
de neurones). Leurs fonctions d’activations peuvent donc être calculées avec une multiplication matricielle suivie de
l’ajout d’un biais.

Vous aimerez peut-être aussi