BERT 预训练 MLM + NSP
Posted
技术标签:
【中文标题】BERT 预训练 MLM + NSP【英文标题】:BERT Pre-Training MLM + NSP 【发布时间】:2022-01-04 10:08:22 【问题描述】:我想为 MLM + NSP 任务预训练 BERT。当我运行下面的代码时,给我一个错误:
RuntimeError: 张量 a (882) 的大小必须与非单维 1 的张量 b (512) 的大小相匹配 1%|▊ | 3/561 [00:02
这看起来像是一个截断问题。但为什么?我只是使用图书馆。如果有人能启发我,我会很高兴。感谢您的提前。
The code I run:
from transformers import BertTokenizer
from transformers import BertConfig, BertForPreTraining
from transformers import TextDatasetForNextSentencePrediction
from transformers import Trainer, TrainingArguments
from transformers import DataCollatorForLanguageModeling
TOKENIZER_PATH = "hukuk_tokenizer"
MAX_LEN = 512
BLOCK_SIZE = 128
DATA_PATH = "data/toy_sentences_v3.removed_long_sent.txt"
OUTPUT_DIR = "/home/osahin/bert_yoktez/results/"
config = BertConfig()
if TOKENIZER_PATH == "hukuk_tokenizer":
config.update("vocab_size":30000)
print("config: ",config)
tokenizer = BertTokenizer.from_pretrained(TOKENIZER_PATH)
tokenizer.model_max_length= MAX_LEN
print("Tokenizer: ",tokenizer)
model = BertForPreTraining(config)
dataset= TextDatasetForNextSentencePrediction(
tokenizer=tokenizer,
file_path=DATA_PATH,
block_size = BLOCK_SIZE
)
data_collator = DataCollatorForLanguageModeling(
tokenizer=tokenizer,
mlm=True,
mlm_probability= 0.15
)
training_args = TrainingArguments(
output_dir= OUTPUT_DIR,
overwrite_output_dir=True,
num_train_epochs=1,
per_device_train_batch_size= 32,
save_steps=1000,
save_on_each_node=True,
prediction_loss_only=True,
)
trainer = Trainer(
model=model,
args=training_args,
data_collator=data_collator,
train_dataset=dataset,
)
trainer.train()
注意:对于 NSP 任务,输入文件由每行一个句子准备。
【问题讨论】:
【参考方案1】:错误The size of tensor a (882) must match the size of tensor b (512) at non-singleton dimension
很可能意味着该模型支持的最大文本大小为 512 个标记,但您尝试向其传递具有 882 个标记的文本。要绕过这一点,您可以在管道中的某处启用截断(很可能是在文本标记化的时刻,即在 TextDatasetForNextSentencePrediction
内或在其创建后立即)。
【讨论】:
在创建数据集的时候不这样做是不是有点奇怪? 是的。请查看源代码以查找详细信息。似乎确实发生了一些截断,所以它失败的原因并不明显。如果您提供了重现问题的最小代码+数据示例,则调试起来会更容易。 github.com/huggingface/transformers/blob/master/src/…【参考方案2】:这个错误是因为tokenization后得到的token数量超过了模型的max token capacity(512)。
创建 TextDatasetForNextSentencePrediction 对象后,可以在管道中注入手动标记化步骤:
ending_sep_token_tensor = torch.tensor([102]) 对于 dataset.examples 中的示例: 如果 len(sample['input_ids'])>MAX_LEN: 样本['input_ids'] = torch.cat((sample['input_ids'][:MAX_LEN-1], ending_sep_token_tensor), 0) 样本['token_type_ids'] = 样本['token_type_ids'][:MAX_LEN]【讨论】:
以上是关于BERT 预训练 MLM + NSP的主要内容,如果未能解决你的问题,请参考以下文章
《自然语言处理实战入门》深度学习 ---- 预训练模型的使用(ALBERT)