如何解决Bert词嵌入的微调
我想加载预训练的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。
解决方法
由于屏蔽语言模型的目标是预测屏蔽令牌,因此标签和输入是相同的。因此,您所写的都是正确的。
但是,我想补充一下比较词嵌入的概念。由于BERT不是词嵌入模型,因此从某种意义上讲,上下文是同一词在不同上下文中可以具有不同的嵌入。示例:“谈话”一词在“我想谈话”和“我将参加谈话”的句子中将有不同的嵌入。因此,每个单词都没有单一的嵌入向量。 (这使BERT与word2vec或fastText不同)。预先训练的BERT上的屏蔽语言模型(MLM)通常是在您有一个小的新语料库并且希望您的BERT模型适应它时执行的。但是,我不确定使用MLM然后微调到特定任务会比直接优化带有下游任务的特定任务语料库的预训练模型带来的性能提升。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。