Avi*_*ade 1 python language-model word-embedding pytorch bert-language-model
我想加载一个预先训练的 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")
Run Code Online (Sandbox Code Playgroud)
损失从 50 开始,减少到 2.3。
由于屏蔽语言模型的目标是预测屏蔽标记,因此标签和输入是相同的。所以,无论你写什么都是正确的。
不过,我想补充一下比较词嵌入的概念。由于 BERT 不是词嵌入模型,因此它是上下文相关的,即同一个词在不同上下文中可以有不同的嵌入。示例:“谈话”一词在句子“我想谈话”和“我将参加谈话”中将有不同的嵌入。因此,每个单词没有单一的嵌入向量。(这使得 BERT 不同于 word2vec 或 fastText)。当您有一个小型新语料库并希望您的 BERT 模型适应它时,通常会在预训练的 BERT 上执行屏蔽语言模型 (MLM)。但是,我不确定通过使用 MLM 然后微调到特定任务会获得什么性能增益,而不是直接在下游任务上使用任务特定语料库微调预训练模型。
| 归档时间: |
|
| 查看次数: |
7332 次 |
| 最近记录: |