【发布时间】:2021-01-16 14:28:24
【问题描述】:
我想加载一个预训练的 Bert 模型并对其进行微调,尤其是使用自定义数据集对模型的词嵌入进行微调。 任务是使用所选单词的词嵌入进行进一步分析。 值得一提的是,数据集由推文组成,没有标签。 因此,我使用了 BertForMaskedLM 模型。
此任务可以使用输入 ID(标记化的推文)作为标签吗? 我没有标签。只是随机排列的推文。
从这里开始,我展示我写的代码:
首先,我从表情符号、非 ASCII 字符等中清除了数据集,如以下链接(2.3 节)所述: 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 语言模型,第二种是在特定数据集上训练的模型。接下来,我将从两个模型中获取特定单词的词向量,并使用偏差技术在它们之间进行比较。
标签: python pytorch word-embedding bert-language-model language-model