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),这意味着我们没有冻结权重,那么这是否意味着我们正在微调?如果我错了,请纠正我。
发布于 2021-03-12 18:14:26
微调通常意味着您将模型权重与特定于任务的层(例如,BERT上的线性层(或其他分类体系结构)用于分类任务)一起更新。因此,一般来说,您不应该冻结权重。从此以后,使用bert_classifier = BertClassifier(freeze_bert=False)进行微调是合适的。
补充说明:在实践中,有些人选择在训练任务特定层时不更新BERT模型权重(这反过来又减少了对巨大计算能力的需求)。这里,我们可以考虑使用BERT模型来提取特征或嵌入。在这种情况下,您可以使用freeze_bert=True。一些人更新了顶部几层的BERT模型权重。这完全取决于你到底想做什么。
https://stackoverflow.com/questions/66572377
复制相似问题