1 00:00:06,220 --> 00:00:12,290 Dans beaucoup de nos exemples, vous verrez des assembleurs de données apparaître encore et encore. 2 00:00:12,290 --> 00:00:18,010 Ils sont utilisés à la fois dans les flux de travail PyTorch et TensorFlow, et peut-être même dans JAX, mais personne 3 00:00:18,010 --> 00:00:20,260 ne sait vraiment ce qui se passe dans JAX. 4 00:00:20,260 --> 00:00:24,590 Nous avons une équipe de recherche qui travaille là-dessus, alors peut-être qu'ils nous le diront bientôt. 5 00:00:24,590 --> 00:00:27,869 Mais que sont les assembleurs de données ? 6 00:00:27,869 --> 00:00:32,230 Les assembleurs de données rassemblent les données. Ce n'est pas très utile. 7 00:00:32,230 --> 00:00:37,930 Plus précisément, ils rassemblent une liste d'échantillons dans un seul mini-batch de entraînement. 8 00:00:37,930 --> 00:00:41,820 Pour certaines tâches, l'assembleur de données peut être très simple. 9 00:00:41,820 --> 00:00:47,010 Par exemple, lorsque vous effectuez une classification de séquences, tout ce dont vous avez vraiment besoin de votre assembleur de données, 10 00:00:47,010 --> 00:00:53,480 c'est qu'il rembourre vos échantillons à la même longueur et les concatène en un seul tenseur. 11 00:00:53,480 --> 00:00:58,989 Mais pour d'autres flux de travail, les assembleurs de données peuvent être plus complexes car ils gèrent une partie du 12 00:00:58,989 --> 00:01:04,879 prétraitement nécessaire à cette tâche particulière. Donc quand vous voulez utilisez un assembleur de données, 13 00:01:04,879 --> 00:01:09,600 pour les utilisateurs de PyTorch, vous transmettez généralement le `DataCollator` à votre objet Trainer. 14 00:01:09,600 --> 00:01:15,549 Dans TensorFlow, c'ets un peu différent. Le moyen le plus simple d'utiliser un assembleur de données consiste à le transmettre à la méthode `to_tf_dataset` 15 00:01:15,549 --> 00:01:23,700 de votre jeu de données. Cela vous donne un `tf.dataset` que vous pouvez passer à `fit`. 16 00:01:23,700 --> 00:01:27,420 Vous verrez ces approches utilisées dans les exemples et les notebooks tout au long de ce cours. 17 00:01:27,820 --> 00:01:34,360 Notez que tous nos assembleurs prennent un argument `return_tensors` : vous pouvez le définir sur `"pt"` pour obtenir des 18 00:01:34,360 --> 00:01:40,820 tenseurs PyTorch, `"tf"` pour obtenir des tenseurs TensorFlow ou `"np"` pour obtenir des tableaux Numpy. 21 00:01:40,820 --> 00:01:46,060 Pour des raisons de compatibilité descendante, la valeur par défaut est `"pt"`, donc les utilisateurs de PyTorch n'ont même pas 22 00:01:46,060 --> 00:01:51,110 besoin de définir cet argument la plupart du temps, et sont donc souvent totalement inconscients de l'existence de cette 23 00:01:51,110 --> 00:01:52,110 option. 24 00:01:52,110 --> 00:01:59,160 C'est une leçon précieuse sur la façon dont les bénéficiaires du privilège sont souvent les plus aveugles à son 25 00:01:59,160 --> 00:02:00,160 existence. 26 00:02:00,160 --> 00:02:08,130 Voyons maintenant quelques `DataCollators` spécifiques en action, mais rappelez-vous que si aucun d' 27 00:02:08,130 --> 00:02:12,069 entre eux ne fait ce dont vous avez besoin, vous pouvez toujours écrire le vôtre ! Et ils sont souvent courts. 28 00:02:12,069 --> 00:02:17,120 Tout d'abord, nous verrons les assembleurs de données de base. 29 00:02:17,120 --> 00:02:21,550 Ce sont `DefaultDataCollator` et `DataCollatorWithPadding`. 30 00:02:21,550 --> 00:02:25,550 Ce sont ceux que vous devez utiliser si vos étiquettes sont simples et si vos données ne 31 00:02:25,550 --> 00:02:28,780 nécessitent aucun traitement spécial avant d'être prêtes pour l'entraînement. 32 00:02:28,780 --> 00:02:40.480 Et notez que, comme les différents modèles ont des tokens de rembourrage différents, le collateur de données avec rembourrage aura besoin du tokenizer de votre modèle pour savoir comment rembourrer les séquences correctement. 33 00:02:40.480 --> 00:02:49.040 Le collateur de données par défaut n'a pas besoin d'un tokenizer pour fonctionner mais il produira une erreur si toutes vos séquences ne sont pas de la même longueur. 34 00:02:49.040 --> 00:02:51.360 Vous devez donc être conscient de cela. 35 00:02:51.360 --> 00:02:59.280 Cependant, un grand nombre d'assembleurs de données autres que ceux de base sont généralement conçus pour accomplir une tâche spécifique. 36 00:02:59.280 --> 00:03:05.280 Et donc je vais vous en montrer deux ici, ce sont `DataCollatorForTokenClassification` et `DataCollatorForSeq2Seq`. 37 00:03:05.280 --> 00:03:12.640 Et la raison pour laquelle ces tâches nécessitent des assembleurs spéciaux est que leurs étiquettes sont de longueur variable. 38 00:03:12.640 --> 00:03:20.159 Dans la classification de tokens, il y a une étiquette pour chaque token et donc la longueur des étiquettes est la longueur de la séquence. 39 00:03:20.159 --> 00:03:28.080 Alors qu'en séquence à séquence, les étiquettes sont une séquence de tokens qui peuvent être de longueur variable et très différente de la longueur de la séquence d'entrée. 40 00:03:28.080 --> 00:03:38.080 Dans ces deux cas, nous nous occupons de l'assemblage de ce batch en rembourrant également les étiquettes, comme vous pouvez le voir dans cet exemple. 41 00:03:38.080 --> 00:03:40.560 So inputs and labels will need to be padded. 42 00:03:40.560 --> 00:03:53.760 Si nous voulons réunir des échantillons de longueur variable dans le même mini-batch, c'est toujours le cas pour tous les assembleurs de données et c'est exactement ce que ces assembleurs de données feront pour nous dans le cadre de ces tâches particulières. 43 00:03:53.760 --> 00:04:00.000 Il y a donc un dernier assembleur de données que je veux vous montrer dans cette conférence et c'est le `DataCollatorForLanguageModeling`. 44 00:04:00.000 --> 00:04:09.519 C'est donc très important d'abord parce que les modèles de langage sont tellement fondamentaux pour tout ce que nous faisons en NLP de nos jours. 45 00:04:09.519 --> 00:04:14.640 Ensuite parce qu'il possède deux modes qui font deux choses très différentes. 46 00:04:14.640 --> 00:04:26.000 Vous choisissez donc le mode que vous voulez avec l'argument `mlm`. Mettez-le à `True` pour la modélisation du langage masqué et mettez-le à `False` pour la modélisation du langage causal. 47 00:04:26.000 --> 00:04:30.000 Donc l'assemblage de données pour la modélisation du langage causal est en fait assez simple. 48 00:04:30.000 --> 00:04:42.080 Le modèle fait juste des prédictions sur quel sera le prochain token et donc vos étiquettes sont plus ou moins juste une copie de vos entrées et l'assembleur va gérer cela et s'assurer que les entrées et les étiquettes sont rembourrées correctement. 49 00:04:42.080 --> 00:04:48.160 Cependant, lorsque vous définissez mlm à `True`, vous obtenez un comportement très différent, différent de celui de tout autre assembleur de données. 50 00:04:48.160 --> 00:04:58.000 Et c'est parce que mettre mlm à `True` signifie une modélisation du langage masqué et cela signifie que les étiquettes doivent être masquées. 51 00:04:58.000 --> 00:05:00.000 Alors, à quoi cela ressemble-t-il ? 52 00:05:00.000 --> 00:05:14.560 Rappelez-vous que dans la modélisation du langage masqué, le modèle ne prédit pas le mot suivant, au lieu de cela, nous masquons aléatoirement certains tokens et le modèle les prédit tous en même temps et essaie de remplir les blancs pour ces tokens masqués. 53 00:05:14.560 --> 00:05:18.080 Mais le processus de masquage aléatoire est étonnamment complexe. 54 00:05:18.080 --> 00:05:29.840 Si nous suivons le protocole de l'article original de BERT, nous devons remplacer certains tokens par un token masqué, d'autres tokens par un token aléatoire, puis nous gardons un troisième ensemble de tokens inchangé. 55 00:05:29.840 --> 00:05:33.919 Ce n'est pas le moment d'entrer dans les détails de ce que nous faisons ou pourquoi nous le faisons. 56 00:05:33.919 --> 00:05:40.479 Vous pouvez toujours vérifier l'article original de BERT si vous êtes curieux, il est bien écrit et facile à comprendre. 57 00:05:40.479 --> 00:05:46.560 Ce qu'il faut savoir ici, c'est que la mise en œuvre de ce système par vous-même peut s'avérer très difficile et très complexe. 58 00:05:46.560 --> 00:05:57.680 Mais l'assembleur de données pour la modélisation du langage le fera pour vous si vous mettez mlm à `True` et c'est un exemple de prétraitement plus complexe que certains de nos assembleurs de données font. 59 00:05:57.680 --> 00:05:59.280 Et c'est tout. 60 00:05:59.280 --> 00:06:02.560 Ceci couvre donc les assembleurs de données les plus couramment utilisés et les tâches pour lesquelles ils sont utilisés. 61 00:06:02.560 --> 00:06:08.720 Nous espérons que vous savez maintenant quand utiliser les assembleurs de données et lequel choisir pour votre tâche spécifique.