Pretraining in DeepLearning
2020-09-12 | Hugo Abraham
Pretraining in deep-learning
Enfin utiliser le deep learning sur des petits jeux de données grâce au transfert d’apprentissage ?
Pourquoi devriez-vous utiliser le pré-entraînement pour vos réseaux de neurones ?
Les projets vivent et meurent par leurs données. La quantité de données limite généralement les stratégies disponibles pour résoudre un cas, voire interdit l’utilisation même du machine learning. Certaines stratégies d'apprentissage automatique sont tristement célèbres pour leur appétit en données, les réseaux de neurones en faisaient partie. Or, dans la plupart des cas, il est difficile de rassembler une grande quantité d'exemples étiquetés, que ce soit par manque d'autorisation, du fait du coût élevé desdits exemples, ou pour d'autres raisons encore. « Hélas! avait-on l'habitude de s’écrier, le problème à résoudre est si complexe que les réseaux de neurones semblent seuls faits pour en triompher, mais nous manquons de données. Ainsi s'éteignent nos espoirs ! »
N'ayez plus peur !
L'espoir est ravivé : un réseau de neurones peut être utilisé même quand on a peu d'exemples pour l'entraîner, grâce au pré-entraînement, que l’on trouvera aussi appelé pretraining ou transfer learning. L'idée en soi est assez simple : on inonde le réseau de neurones avec des données similaires à celles du cas voulu (mais disponible en grand nombre), et on l'entraîne sur une tâche plus facile à étiqueter. Ce n'est qu'après qu’on l'entraîne sur le cas cible.
Étonnamment, cela fonctionne très, très bien. Quelques photos de concombres et de courgettes permettent à un algorithme de les différencier, quelques centaines de photos de chiens permettent ainsi d’entraîner un énorme réseau à distinguer entre les races, à condition que le réseau ait été préalablement entraîné sur des millions de photos (1). De même, quelques centaines de textes juridiques peuvent être classés à condition que l'algorithme soit pré-formé à prédire le mot suivant une séquence à partir d'un vaste corpus.
Dans la suite, nous essayerons de comprendre pourquoi le pré-entraînement fonctionne, ainsi, nous espérons vous convaincre de toujours pré-entraîner votre modèle. Nous terminerons par une brève mention de l'écosystème grâce auquel on peut désormais utiliser de gigantesques réseaux pré-entraînés .
Comment les réseaux de neurones calculent leurs prédictions ?
Le pré-entraînement doit sa réussite à la manière dont un algorithme de deep learning construit ces prédictions, par couches successives. Ces couches sont connectées les unes aux autres, ainsi les neurones de l’une sont calculés à partir des neurones de la précédente et alimentent les neurones de la suivante.
Les neurones peuvent être pensés comme détectant des caractéristiques de plus en plus complexes au fur et à mesure de la progression dans les couches. Pensez à une image, chaque neurone de la première couche combine les valeurs des pixels de manière différente, détectant différentes caractéristiques simples telles que des lignes verticales ou horizontales. Chaque couche combine alors des caractéristiques de plus en plus complexes pour qu’enfin des neurones détectent différentes formes d'oreilles, des mains, ou des textures comme des fourrures ou des écailles (2). C’est sur la présence ou l’absence de ces caractéristiques que l’algorithme fonde sa prédiction (3).
La force même des réseaux de neurones provient de cette succession de caractéristiques de plus en plus complexes, non pas choisies par un opérateur, mais apprises au cours du processus d'entraînement par l'algorithme lui-même ! Par exemple il semble fastidieux de décrire toutes les façons dont un pneu de voiture peut apparaître sur une image, et sous tous les angles. Il est plus facile d’inonder un réseau de photos de pneus et de le laisser déchiffrer ce qui caractérise un pneu. Ce n'est coûteux qu’en temps de calcul, et les ordinateurs sont désormais moins chers à l'heure que les ingénieurs. En d'autres termes, au lieu de passer du temps à comprendre la nature sous-jacente de ce que nous voulons résoudre, on peut simplement présenter des données brutes au réseau.
Avant les réseaux neuronaux, en analyse du langage, il fallait étudier la grammaire, les phonèmes, l'étymologie. C'était un travail fastidieux, complexe et souvent stérile. Certes, cela permit une meilleure compréhension du langage humain. Cela nous approcha peut-être d’une sorte de vérité sur la question. Mais, en tant qu'ingénieurs, nous ne nous soucions pas de la vérité, nous nous soucions de la résolution de problèmes. A cet égard, les réseaux neuronaux ont surpassé l'analyse scientifique. De plus, la même architecture neuronale peut être utilisée pour l’analyse de différentes langues, quelles que soient les différentes structures grammaticales.
Plus le réseau est profond, plus les concepts peuvent être combinés et raffinés, c'est-à-dire que les prédictions peuvent être plus fines, donc résoudre des problèmes plus complexes. Malheureusement, tous ces neurones sont autant de paramètres à apprendre. Il peut y en avoir des dizaines de millions. Par conséquent, ils nécessitent de grands volumes d'exemples pour faire des prédictions même médiocres. Nous voici revenu au nœud du problème. Alors, comment le pré-entraînement lève-t-il cette malédiction?
Des racines aux branches, seules les feuilles nous importent.
Pour générer des prédictions pertinentes, toutes les variables primaires doivent être trouvées par le modèle, puis combinées correctement. Heureusement, la plupart de ces variables sont communes à de nombreuses tâches. Par exemple les applications de vision par ordinateur doivent toutes détecter les formes de base (lignes, formes géométriques, etc), et le traitement du langage naturel nécessite de trouver des liens entre des mots comme les noms et les verbes. Le but du pré-entraînement est de fournir suffisamment d'exemples à l'algorithme pour lui permettre d'apprendre ces concepts communs. Dans de nombreux cas, seuls les concepts les plus complexes doivent être appris grâce au jeu de données du problème cible.
Disons que l’objectif est de classer des textes longs en deux catégories, avec seulement quelques centaines, voire dizaines d'exemples. On pourrait pré-former un grand réseau neuronal en lui demandant de prévoir le mot suivant une séquence. Il suffirait de tirer les phrases de milliers d'articles de presse dans la même langue. Cela permettrait à l'algorithme d'acquérir une compréhension grossière de la façon dont les mots se succèdent, une compréhension statistique de la syntaxe. On procéderait alors à un pré-entraînement supplémentaire sur la prédiction du mot suivant dans des séquences extraites du corpus de longs textes. Ce n'est qu'après que l'on entraînerait le réseau à la classification des textes. Cela ne nécessiterait alors que quelques itérations sur l'ensemble de données, car seules les plus hautes entités auraient besoin d'apprendre leurs paramètres (4).
Il suffit donc de trouver un grand ensemble de données qui ressemblent à celles du jeu du problème étudié. Ensuite on entraîne le modèle sur une tâche qui partage des concepts primaires similaires. En prime, si l'on a besoin d’effectuer toute autre tâche sur le même ensemble de données, le pré-entraînement sera probablement le même ! Plusieurs tâches peuvent partager le même tronc, comme des feuilles différentes. Dans la forêt du deep learning, chaque sujet est son propre arbre, portant toutes leurs sous-applications comme des branches. On peut espérer que cela encourage la collaboration, de nombreuses équipes bénéficiant toutes de la croissance d'un tronc solide pour supporter leurs propres projets.
Comment utiliser des réseaux de neurones profonds pré-entraînés ?
Réjouissez-vous ! Car de nombreuses architectures de réseaux profonds sont disponibles avec pré-entraînement ! Des organismes publiques et même des grandes entreprises telles que Google ou Facebook mettent désormais leurs modèles en libre accès. Un exemple récent est la collaboration CamemBert pour l’élaboration d’un modèle de langage français. Il suffit de regarder les librairies transformateurs-huggingface ou FastAI. Presque tous les paquets python pour l'apprentissage automatique fournissent des modèles. Il n'y a aucune raison de ne pas les utiliser. Alors faites des merveilles avec le pré-entraînement !
Allez, au travail, il y a tant à résoudre.
Notes
- Un petit florilège d’exemples.
- On trouvera une visualisation de ce principe ici, et une discussion plus formelle dans cet article.
- Pour une introduction plus complète aux réseaux neuronaux on se reportera à cette vidéo.
- Cet enchaînement fut proposé par Jeremy Howard, l'un des fondateurs de FastAI, sous le nom d’ULMFIT.