BERT微调:一次训练BERT分类模型是否正确?



我有一个关于训练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的分类模型有两种方法:

  1. threshold这是与文本编码器一起训练分类器的实践(在这种情况下是BERT,但它可以是任何其他文本编码器,例如RoBERTa, ALBERT…)。在此设置中,编码器和分类器同时进行训练。

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

研究表明,微调比使用BERT作为嵌入提供稍微更好的结果。你可以在这里找到讨论这些结果的原始研究论文。

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

Yacine

最新更新