Alimenter la machine : nous donnons quelques gros titres à une IA et voyons ce qu’elle fait

Il y a un moment dans une incursion dans un nouveau territoire technologique où vous réalisez que vous vous êtes peut-être lancé dans une tâche sisyphéenne. En regardant la multitude d’options disponibles pour prendre en charge le projet, vous recherchez vos options, lisez la documentation et commencez à travailler uniquement pour trouver qu’en fait, juste définir le problème peut être plus de travail que de trouver la solution réelle.

Lecteur, c’est là que je me suis retrouvé après deux semaines dans cette aventure en apprentissage automatique. Je me suis familiarisé avec les données, les outils et les approches connues des problèmes avec ce type de données, et j’ai essayé plusieurs approches pour résoudre ce qui en surface semblait être un simple problème d’apprentissage automatique : sur la base des performances passées, pourrions-nous prédire si un titre Ars donné sera un gagnant dans un test A/B ?

Les choses ne se sont pas particulièrement bien passées. En fait, alors que je terminais cet article, ma dernière tentative a montré que notre algorithme était à peu près aussi précis qu’un tirage au sort.

Mais au moins c’était un début. Et dans le processus d’y arriver, j’ai beaucoup appris sur le nettoyage et le pré-traitement des données qui entrent dans tout projet d’apprentissage automatique.

Notre source de données est un journal des résultats de plus de 5 500 tests A/B de gros titres au cours des cinq dernières années – c’est à peu près aussi longtemps qu’Ars a fait ce genre de fusillade pour chaque article qui est publié. Puisque nous avons des étiquettes pour toutes ces données (c’est-à-dire que nous savons s’il a gagné ou perdu son test A/B), cela semblerait être un problème d’apprentissage supervisé. Tout ce que j’avais vraiment besoin de faire pour préparer les données était de m’assurer qu’elles étaient correctement formatées pour le modèle que j’ai choisi d’utiliser pour créer notre algorithme.

Je ne suis pas un scientifique des données, donc je n’allais pas construire mon propre modèle à tout moment cette décennie. Heureusement, AWS fournit un certain nombre de modèles prédéfinis adaptés à la tâche de traitement de texte et conçus spécifiquement pour fonctionner dans les limites du cloud Amazon. Il existe également des modèles tiers, tels que Hugging Face, qui peuvent être utilisés dans l’univers SageMaker. Chaque modèle semble avoir besoin de données qui lui sont fournies d’une manière particulière.

Le choix du modèle dans ce cas dépend en grande partie de l’approche que nous adopterons pour le problème. Au départ, j’ai vu deux approches possibles pour entraîner un algorithme afin d’obtenir une probabilité de succès d’un titre donné :

La deuxième approche est beaucoup plus difficile, et il y a une préoccupation primordiale avec l’une ou l’autre de ces méthodes qui rend la seconde encore moins tenable : 5 500 tests, avec 11 000 titres, ce n’est pas beaucoup de données avec lesquelles travailler dans le grand schéma AI/ML de des choses.

J’ai donc opté pour la classification binaire pour mon premier essai, car elle semblait la plus susceptible de réussir. Cela signifiait également que le seul point de données dont j’avais besoin pour chaque titre (en plus du titre lui-même) était de savoir s’il avait gagné ou perdu le test A/B. J’ai pris mes données sources et les ai reformatées dans un fichier de valeurs séparées par des virgules avec deux colonnes : des titres dans l’une et “oui” ou “non” dans l’autre. J’ai également utilisé un script pour supprimer tout le balisage HTML des titres (principalement quelques balises HTML pour les italiques). Les données étant presque entièrement réduites à l’essentiel, je les ai téléchargées dans SageMaker Studio afin de pouvoir utiliser les outils Python pour le reste de la préparation.

Ensuite, je devais choisir le type de modèle et préparer les données. Encore une fois, une grande partie de la préparation des données dépend du type de modèle dans lequel les données seront introduites. Différents types de modèles (et de problèmes) de traitement du langage naturel nécessitent différents niveaux de préparation des données.

Après cela vient la “tokenisation”. L’évangéliste de la technologie AWS Julien Simon l’explique ainsi : “Le traitement des données doit d’abord remplacer les mots par des jetons, des jetons individuels.” Un jeton est un nombre lisible par une machine qui remplace une chaîne de caractères. “Donc, ” ransomware serait le mot un “, a-t-il dit, ” rooks serait le mot deux, etup serait le mot trois, donc une phrase devient alors un séquence de jetons, et vous pouvez l’alimenter dans un modèle d’apprentissage en profondeur et le laisser apprendre lesquels sont les bons, lesquels sont les mauvais.”

En fonction du problème particulier, vous souhaiterez peut-être supprimer certaines données. Par exemple, si nous essayions de faire quelque chose comme une analyse des sentiments (c’est-à-dire déterminer si un titre Ars donné était de ton positif ou négatif) ou de regrouper les titres en fonction de leur sujet, je voudrais probablement réduire les données au le contenu le plus pertinent en supprimant les « mots vides » – mots courants qui sont importants pour la structure grammaticale mais qui ne vous disent pas ce que le texte dit réellement (comme la plupart des articles).

Titres tokenisés sans mots vides via le Natural Language Tool Kit de Python (<code>nltk</code>).  Remarquez que la ponctuation est parfois emballée avec des mots comme un signe ;  cela devrait être nettoyé pour certains cas d’utilisation.” src=”https://cdn.arstechnica.net/wp-content/uploads/2021/07/ai-ml-pt2-Picture1-640×527.png” width=”640″ height=”527″ srcset=”https://cdn.arstechnica.net/wp-content/uploads/2021/07/ai-ml-pt2-Picture1.png 2x”><figcaption class=Agrandir / Titres tokenisés sans mots vides via Python’s Natural Language Tool Kit (nltk). Remarquez que la ponctuation est parfois emballée avec des mots comme un signe ; cela devrait être nettoyé pour certains cas d’utilisation.

Cependant, dans ce cas, les mots vides étaient des parties potentiellement importantes des données. Après tout, nous recherchons des structures de titres qui attirent l’attention. J’ai donc choisi de garder tous les mots. Et lors de ma première tentative de formation, j’ai décidé d’utiliser BlazingText, un modèle de traitement de texte qu’AWS démontre dans un problème de classification similaire à celui que nous tentons. BlazingText nécessite que les données “label” – les données qui appellent une partie particulière de la classification du texte – soient précédées de “__label__“. Et au lieu d’un fichier délimité par des virgules, les données de l’étiquette et le texte à traiter sont mis sur une seule ligne dans un fichier texte, comme ceci :

Données préparées pour le modèle BlazingText, avec des titres forcés en minuscules.

Agrandir / Données préparées pour le modèle BlazingText, avec des titres forcés en minuscules.

Une autre partie du prétraitement des données pour l’apprentissage supervisé ML consiste à diviser les données en deux ensembles : un pour l’apprentissage de l’algorithme et un pour la validation de ses résultats. L’ensemble de données d’apprentissage est généralement le plus grand. Les données de validation sont généralement créées à partir d’environ 10 à 20 pour cent des données totales.

Il y a eu de nombreuses recherches sur ce qui est réellement la bonne quantité de données de validation – certaines de ces recherches suggèrent que le point idéal est davantage lié au nombre de paramètres dans le modèle utilisé pour créer l’algorithme plutôt qu’à la taille globale de les données. Dans ce cas, étant donné qu’il y avait relativement peu de données à traiter par le modèle, j’ai pensé que mes données de validation seraient de 10 %.

Dans certains cas, vous souhaiterez peut-être retenir un autre petit pool de données pour tester l’algorithme après c’est validé. Mais notre plan ici est d’utiliser éventuellement les titres Ars en direct pour tester, j’ai donc sauté cette étape.

Pour effectuer ma préparation finale des données, j’ai utilisé un bloc-notes Jupyter – une interface Web interactive vers une instance Python – pour transformer mon CSV à deux colonnes en une structure de données et la traiter. Python a des boîtes à outils de manipulation de données et spécifiques à la science des données qui rendent ces tâches assez simples, et j’en ai utilisé deux en particulier ici :

Les csv module de lecture et d’écriture de fichiers CSV.

Voici une partie du code du bloc-notes que j’ai utilisé pour créer mes ensembles d’entraînement et de validation à partir de nos données CSV :

Agrandir

j’ai commencé par utiliser pandas pour importer la structure de données à partir du fichier CSV créé à partir des données initialement nettoyées et formatées, en appelant l’objet résultant « ensemble de données ». En utilisant le dataset.head() La commande m’a donné un aperçu des en-têtes de chaque colonne importée du fichier CSV, ainsi qu’un aperçu de certaines des données.

Le module pandas m’a permis d’ajouter en masse la chaîne “__label__” à toutes les valeurs de la colonne label comme requis par BlazingText, et j’ai utilisé une fonction lambda pour traiter les titres et forcer tous les mots en minuscules. Enfin, j’ai utilisé le sklearn module pour diviser les données en deux fichiers que je fournirais à BlazingText.

Leave a Comment

Your email address will not be published. Required fields are marked *