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é.
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.
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 **
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 **
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.
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.
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é.
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, 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 PyTorch ・ Explication approfondie de l'article de "BERT", le roi du traitement du langage naturel
Recommended Posts