Régression avancée du traitement du langage naturel 2024 | Supermellow AI | Skillshare
Recherche

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Regressão avançada de processamento de linguagem natural 2024

teacher avatar Supermellow AI, AI Developer

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Leçons de ce cours

    • 1.

      Apresentação

      2:58

    • 2.

      Importar pacotes e configurar

      6:31

    • 3.

      Carregar dados e pré-processamento

      21:11

    • 4.

      Logger e tokenizer

      10:52

    • 5.

      Criar conjunto de dados

      1:54

    • 6.

      Definir métodos de pool

      37:34

    • 7.

      Crie um modelo personalizado

      8:09

    • 8.

      Função de perda, métricas e funções de ajuda

      9:36

    • 9.

      Funções de treinamento e validação

      47:01

    • 10.

      Treinamento de modelo e resultados

      11:49

    • 11.

      Inferência

      4:41

    • 12.

      Conjunto

      3:25

    • 13.

      Conclusão

      1:13

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

5

Estudantes

--

Projeto

À propos de ce cours

Mergulhe no mundo do processamento de linguagem natural (PNL) e da análise de regressão com este curso abrangente. Aprenda como transformar dados de texto em representações numéricas e aplicar técnicas avançadas de aprendizagem de máquina para extrair insights significativos. Este curso apresenta modelos baseados em DeBERTá com arquiteturas personalizadas, utilizando vários métodos de pooling como pool CLS, pool médio, pool de atenção e pool ponderado.

Partindo dos fundamentos da regressão, vamos guiar você em cada etapa: do carregamento e do pré-processamento de dados até o treinamento de modelos usando a validação cruzada do K-Fold e, por fim, fazendo previsões sobre novos dados. Você também vai explorar técnicas de conjunto para melhorar ainda mais o desempenho do seu modelo.

Quer você já esteja familiarizado com o Python e buscando aprofundar sua experiência, este curso fornece todas as ferramentas e modelos de código para ajudar você a construir modelos de NLP de ponta que podem prever tendências, analisar sentimentos e muito mais. Junte-se a nós nesta jornada e domine a arte da análise de regressão baseada em texto!


Nota: esteja ciente de que a voz neste curso é gerada usando IA. Isso permite uma narração e consistência mais claras ao longo das lições.

Referência:

https://github.com/rohitsingh02/kaggle-feedback-english-language-learning-1st-place-solution https://www.kaggle.com/datasets/joebeachcapital/restaurant-reviews https://www.kaggle.com/code/mozattt/fgm-fb3-deberta-v3-base-train https://www.kaggle.com/code/mozattt/fgm-fb3-single-model-deberta-v3-base-inference?scriptVersionId=111084742

Conheça seu professor

Teacher Profile Image

Supermellow AI

AI Developer

Professor

As AI advances, coding is becoming increasingly accessible. We are entering an era where anyone can write code and create programs. Consequently, coding education must evolve to reflect this new reality.We are a company that provides practical information on various computer-related topics, including coding and artificial intelligence, through videos. Our goal is to help individuals and businesses effectively integrate this knowledge into their daily lives and work.

Visualizar o perfil completo

Level: Intermediate

Notes attribuées au cours

Les attentes sont-elles satisfaites ?
    Dépassées !
  • 0%
  • Oui
  • 0%
  • En partie
  • 0%
  • Pas vraiment
  • 0%

Pourquoi s'inscrire à Skillshare ?

Suivez des cours Skillshare Original primés

Chaque cours comprend de courtes leçons et des travaux pratiques

Votre abonnement soutient les enseignants Skillshare

Apprenez, où que vous soyez

Suivez des cours où que vous soyez avec l'application Skillshare. Suivez-les en streaming ou téléchargez-les pour les regarder dans l'avion, dans le métro ou tout autre endroit où vous aimez apprendre.

Transcription

1. Introduction: En quoi consiste exactement le traitement du langage naturel ? En termes simples, la PNL est un domaine de l' intelligence artificielle qui permet aux ordinateurs de comprendre, interpréter et de générer le langage humain Pensez à la PNL comme au processus de transformation du langage naturel en coordonnées Pour le dire plus simplement, cela nous permet de représenter le texte sous forme de points dans un espace de coordonnées. C'est un peu comme un emplacement sur une carte. Une fois que nous avons ces coordonnées, nous pouvons effectuer différents types de processus et d'analyses mathématiques. L'intelligence artificielle peut être divisée en deux grandes catégories. La première catégorie est la régression. La régression est une technique statistique utilisée pour modéliser et prévoir les relations entre les variables. En d'autres termes, la régression est un moyen de déterminer la distribution des données. Il s'agit de trouver la forme et modèle d'une grande quantité de données. La deuxième catégorie est la classification, qui est liée à la régression, mais implique la conversion valeurs numériques en types catégoriques Pour l'instant, concentrons-nous sur la régression. En NLP, la régression consiste transformer le texte en coordonnées, puis à identifier la distribution de ces coordonnées Il s'agit de convertir des données textuelles en valeurs numériques et d'analyser les tendances de ces chiffres. Maintenant, comment appliquer cette méthode dans le monde réel ? Nous pouvons l'utiliser pour prédire le succès des romans ou des scénarios de films. Analysez les paroles des chansons pour déterminer si elles seront des succès, trouvez les scores d'opinion issus des publications sur les réseaux sociaux, évaluez la satisfaction du produit à partir des données d'évaluation et identifiez même des articles de recherche similaires en fonction de leur contenu. Le thème commun de ces exemples est l'utilisation du texte pour trouver des valeurs numériques, et cette méthode peut être appliquée dans toutes les situations où nous devons dériver des nombres à partir de texte. Dans cette vidéo, nous allons démontrer cette technique à l'aide des données d'évaluation des restaurants. Nous trouverons les numéros souhaités dans les avis. Grâce aux progrès de l'intelligence artificielle, PNL a également réalisé des progrès importants Auparavant, la transformation du texte en valeurs numériques était une tâche difficile en raison des nombreuses combinaisons dans lesquelles le texte peut être formé. La même idée ou le même contenu peuvent être exprimés d'innombrables manières. Cependant, avec des modèles d'apprentissage profond tels que RNN, GRU, LSTM et le modèle de transformateur, nous avons commencé à quantifier le nous avons commencé à Grâce à ces modèles, le texte peut désormais être représenté sous forme de coordonnées. C'est là que le concept de régression devient crucial. En identifiant la distribution des données, nous pouvons déterminer des valeurs numériques même à partir de nouvelles données invisibles J'espère que cela vous permettra de bien comprendre comment la PNL et la régression fonctionnent ensemble Permettez-moi de vous montrer une démonstration avec ces données d' évaluation des restaurants. 2. Importer des paquets et des setups: Lorsque vous démarrez Jupiter lab, vous verrez cet écran. Cliquez sur ce bouton de bloc-notes en Python pour créer un nouveau bloc-notes. Maintenant, un nouveau bloc-notes a été créé. Définissons le nom de ce carnet en carnet d'entraînement. Le nom de l'onglet deviendra «   train notebook » en conséquence. Nous pouvons ensuite procéder à l'importation des packages nécessaires. Permettez-moi de vous expliquer brièvement les utilisations de ces packages. Le système d'exploitation est utilisé pour configurer le tokenizer. GC permet d'effacer la mémoire du GPU, et la date, l'heure et les mathématiques servent à créer des noms de fichiers Job lib est utilisé au cas où nous aurions besoin d'enregistrer des fichiers dans ce format. Le hasard est nécessaire pour définir une valeur initiale fixe pour les opérations aléatoires. Le temps est utilisé pour imprimer les journaux pendant l'entraînement du modèle, et les avertissements nous aident à supprimer messages d'avertissement qui n'ont pas impact significatif sur l'exécution normale. Ensuite, nous utiliserons spe num, Pi et Pandas pour les calculs de base et le traitement des données CSV TQ DM est un excellent outil pour montrer les progrès, nous allons donc également l'importer Nous utiliserons Psychic Learn pour gérer les fonctions nécessaires l'évaluation des métriques des données de test et à la validation croisée avec des plis. Ensuite, nous avons chargé les packages relatifs aux transformateurs de torche et aux tokeniseurs Ces bibliothèques sont très importantes pour exécuter le code Assurez-vous donc que les versions correspondent celles fournies dans le fichier Yamel Enfin, le codec, le text Unit Tuple et R sont des packages utilisés pour le prétraitement des données Les versions du transformateur et du tokenizer étant importantes, nous inclurons du code pour vérifier les De plus, nous allons définir une variable d'environnement pour activer le traitement parallèle pour le tokenizer, ce qui permettra au processus de tokenisation de s' Ensuite, nous allons écrire le code pour configurer les paramètres requis pour le modèle. L'utilisation d'un tel fichier de configuration présente de nombreux avantages. Le principal avantage est qu' il vous permet de modifier tous les paramètres nécessaires construction du modèle d'IA en un seul endroit. Lors du réglage du modèle, vous pouvez simplement ajuster cette partie et tester le modèle, c'est pourquoi il est avantageux d'écrire le code de cette manière. Les variables qui entrent dans ces paramètres de configuration doivent généralement être définies une par une dans la classe lorsque vous écrivez le code. Par conséquent, vous pouvez simplement revoir brièvement les valeurs de configuration et passer à autre chose. Il est pratique de gérer les résultats de l'entraînement du modèle s'ils sont stockés dans un dossier spécifique C'est pourquoi j'ai ajouté une valeur de configuration telle que S tier à présent. Comme le modèle est enregistré avec des horodatages, il devient plus facile de gérer les modèles enregistrés. De plus, les valeurs de configuration du train et du débogage sont utiles pour tester le code sans exécuter l'intégralité du processus et sont pratiques lors de l' écriture de code d'inférence Ensuite, nous configurons des paramètres tels que l'emplacement des données d'entraînement, l'emplacement des données de test, le modèle à entraîner et les paramètres associés. Dans cette vidéo, puisque nous allons utiliser des techniques de regroupement, nous allons spécifier la méthode de regroupement à utiliser ainsi que les paramètres associés. En outre, nous allons configurer des paramètres qui permettent gérer efficacement la mémoire pendant l'entraînement des modèles. Paramètres liés au taux d'apprentissage, au nom de la colonne cible, valeurs de départ pour la génération de nombres aléatoires, aux valeurs liées à la validation croisée, ainsi qu'à la taille du lot et à la configuration du GPU. Passons maintenant au code. Commençons par définir la graine. Sd est utilisé pour fixer des valeurs aléatoires. Créons une fonction pour corriger la graine. Nous appellerons cette fonction seed everything. Cette fonction prendra un paramètre appelé Sd et sa valeur par défaut est 42. Nous allons d'abord appliquer cette graine au module aléatoire. Ensuite, nous allons modifier la graine de hachage du système d'exploitation Python. Comme cela nécessite une entrée de chaîne, nous allons convertir la graine en chaîne avant de la définir. Ensuite, nous allons définir la graine aléatoire pour Numpi. Ensuite, nous traiterons les étuis pour la torche séparément. Nous allons écrire du code pour corriger le point de départ aléatoire pour Torch, Torch GPU et CU DNN. La raison de la fixation de ces valeurs aléatoires est d'obtenir des résultats cohérents lors de l'entraînement du modèle. Lors de l'entraînement d'un modèle, de nombreux facteurs aléatoires entrent en jeu, ce qui peut entraîner une fluctuation des indicateurs de performance Par exemple, si vous essayez d' améliorer le modèle à l'aide d'une certaine méthode, mais que les indicateurs d'évaluation ne cessent de changer, vous ne saurez pas si le changement est dû à votre méthode ou simplement au hasard. donc essentiel de fixer des valeurs aléatoires est donc essentiel de fixer des valeurs aléatoires pour éviter cette confusion. 3. Charger les données et le prétraitement: Nous allons charger le fichier CSV du train. Ensuite, nous imprimerons son contenu. Les données se composent de huit colonnes. Mais pour cette vidéo, nous allons nous concentrer sur les colonnes d'évaluation et de notation. La colonne d'évaluation contient des données textuelles rédigées par les utilisateurs, tandis que la colonne d' évaluation contient les valeurs numériques correspondantes. Nous pouvons également constater que les données du test ont la même structure que l'entraînement. Nous utiliserons le texte de ce test pour créer un modèle qui prédit la note. Lorsque vous utilisez du texte, des problèmes d'encodage peuvent parfois survenir. Pour traiter ces problèmes à l'avance, nous allons définir quelques fonctions. Créons une fonction pour gérer les erreurs d'encodage. Cette fonction prend comme argument une erreur Unicode, qui contient des informations sur l'erreur survenue lors du codage. L'essentiel est d'extraire la chaîne problématique de l'objet d'erreur Ensuite, il encode cette chaîne en UTF huit. Nous utiliserons cette fonction lorsque nous devrons convertir des caractères spécifiques en UTF huit pendant le processus de codage La deuxième fonction gérera les erreurs de décodage. De même, il prend également une erreur Unicode comme argument. Tout comme la fonction d'encodage, elle récupère la chaîne de l'objet d'erreur, mais cette fois, elle la décode à l'aide du CP 12 52 Cette fonction sera utilisée lorsque des caractères spécifiques doivent être interprétés comme CP 12 52 pendant le processus de décodage Voyons comment utiliser les deux fonctions dont nous venons de parler. Cette fois, nous utiliserons la fonction d' enregistrement des erreurs du module Code pour enregistrer les gestionnaires d'erreurs que nous avons définis Laisse-moi te le décomposer. Le package Codex est utilisé en Python pour gérer l' encodage et le décodage La fonction register error est utilisée pour enregistrer un nouveau gestionnaire d'erreurs et prend deux paramètres Le premier paramètre est une chaîne qui indique le nom du gestionnaire d'erreurs, et le second est la fonction à appeler en cas d'erreur Une fois que nous avons enregistré ces deux gestionnaires d'erreurs, nous pouvons appeler les fonctions que nous avons définies précédemment chaque fois qu'une erreur survient lors de l'encodage ou du décodage Il est temps d'examiner une fonction qui utilise réellement les gestionnaires d'erreurs que nous avons enregistrés Cette fonction s'appelle résoudre les encodages et normaliser. Son rôle est de normaliser le texte par le biais multiples processus d'encodage et de décodage Passons en revue le code ensemble pour voir ce qui se passe étape par étape. Tout d'abord, il convertit le texte en une séquence d'octets en utilisant le codage d'échappement Unicode brut. Raw Unicode Escape code les caractères Unicode sous forme de séquences d'échappement Ensuite, il décode les octets codés en UTF huit. Si une erreur se produit au cours de ce processus, notre gestionnaire d'erreurs enregistré utilise décodage remplacé par le CP 12 f two pour résoudre le problème Cela permet de résoudre les problèmes rencontrés lors du codage UTF huit en les décodant avec CP 12 f two. Ensuite, le texte maintenant décodé en UTF huit est réencodé en CP 252 Si une erreur se produit à ce stade, il utilise le codage de remplacement avec le gestionnaire d'erreurs UTF huit Ici, les caractères qui ne peuvent pas être codés en C deux sont convertis en UTF huit Enfin, les deux cent 52 octets codés par CP sont décodés en huit UTF. Dans la dernière étape, il utilise la fonction Uni Dcde pour générer la chaîne Lorsque vous utilisez du texte, des problèmes d'encodage peuvent parfois survenir. Pour résoudre ces problèmes à l'avance, nous allons définir quelques fonctions. La principale fonction que nous utiliserons est résoudre les encodages et de les normaliser Pour cette fonction, nous avons défini deux fonctions d'assistance. L'un change les parties problématiques en UTF huit, et l'autre convertit ces parties en CP 12 52 Tout d'abord, nous convertissons le texte en Unicode. Au cours de ce processus, il se peut que la conversion en nœud échoue dans certains cas . Pour gérer cela, nous convertissons toutes les erreurs en CP 12 52 lors de la retransformation du texte. Utilisez CP 12 52 car il s'agit de la méthode de codage utilisée par le système d'exploitation Windows. De nombreux textes sont écrits dans le CP 12 52. Ensuite, nous réencodons le texte entier en CP 12 52, puis nous le convertissons en UTF huit Cette étape permet de s'assurer que le texte est principalement aligné sur l'UTF huit Enfin, lorsque nous décodons le texte en Unicode, nous pouvons constater qu'il a été soigneusement prétraité Examinons un exemple de texte présentant des problèmes d' encodage pour voir comment fonctionne cette fonction. Tout d'abord, nous allons encoder ce texte à l'aide d' échappement Unicode brut et imprimer le résultat Vous devriez pouvoir voir le texte transformé en séquence d'octets. Nous allons décoder le texte transformé en UTF huit et l'imprimer En cas d'erreur, les caractères problématiques auraient été convertis en CP 12 52. Certains textes ont peut-être été décodés à l'aide CP 12 52 en raison d'une erreur Cette fois, nous allons l' encoder en utilisant CP et 12 sur deux, puis l'imprimer à nouveau. De cette façon, vous pourrez voir le texte encodé avec CP 12. Toutes les parties où des erreurs sont survenues seront recopées en UTF huit. Décodons à nouveau le texte codé en UTF huit et modifions-le ce processus, vous verrez comment le texte est progressivement corrigé. En appliquant la fonction de code unitaire pour décoder le texte. Nous pouvons obtenir la version finale du texte. Nous pouvons examiner comment le texte présentant des problèmes d'encodage est transformé à l'aide de la fonction que nous avons développée. De plus, nous allons créer une fonction qui simplifie le processus de tokenisation en définissant des jetons spéciaux Cette fonction renverra simplement des jetons spéciaux sous forme de dictionnaire, nous ne définirons donc aucun paramètre. Dans la fonction, nous allons créer un dictionnaire dans lequel le texte que nous voulons remplacer sert de clé et le texte de remplacement est la valeur. Je remplacerai les parties du texte écrites sous la forme n par le jeton BR. Si vous souhaitez effectuer des remplacements supplémentaires, vous pouvez simplement ajouter d'autres entrées au dictionnaire Enfin, la fonction renverra ce dictionnaire. Nous allons créer une fonction qui transforme le texte saisi à l'aide de la fonction que nous avons définie précédemment. Nous allons récupérer les jetons spéciaux , puis utiliser les paires clé-valeur pour modifier le texte en remplaçant toutes les occurrences de la clé par la valeur correspondante. La fonction renverra le texte modifié. En appliquant cette fonction, nous pouvons gérer les nouveaux caractères de ligne plus efficacement, regroupant et n en un seul jeton au lieu de les tokeniser séparément. Cette approche présente l'avantage de rendre le texte lisible lors l'analyse en remplaçant ces éléments par des jetons plus visibles. Créons la fonction de prétraitement finale. Cette fonction prendra le texte comme paramètre. Tout d'abord, les encodages de résolution et la fonction normalisée seront appliqués au texte pour résoudre éventuels problèmes d'encodage Ensuite, si des jetons spéciaux doivent être transformés, la fonction de remplacement des jetons spéciaux est appliquée pour effectuer ces modifications. Enfin, la fonction renverra le texte modifié. Passons en revue un exemple pour voir comment fonctionne la fonction que nous venons de créer. Vous remarquerez que dans le texte modifié, la barre oblique N a été remplacée par le jeton BR Nous allons maintenant configurer une variable appelée identifiant. Cette variable n'a pas de signification significative. Il est simplement utilisé pour nommer le processus de formation lorsque le modèle est en cours d'entraînement. Un identifiant sera créé en utilisant le nom du modèle et l' heure à laquelle le code a été exécuté. Cela permet de savoir quel modèle a été utilisé et quand il a été exécuté. L'instruction if sera utilisée pour extraire uniquement le nom du modèle. La plupart des noms de modèles sur le visage étreint sont séparés par une barre oblique, qui divise le nom de l'entreprise et le nom du modèle En divisant la chaîne au niveau de la barre oblique et en sélectionnant l'index approprié, le nom du modèle peut être récupéré S'il n'y a pas de nom de société, le nom du modèle est pris directement. L'heure actuelle stockée sous la forme S star now dans la configuration sera ensuite ajoutée au début du nom du modèle. Après l'impression, un identifiant unique composé de l'heure et du nom du modèle est généré. Cette variable sera utilisée lors de la sauvegarde du modèle. Étant donné que des fichiers spécifiques sont générés à chaque exécution du code, cet identifiant permet de distinguer ces fichiers afin d'éviter qu'ils ne soient écrasés Comme le cadre de données d'entraînement sera fréquemment utilisé, je vais l'ajouter à la configuration en tant que train DF variable. Lorsque vous imprimez le train DF, vous verrez qu'il s'agit du même bloc de données d' entraînement que celui que nous avons imprimé précédemment. Nous allons effectuer un prétraitement de base sur le bloc de données d'entraînement. Dans ce modèle, la colonne de notation, qui est définie comme valeur cible, ne peut pas contenir de valeurs NAN. Nous allons donc écrire un code pour supprimer toutes les lignes contenant des valeurs NAN. Nous utiliserons la fonction dropna de Pandas, en spécifiant le paramètre du sous-ensemble comme colonne de notation pour supprimer Imprimons le bloc de données pour vérifier les résultats. Heureusement, il n' y a aucune valeur NAN dans la colonne d'évaluation de ce bloc de données. S'il y avait eu des valeurs NAN, certaines lacunes seraient apparues dans l'indice. Pour gérer cela, nous allons écrire du code pour réinitialiser l'index. À l'aide de la fonction de réinitialisation de l'index de Pandas, nous allons définir le paramètre drop sur true pour supprimer l'ancien index et en générer un nouveau Ensuite, bien que la colonne de révision soit probablement déjà définie sur des chaînes, nous allons explicitement changer son type de données en chaîne avant de l'utiliser. De même, nous allons modifier le type de données de la colonne de notation. Parfois, lors du chargement d'un bloc de données, les données sont chargées sous forme de chaînes. La colonne de notation étant composée de données numériques sous forme d'entiers, nous allons convertir son type de données en int Nous utiliserons la méthode d'application dans la colonne de révision pour appliquer le texte préalable au traitement. Cela nous permettra d' obtenir les résultats de pré-traitement pour tout le texte de la colonne de révision. Enfin, nous n'extrairons que les colonnes d'évaluation et de notation du châssis du train DFC car ce sont les valeurs d'entrée nécessaires Une fois que nous avons vérifié le bloc de données, il s'affichera comme indiqué ci-dessous. Le prétraitement de base pour le train DF étant terminé, nous allons maintenant ajouter certaines variables fréquemment utilisées au. À l'aide de l'identifiant, nous allons définir le dossier dans lequel le modèle sera enregistré et également stocker le chemin pour enregistrer le fichier journal dans un v. Ajoutons la colonne de pliage au cadre de données du train DF. La raison de la configuration des plis est d' appliquer une validation croisée à K plis. Nous allons créer une colonne de pliage initialisée avec Nags one, une valeur d'espace réservé À l'aide du pli K stratifié, nous allons créer un objet de pliage basé sur la valeur d'enfold définie dans la Nous allons définir la valeur true et utiliser le CV de Config pour l'état aléatoire. Ensuite, nous allons modifier la colonne de pliage dans le train de partitions DF à l'aide de l'objet de pliage. Après avoir divisé les données avec le split par points, nous utiliserons enumerate pour attribuer le numéro de pli n aux lignes incluses dans l'index valide Ici, l'indice du train représente les indices restants qui ne figurent pas dans l'index valide. Ces indices seront utilisés pendant l'entraînement, tandis que l'indice valide est uniquement destiné à la validation. Bien que les valeurs de pliage soient naturellement des entiers, nous les convertirons explicitement en int dans le code Après avoir vérifié les données, vous constaterez que les valeurs de pliage ont été mises à jour en fonction de la division du pli. Nous utiliserons une instruction if pour vérifier la variable train dans la configuration. Comme la variable train est définie sur true dans la configuration, le code contenu dans le bloc I sera exécuté. Étant donné que ces codes gèrent le prétraitement de la trame de données d'entraînement et les opérations associées, leur conservation permettra de les modifier ou de les mettre à jour plus facilement à l'avenir. Ensuite, nous allons ajouter du code pour activer le mode de débogage. La variable de débogage nous permet de vérifier rapidement si le code fonctionne correctement ou si des erreurs se produisent L'utilisation d'une instruction if pour vérifier la valeur de débogage dans la configuration réduira le nombre d'époques, car elle est destinée aux tests De plus, comme il n'est pas nécessaire de tester tous les plis, les valeurs du pli TRN seront réduites à deux Comme précédemment, nous allons vérifier la variable train et, au lieu de tester l'ensemble de la trame de données, le code échantillonnera un sous-ensemble de données à des fins de test La fonction d'échantillonnage sera utilisée pour tester environ 1 000 points de données, et l'état aléatoire est défini sur la valeur initiale de la configuration. Comme les données d'échantillon ne comporteront pas d'indices séquentiels, nous appliquerons également une réinitialisation Enfin, l'utilisation de OS makes créera le dossier de sortie tel que spécifié dans la configuration. En définissant le paramètre exist k sur true, le code remplacera le dossier s'il existe déjà Nous imprimerons le chemin pour nous assurer qu'il a été correctement défini. Imprimons à nouveau le train DF pour confirmer que les valeurs de pliage ont été correctement générées. De plus, en vérifiant le chemin actuel, nous pouvons vérifier que le dossier de sortie a été créé avec succès. 4. Enregistreur et tokenizer: Définissons l'enregistreur. L'utilisation d'un enregistreur vous permet d' imprimer et de vérifier facilement les informations souhaitées, telles que les détails du modèle et les progrès de l'entraînement Tout d'abord, nous chargeons le package nécessaire à la création de l'enregistreur. Ensuite, nous utilisons Get logger pour créer l'enregistreur. Il faut une variable appelée name, mais pour l'instant, vous pouvez considérer cela comme un code de base nécessaire lors de la création d'un enregistreur Ensuite, nous définissons le niveau de l'enregistreur. Cela détermine la quantité de messages du journal qui sera affichée. Il existe différents niveaux : information, avertissement, erreur et critique. Ici, nous utiliserons le niveau d'information. Le gestionnaire décide où envoyer les messages du journal. Nous allons définir un gestionnaire pour la console et un autre pour un fichier Nous définissons également comment formater les messages du journal. Et dans ce cas, nous ne publierons que la partie message du journal. Après avoir ajouté ces gestionnaires à l'enregistreur. Nous définissons une fonction pour le renvoyer. Créons une variable appelée logger, en utilisant la fonction get logger En utilisant la méthode info de l'enregistreur, vous verrez les informations imprimées sur la console Lorsque vous utilisez cet enregistreur pour imprimer le répertoire de sortie, les informations sont affichées via l'enregistreur Maintenant, configurons le tokenizer. Nous avions auparavant une fonction qui stockait des jetons spéciaux dans un dictionnaire pendant le prétraitement. Nous utiliserons cette fonction pour nous assurer que ces jetons sont correctement tokenisés lors de la configuration du Nous allons attribuer la variable de remplacement des jetons spéciaux en appelant la fonction « obtenir des jetons spéciaux supplémentaires ». Cela stockera le dictionnaire des jetons que nous voulons remplacer. Comme la fonction tokenizer nécessite les jetons sous forme de liste, ne convertira que les valeurs du dictionnaire en liste Nous allons configurer le tokenizer à l' aide du tokenizer automatique, passant le modèle et tous les jetons spéciaux définis précédemment En configurant le tokenizer de cette façon, nous pouvons nous assurer que les jetons spéciaux sont reconnus comme des jetons uniques et ne sont pas divisés en plusieurs parties distinctes Puisque nous avons ajouté de nouveaux jetons au tokenizer, nous allons les enregistrer afin que le tokenizer puisse être chargé avec le modèle ultérieurement Vous devriez être en mesure de voir les tracés enregistrés en cours d'impression. Imprimons ensuite la longueur maximale. La longueur maximale représente la longueur maximale lors de la tokenisation du texte, et c'est un facteur crucial lors de l'entraînement du modèle L'avantage d'utiliser une longueur maximale plus élevée est qu'elle nous permet de conserver plus d' informations à partir de textes plus longs. Cependant, l'inconvénient est qu' une longueur maximale plus élevée augmente le coût de calcul Pour cet exemple, nous allons définir la longueur maximale à 128. Nous allons maintenant passer un exemple pour comprendre ce que fait le tokenizer abord, jetez un coup d'œil à un examen des données d'entraînement et tokenisez-le. Récupérons la première entrée de la colonne de révision dans le train DF. Vous pourrez voir le texte de pré-traitement. Ensuite, nous allons encoder ce texte à l'aide du tokenizer. À l'aide du tokenizer défini, nous passerons l'exemple précédent en paramètre et définirons des options telles que les tenseurs de retour, l' ajout de jetons spéciaux, la longueur, rembourrage et la troncature. Ensuite, nous exécuterons le code. Lorsque nous examinons la sortie tokenisée, nous pouvons voir qu'elle se compose d'identifiants d'entrée, d'identifiants type de jeton et de masques d' attention, qui sont des listes de nombres Les identifiants d'entrée représentent des mots qui ont été convertis en nombres entiers spécifiques Chaque modèle possède un vocabulaire qui fait correspondre les mots aux nombres, et ce mappage est utilisé pour convertir le texte en format numérique Les identifiants de type jeton sont utilisés pour distinguer les phrases. La plupart des modèles basés sur Bert peuvent traiter deux phrases simultanément. mots de la première phrase sont marqués d'un zéro et ceux de la deuxième phrase sont marqués d'un. Il existe des jetons spéciaux pour séparer les phrases. Mais dans cet exemple, nous n'en avons inclus aucune Toutes les valeurs sont donc nulles. Le masque d'attention indique quelles parties de l'entrée doivent être ignorées par le modèle. Après avoir défini la longueur maximale de la phrase d'entrée, modèles basés sur des transformateurs ajoutent zéro jeton à la fin de l'entrée pour qu'elle corresponde à cette longueur. Comme ce rembourrage est uniquement destiné à l'alignement, masque d' attention est utilisé pour s'assurer que ces pièces rembourrées ne sont pas prises en compte dans les calculs des modèles Étant donné que cette partie peut affecter formation des modèles, nous la commenterons. Nous allons créer une fonction appelée prepare input, qui fonctionnera de la même manière que dans l'exemple que nous avons vu. La fonction prendra et comme paramètres. Les entrées seront définies la même manière que nous avons appliqué le tokenizer au texte plus tôt, avec tous les paramètres définis exactement de la La seule étape supplémentaire consiste à convertir le type de données en to afin qu'il puisse être utilisé dans Torch. Ensuite, nous allons créer une fonction appelée colate. Les entrées sont les entrées groupées. La raison de la création de cette fonction est d'utiliser plus efficacement la mémoire du GPU, améliorant ainsi la vitesse d'entraînement du modèle dans les limites des ressources disponibles. Nous allons d'abord déterminer la longueur du masque, qui est la longueur du texte le plus long de chaque lot. Dans les entrées, nous allons additionner les valeurs du masque d' attention et trouver la longueur la plus longue. Ensuite, nous réduirons toutes les entrées du lot à cette longueur. Nous allons parcourir les paires de valeurs clés et les entrées et définir la longueur maximale comme longueur du masque. Ce processus permet de raccourcir les textes à une longueur spécifique, ce qui accélère le calcul Enfin, nous retournerons les entrées. 5. Créer un ensemble de données: Ici, nous allons transformer les données d'entraînement dans un format utilisable avec PyTorch Lors de la création de l'ensemble de données, nous définirons la configuration et le bloc de données en tant que paramètres. Après avoir configuré la configuration, nous utiliserons le bloc de données pour créer le texte et les étiquettes. Nous définirons le texte selon les valeurs de la colonne de révision du bloc de données, et les étiquettes seront définies sur la colonne cible, qui correspond aux valeurs d'évaluation. La fonction qui renvoie la longueur de l'ensemble de données sera basée sur la longueur du texte. Lorsque vous accédez à l' ensemble à l'aide d'un index, nous utiliserons la fonction définie précédemment pour renvoyer à la fois l' entrée et l'étiquette. 6. Définir les méthodes de mise en commun: Dans cette vidéo, nous allons examiner en détail le pool. Dans le traitement du langage naturel, regroupement est utilisé pour extraire des caractéristiques importantes du texte. La première technique de mise en commun que nous aborderons est la mise en commun CLS. Il s'agit de la méthode de regroupement la plus élémentaire du NLP car le jeton CLS lui-même contient des fonctionnalités importantes Le jeton CLS est placé au début d'une phrase lors de la tokenisation et est conçu pour représenter l' intégralité de la séquence de texte En d'autres termes, ce jeton porte le sens de la phrase entière. Les modèles basés sur des transformateurs utilisent le mécanisme d'attention, qui identifie les informations clés du texte. Le jeton CLS placé au début interagit avec les autres dans la phrase, ses informations Puis, en fin de compte, accumule et reflète le sens général de la phrase La première technique de regroupement que nous allons créer est une couche qui extrait ce jeton CLS. Le pooling CS sera implémenté à l'aide du module nn. Puisque nous créons une couche, nous allons définir la méthode init et créer la méthode forward La méthode directe suppose que les entrées ont été transmises au modèle. Lorsque les entrées sont introduites dans le modèle, les sorties nous indiquent le dernier état caché. Ce dernier état masqué sera considéré comme un paramètre et définira également le paramètre du masque d'attention avec une valeur par défaut nulle. Le dernier état masqué peut être considéré comme l' information récapitulative clé laissée fois que le modèle a traité toutes les données. À partir de là, nous allons extraire et renvoyer le premier jeton, connu sous le nom de jeton CLS. Dans cette vidéo, nous allons créer différentes techniques de mise en commun. Examinons d'abord comment l'entrée change à l'aide d'un exemple. Créez ensuite des méthodes de mise en commun basées sur cela. Nous allons commencer par configurer des exemples de données pour dernier état masqué et le masque d'attention. Dans le masque d'attention, un indique un jeton valide et zéro représente un jeton de rembourrage Nous allons définir une variable appelée masque de saisie expansé. Cette variable étend le masque pour qu'il corresponde à la taille du dernier état masqué, ce qui permet de prendre en compte de manière sélective certaines parties du dernier état masqué. Tout d'abord, appliquez le chiffre neuf est un sur le masque d'attention, en ajoutant une nouvelle dimension à la fin Cela changera un tenseur de taille 24 en 241. Ensuite, appliquez expand pour étendre le tenseur à 243 afin qu' il corresponde à la taille du dernier état caché La fonction d'extension se comporte comme si elle répétait des valeurs le long des dimensions étendues Enfin, remplacez le type de données par float. Au départ, les valeurs sont des entiers, mais nous les convertissons en nombres flottants pour les utiliser dans des opérations ultérieures Nous allons étendre ce masque pour appliquer des pondérations uniquement aux jetons valides dans chaque valeur du dernier état caché, ignorant les jetons rembourrés. Maintenant, nous multiplions le dernier état masqué par le masque de saisie développé pour ne conserver que les données valides. Ensuite, nous calculons la somme selon la dimension 1, qui correspond aux jetons de chaque séquence. Cette étape fait la somme des valeurs de tous les jetons valides de chaque séquence, combinant efficacement les vecteurs d'état cachés par jeton en un seul. Cela nous permet de condenser les informations de la séquence entière en une seule Ensuite, nous attribuons le résultat du masque de saisie de sommation étendu le long de la dimension 1 à une variable appelée masque de somme Cette somme représente le nombre de jetons valides dans chaque séquence. Nous utilisons ensuite la fonction de serrage pour limiter la valeur minimale du masque. Cela empêche la division par zéro, ce qui peut se produire si une séquence ne contient aucun jeton valide ou si elle consiste uniquement en un remplissage Enfin, nous divisons certaines intégrations par un masque pour calculer la moyenne Cela nous donne les intégrations moyennes, qui représentent le sens général de l'ensemble de la phrase Résumons les étapes précédentes et créons une couche de regroupement moyenne. Nous allons commencer par hériter du module N N et définir la méthode d'initialisation R. Nous allons ensuite créer un masque de saisie étendu et écrire le code de la même manière que dans l'exemple précédent. Nous ne conserverons que les jetons valides, les additionnerons et calculerons le masque de somme pour obtenir le nombre de jetons valides. Nous ne conserverons que les jetons valides, les additionnerons et calculerons le masque pour obtenir le nombre de jetons valides. Ensuite, nous nous assurerons que la valeur minimale du masque n'est pas nulle avant de procéder à la division. Ck. Enfin, nous créons une couche qui renvoie les intégrations moyennes Les prochaines méthodes de mise en commun que nous allons définir sont la mise en commun et la mise en commun. Ces méthodes représentent une phrase utilisant les valeurs maximale et minimale des jetons. Tout comme dans le cas de la mise en commun des moyennes, nous allons d'abord étendre le masque. L'intégration représente le dernier état masqué. En termes simples, une intégration est un vecteur qui représente la phrase Tout d'abord, nous remplaçons les jetons non valides dans l'intégration par une très petite valeur négative Ensuite, nous utilisons la fonction pour créer une intégration en utilisant les plus grandes valeurs parmi les jetons Ensuite, nous allons implémenter le pool minimal, qui est similaire au pool maximal. La différence est que nous remplaçons les jetons non valides par une valeur positive élevée. Comme dans Max Pooling, nous étendons le masque et créons l'intégration. Ensuite, nous remplaçons les valeurs non valides un grand nombre et appliquons la fonction pour créer l'intégration Cette méthode génère une intégration qui représente la phrase en utilisant les plus petites valeurs parmi les jetons La prochaine technique de mise en commun que nous créons utilise le concept d'attention Avant de renforcer la mise en commun de l' attention, nous devons organiser à l'avance certaines activités requises. La mise en commun de l'attention est plus complexe que les méthodes de regroupement CLS, Mean, Max et Min décrites précédemment méthodes de regroupement CLS, Mean, Max et Min préparons donc ces fonctions à l'avance pour améliorer la lisibilité Nous allons écrire le code en fonction de la sortie du modèle. Nous allons créer une fonction pour extraire le dernier état masqué. Cette fonction utilisera les sorties du backbone ou les sorties des modèles comme paramètre et utilisera l'indexation pour obtenir le dernier état caché, qu'elle retournera Ensuite, nous allons créer une fonction pour obtenir tous les états cachés. Comme pour la fonction précédente, nous utiliserons Index 1 pour obtenir tous les états cachés et les renvoyer. Enfin, nous allons créer une fonction pour extraire l'identifiant et le masque d'attention des entrées. À l'aide d'un tokenizer, des entrées seront générées, et cette fonction séparera et renverra l'identifiant d'entrée et le masque d'attention À l'aide des fonctions que nous avons créées précédemment, nous allons implémenter une méthode de regroupement basée sur le mécanisme d' attention. Regardons un exemple pour voir comment créer une intégration de représentation de phrases Nous allons importer le modèle automatique et tokenizer automatique depuis la bibliothèque des transformateurs Ensuite, nous allons charger le modèle et le tokenizer. Le modèle de base sera celui défini dans la configuration. Nous préparerons ensuite un exemple de texte. À l'aide du tokenizer, nous allons créer les entrées, où les paramètres incluront le texte et définirons les tenseurs de retour sur les tenseurs de torche Pi Nous ajouterons également un rembourrage et tronquerons le texte pour qu'il corresponde à la longueur maximale Comme nous ne nous entraînons pas pour le moment, nous n'utiliserons aucun grade pour générer les résultats. Lors de la saisie dans le modèle, nous transmettrons les entrées et définirons les états cachés de sortie sur true pour récupérer les états cachés de chaque couche À partir des sorties du modèle, nous utiliserons la fonction get all hidden states pour récupérer tous les états cachés. Maintenant, imprimons tous les états cachés et leur forme. La raison pour laquelle nous avons 13 états est que le premier inclut l'intégration des entrées La base De Berta comporte 12 couches au total. Nous allons extraire les jetons CLS de ces 12 états cachés et empiler les données Imprimons les encastrements CLS et vérifions leur forme. En extrayant les jetons CLS, nous avons obtenu des intégrations de représentation de phrases intégrations Enfin, nous allons réorganiser les données à l'aide de la fonction d'affichage. Ensuite, nous allons appliquer le concept d'attention. Pour ce faire, nous allons créer une requête. Ceci est basé sur le concept du mécanisme d' attention. Nous allons le définir comme un paramètre pouvant être appris et initialiser pour qu'il suive une Comme le vecteur sera utilisé dans cet exemple, nous allons le déplacer vers le processeur plutôt que vers le processeur graphique. Imprimons également la forme de Q. Puisque nous allons réaliser un produit par points entre ce vecteur et les états cachés, nous allons d'abord transposer Q. En utilisant le produit par points, nous calculons l' importance de chaque couche Pour convertir ces scores importants en valeurs de 0 à 1, nous appliquons soft max. De cette façon, nous pouvons comprendre l'importance relative de chaque couche. Ensuite, nous appliquerons la somme pondérée aux états cachés à l'aide de ces valeurs. abord, nous devons faire correspondre la taille des vecteurs dans les états cachés. Pour ce faire, nous allons utiliser la fonction seed pour modifier la forme de V , puis permuter les deux dernières dimensions afin garantir la forme correcte pour les opérations ultérieures. Le V résultant sera la somme pondérée des états cachés. Enfin, nous allons créer une matrice de pondération. Cette matrice effectuera une transformation linéaire sur V temp, convertissant la dimension d'entrée en dimension de sortie Cette transformation aide le modèle à apprendre et stocker des informations clés dans le vecteur pendant l'entraînement. En soulignant les caractéristiques importantes du vecteur d'entrée et en le convertissant en v de sortie, nous créons le vecteur final, qui peut être utilisé pour la tâche suivante, classification, dans ce cas. Créons une couche de mise en commun de l'attention en basant sur l'exemple que nous venons de passer en revue. Nous utiliserons le module N N do, et dans la méthode score it, les paramètres nécessaires incluront le nombre de couches cachées, taille cachée, le DMF C caché et le taux d'abandon Nous les définirons comme des variables de classe. De plus, nous définirons le périphérique de calcul, ainsi que le tenseur de requête, le tenseur poids et le résultat, comme Ensuite, nous allons écrire le reste du code. Dans le code, vous remarquerez que le processus de calcul de l'importance basé sur le concept de l'exemple précédent a été implémenté dans la méthode d'attention. Nous avons également appliqué le décrochage pour éviter le surajustement. Pour résumer ce code, cette couche implémente un mécanisme de mise en commun de l'attention qui extrait des informations importantes des états cachés calculés sur plusieurs couches d'un modèle de transformateur. Il utilise un vecteur de requête pour calculer les poids pour les états cachés de chaque couche, puis crée la représentation de phrase finale incorporée en faisant la moyenne pondérée des informations importantes des couches Examinons maintenant un exemple de couche de mise en commun pondérée. abord, nous définissons une variable appelée début de couche, qui détermine à partir de quelle couche la moyenne pondérée débutera. S'il existe une valeur initiale pour les pondérations des couches, nous la définirons. Dans le cas contraire, nous lui attribuerons la valeur none. Ensuite, nous définissons le nombre de couches cachées num, qui dépend du modèle utilisé. Puisque nous utilisons le modèle de base De Berta, nous allons le définir sur 12. Nous allons maintenant configurer les pondérations des couches. Si la valeur initiale n'est pas définie et est nulle, nous allons entrer un paramètre avec une pondération de un pour toutes les couches à partir du début des couches. Ce paramètre sera automatiquement optimisé lors de l'entraînement. Nous utilisons la fonction stack pour empiler les sorties de plusieurs couches en un seul tenseur Notez que les couches antérieures au début de la couche ne sont pas utilisées. T. Ensuite, nous utilisons la compression pour augmenter la dimension des tenseurs afin de pouvoir multiplier les sorties de chaque couche par les poids Ensuite, nous additionnons les sorties pondérées de chaque couche et les divisons par la somme des poids pour calculer la moyenne pondérée. En utilisant les méthodes que nous avons appliquées précédemment, nous allons créer un pool pondéré. Le résultat final sera le jeton CLS avec la moyenne pondérée appliquée Cette méthode de regroupement prend les résultats de plusieurs couches et en fait la moyenne en fonction de leur pondération Il est conçu pour refléter les informations des couches les plus importantes en leur attribuant une pondération plus élevée dans la moyenne. Ainsi, toutes les méthodes de mise en commun que je souhaitais partager sont désormais créées. Je pense que cette partie est la plus cruciale de cette vidéo d'apprentissage automatique. La raison en est que l'utilisation de ces techniques vous permet de créer une variété de modèles. Selon le modèle de base, vous pouvez générer six modèles différents. Quel est donc l'avantage de cette approche ? Il vous permet d'aborder le problème sous différents angles à l' aide d'un seul modèle. Si ces modèles sont bien entraînés, vous pouvez les assembler pour obtenir des résultats encore meilleurs. En fait, il vous permet de résoudre le problème de plusieurs manières en utilisant un seul 7. Créer un modèle personnalisé: Créons maintenant un modèle à l'aide de ces couches. De bonnes techniques de mise en commun étant déjà en place, la génération du modèle est relativement simple. Nous utiliserons ces méthodes de regroupement pour créer un modèle de régression. Nous utiliserons le module N N pour construire le modèle, avec des paramètres de configuration et de pré-entraînement. Ces variables indiquent la configuration et indiquent s'il faut utiliser un modèle préentraîné. Par défaut, nous nous entraînerons à partir de zéro Nous leur donnerons donc la valeur n et la valeur false. Et si une instruction sera écrite pour vérifier la présence de la configuration. S'il n'est pas présent, nous enregistrerons le fichier de configuration dans le répertoire de sortie. Pour enregistrer les détails de configuration au démarrage du modèle, nous utiliserons un enregistreur pour vérifier comment le modèle est initialisé Ensuite, nous allons configurer le modèle, selon qu'un modèle pré-entraîné est utilisé ou non. Ensuite, nous utiliserons la variable de point de contrôle du gradient définie dans Config L'avantage de ce code est qu'il permet d'économiser de la mémoire. C'est utile lorsque l'entraînement grands modèles est difficile en raison d'une mémoire limitée. Ce code n'enregistre pas toutes les sorties intermédiaires pendant l'entraînement. Il ne sauvegarde de manière sélective que les éléments importants. Les pièces qui ne sont pas enregistrées sont recalculées ultérieurement en cas Je préfère que le modèle soit intégré à la mémoire du GPU plutôt que de gagner du temps Je vais donc utiliser cette méthode. Ensuite, nous allons configurer la couche de regroupement à l'aide la méthode de regroupement définie dans Config. Avant de définir la méthode directe, nous allons créer une méthode pour la simplifier. Cette méthode renvoie les entités générées après avoir transmis l'entrée à la couche de regroupement. Ensuite, nous allons créer la méthode de transfert. Les entrées du modèle passeront par la méthode de regroupement , puis par une couche linéaire requise pour la régression. La sortie générée ici sera le résultat final après avoir parcouru le modèle. 8. Fonction de perte, mesures et fonctions d'aide: Nous allons créer une métrique pour évaluer le modèle. Nous utiliserons l'APA de Cohen comme métrique d'évaluation. Les valeurs des données de révision sont des nombres entiers, et plus les valeurs prédites sont proches de ces nombres entiers, meilleure est la prévision Par exemple, si un avis est noté trois, il est plus précis de le prévoir comme quatre que de le prédire comme Cette métrique prend en compte ces aspects et exprime les performances du modèle sur une échelle allant de 1 à 1 MG C'est un excellent indicateur lorsqu'il s'agit de données telles que les avis. Pour implémenter cet encodage, nous convertissons d'abord les prédictions du modèle en valeurs de 1 à 5 Ensuite, nous utilisons le CAPA de Cohen fourni par Psych Learn pour calculer le résultat Plus tôt, nous avons écrit une fonction pour calculer l'APA de Cohen. Préparons maintenant une fonction supplémentaire pour gérer plusieurs cas de régression dans lesquels il existe plusieurs valeurs cibles. Dans cette fonction, nous supposons que la cible y peut avoir plusieurs valeurs. Nous calculons l'APA de Cohen pour chaque cible, puis renvoyons à la fois la valeur métrique moyenne pour toutes les cibles et les valeurs métriques individuelles. Nous allons modifier le score GT pour utiliser le f de Cohen et afficher uniquement le résultat. De cette façon, si nous devons modifier la métrique dans un code similaire à l'avenir, cela peut être fait facilement. Nous allons écrire la fonction G score séparément à cette fin. Nous allons créer une classe appelée Average Meter. Ce cours est un utilitaire permettant accumuler des valeurs et de calculer leur moyenne, couramment utilisé pour suivre des indicateurs tels que la perte ou précision pendant le processus de formation des modèles de deep learning. Le cours est mis à jour périodiquement pour gérer la valeur actuelle, la valeur cumulée et la moyenne, ce qui permet de suivre l'évolution des pertes tout au long de l'entraînement. Dans la méthode init, lorsque cette classe est appelée, elle réinitialise toutes les valeurs initiales La méthode de réinitialisation mettra toutes les valeurs à zéro. Ici, Val représente la valeur actuelle. AVG est la valeur moyenne, somme est la somme cumulée des valeurs et le nombre est le nombre de valeurs saisies La méthode de mise à jour prend une nouvelle valeur et elle est prise en compte pour mettre à jour l'état actuel. Cette méthode peut être appelée à chaque itération pour mettre à jour la valeur de perte ou d'autres mesures Ce cours fournit un moyen pratique de suivre la valeur des pertes ou d'autres indicateurs pendant l'entraînement. Le temps est un facteur crucial pour comprendre le processus de formation du modèle. Il est important de savoir dans quelle mesure l'entraînement a progressé et combien de temps il reste Pour y remédier, nous allons créer des fonctions permettant de suivre le temps. Créons d'abord une fonction qui convertit le temps de quelques secondes en minutes. Nous allons créer une fonction pour afficher le temps consacré à la formation des modèles et le temps restant. Tout d'abord, l' heure actuelle sera enregistrée. Ensuite, en fonction de l'heure de début fournie, la fonction calculera le temps écoulé et le temps restant, renvoyant ces informations sous forme Représente maintenant l'heure actuelle tandis que S est la différence entre l'heure de début et l'heure actuelle en secondes. La valeur divisée par pourcentage indique la progression de l'entraînement, qui sera déterminée par la durée de ta. La valeur divisée par le pourcentage indique la progression de la formation, qui sera ensuite déterminée par la longueur du chargeur de train. Ainsi, en soustrayant S de ES, on obtient le temps restant et S indique le temps déjà consacré Formatons ces valeurs dans une chaîne pour la sortie. Définissons maintenant la fonction de perte. Dans l'analyse de régression, la fonction de perte la plus couramment utilisée est le RMSE, erreur quadratique moyenne Nous inclurons un paramètre de réduction pour déterminer le mode de calcul de la perte . Dans ce carnet de formation, nous utiliserons mean. Voici comment nous allons créer la classe de pertes RMSE. 9. Fonctions de formation et de validation: Créons ensuite une fonction pour entraîner le modèle. Les paramètres de cette fonction incluent le pliage, le chargeur de train, le modèle, le critère, l'optimiseur, l' EPOC, le planificateur Les paramètres de cette fonction incluent le pliage, le chargeur de train, le modèle, le critère, l'optimiseur, l' EPOC, le planificateur Pour expliquer chaque paramètre en détail, pli fait référence au pli utilisé pour l'entraînement. Train Loader est le chargeur de données d'entraînement. Le modèle est le modèle. Le critère est la fonction de perte. L'optimiseur est l'optimiseur. EPOC est le numéro d'EPOC. planificateur gère le taux d'apprentissage et l'appareil indique s'il faut utiliser le processeur ou le GPU pour Nous utilisons la classe moyenne des compteurs pour suivre les pertes et mettre le modèle en mode entraînement. Ensuite, nous créons un objet scalaire de grade pour optimiser la mémoire et la vitesse de calcul Si l'Apex de CFG est vrai, nous pouvons réduire la précision pour accélérer l'entraînement Comme mentionné précédemment, les méthodes que je partage sont conçues pour que le modèle soit entraîné principalement sur le GPU, c'est pourquoi nous utilisons ces techniques d'optimisation. Nous enregistrons le temps de formation et créons une variable pour suivre le nombre total d' étapes du processus de formation. Nous chargeons ensuite les données pour chaque lot , les entrées étant les données d'entrée et les étiquettes les valeurs cibles. Nous plaçons le masque d'attention à partir des données d'entrée sur le GPU ou le processeur. Comme les modèles sont généralement entraînés sur GPU, nous l'avons configuré de cette façon Nous appliquons ensuite la fonction Cate aux entrées et déplaçons l' entrée vers le GPU. Cela est nécessaire car le modèle et les entrées doivent se trouver sur le même appareil pour que les calculs puissent être effectués. Les étiquettes cibles sont également déplacées vers le GPU et la taille du lot actuel est stockée. À l'aide d'opérations de mémoire efficaces, nous transmettons les entrées au modèle pour obtenir des prédictions, puis nous calculons la perte en fonction de ces prédictions. Si le pas d'accumulation du gradient est supérieur à un, nous l'utilisons pour calculer la perte. L'utilisation de l' étape d'accumulation de gradient nous permet d'imiter fait d'avoir une plus grande mémoire GPU en accumulant des Lorsque la taille de la mémoire du GPU est petite, la taille du lot doit également être petite. Cependant, avec cette méthode, même si la taille du lot est petite, nous pouvons cumuler les calculs pour obtenir une taille de lot approximative plus grande. Récemment, grâce à ces paramètres variables, il est devenu possible d'utiliser de grands modèles même avec une mémoire limitée. Le point essentiel que je souligne est que si le modèle peut effectuer une seule boucle d'entraînement au sein du GPU, il peut être entraîné efficacement. Par conséquent, si vous ne pouvez pas entraîner le modèle en raison de limites de taille de lot, réduisez la taille du lot autant que possible et utilisez ces variables. Cela permet aux individus ou petites équipes de peaufiner les modèles. Ensuite, nous mettons à jour la perte l' aide de la valeur calculée et utilisons rétropropagation pour déterminer la direction dans laquelle le modèle doit être optimisé. Sur la base du réglage de l'échelle, nous appliquons le dédimensionnement pour éviter que les dégradés ne soient mal découpés Nous appliquons ensuite un code pour empêcher l'explosion du dégradé. Nous appliquons ensuite un code pour empêcher l'explosion du dégradé. Maintenant, une fois l'accumulation des dégradés terminée, nous mettons à jour l'optimiseur avec les dégradés mis à l'échelle. Nous mettons ensuite à jour le scaler et réinitialisons les dégradés accumulés Nous incrémentons l'étape globale, et si le planificateur par lots l'est, nous le mettons à jour à chaque Enfin, nous enregistrons l'heure de fin du lot. Nous imprimons régulièrement les informations de formation. Enfin, nous renvoyons la perte moyenne pour l'époque actuelle. Créons une fonction pour la validation. Cette fonction évaluera les performances du modèle sur l'ensemble valide et calculera la perte. Passons en revue le code en détail. Les paramètres d'entrée sont valides, modèle et appareil. Tout d'abord, un chargeur valide est nécessaire pour charger les données de validation, et le modèle est utilisé pour transmettre les données afin d' obtenir les résultats. Ensuite, le critère est utilisé pour calculer la perte, et le périphérique spécifie le périphérique, processeur ou le GPU, sur lequel le modèle sera exécuté. Nous commençons par configurer la fonction de perte à des fins validation et passons le modèle en mode évaluation. Ensuite, nous créons une liste pour stocker les prédictions et configurons les variables nécessaires pour calculer le temps écoulé. Nous chargeons maintenant les données lot par lot à partir d'un chargeur valide. Ici, les entrées sont les données d'entrée et les étiquettes sont les valeurs cibles. Nous chargeons maintenant les données lot par lot à partir d'un chargeur valide. Ici, les entrées sont les données d'entrée et les étiquettes sont les valeurs cibles. Ensuite, nous désactivons la rétropropagation, car le calcul du gradient n'est pas nécessaire pendant la phase de validation Nous transmettons ensuite les entrées au modèle pour obtenir des prévisions et calculer la perte. À l'aide de l'étape d'accumulation du gradient, nous mettons à jour la perte comme nous l'avons fait dans le train F N. Pour enregistrer les prédictions, nous les déplaçons vers le processeur et les ajoutons à la liste que nous avons créée précédemment. Cette étape est nécessaire car le code d'évaluation s'exécute sur le processeur. Ensuite, nous vérifions l'heure à la fin de la validation et imprimons régulièrement les informations de validation, notamment l'étape en cours, temps écoulé, le courant et les moyennes Enfin, nous renvoyons la perte moyenne pour l'ensemble de validation avec les prévisions. Écrivons maintenant le code permettant de créer le modèle tout en effectuant une validation croisée à l'aide des fonctions que nous avons définies précédemment. Dans ce processus de validation croisée, nous utiliserons des plis. Nous allons entraîner le modèle sur les données, excluant un pli spécifique, puis le valider à l'aide de ce pli. Les paramètres d'entrée pour cette fonction sont les plis et le pliage. plis contiennent toutes les informations de pliage de l'ensemble de données. Alors que le pli fait référence au numéro de pli spécifique que nous sommes en train d'entraîner. Tout d'abord, nous utilisons Lger pour imprimer quel pli est actuellement utilisé pour la formation L'utilisation de l'enregistreur affichera un message plus long pour vérifier facilement quel pli est utilisé pour l'entraînement À l'aide des plis et des valeurs de pliage, nous allons créer des plis en train et des plis valides. Pour les pliages en train, nous sélectionnons les données du jeu de données des plis pour lesquelles la valeur du pli ne correspond pas. Nous avons également réinitialisé l' index et défini dropes true pour empêcher que l'ancien index ne devienne une nouvelle colonne De même, pour les pliages valides, nous sélectionnons les données pour lesquelles la valeur du pli correspond pour créer l'ensemble de validation. Ensuite, nous allons attribuer les valeurs d'étiquette pour validation à la variable d'étiquettes valide. Ensuite, nous préparons les données d'entraînement et de validation ainsi que les valeurs cibles pour les données de validation et les attribuons à des variables. À l'aide de ces données, nous créons les ensembles de données d'entraînement et de validation avec un ensemble de données de train personnalisé. En convertissant le train et les données valides en ensembles, nous pouvons utiliser le chargeur pour activer le traitement par lots dans Pi Torch. En convertissant le train et les données valides en ensembles de données, nous pouvons utiliser le chargeur de données pour activer le traitement par lots dans Pi Torch. Lors de la configuration du chargeur de données, nous utilisons la taille de lot spécifiée dans la configuration, et pour le shuffle, il est recommandé de la définir sur true, car il s' agit de données d'entraînement En outre, le fait de définir le paramètre de mémoire des broches sur true accélérera le chargement des données. De même, nous avons configuré la valeur valide. Cependant, étant donné que la validation utilise moins de mémoire, nous allons doubler la taille du lot. De plus, nous avons défini la valeur false lors validation afin de garantir que l'ordre des données reste inchangé. Pendant la validation, le modèle passe en mode évaluation. Pour accélérer la validation, la taille du lot sera doublée. Ensuite, nous créons le modèle et le déplaçons également vers le GPU. Créons une fonction pour configurer l'optimiseur du modèle Dans cette fonction, nous trouvons la liste des paramètres pour configurer l'optimiseur et spécifiez la liste des paramètres qui ne doivent pas utiliser de poids Lorsque nous définissons les paramètres du modèle à entraîner, nous les divisons entre ceux qui utiliseront décroissance du poids et ceux qui n'en utiliseront pas. Cette étape est facultative, et les paramètres qui ne provoquent pas surajustement n' utiliseront pas de perte de poids. Si le modèle est relativement simple et que les données d'entraînement sont suffisantes, il peut fonctionner correctement sans perte de poids. L'application inutilement de la perte de poids peut avoir un impact négatif sur les performances d' entraînement Il est donc préférable de l'utiliser manière sélective en fonction des circonstances du modèle Cette fonction montre comment appliquer de manière sélective la réduction de poids. Ensuite, à l'aide de ces informations, nous définissons le taux d'apprentissage et diminution du poids pour l'optimiseur La fonction renvoie ces paramètres configurés. Comme LLRD est défini sur false dans la configuration, vous pouvez vous concentrer sur la partie s. Pour expliquer brièvement le LLRD, taux d'apprentissage par couche. Il s'agit d'une technique dans laquelle différents taux d'apprentissage sont appliqués à chaque couche, but d'une meilleure optimisation. Bien que le réglage précis des taux d'apprentissage puisse améliorer les performances du modèle, après mon expérience, la différence a été minime. Je pense que cela est dû au fait que les performances par défaut de la plupart des optimiseurs sont assez bonnes Ensuite, nous créons une fonction pour configurer le planificateur. Le planificateur décidera comment modifier le taux d'apprentissage Dans cette configuration, nous prenons en compte la fois les options linéaires et cosinusoïdales Les deux méthodes peuvent fonctionner, vous pouvez donc choisir celle qui donne les meilleurs résultats. Cette fonction configure le planificateur pour l'entraînement des modèles. Le planificateur ajuste le taux d'apprentissage pendant le pendant le Le code sera écrit pour permettre l'utilisation de l'un des deux planificateurs, le planificateur linéaire ou le planificateur La fonction prend trois paramètres : CFG, Optimizer et Num train steps. Le CFG contient les configurations définies précédemment. Optimizer fait référence à l' optimiseur que nous avons créé précédemment, et Num train steps représente le nombre total d'étapes d'entraînement Passons maintenant en revue les paramètres utilisés lors de la configuration du planificateur L'optimiseur est celui que nous avons défini précédemment, et num warm steps fait référence au nombre d'étapes d' échauffement au cours desquelles le taux d'apprentissage augmente progressivement d'étapes d'entraînement fait référence au nombre total d'étapes d'entraînement. Pour le planificateur en cosinus, le paramètre num cycles détermine dans quelle mesure le taux d'apprentissage oscille au cours d' Ce planificateur diminue le taux d'apprentissage dans un schéma d'onde cosinusoïdale. Ensuite, nous définirons la fonction de perte à l'aide de la perte RMSE que nous avons configurée précédemment Pour suivre les meilleures performances de validation et les meilleures pertes, nous initialisons certaines variables Nous créons également des listes pour suivre les pertes et les performances de chacun. Nous écrivons une boucle pour entraîner et valider le modèle pour chaque époque Pour chaque époque, nous calculons la perte de validation et les prédictions à l'aide du modèle Nous utilisons ensuite ces prédictions pour calculer les mesures d'évaluation. Si les performances du modèle sont meilleures que celles des versions précédentes, nous sauvegardons le modèle. Sinon, nous ne l'enregistrons pas. En effet, la sauvegarde de tous les modèles peut rapidement entraîner des problèmes de stockage. Le modèle que nous utilisons actuellement est relativement petit par rapport aux modèles récents, mais il sera utile de comprendre cette façon de sauvegarder les modèles lorsqu'il s'agit de modèles plus grands. Nous allons également écrire du code pour enregistrer le modèle pour chaque eo. Ensuite, nous chargeons le meilleur modèle et stockons les prédictions pour les données de validation dans un bloc de données. Nous résumons également les mesures de perte et d'évaluation pour chaque époque dans un cadre. Après chaque époque, nous effaçons la mémoire et appelons la collecte des déchets pour libérer de la mémoire Enfin, la fonction renvoie la meilleure perte d'apprentissage, la perte validation, les meilleurs résultats et le bloc de données contenant les informations pour chaque époque À l'aide de cette fonction, nous pouvons entraîner le modèle sur les données à l'exception d'un pli spécifique et le valider sur ce pli par validation croisée. Nous enregistrons également le meilleur modèle, optimisons à l'aide de diverses techniques d' entraînement, puis enregistrons et surveillons les performances tout au long du processus d'entraînement. 10. Formation sur les modèles et résultats: Créons maintenant une fonction utilisée pour évaluer le modèle et enregistrer les résultats. Cette fonction prendra comme paramètres OFDF, fold , best train loss et best val loss Laissez-moi vous expliquer chacun de ces paramètres. OFDF contient les informations de formation et de validation générées pour chaque époque par le biais de la boucle ferroviaire pli indique le pli actuel qui est utilisé pendant l'entraînement. meilleure perte de train et la meilleure perte de val sont les meilleures valeurs de perte d'entraînement et de validation obtenues à partir de la boucle du train. Cette fonction utilise ces valeurs pour calculer le score d'évaluation. Ensuite, il imprime le score à l'aide d'un enregistreur pour montrer les performances du modèle. Enfin, il extrait les colonnes nécessaires et les renvoie. Maintenant, nous allons enfin entraîner le modèle. Tout d'abord, nous créons un bloc de données vide pour stocker les résultats de l'entraînement. Nous créons également des listes pour enregistrer les pertes liées à la formation et à la validation. Ensuite, nous écrivons une boucle pour appliquer la boucle du train à chaque pli. Nous stockons les valeurs obtenues à l' aide de cette fonction dans les listes que nous avons créées précédemment, puis nous convertissons les parties nécessaires en un bloc de données pour le stockage. Nous enregistrons également les résultats sous de fichier CSV et stockons les données dans un fichier pickle Lorsque vous appliquez cette fonction, vous verrez le processus d'entraînement commencer. En outre, vous pouvez utiliser l' enregistreur pour vérifier quel modèle est entraîné, quelles configurations sont utilisées et comment les valeurs changent au cours du processus Je vais commenter l'exemple de code qui peut affecter la formation. Exécutons le code d'entraînement. Vous verrez les paramètres de configuration s'afficher. Et au fur et à mesure que le modèle s'entraîne, il contiendra les informations connexes. Vous verrez également qu'un dossier lié à la formation a été créé. Une fois l' apprentissage du modèle terminé, vous verrez que le modèle, le tokenizer, les modèles entraînés pour chaque pli, journaux et O OFDF ont été générés Au cours de cette session, nous avons construit un modèle de régression en nous entraînant sur les données d'examen. Tout au long de ce processus, nous avons écrit le code pour charger les données, effectué un prétraitement simple, créé un modèle avec des méthodes de regroupement et même développé diverses fonctions nécessaires à l'entraînement pour exécuter l'entraînement du modèle. Je pense que la plupart des méthodes et des processus utilisés pour créer le modèle étaient similaires à ceux que vous avez vus auparavant. Dans cette vidéo, certains des aspects utiles incluent l' organisation de la configuration en haut, ce qui nous permet de générer de nouveaux modèles en modifiant simplement cette section lors de l'entraînement. Une fois l' apprentissage du modèle terminé, vous verrez que le tokenizer du modèle de configuration, les modèles entraînés pour chaque pli, journaux et l'OOFDF Au cours de cette session, nous avons construit un modèle de régression en nous entraînant sur les données d'examen. Tout au long de ce processus, nous avons écrit le code pour charger les données, effectué un prétraitement simple, créé un modèle avec des méthodes de regroupement et même développé diverses fonctions nécessaires à l'entraînement pour exécuter l'entraînement du modèle. Je pense que la plupart des méthodes et des processus utilisés pour créer le modèle étaient similaires à ceux que vous avez vus auparavant. Dans cette vidéo, certains des aspects utiles incluent l' organisation et la configuration du haut, ce qui nous permet de générer de nouveaux modèles en modifiant simplement cette section lors de l'entraînement. Bien entendu, il existe de nombreuses façons d'améliorer ce modèle et ce code. Vous pourriez utiliser un modèle plus avancé, modifier le taux d'apprentissage pour chaque couche, bien que nous ne l'ayons pas utilisé ici. Utilisez de meilleures données ou appliquez techniques de prétraitement plus sophistiquées pour obtenir un texte plus clair pour la formation. J'espère que ce code aidera les individus ou les petites équipes à appliquer une analyse de régression en langage naturel. Nous concluons ainsi cette partie cruciale de la formation du modèle. 11. Inférence: Créons maintenant un bloc-notes pour utiliser le modèle entraîné. Créez d'abord un nouveau fichier de bloc-notes et renommez-le en bloc-notes d' inférence Le carnet d'inférence et carnet de train ont une structure presque identique Considérez donc cela comme une opportunité de passer en revue ce que nous avons abordé jusqu'à présent. Nous chargeons les packages nécessaires et définissons l'appareil sur lequel le code sera exécuté. Ensuite, à l'aide de la classe de configuration, nous rassemblons tous les paramètres de configuration en un seul endroit. Dans ce bloc-notes, nous n'avons pas besoin des variables requises pour l'entraînement nous suffit donc de configurer ce qui est nécessaire pour l'inférence Ensuite, nous configurons le tokenizer et correspondre la valeur initiale utilisée pendant Ensuite, nous créons le code de prétraitement et l'enregistreur. Nous utilisons l'enregistreur pour afficher les informations nécessaires lors de l'inférence Nous créons également la métrique d'évaluation et l'utilisons pour calculer le score. Comme pour les données d'entraînement, nous prétraitons les données de test, créons un ensemble de données, puis nous utilisons le chargeur de données pour créer le chargeur de test. Nous utilisons ensuite les mêmes techniques de mise en commun qui ont été cruciales lors de la construction du modèle. Après avoir créé un modèle qui applique ces techniques de regroupement, nous créons une inférence Lorsque nous exécutons cette fonction, nous pouvons voir le modèle effectuer une inférence Comme le modèle a été construit à l'aide de plis, nous effectuons une inférence pour chaque pli H. Comme le modèle a été construit à l'aide de plis, nous effectuons une inférence pour chaque pli Une fois l'inférence terminée, nous pouvons vérifier les résultats Vous verrez que les résultats des données de test sont similaires à ceux obtenus de l'entraînement sur les données d'entraînement. À l'aide de ce bloc-notes, vous pouvez utiliser le modèle entraîné. Enfin, créons un carnet d' ensemble. OK. 12. Ensemble: Ensemble fait référence à la combinaison de plusieurs modèles d'apprentissage automatique pour faire des prédictions. Dans ce cas, j' utilise les mêmes données pour entraîner en plus une petite version du modèle. Nous avons donc deux modèles de base et de petite taille. Dans ce carnet, nous combinerons ces deux modèles à l'aide d'une moyenne pondérée pour créer de nouvelles prédictions. Imaginez que ce bloc-notes exécute le bloc-notes d'inférence plusieurs fois. La différence ici est que nous agrégeons ces résultats pour créer de nouvelles prévisions. Tout d'abord, nous chargeons les packages nécessaires et configurons la configuration. Comme il existe deux modèles, nous aurons deux paramètres de configuration. Nous avons ensuite mis ces paramètres dans une liste. Nous faisons des prédictions pour les deux configurations, puis calculons la moyenne pondérée. Les paramètres de prétraitement et d'évaluation resteront les mêmes. Encore une fois, nous utilisons un enregistreur pour vérifier les modèles et examiner les performances des modèles que nous avons créés précédemment Sur la base des performances de ces modèles, nous attribuons des poids à chaque modèle. Ensuite, nous créons l'ensemble, introduisons les méthodes de regroupement et construisons les modèles de la même manière. À l'aide de la fonction d'inférence, nous générons et les résultats Lorsque vous comparez les résultats, vous remarquerez qu'ils sont différents des prédictions effectuées uniquement à l'aide du modèle de base. Il semble que l'ensemble avec la petite version ait entraîné une performance légèrement moins bonne. Si vous en avez l'occasion, associez-le à d'autres modèles ou à des modèles plus grands, vous obtiendrez peut-être des résultats encore meilleurs 13. Conclusion: Tout au long de ce cours, nous avons exploré le processus de création d' un modèle de régression basé sur les données d'examen et optimisation du modèle à l'aide de diverses techniques. Du prétraitement des données à l'apprentissage des modèles, en passant par l'inférence et l'assemblage. Nous avons abordé les concepts essentiels et les étapes de mise en œuvre à chaque étape. Nous avons notamment appris à interpréter efficacement les données textuelles grâce diverses méthodes de regroupement et à effectuer validation croisée lors de l'entraînement du modèle afin de sélectionner le modèle optimal. Nous avons également examiné comment utiliser les modèles entraînés pour les prévisions et améliorer les performances grâce à l'assemblage de plusieurs J'espère que ce cours vous a permis d'approfondir votre compréhension du traitement du langage naturel et de la construction de modèles de régression, en vous fournissant des connaissances pratiques que vous pourrez appliquer à des projets du monde réel. La clé pour travailler avec des modèles d'apprentissage automatique et d'apprentissage profond réside l'expérimentation et l'amélioration continues. Sur la base de ce que vous avez appris aujourd'hui, je vous encourage à poursuivre le développement vos propres modèles et à viser des performances encore meilleures. Merci d'avoir fait partie de ce voyage.