deep-learning - 如何微调 BERT 模型?
问题描述
class BertClassifier(nn.Module):
#Bert Model for Classification Tasks.
def __init__(self, freeze_bert=False):
"""
@param bert: a BertModel object
@param classifier: a torch.nn.Module classifier
@param freeze_bert (bool): Set `False` to fine-tune the BERT model
"""
super(BertClassifier, self).__init__()
# Specify hidden size of BERT, hidden size of our classifier, and number of labels
D_in, H, D_out = 768, 50, 2
# Instantiate BERT model
self.bert = BertModel.from_pretrained('bert-base-uncased')
# Instantiate an one-layer feed-forward classifier
self.classifier = nn.Sequential(
nn.Linear(D_in, H),
nn.ReLU(),
#nn.Dropout(0.5),
nn.Linear(H, D_out)
)
# Freeze the BERT model
if freeze_bert:
for param in self.bert.parameters():
param.requires_grad = False
我想知道,如果我们调用bert_classifier = BertClassifier(freeze_bert=False)
这意味着我们没有冻结权重,那么这是否意味着我们正在微调?如果我错了,请纠正我。
解决方案
微调通常意味着您更新模型权重以及您的任务特定层(例如,BERT 之上的线性层(或其他分类架构)用于分类任务。)。因此,一般来说,您不应该冻结权重。此后,使用bert_classifier = BertClassifier(freeze_bert=False)
适合微调。
附加说明:在实践中,有些人选择在训练特定任务层时不更新 BERT 模型权重(这反过来又降低了对巨大计算能力的要求)。在这里,我们可以考虑使用 BERT 模型来提取特征或嵌入。在这种情况下,您可以使用freeze_bert=True
. 并且有些人更新了顶层几层的 BERT 模型权重。这完全取决于您到底想做什么。
推荐阅读
- abap - 无法选择表格视图中的行
- node.js - 在firebase云功能中查询firebase firestore?
- java - SecureRandom.ints() 安全吗?
- python - 名称错误未为类定义全局名称“类名”
- stripe-payments - 有用于下载收据的 Stripe API 吗?
- excel - 突出显示包含扩展列表中单词的单元格
- mysql - 如何从已截断的 Mysql 5.6 分区中清除数据?
- sap-cloud-sdk - 如何在 SCP multitanant 应用程序中获取订阅者的目的地
- vue.js - 使用 Koa 启动重定向后的 CORS 问题
- graph - 如何将二叉搜索树转换为列表