Ceci est une continuation de BERT utilisant le Microsoft Cognitive Toolkit (CNTK).
Dans la partie 2, ALBERT sera pré-appris en utilisant le Wikipedia japonais préparé dans la partie 1. On suppose que NVIDIA GPU CUDA est installé.
Natural Language: BERT Part1 --Japanese Wikipedia Corpus a préparé un corpus de pré-apprentissage en utilisant Wikipedia japonais.
Dans la partie 2, nous créerons et formerons un modèle de pré-apprentissage non supervisé.
BERT Représentations d'encodeur bidirectionnel à partir de transformateurs (BERT) [1] utilise uniquement la partie Encoder de Transformer [2]. Les transformateurs sont introduits dans Natural Language: Machine Translation Part2-Neural Machine Translation Transformer.
Cette fois, nous avons implémenté le modèle de base de ALBERT [3], qui est une version allégée de BERT, et l'avons configuré avec Pre-Layer Normalization Transformer [4]. Les détails de la structure des couches sont illustrés dans la figure ci-dessous.
L'attention multi-têtes de BERT utilise l'auto-attention, qui permet un apprentissage interactif.
La valeur initiale de chaque paramètre a été fixée à une distribution normale avec une variance de 0,02.
La fonction de perte utilise l'erreur d'entropie croisée pour la prédiction de mots masqués dans LM masqué et l'entropie croisée binaire pour l'identification dans la prédiction de phrases.
Adam [5] a été utilisé comme algorithme d'optimisation. L'hyperparamètre d'Adam $ β_1 $ est défini sur 0,9 et $ β_2 $ sur la valeur par défaut de CNTK.
Pour le taux d'apprentissage, utilisez le taux d'apprentissage cyclique (CLR) [6], le taux d'apprentissage maximal est 1e-4, le taux d'apprentissage de base est 1e-8, la taille du pas est 10 fois le nombre d'époques et la stratégie est triangulaire2. Je l'ai mis à.
La formation du modèle a effectué 3 000 000 itérations par formation en mini-lots.
・ Processeur Intel (R) Core (TM) i7-5820K 3,30 GHz ・ GPU NVIDIA Quadro RTX 6000 24 Go
・ Windows 10 Professionnel 1909 ・ CUDA 10.0 ・ CuDNN 7.6 ・ Python 3.6.6 ・ Cntk-gpu 2.7 ・ Cntkx 0.1.33 ・ MeCab 0.996 ・ Numpy 1.17.3 ・ Pandas 0.25.0
Le programme de formation est disponible sur GitHub.
bert_pretraining.py
Je compléterai le contenu principal de cette implémentation.
Masked LM and Sentence Prediction Dans le pré-apprentissage BERT, la phrase d'entrée commence par le mot spécial [CLS] et se compose de deux phrases, comme le montre la figure ci-dessous. Un mot spécial [SEP] est inséré à la fin de chaque phrase. Il effectue ensuite deux types d'apprentissage appelés LM masqué et prédiction de phrases.
Masked LM Dans Masked LM, 15% de la phrase d'entrée est remplacée par le mot spécial [MASK] comme phrase d'entrée, et le mot à la même position dans la phrase d'entrée d'origine est la réponse correcte.
Pour prédire le mot masqué, utilisez le processus suivant pour prédire le mot correct. À ce stade, le gradient de la position masquée uniquement est utilisé pour mettre à jour les paramètres.
bert_masked_lm
def bert_masked_lm(encode):
""" Masked Language Model """
h = Dense(num_hidden, activation=Cx.gelu_fast, init=C.normal(0.02))(encode)
h = LayerNormalization()(h)
return Dense(num_word, activation=None, init=C.normal(0.02))(h)
Cependant, [MASK] est un mot spécial utilisé uniquement dans le pré-apprentissage BERT, ce qui contribue à la non-naturalité du modèle de langage lors du réglage fin. Par conséquent, BERT utilise les stratégies suivantes pour réduire la non-nature.
・ 80% de chances de remplacer par [MASQUE]. ・ 10% de chances de remplacer par un mot aléatoire. ・ Il y a 10% de chances de le laisser tel quel sans le remplacer. Cela a le sens de se rapprocher de l'expression réelle du mot.
Next Sentence Prediction La prédiction de la phrase suivante vise à acquérir une compréhension contextuelle en résolvant le problème de classification binaire de savoir si deux phrases contenues dans la phrase d'entrée sont connectées ou non.
Pour cette classification, la couche masquée (pooler) à la position [CLS] de l'instruction d'entrée est extraite en tant que quantité d'entités, et la jointure complète et la fonction sigmoïde sont appliquées.
bert_sentence_prediction
def bert_sentence_prediction(pooler):
""" Sentence Prediction """
h = C.sequence.unpack(pooler, padding_value=0, no_mask_output=True)[0, :]
return Dense(1, activation=C.sigmoid, init=C.normal(0.02))(h)
50% des données d'apprentissage sont deux phrases consécutives, et les 50% restants sont un exemple négatif discontinu en reliant des phrases au hasard.
A Lite BERT Un Lite BERT (ALBERT) améliore la réduction de poids et la compréhension contextuelle des problèmes de BERT.
Factorized embedding parameterization Le nombre de paramètres de la couche incorporée est réduit par la décomposition factorielle.
En supposant que le nombre de mots est $ V $, la dimension du calque caché est $ H $ et la dimension incorporée de la dimension inférieure est $ E $, le nombre de paramètres passe de $ V \ fois H $ à $ V \ fois E + E . Il peut être réduit aux fois H $.
Si le nombre réel de mots est $ E = 32 000 $, la dimension du calque masqué est $ H = 768 $, et la dimension incorporée inférieure est $ E = 128 $,
V \times H = 24,576,000 \\
V \times E + E \times H = 4,096,000 + 98,304 = 4,194,304
On voit que le nombre de paramètres peut être réduit d'environ 83% dans la couche intégrée.
Cross-layer parameter sharing ALBERT partage les paramètres de réseau Feedfoward Position -wise avec chaque tête d'auto-attention de Transformer Encoder dans les 12 couches.
Cela peut réduire considérablement le nombre de paramètres.
Sentence-Order Prediction Puisque la prédiction de la phrase suivante est un problème simple pour comprendre le contexte, son utilité est remise en question par RoBERTa [7] et ainsi de suite.
Par conséquent, ALBERT entraîne la compréhension du contexte avec la prédiction de l'ordre des phrases au lieu de la prédiction de la phrase suivante.
C'est très facile à mettre en œuvre, préparez simplement un exemple négatif de connexion aléatoire d'instructions, mais un exemple négatif d'échange de deux instructions.
GELU Unités linéaires d'erreur gaussienne (GELU) [8] est proposée comme une fonction d'activation qui combine Dropout [9], Zoneout [10] et ReLU. Par conséquent, il devrait avoir pour effet de régulariser de manière probabiliste l'entrée avec une fonction divisible et lisse. GELU ressemble à la figure ci-dessous.
GELU est exprimé par la formule suivante.
GELU(x) = x \Phi(x)
Ici, $ \ Phi $ représente la fonction de densité de probabilité cumulative de la distribution normale, et en supposant que l'entrée $ x $ est plus proche de la moyenne 0 et de la variance 1 par la normalisation par lots et la normalisation des couches, la distribution normale standard Utilisez la densité de probabilité cumulative.
\Phi(x) = \frac{1}{2} \left( 1 + erf \left( \frac{x - \mu}{\sqrt{\sigma^2}} \right) \right) \\
erf(x) = \frac{2}{\sqrt{\pi}} \int^x_0 e^{-u^2} du
Où $ erf $ représente la fonction d'erreur. L'implémentation utilise la formule suivante, qui est une approximation de la formule ci-dessus.
GELU(x) \approx 0.5x \left( 1 + \tanh \left[ \sqrt{\frac{2}{\pi}}(x + 0.044715x^3) \right] \right)
Cependant, la formule d'approximation ci-dessus prend beaucoup de temps à calculer, donc dans cette implémentation, nous avons utilisé la formule suivante, qui est une autre approximation de la formule ci-dessus.
GELU(x) \approx x\sigma(1.702x)
Où $ \ sigma $ représente une fonction sigmoïde.
Training loss La figure ci-dessous est une visualisation du journal de la fonction de perte pendant l'entraînement. L'axe horizontal représente le nombre de répétitions et l'axe vertical représente la valeur de la fonction de perte.
J'ai demandé à ALBERT formé de résoudre le problème de remplissage des phrases. Ici, la réponse est la phrase originale, masquée est la phrase originale avec une partie de la phrase remplacée par [MASK], et Albert prédit le mot à la position [MASK].
answer :L'humanité doit évoluer en utilisant correctement l'intelligence.
masked :Humanité[MASK]Doit être utilisé correctement pour évoluer.
albert :L'humanité doit évoluer en utilisant correctement les êtres vivants.
La figure ci-dessous montre une visualisation de la carte Attention pour chaque tête de l'auto-attention sur les 11e et 12e couches de l'encodeur, et la carte des couleurs est affichée comme chaude.
Encoder 11
Encoder 12
BERT fine-tuning Le motif original de BERT est l'apprentissage par transfert du modèle de pré-apprentissage. Par conséquent, en utilisant le modèle appris à l'avance cette fois-ci, l'apprentissage par transfert a été effectué avec la tâche de classification de document de livingoor NEWS Corpus utilisée dans Natural Language: Doc2Vec Part1 --livedoor NEWS Corpus. Je l'ai essayé.
Prétraitement et analyse morphologique des données textuelles À l'aide des dictionnaires MeCab et NEologd, nous n'avons extrait que la nomenclature, les verbes et les adjectifs, supprimé les mots vides, puis converti les mots en identifiants dans le modèle SentencePiece.
Cette fois, nous avons formé 5 Epoch en plus de 9 classifications de entièrement couplé à la sortie de Pooler.
Similaire à Natural Language: Doc2Vec Part2 --Document Classification, l'évaluation des performances utilisant les données de vérification a donné les résultats suivants. 10 Epoch de Doc2Vec a des performances inférieures à 90%.
Accuracy 75.56%
En raison de contraintes de temps, la pré-formation d'ALBERT n'a pu entraîner qu'une seule époque en pratique, et le modèle était trop complexe pour le problème, qui pouvait être à l'origine de la dégradation des performances.
Natural Language : Doc2Vec Part1 - livedoor NEWS Corpus Natural Language : Doc2Vec Part2 - Document Classification Natural Language : BERT Part1 - Japanese Wikipedia Corpus
Recommended Posts