首页 > 解决方案 > 如何微调 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)这意味着我们没有冻结权重,那么这是否意味着我们正在微调?如果我错了,请纠正我。

标签: deep-learningpytorchbert-language-model

解决方案


微调通常意味着您更新模型权重以及您的任务特定层(例如,BERT 之上的线性层(或其他分类架构)用于分类任务。)。因此,一般来说,您不应该冻结权重。此后,使用bert_classifier = BertClassifier(freeze_bert=False)适合微调。

附加说明:在实践中,有些人选择在训练特定任务层时不更新 BERT 模型权重(这反过来又降低了对巨大计算能力的要求)。在这里,我们可以考虑使用 BERT 模型来提取特征或嵌入。在这种情况下,您可以使用freeze_bert=True. 并且有些人更新了顶层几层的 BERT 模型权重。这完全取决于您到底想做什么。


推荐阅读