我想加载预训练的Bert模型并对其进行微调,尤其是使用自定义数据集对该模型的词嵌入进行微调。 任务是使用所选单词的单词嵌入进行进一步分析。 值得一提的是,数据集由推文组成,没有标签。 因此,我使用了BertForMaskedLM模型。
此任务是否可以使用输入ID(标记化的推文)作为标签? 我没有标签。只是按随机顺序发送的推文。
至此,我介绍了我编写的代码:
首先,我按照以下链接(2.3节)中所述从表情符号,非ASCII字符等中清除了数据集: https://www.kaggle.com/jaskaransingh/bert-fine-tuning-with-pytorch
第二,微调过程的代码:
import torch
device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForMaskedLM.from_pretrained('bert-base-uncased')
model.to(device)
model.train()
lr = 1e-2
optimizer = AdamW(model.parameters(), lr=lr, correct_bias=False)
max_len = 82
chunk_size = 20
epochs = 20
for epoch in range(epochs):
epoch_losses = []
for j, batch in enumerate(pd.read_csv(path + file_name, chunksize=chunk_size)):
tweets = batch['content_cleaned'].tolist()
encoded_dict = tokenizer.batch_encode_plus(
tweets, # Sentence to encode.
add_special_tokens = True, # Add '[CLS]' and '[SEP]'
max_length = max_len, # Pad & truncate all sentences.
pad_to_max_length = True,
truncation=True,
return_attention_mask = True, # Construct attn. masks.
return_tensors = 'pt', # Return pytorch tensors.
)
input_ids = encoded_dict['input_ids'].to(device)
# Is it correct? or should I train it in another way?
loss, _ = model(input_ids, labels=input_ids)
loss_score = loss.item()
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), max_grad_norm)
optimizer.step()
optimizer.zero_grad()
model.save_pretrained(path + "Fine_Tuned_BertForMaskedLM")
损失从50开始减少到2.3。
答案 0 :(得分:0)
由于屏蔽语言模型的目标是预测屏蔽令牌,因此标签和输入是相同的。因此,您所写的都是正确的。
但是,我想补充一下比较词嵌入的概念。由于BERT不是词嵌入模型,因此从某种意义上讲,上下文是同一词在不同上下文中可以具有不同的嵌入。示例:“谈话”一词在“我想谈话”和“我将参加谈话”的句子中将有不同的嵌入。因此,每个单词都没有单一的嵌入向量。 (这使BERT与word2vec或fastText不同)。预先训练的BERT上的屏蔽语言模型(MLM)通常是在您有一个小的新语料库并且希望您的BERT模型适应它时执行的。但是,我不确定使用MLM然后微调到特定任务会比直接优化带有下游任务的特定任务语料库的预训练模型带来的性能提升。