【问题标题】:BERT finetuning : Is it right to train BERT Classification model at once?BERTfinetuning:一次训练BERT分类模型对吗?
【发布时间】:2021-10-02 02:31:07
【问题描述】:

我有一个关于训练 BERT 分类(或预训练模型)的问题。

BERT 分类器模型通常构建 2 个模型。 BERT 模型和分类器。

许多 BERT 微调示例代码同时训练 BERT 模型和分类器层。 但我认为,分类器首先是训练,BERT 权重不应该更新。分类器训练后,训练所有模型层。

例子

import torch
from transformers import BertForSequenceClassification
model = BertForSequenceClassification()
...

# training1
for name, param in model.named_parameters():
    if 'classifier' in name:
        param.requires_grad = True # only classifier update
    else:
        param.requires_grad = False # tied other layer

...
# And after training1, we can using BERT model that is trained only classfier.
model = BertForSequenceClassification()
model.load_state_dict(torch.load({model only trained classifier})
for name, param in model.named_parameters():
    param.requires_grad = True # training all 

# training BERT Classification model

为什么要一次性训练 BERT 分类模型? 谢谢。

【问题讨论】:

  • 为什么你认为 BERT 模型不应该与分类(特定任务)层一起进行联合训练?
  • 许多例子表明,使用特定任务层的预训练模型训练效果很好。但我认为,BERT 模型已经训练过了,但特定于任务的层只是初始化了。所以想知道为什么他们给我看好的结果。实验结果存在,但我找不到理论结果。
  • BERT 模型在通用和大型语言语料库上进行训练。因此,继续微调任务特定层和任务特定数据的 BERT 模型总是有利的。

标签: machine-learning nlp huggingface-transformers bert-language-model


【解决方案1】:

有两种方法可以训练基于 BERT 的分类模型:

  1. 微调:这是与文本编码器(在本例中为 BERT,但它可以是任何其他文本编码器,例如 RoBERTa、ALBERT...)一起训练分类器的做法。在这种设置下,编码器和分类器同时训练。

  2. BERT 作为嵌入模型:在这里你冻结了 BERT 的权重,你只训练分类器。在这样的设置结束时,BERT 将与训练前完全相同。

研究表明,与使用 BERT 作为嵌入相比,微调提供的结果略好。您可以找到讨论这些结果的原始研究论文here

您的建议是两者之间的权衡,这很有趣。我自己从未尝试过,但我怀疑你会遇到过度拟合,因为你在相同的数据上训练了你的分类器两次。所以我想你会比冻结 BERT 有更好的结果,但是你的模型比微调方法更难泛化到看不见的数据。

亚辛

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 2020-12-08
    • 2021-05-13
    • 1970-01-01
    • 2021-10-22
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多