【问题标题】:Fine tuning of Bert word embeddings微调 Bert 词嵌入
【发布时间】: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


【解决方案1】:

由于掩码语言模型的目标是预测掩码标记,因此标签和输入是相同的。所以,你写的都是对的。

不过,我想补充一下比较词嵌入的概念。由于 BERT 不是一个词嵌入模型,它是上下文相关的,从某种意义上说,同一个词在不同的上下文中可以有不同的嵌入。示例:“谈话”一词在“我想谈话”和“我将参加谈话”这两个句子中有不同的嵌入。因此,每个单词都没有单一的嵌入向量。 (这使得 BERT 与 word2vec 或 fastText 不同)。当你有一个小的新语料库并希望你的 BERT 模型适应它时,通常会在预训练的 BERT 上执行掩码语言模型 (MLM)。但是,我不确定通过使用 MLM 然后对特定任务进行微调,而不是直接在下游任务上使用任务特定语料库对预训练模型进行微调,您会获得什么性能提升。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 2020-09-17
    • 2020-07-01
    • 2017-03-13
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多