Pytorch Transformers tokenizer tokenizer vocabulaire pour ajouter de nouveaux mots et intégration

Cible:

在NLP领域,基于公开语料的预训练模型,在专业领域迁移时,会遇到专业领域词汇不在词汇表的问题,本文介绍如何添加专有名词到预训练模型。

Par exemple, dans le modèle de pré-formation Bert, le vocabulaire financier, tel que le vocabulaire des indicateurs financiers tels que « ratio cours-bénéfice », n'est pas inclus. Cet article présentera :

  • Comment ajouter de la terminologie au glossaire
  • Méthode 1 : modifier le vocabulaire
  • Méthode 2 : Plus générale, modifier le tokenizer tokenizer
  • Comment préserver les capacités des modèles existants et former des représentations intégrées d'un nouveau vocabulaire

contenu:

NLP的分词

Flux de traitement PNL :

  1. Segmentez la phrase d'entrée pour obtenir des mots et des indices
  2. Obtenir l'intégration correspondant au mot via la couche d'intégration
  3. L'intégration est envoyée au modèle de pré-entraînement et le vecteur d'intégration sémantique du jeton dans la phrase est obtenu via le mécanisme d'attention
  4. Utilisez des vecteurs d'intégration sémantique pour construire des tâches en aval.

Parmi eux, le modèle de pré-formation est formé sur un corpus public. Lorsque nous effectuons un apprentissage par transfert et migrons le modèle vers le domaine de la finance et de l'économie, l'un des problèmes auxquels nous serons confrontés est que le vocabulaire de la finance et de l'économie n'est pas adapté. le vocabulaire et sera divisé en mots individuels. Cela conduit à la destruction du sens complet des termes professionnels, ou ce n'est pas si intuitif lorsqu'on laisse le modèle apprendre, comme :

  • Le « ratio cours-bénéfice plus élevé de Huawei » sera divisé par défaut en : [' , '', 'Huawei', 'de', 'ville', 'bénéfice', 'taux', 'supérieur', ' ' ]
  • On peut voir que le ratio cours-bénéfice est divisé en « marché », « bénéfices » et « taux ».
  • Nous pouvons explicitement dire au tokenizer que le ratio cours-bénéfice est un terme professionnel et qu'il n'est pas nécessaire de le diviser. Par conséquent, après traitement, le vocabulaire est divisé en [' ', '', 'Huawei', 'de', 'ratio cours-bénéfice', '', 'supérieur', ' ' ]
  • atteint l'objectif attendu
from transformers import AutoTokenizer,AutoModel

PRE_TRAINED_MODEL_NAME='xlm-roberta-base'
tokenizer = AutoTokenizer.from_pretrained(PRE_TRAINED_MODEL_NAME)

e = tokenizer.encode('华为的市盈率较高')
s = [tokenizer.decode(i) for i in e]
print(s)
# ['<s>', '', '华为', '的', '市', '盈', '率', '较高', '</s>']
tokenizer.add_tokens(["市盈率"])
e2 = tokenizer.encode('华为的市盈率较高')
s2 = [tokenizer.decode(i) for i in e2]
print(s2)
# ['<s>', '', '华为', '的', '市盈率', '', '较高', '</s>']

Méthode pour réaliser :

有两种实现

    1. Dans vocabulaire.txt, utilisez le [unused] dans les 100 premiers et remplacez [unused] par ce que vous souhaitez ajouter. Le nombre spécifique de [inutilisés] dépend de votre propre modèle de pré-formation, peut-être 100, peut-être 1 000, mais ils sont tous limités. Si le vocabulaire à ajouter est petit et que le modèle de pré-formation dispose d'un fichier vocab.txt, vous pouvez, comme bert, le montant n'est pas assez important pour le domaine actuellement.
    1. Une méthode plus générale : ajouter du nouveau vocabulaire professionnel au vocabulaire via le tokenizer, il n'y a pas de limite. Surtout pour les modèles les plus compliqués, il n'y a pas de fichier vocab.txt séparé, et cela ne peut être fait que de cette manière.
import torch
from transformers import AutoTokenizer,AutoModel

PRE_TRAINED_MODEL_NAME='xlm-roberta-base'
tokenizer = AutoTokenizer.from_pretrained(PRE_TRAINED_MODEL_NAME)
model = AutoModel.from_pretrained(PRE_TRAINED_MODEL_NAME)

print(len(tokenizer))  # 250002
tokenizer.add_tokens(["NEW_TOKEN"])
print(len(tokenizer))  # 250003

Génération de nouveaux vocabulaires intégrés :

L'ajout d'un nouveau vocabulaire ne correspondra inévitablement pas à la dimension de l'intégration d'origine. La dimension de l'intégration d'origine est [vocab_size, Hidden_size], mais il nous est impossible de recycler l'intégralité de l'intégration. Nous souhaitons conserver les paramètres d'intégration d'origine tels que autant que possible. Par conséquent, c'est plus intelligent ici. La technique de remodelage est utilisée pour ajouter artificiellement de nouvelles incorporations de vocabulaire (aléatoires, non apprises), puis utiliser du matériel de domaine pour l'apprentissage.
Dans cette méthode, le jeton étant ajouté, la matrice d'intégration doit être modifiée.
Les expériences montrent que la matrice de redimensionnement ne perturbe pas les intégrations pré-entraînées d'origine.

import torch
from transformers import AutoTokenizer,AutoModel

PRE_TRAINED_MODEL_NAME='xlm-roberta-base'
tokenizer = AutoTokenizer.from_pretrained(PRE_TRAINED_MODEL_NAME)
model = AutoModel.from_pretrained(PRE_TRAINED_MODEL_NAME)

print(len(tokenizer))  # 250002
tokenizer.add_tokens(["NEW_TOKEN"])
print(len(tokenizer))  # 250003

x = model.embeddings.word_embeddings.weight[-1, :] # 原始最后一个token的embedding

model.resize_token_embeddings(len(tokenizer)) # 调整embedding维度
# The new vector is added at the end of the embedding matrix

print(model.embeddings.word_embeddings.weight[-1, :])
# Randomly generated matrix 添加的embedding是随机值。

with torch.no_grad():
    model.embeddings.word_embeddings.weight[-1, :] = torch.zeros([model.config.hidden_size])
# 人为设置新添加的embedding为0

print(model.embeddings.word_embeddings.weight[-1, :])
# outputs a vector of zeros of shape [768]

y = model.embeddings.word_embeddings.weight[-2, :] # 原始最后一个token变成倒数第二了,取其embedding

print(x == y) # 原始token的embedding会改变吗?原来embedding weight 不会变

e = tokenizer.encode('华为的市盈率较高')
s = [tokenizer.decode(i) for i in e]
print(s)
tokenizer.add_tokens(["市盈率"])
e2 = tokenizer.encode('华为的市盈率较高')
s2 = [tokenizer.decode(i) for i in e2]
print(s2)

Avec cette intégration initiale, après des tâches telles que MLM, la représentation d'intégration d'un nouveau vocabulaire peut être formée, et cette intégration peut être apprise via des tâches en aval.

maître:

  • Façons d'ajouter du vocabulaire de domaine
  • Comment modifier la nouvelle intégration
  • Entraîner l'intégration du nouveau jeton

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43290383/article/details/128874925
conseillé
Classement