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的主要内容,如果未能解决你的问题,请参考以下文章

中文bert wwm 预训练参考笔记

《自然语言处理实战入门》深度学习 ---- 预训练模型的使用(ALBERT)

恒源云_替代MLM的预训练任务,真的超简单吗?

恒源云(GPUSHARE)_替代MLM的预训练任务,真的超简单吗?

一文带你了解知识图谱融入预训练模型哪家强?九大模型集中放送

ICLR 2022 | BEIT论文解读:将MLM无监督预训练应用到CV领域