Вопросы при обучении языковых моделей с нуля с Huggingface

Я следую руководству здесь (https://github.com/huggingface/blog/blob/master/how-to-train.md, https://huggingface.co/blog/how-to-train) для обучения модель в стиле RoBERTa с нуля. (С моим собственным токенизатором и набором данных)

Однако, когда я запускаю run_mlm.py (https://github.com/huggingface/transformers/blob/master/examples/pytorch/language-modeling/run_mlm.py) для обучения моей модели задаче маскирования, появляются следующие сообщения:

      All model checkpoint weights were used when initializing RobertaForMaskedLM.

All the weights of RobertaForMaskedLM were initialized from the model checkpoint at roberta-base.

If your task is similar to the task the model of the checkpoint was trained on, you can already use RobertaForMaskedLM for predictions without further training.

Мне интересно, означает ли это, что я тренируюсь с нуля с «предварительно натренированным весом» RoBERTa? А если это тренировка с предварительно натренированными весами, есть ли способ использовать случайно инициированные веса вместо предварительно тренированных?

==== 2021.10.26 Обновлено ===

Я обучаю модель с помощью задачи моделирования маскированного языка с помощью следующих команд:

      python transformer_run_mlm.py \
--model_name_or_path roberta-base  \
--config_name ./my_dir/ \
--tokenizer_name ./my_dir/ \
--no_use_fast_tokenizer \
--train_file ./my_own_training_file.txt \
--validation_split_percentage 10 \
--line_by_line \
--output_dir /my_output_dir/ \
--do_train \
--do_eval \
--per_device_train_batch_size 64 \
--per_device_eval_batch_size 16 \
--learning_rate 1e-4 \
--max_seq_length 1024 \
--seed 42 \
--num_train_epochs 100 

./My_dir/ состоит из трех файлов:

config.json создается следующими кодами:

      from transformers import RobertaModel

model = RobertaModel.from_pretrained('roberta-base')
model.config.save_pretrained(MODEL_CONFIG_PATH)

А вот содержание:

      {
  "_name_or_path": "roberta-base",
  "architectures": [
    "RobertaForMaskedLM"
  ],
  "attention_probs_dropout_prob": 0.1,
  "bos_token_id": 0,
  "classifier_dropout": null,
  "eos_token_id": 2,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 768,
  "initializer_range": 0.02,
  "intermediate_size": 3072,
  "layer_norm_eps": 1e-05,
  "max_position_embeddings": 514,
  "model_type": "roberta",
  "num_attention_heads": 12,
  "num_hidden_layers": 12,
  "pad_token_id": 1,
  "position_embedding_type": "absolute",
  "transformers_version": "4.12.0.dev0",
  "type_vocab_size": 1,
  "use_cache": true,
  "vocab_size": 50265
}

voiceab.json, merges.tx t создаются с помощью следующих кодов:

      from tokenizers.implementations import ByteLevelBPETokenizer

tokenizer = ByteLevelBPETokenizer()

tokenizer.train(files=OUTPUT_DIR + "seed.txt", vocab_size=52_000, min_frequency=2, special_tokens=[
    "<s>",
    "<pad>",
    "</s>",
    "<unk>",
    "<mask>",
])

# Save files to disk
tokenizer.save_model(MODEL_CONFIG_PATH)

А вот содержимое Vocab.json (доля)

      {"<s>":0,"<pad>":1,"</s>":2,"<unk>":3,"<mask>":4,"!":5,"\"":6,"#":7,"$":8,"%":9,"&":10,"'":11,"(":12,")":13,"*":14,"+":15,",":16,"-":17,".":18,"/":19,"0":20,"1":21,"2":22,"3":23,"4":24,"5":25,"6":26,"7":27,"8":28,"9":29,":":30,";":31,"<":32,"=":33,">":34,"?":35,"@":36,"A":37,"B":38,"C":39,"D":40,"E":41,"F":42,"G":43,"H":44,"I":45,"J":46,"K":47,"L":48,"M":49,"N":50,"O":51,"P":52,"Q":53,"R":54,"S":55,"T":56,"U":57,"V":58,"W":59,"X":60,"Y":61,"Z":62,"[":63,"\\":64,"]":65,"^":66,"_":67,"`":68,"a":69,"b":70,"c":71,"d":72,"e":73,"f":74,"g":75,"h":76,"i":77,"j":78,"k":79,"l":80,"m":81,"n":82,"o":83,"p":84,"q":85,"r":86,"s":87,"t":88,"u":89,"v":90,"w":91,"x":92,"y":93,"z":94,"{":95,"|":96,"}":97,"~":98,"¡":99,"¢":100,"£":101,"¤":102,"¥":103,"¦":104,"§":105,"¨":106,"©":107,"ª":108,"«":109,"¬":110,"®":111,"¯":112,"°":113,"±":114,"²":115,"³":116,"´":117,"µ":118,"¶":119,"·":120,"¸":121,"¹":122,"º":123,"»":124,"¼":125,"½":126,"¾":12

А вот содержимое merges.txt (доля)

      #version: 0.2 - Trained by `huggingface/tokenizers`
e n
T o
k en
Ġ To
ĠTo ken
E R
V ER
VER B
a t
P R
PR O
P N
PRO PN
Ġ n
U N
N O
NO UN
E n
i t
t it
En tit
Entit y
b j
c o
Ġ a

1 ответ

Решение

Я думаю, вы смешиваете два разных действия.

  1. В первом опубликованном вами руководстве объясняется, как создать модель с нуля.
  2. В run_mlm.py скрипт предназначен для тонкой настройки (см. строку 17 скрипта) уже существующей модели

Итак, если вы просто хотите создать модель с нуля, шага 1 должно быть достаточно. Если вы хотите настроить только что созданную модель, вам нужно выполнить шаг 2. Обратите внимание, что обучение модели RoBERTa с нуля уже подразумевает фазу MLM, поэтому этот шаг полезен только в том случае, если у вас будет другой набор данных в будущее, и вы хотите улучшить свою модель, доработав ее.

Однако вы не загружаете только что созданную модель, вы загружаете модель roberta-base из репозитория Huggingface: --model_name_or_path roberta-base \


Что касается предупреждения, оно говорит вам, что вы загрузили модель ( roberta-base, как выяснено), который был предварительно обучен для задачи маскированного моделированияязыка (MaskedLM). Это означает, что вы загрузили контрольную точку модели Итак, цитируя:

Если ваша задача аналогична задаче, на которой была обучена модель контрольной точки, вы уже можете использовать RobertaForMaskedLM для прогнозов без дополнительного обучения.

Это означает, что если вы собираетесь выполнять задачу MaskedLM, модель годится. Если вы хотите использовать его для другой задачи (например, для ответа на вопрос), вам, вероятно, следует отрегулировать его, потому что модель, как она есть, не даст удовлетворительных результатов.


В заключение, если вы хотите создать модель с нуля для выполнения MLM, выполните шаг 1. Это создаст модель, которая может выполнять MLM.

Если вы хотите настроить в MLM уже существующую модель (см. Репозиторий Huggingface ), выполните шаг 2.

Другие вопросы по тегам