[PYTHON] Jugement négatif / positif des phrases par BERT et visualisation des motifs

1.Tout d'abord

Je lis ** "Developmental Deep Learning avec PyTorch" **. Cette fois, j'ai étudié le BERT au chapitre 8, alors j'aimerais produire mon propre résumé.

2. Qu'est-ce que BERT?

En 2018, l'année suivant l'annonce de Transformer, ** BERT ** a finalement été annoncé avec une précision dépassant les humains même dans le domaine du traitement du langage naturel. C'était.

BERT a été en mesure de gérer toutes les tâches de traitement du langage naturel avec un réglage fin et a réalisé un SoTA écrasant dans 11 types de tâches.

スクリーンショット 2020-07-30 13.31.18.png

Ceci est le diagramme modèle de BERT dans l'article. Cela semble compliqué car il est développé dans le sens de la longueur du mot, mais en termes simples, c'est celui qui extrait uniquement la partie Encoder de ** Transformer **. Alors, quelle est la différence entre BERT et Transformer? C'est ** pré-apprentissage avec 2 types de tâches ** et ** réglage fin ** ** apprentissage en 2 étapes ** selon la tâche souhaitée.

** 1) Pré-apprentissage avec 2 types de tâches ** スクリーンショット 2020-07-31 17.54.40.png

La tâche de masquer 15% d'un mot dans une phrase et de deviner ce mot (** Masked Language Model ) et la tâche de déterminer si les contextes de deux phrases sont connectés ( Next Sentence Prediction **) ** Apprenez en même temps **.

Mettez ** [CLS] ** au début de la phrase que vous entrez et ajoutez ** des expressions intégrées pour représenter la première ou la deuxième instruction dans les deux phrases ** et ** [SEP] ** entre les deux. Mettez dedans.

En apprenant ces deux tâches, ** la capacité de convertir des mots en vecteurs de caractéristiques selon le contexte ** et ** la capacité de déterminer si les phrases sont sémantiquement connectées ** (à peu près le sens des phrases) Acquérir la capacité de comprendre).

Le pré-apprentissage qui entraîne ce terrain coûte beaucoup de coûts de calcul, et il semble que cela prend environ 4 jours même si vous utilisez 4 TPU, mais si quelqu'un le fait une fois, il se transformera en un réseau capable de résoudre diverses tâches avec un réglage fin. Tu peux le faire.

** 2) Réglage fin ** スクリーンショット 2020-07-31 17.54.57.png

Avec le ** poids de pré-apprentissage comme valeur initiale **, un réglage fin est effectué avec des données étiquetées. Le travail de base ayant été considérablement formé par le pré-apprentissage **, il est possible de créer un modèle performant à partir d'une petite quantité de données de phrase **. Le document indique que le coût de calcul de la mise au point pour diverses tâches était inférieur à une heure avec un seul TPU.

Vous trouverez ci-dessous les 11 tâches PNL enregistrées par BERT sur SoTA.

base de données type Aperçu
MNLI inférence Implications de la prémisse et de l'hypothèse/Contradiction/Jugement de l'un ou l'autre neutre
QQP Jugement de similarité Implications de la prémisse et de l'hypothèse/Contradiction/Jugement de l'un ou l'autre neutre
QNLI inférence Une paire phrase-question est transmise pour déterminer si la phrase contient une réponse
SST-2 1 phrase classification Phrase positive/Analyse des émotions négatives
CoLA 1 phrase classification Déterminer si la phrase est grammaticalement correcte
STS-B Jugement de similarité Notez 1 à quel point les deux phrases sont similaires en termes de sens~Déterminé par 5
MRPC Jugement de similarité Déterminer si les deux phrases sont sémantiquement identiques
RTE inférence Déterminez si deux phrases impliquent
SQuAD v1.1 inférence Prédire où se trouve la réponse dans une phrase contenant une question et une réponse
SQuAD v2.0 inférence v1.1 plus l'option qu'il n'y a pas de réponse
SWAG inférence Sélectionnez la phrase qui suit la phrase donnée parmi 4 choix

** 3) Autres différences ** -Dans Transformer, les informations de position d'un mot sont données sous la forme d'une valeur composée de sin et cos dans Positive Encoder, mais dans BERT, elles sont apprises. -Dans le cadre de la fonction d'activation, GELU (la sortie autour de l'entrée 0 est lisse et non nette) est utilisée à la place de ReLU.

3. Modèle à mettre en œuvre cette fois

スクリーンショット 2020-08-01 13.11.12.png

Cette fois, nous utiliserons le ** modèle pré-entraîné ** de BERT pour effectuer un réglage fin ** de la tâche de détermination du négatif / positif des phrases. Il existe deux types de modèles BERT avec des tailles de modèles différentes, et cette fois, nous utiliserons le modèle plus petit appelé Base.

Il y a deux sorties BERT, ** pour l'identification ** et ** pour le niveau de jeton **, et cette fois nous allons connecter les couches entièrement connectées pour l'identification et faire un jugement négatif / positif. L'ensemble de données utilisé est ** IMDb ** (Internet Movie Dataset), qui résume si le contenu de la critique du film (en anglais) est positif ou négatif.

En entraînant le modèle, lorsque vous entrez une critique pour un film, déterminez si la critique est positive ou négative et laissez l'attention mutuelle des mots de la critique clarifier le mot sur lequel la décision était basée.

4. Code du modèle

from bert import get_config, BertModel, set_learned_params

#Lire le fichier JOSN des paramètres du modèle en tant que variable d'objet
config = get_config(file_path="./data/bert_config.json")

#Créer un modèle BERT
net_bert = BertModel(config)

#Définir les paramètres entraînés dans le modèle BERT
net_bert = set_learned_params(
    net_bert, weights_path="./data/pytorch_model.bin")

Créez un modèle BERT et définissez des paramètres de poids pré-entraînés.

class BertForIMDb(nn.Module):
    '''Un modèle qui relie la partie qui juge le positif et le négatif d'IMDb au modèle BERT'''

    def __init__(self, net_bert):
        super(BertForIMDb, self).__init__()

        #Module BERT
        self.bert = net_bert  #Modèle BERT

        #Ajout d'une prédiction positive / négative à la tête
        #L'entrée est la dimension de la fonction de sortie de BERT, et la sortie est positive et négative.
        self.cls = nn.Linear(in_features=768, out_features=2)

        #Traitement d'initialisation du poids
        nn.init.normal_(self.cls.weight, std=0.02)
        nn.init.normal_(self.cls.bias, 0)

    def forward(self, input_ids, token_type_ids=None, attention_mask=None, output_all_encoded_layers=False, attention_show_flg=False):
        '''
        input_ids: [batch_size, sequence_length]Liste des identifiants de mots des phrases
        token_type_ids: [batch_size, sequence_length]L'identifiant qui indique si chaque mot est la première ou la deuxième phrase
        attention_mask: Masquage qui fonctionne de la même manière que le masque Transformer.
        output_all_encoded_couches: indiquez si vous souhaitez renvoyer les 12 transformateurs d'une liste ou seulement le dernier dans la sortie finale
        attention_show_flg:Self-Drapeau à renvoyer Attention poids
        '''

        #Propagation vers l'avant de la partie modèle de base de BERT
        #Propager vers l'avant
        if attention_show_flg == True:
            '''attention_Au moment du spectacle, attention_les probs retournent aussi'''
            encoded_layers, pooled_output, attention_probs = self.bert(
                input_ids, token_type_ids, attention_mask, output_all_encoded_layers, attention_show_flg)
        elif attention_show_flg == False:
            encoded_layers, pooled_output = self.bert(
                input_ids, token_type_ids, attention_mask, output_all_encoded_layers, attention_show_flg)

        #Premier mot de la phrase d'entrée[CLS]Classez les positifs et les négatifs à l'aide des fonctionnalités de
        vec_0 = encoded_layers[:, 0, :]
        vec_0 = vec_0.view(-1, 768)  #Taille[batch_size, hidden_Convertir en taille
        out = self.cls(vec_0)

        # attention_Au moment du spectacle, attention_probs (le dernier) retournent également
        if attention_show_flg == True:
            return out, attention_probs
        elif attention_show_flg == False:
            return out

C'est un modèle qui relie le modèle BERT avec le linéaire qui détermine le négatif / positif d'IMDb. Étant donné que la mise à jour du paramètre de poids est lourde lorsqu'elle est effectuée sur toutes les couches de BertLayer, elle est effectuée uniquement sur la couche finale (12e couche) de BertLayer et le linéaire ajouté.

5. Code complet et exécution

L'ensemble du code a été créé dans Google Colab et publié sur Github, donc si vous voulez l'essayer vous-même, ce [** "lien" **](https://github.com/cedro3/BERT/blob/master/ Vous pouvez le déplacer en cliquant sur BERT_IMDb_run.ipynb) et en cliquant sur le bouton «Colab sur le Web» en haut de la feuille affichée.

Lorsque j'ai exécuté le code, je n'ai appris que 2 époques, mais le taux de précision des données de test était d'environ 90%. La dernière fois, j'ai fait la même tâche avec Transfomer, mais le taux de réponse correct à ce moment-là était d'environ 85%, donc ** + 5 points d'amélioration ** Il est devenu.

À propos, quant à la clarification du fondement du jugement, スクリーンショット 2020-08-01 14.05.21.png Avec ce genre de sentiment, clarifiez quel mot a été utilisé comme base de jugement.

(référence) ・ Apprenez en créant! Apprentissage en profondeur par PyTorchExplication approfondie de l'article de "BERT", le roi du traitement du langage naturel

Recommended Posts

Jugement négatif / positif des phrases par BERT et visualisation des motifs
Jugement négatif / positif des phrases et visualisation des motifs par Transformer
Création d'un classificateur négatif / positif à l'aide de BERT
Analyse des données financières par pandas et leur visualisation (2)
Analyse des données financières par pandas et leur visualisation (1)
Comment visualiser les données par variable explicative et variable objective
Visualisation des données par préfecture
Visualisation de la matrice créée par numpy
Jugement du if par la notation d'inclusion de liste
Analyse négative / positive 1 Application de l'analyse de texte
Agrégation et visualisation des nombres accumulés
[Python] J'ai analysé le journal d'un homme au cours de sa première année de vie professionnelle et j'ai fait un jugement positif / négatif sur la vie professionnelle.
Visualisation de corrélation entre la quantité de caractéristiques et la variable objective
[Version japonaise] Jugement de la similitude des mots pour les mots polynomiaux utilisant ELMo et BERT
Déterminez s'il s'agit de mon enfant à partir de l'image du chien Shiba par apprentissage profond (4) Visualisation par Grad-CAM et Grad-CAM guidé