Medric Djeafea Sonwa : Optimisation des calculs des réseaux de neurones par la réduction de la précision en nombre de bit des poids : Différence entre versions

De Ensiwiki
Aller à : navigation, rechercher
(Introduction)
Ligne 11 : Ligne 11 :
 
La génération courante des réseaux de neurones nécessitent beaucoup de ressources en terme de stockage
 
La génération courante des réseaux de neurones nécessitent beaucoup de ressources en terme de stockage
 
et de temps de calcul. De part le nombre élevé de paramètres nécessaires pour ces réseaux, ainsi que le nombre de bits de précision nécessaires pour représenter ces paramètres (32 bits, 64 bits etc. pour chacun des millions de paramètres), le temps des opérations de reconnaissance devient énorme et il est difficilement envisageable d'intégrer cette génération
 
et de temps de calcul. De part le nombre élevé de paramètres nécessaires pour ces réseaux, ainsi que le nombre de bits de précision nécessaires pour représenter ces paramètres (32 bits, 64 bits etc. pour chacun des millions de paramètres), le temps des opérations de reconnaissance devient énorme et il est difficilement envisageable d'intégrer cette génération
de réseaux de neurones dans des systèmes embarqués, comme des drônes ou encore des microcontroleurs qui ne
+
de réseaux de neurones dans des systèmes embarqués, comme des drones ou encore des microcontrôleurs qui ne
 
disposent pas d'une grande puissance. Ayant constaté cette problématique, de nouvelles recherches se sont  
 
disposent pas d'une grande puissance. Ayant constaté cette problématique, de nouvelles recherches se sont  
 
penchées sur la possibilité de réduire le nombre de bits sur lesquels sont représentés les paramètres des NN afin
 
penchées sur la possibilité de réduire le nombre de bits sur lesquels sont représentés les paramètres des NN afin
Ligne 18 : Ligne 18 :
 
dans l'ensemble binaire {-1,1}, et la "ternarisation" qui consiste à traduire ceci dans l'ensemble {-1,0,+1}.
 
dans l'ensemble binaire {-1,1}, et la "ternarisation" qui consiste à traduire ceci dans l'ensemble {-1,0,+1}.
  
== Principe des réseaux de neurones binarisés ==
+
== Principe des réseaux de neurones "binarisés" ==
  
 
La première approche pour l'optimisation des calculs dans les réseaux de neurones est la binarisation
 
La première approche pour l'optimisation des calculs dans les réseaux de neurones est la binarisation
Ligne 37 : Ligne 37 :
 
== Formulation mathématique ==
 
== Formulation mathématique ==
  
Lors de l'entrainement des réseaux de neurones, les valeurs réeles des poids (biais inclus) ne sont pas
+
Lors de l’entraînement des réseaux de neurones, les valeurs réelles des poids (biais inclus) ne sont pas
 
limitées, il est nécessaire de convertir ces valeurs à 2 valeurs possibles -1 ou 1.
 
limitées, il est nécessaire de convertir ces valeurs à 2 valeurs possibles -1 ou 1.
Notons $w$ la valeur réele du poids d'un neurone, et $w^b$ la convertion sur l'ensemble $\{-1, +1\}$ de ce poids.
+
Notons $w$ la valeur réelle du poids d'un neurone, et $w^b$ la conversion sur l'ensemble $\{-1, +1\}$ de ce poids.
  
La première fonction qui permet de retrouver $w^b$ est la ''binarisation deterministe'' :
+
La première fonction qui permet de retrouver $w^b$ est la ''binarisation déterministe'' :
 
$$
 
$$
 
w^b = \begin{cases}
 
w^b = \begin{cases}
Ligne 50 : Ligne 50 :
  
 
Où $t_w$ est une valeur seuil fonction de $w$, qui est soit fixe, soit variable et dont la valeur peut varier
 
Où $t_w$ est une valeur seuil fonction de $w$, qui est soit fixe, soit variable et dont la valeur peut varier
durant le processus d'apprentissage du neurone. Il est courant de fixer $t_w$ à $0$ independamment de $w$.
+
durant le processus d'apprentissage du neurone. Il est courant de fixer $t_w$ à $0$ indépendamment de $w$.
  
Une autre méthode qui permet de determiner $w_b$ est la ''binarisation stochastique'' :
+
Une autre méthode qui permet de déterminer $w_b$ est la ''binarisation stochastique'' :
 
$$
 
$$
 
     w^b = \begin{cases}
 
     w^b = \begin{cases}
Ligne 65 : Ligne 65 :
 
$$
 
$$
  
La \textbf{determistic binarization} est préférable dans notre contexte, car facile à implémenter, et de plus nécessite
+
La binarisation déterministe est préférable dans notre contexte, car facile à implémenter, et de plus nécessite
moins de calcul machine. Il se pose toute fois avec cette methode, le problème du choix du seuil. Bienqu'on puisse
+
moins de calcul machine. Il se pose toute fois avec cette méthode, le problème du choix du seuil. Bien qu’on puisse
 
directement la fixer à $0$, on peut également trouver une valeur optimale à celle-ci en calculant l'erreur commise sur son  
 
directement la fixer à $0$, on peut également trouver une valeur optimale à celle-ci en calculant l'erreur commise sur son  
 
choix. Cette erreur est :
 
choix. Cette erreur est :
Ligne 76 : Ligne 76 :
 
t^*_w = \underset{ t_w \in ]-\epsilon, \epsilon[ }{\arg\min}E_w(t_w)
 
t^*_w = \underset{ t_w \in ]-\epsilon, \epsilon[ }{\arg\min}E_w(t_w)
 
$$
 
$$
Où $\epsilon$ est un nombre positif et proche de zero.
+
Où $\epsilon$ est un nombre positif et proche de zéro.
  
  
Considerons la $i^{th}$ couche d'un NN, dont la matrice de poids est $W_i$ et le vecteur de biais est $b_i$.
+
Considérons la $i^{th}$ couche d'un NN, dont la matrice de poids est $W_i$ et le vecteur de biais est $b_i$.
Considerons l'input $x$, on a : \(z = W_ix+b_i\)
+
Considérons l'input $x$, on a : \(z = W_ix+b_i\)
  
Le vecteur final à valeur réele de cette couche est : \(a = activation(z)\)
+
Le vecteur final à valeur réelle de cette couche est : \(a = activation(z)\)
  
 
Où $activation$ est une la fonction d'activation \cite{karlik2011performance} de cette couche. Elle peut être  
 
Où $activation$ est une la fonction d'activation \cite{karlik2011performance} de cette couche. Elle peut être  
Ligne 103 : Ligne 103 :
 
$$
 
$$
  
 +
== Adaptation des opérations arithmétiques ==
  
 
+
Comme précédemment mentionné, pour optimiser le temps des opérations dans le CPU il est nécessaire de
 
+
definir de nouvelles opérations mathématiques pour nos ensembles {-1, +1} et {-1,0,+1}. Une fois que notre
L’objectif de ce projet est d'étudier l'opportunité de réduire la précision des nœuds de calcul d'un CNN de manière non uniforme de manière à éviter un coûteux processus d'apprentissage.
+
réseau de neurone ait fini l'apprentissage et qu'il ait été implanté dans un système embarqué, celui considère
Cette stratégie a du sens pour des implantations matérielles reconfigurables (à base de FPGA) dans lesquelles chaque nœud peut avoir sa propre configuration en fonction de l'application visée. (Cette étape d'implantation ne fait pas partie du travail demandé, elle n'est citée que pour montrer l'intérêt effectif du travail demandé).
+
maintenant ses paramètres comme binaire ou ternaire.
 
+
Le travail attendu consiste dans un premier temps à faire un état de l'art ciblé sur les CNN efficace, puis à proposer une stratégie de réduction de la complexité et enfin à en valider la pertinence en simulation.
+
 
+
== Prérequis ==
+
Archi : mieux vaut avoir compris les bases
+
 
+
Maths : certains papiers en sont bourrés. Phobiques, s'abstenir
+
 
+
Utilisation des outils classiques d'apprentissage : tensorflow, pytorch, keras, etc, suivant le goût et les usages de chacun
+

Version du 24 mai 2020 à 13:56

Cornues.png
Titre du projet Optimisation des calculs des réseaux de neurones par la réduction de la précision en nombre de bit des poids
Cadre IRL

Labo TIMA
Équipe System Level Synthesis
Encadrants olivier.muller@univ-grenoble-alpes.fr,frederic.petrot@univ-grenoble-alpes.fr

Introduction

La génération courante des réseaux de neurones nécessitent beaucoup de ressources en terme de stockage et de temps de calcul. De part le nombre élevé de paramètres nécessaires pour ces réseaux, ainsi que le nombre de bits de précision nécessaires pour représenter ces paramètres (32 bits, 64 bits etc. pour chacun des millions de paramètres), le temps des opérations de reconnaissance devient énorme et il est difficilement envisageable d'intégrer cette génération de réseaux de neurones dans des systèmes embarqués, comme des drones ou encore des microcontrôleurs qui ne disposent pas d'une grande puissance. Ayant constaté cette problématique, de nouvelles recherches se sont penchées sur la possibilité de réduire le nombre de bits sur lesquels sont représentés les paramètres des NN afin de réduire le temps de calcul et la mémoire nécessaire. Ainsi, dans ce papier nous présentons les formulations mathematiques de deux méthodes d'entre elles : la "binarisation" qui consiste à réduire les poids et les outputs dans l'ensemble binaire {-1,1}, et la "ternarisation" qui consiste à traduire ceci dans l'ensemble {-1,0,+1}.

Principe des réseaux de neurones "binarisés"

La première approche pour l'optimisation des calculs dans les réseaux de neurones est la binarisation des poids et des biais des neurones, et la binarisation de leurs outputs. En d'autres termes, les poids et les biais ne peuvent avoir que 2 valeurs possibles, ce qui limite leurs représentations sur un bit. Les outputs des neurones peuvent aussi subir une transformation afin qu'ils soient représentés sur un seul bit. Ceci entraîne une perte d'information, ainsi, en fonction de la précision qu'on souhaite avoir et du temps d'exécution qu'on peut tolérer, on pourra déterminer si oui ou non on souhaite également convertir les outputs des neurones sur un certain nombre de bit.

Sachant que les poids et les biais ont été réduits à un nombre de bit, ainsi que les données d'entrées, des versions des opérations arithmétique ( addition, soustraction, etc.) peuvent être conçues spécialement pour des opérandes avec un nombre limité de valeurs. Le but étant d’accélérer la vitesse d'exécution de ces opérations. En effet, une opération d'addition conçue pour des opérandes de 2 bits, aura un coût inférieur à celle conçue pour des opérandes de 8 bits.

Formulation mathématique

Lors de l’entraînement des réseaux de neurones, les valeurs réelles des poids (biais inclus) ne sont pas limitées, il est nécessaire de convertir ces valeurs à 2 valeurs possibles -1 ou 1. Notons $w$ la valeur réelle du poids d'un neurone, et $w^b$ la conversion sur l'ensemble $\{-1, +1\}$ de ce poids.

La première fonction qui permet de retrouver $w^b$ est la binarisation déterministe : $$ w^b = \begin{cases}

   +1 \ if \ w \ge t_w \\
   -1 \ if \ w < t_w

\end{cases} $$

Où $t_w$ est une valeur seuil fonction de $w$, qui est soit fixe, soit variable et dont la valeur peut varier durant le processus d'apprentissage du neurone. Il est courant de fixer $t_w$ à $0$ indépendamment de $w$.

Une autre méthode qui permet de déterminer $w_b$ est la binarisation stochastique : $$

   w^b = \begin{cases}
       +1 \ with \ prob. \ \sigma(w) \\
       -1 \ with \ prob. \ 1-\sigma(w)
   \end{cases}

$$

Où $\sigma$ est la fonction $sigmoid$ donnée par : $$ \sigma(z) = \frac{1}{1+ \exp(-z)} $$

La binarisation déterministe est préférable dans notre contexte, car facile à implémenter, et de plus nécessite moins de calcul machine. Il se pose toute fois avec cette méthode, le problème du choix du seuil. Bien qu’on puisse directement la fixer à $0$, on peut également trouver une valeur optimale à celle-ci en calculant l'erreur commise sur son choix. Cette erreur est : $$ E_w(t_w) = (w - w^b)^2 = ( w - (-1)^{ 1_{w < t_w} } )^2 $$ Et ainsi, un choix optimal de $t_w$ est alors : $$ t^*_w = \underset{ t_w \in ]-\epsilon, \epsilon[ }{\arg\min}E_w(t_w) $$ Où $\epsilon$ est un nombre positif et proche de zéro.


Considérons la $i^{th}$ couche d'un NN, dont la matrice de poids est $W_i$ et le vecteur de biais est $b_i$. Considérons l'input $x$, on a : \(z = W_ix+b_i\)

Le vecteur final à valeur réelle de cette couche est : \(a = activation(z)\)

Où $activation$ est une la fonction d'activation \cite{karlik2011performance} de cette couche. Elle peut être $sigmoid$, $tanh$, $ReLU$ etc.

Ainsi, pour obtenir la valeur dans l'ensemble $\{-1, +1\}$ de $a$, une binarisation est appliquée à ce résultat : $$ a^b = \begin{cases}

   +1 \ si \ a \ge 0 \\
   -1 \ si \ a < 0

\end{cases} $$

Une autre pratique serait de remplacer la fonction d'activation par la binarisation, notre expression deviendrait : $$ a^b = a = \begin{cases}

   +1 \ si \ z \ge 0 \\
   -1 \ si \ z < 0

\end{cases} $$

Adaptation des opérations arithmétiques

Comme précédemment mentionné, pour optimiser le temps des opérations dans le CPU il est nécessaire de definir de nouvelles opérations mathématiques pour nos ensembles {-1, +1} et {-1,0,+1}. Une fois que notre réseau de neurone ait fini l'apprentissage et qu'il ait été implanté dans un système embarqué, celui considère maintenant ses paramètres comme binaire ou ternaire.