BERT 域适配

BERT Domain Adaptation

我正在使用 transformers.BertForMaskedLM 在我的自定义数据集上进一步预训练 BERT 模型。我首先通过用空格分隔单词将所有文本序列化为 .txt 文件。然后,我使用 transformers.TextDataset 通过作为 tokenizer 参数给出的 BERT 分词器加载序列化数据。然后,我使用 BertForMaskedLM.from_pretrained() 加载预训练模型(这是 transformers 库提供的)。然后,我使用 transformers.Trainer 在我的自定义数据集上进一步预训练模型,即领域适应,持续 3 个时期。我用 trainer.save_model() 保存模型。然后,我想加载进一步的预训练模型以在我的自定义数据集中获取单词的嵌入。要加载模型,我使用 AutoModel.from_pretrained() 但这会弹出警告。

Some weights of the model checkpoint at {path to my further pre-trained model} were not used when initializing BertModel

所以,我知道为什么会弹出这个。因为我使用 transformers.BertForMaskedLM 进行了进一步的预训练,但是当我使用 transformers.AutoModel 加载时,它会将其加载为 transformers.BertModel。我不明白的是这是否是一个问题。我只想获取嵌入,例如,大小为 768 的嵌入向量。

您保存了一个装有 LM 头的 BERT 模型。现在您要将序列化文件加载到独立的 BERT 结构中,不带任何额外元素,并发出警告。这是很正常的,没有致命错误!您可以检查卸载的参数列表,如下所示:

from transformers import BertTokenizer, BertModel
from transformers import BertTokenizer, BertLMHeadModel, BertConfig
import torch

lmbert = BertLMHeadModel.from_pretrained('bert-base-cased', config=config)
lmbert.save_pretrained('you_desired_path/BertLMHeadModel')
lmbert_params = []
for name, param in lmbert.named_parameters():
    lmbert_params.append(name)
bert = BertModel.from_pretrained('you_desired_path/BertLMHeadModel')
bert_params = []
for name, param in bert.named_parameters():
    bert_params.append(name)
params_ralated_to_lm_head = [param_name for param_name in lmbert_params if param_name.replace('bert.', '') not in bert_params]
params_ralated_to_lm_head

输出:

['cls.predictions.bias',
 'cls.predictions.transform.dense.weight',
 'cls.predictions.transform.dense.bias',
 'cls.predictions.transform.LayerNorm.weight',
 'cls.predictions.transform.LayerNorm.bias']