Декодирование прогнозов для задачи моделирования языка масок с использованием пользовательского BPE - PullRequest
0 голосов
/ 15 апреля 2020

Я обучил собственный токенайзер BPE для RoBERTa, используя токенизаторы .

Я обучил пользовательскую модель для маскированной задачи LM с использованием скелета, предоставленного в run_language_modeling.py

Модель достигает недоумения 3.2832 на протяженном наборе Eval.

Вот что меня смущает при декодировании предсказаний модели:

Следующее прекрасно работает при использовании предварительно обученных модель

>> from transformers import pipeline
>> nlp = pipeline('fill-mask', model='roberta-base')
>> nlp("has the <mask> ever had checkup")
[{'sequence': '<s> has the cat ever had checkup</s>',
  'score': 0.11192905157804489,
  'token': 4758},
 {'sequence': '<s> has the baby ever had checkup</s>',
  'score': 0.08717110008001328,
  'token': 1928},
 {'sequence': '<s> has the dog ever had checkup</s>',
  'score': 0.07775705307722092,
  'token': 2335},
 {'sequence': '<s> has the man ever had checkup</s>',
  'score': 0.04057956114411354,
  'token': 313},
 {'sequence': '<s> has the woman ever had checkup</s>',
  'score': 0.031859494745731354,
  'token': 693}]

Однако при использовании пользовательской обученной модели Роберта с заказчиком BPE

>> from transformers import RobertaForMaskedLM, RobertaTokenizer
>> model = RobertaForMaskedLM.from_pretrained(path_to_model)
>> tokenizer = RobertaTokenizer.from_pretrained(path_to_tokenizer)
>> nlp = pipeline('fill-mask', model=model, tokenizer=tokenizer)
>> nlp("has the <mask> ever had checkup")
[{'sequence': '<s> the  had never had checkup</s>',
  'score': 0.08322840183973312,
  'token': 225},
 {'sequence': '<s> the - had never had checkup</s>',
  'score': 0.07046554237604141,
  'token': 311},
 {'sequence': '<s> the o had never had checkup</s>',
  'score': 0.020223652943968773,
  'token': 293},
 {'sequence': '<s> the _ had never had checkup</s>',
  'score': 0.013033385388553143,
  'token': 1246},
 {'sequence': '<s> the r had never had checkup</s>',
  'score': 0.011952929198741913,
  'token': 346}]

Мой вопрос: несмотря на то, что моя пользовательская модель предсказала правильную замену токена <mask>, это только маркер подслов. Итак, как можно получить полное слово обратно, как предварительно обученные модели? например, cat делится на ca & t, поэтому, если вы замаскируете cat, моя пользовательская модель прогнозирует только ca, а не оставшуюся часть t.

Следующая конфигурация json использовалась для обучения:

{
  "architectures": [
    "RobertaForMaskedLM"
  ],
  "attention_probs_dropout_prob": 0.1,
  "bos_token_id": null,
  "do_sample": false,
  "eos_token_ids": null,
  "finetuning_task": "mlm",
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 768,
  "id2label": {
    "0": "LABEL_0",
    "1": "LABEL_1"
  },
  "initializer_range": 0.02,
  "intermediate_size": 3072,
  "is_decoder": false,
  "label2id": {
    "LABEL_0": 0,
    "LABEL_1": 1
  },
  "layer_norm_eps": 1e-12,
  "length_penalty": 1.0,
  "max_length": 100,
  "max_position_embeddings": 514,
  "model_type": "roberta",
  "num_attention_heads": 12,
  "num_beams": 1,
  "num_hidden_layers": 6,
  "num_labels": 2,
  "num_return_sequences": 1,
  "output_attentions": false,
  "output_hidden_states": false,
  "output_past": true,
  "pad_token_id": null,
  "pruned_heads": {},
  "repetition_penalty": 1.0,
  "temperature": 1.0,
  "top_k": 50,
  "top_p": 1.0,
  "torchscript": false,
  "type_vocab_size": 2,
  "use_bfloat16": false,
  "vocab_size": 30522
}

А для обучения пользовательскому токенизатору:

некоторые упоминали, что следят за порядком специальных токенов то же самое.

from tokenizers import ByteLevelBPETokenizer

# Initialize a tokenizer
tokenizer = ByteLevelBPETokenizer()

# Customize training
tokenizer.train(files=["/home/data/BPE/txt_data/72148_tokens.txt",
                       "/home/data/BPE/txt_data/70551_tokens.txt",
                       "/home/data/BPE/txt_data/70553_tokens.txt",
                       "/home/data/BPE/txt_data/78452_tokens.txt",
                       "/home/data/BPE/txt_data/74177_tokens.txt",
                       "/home/data/BPE/txt_data/71260_tokens.txt",
                       "/home/data/BPE/txt_data/71250_tokens.txt",], vocab_size=30522, min_frequency=10, special_tokens=[
    "<s>",
    "<pad>",
    "</s>",
    "<unk>",
    "<mask>",
])

# Save files to disk
tokenizer.save("/home/data/BPE/", "30k_v3_roberta")
...