RobertaModel、RobertaSequenceClassification有什么区别(抱脸)

What's difference RobertaModel, RobertaSequenceClassification (hugging face)

我尝试使用抱脸变形器api。 当我导入库时,我有一些问题。如果有知道答案的,请告诉我你的知识。

变形金刚库有几个经过训练的模型。 transformers 不仅提供像 'BertModel, RobertaModel, ... 这样的裸模型,还提供像 'ModelForMultipleChoice' , 'ModelForSequenceClassification', 'ModelForTokenClassification' , ModelForQuestionAnswering.

这样方便的头

我想知道自己添加新线性变换的裸模型和序列分类模型有什么区别。 自定义模型(具有随机初始化线性的预训练模型)和用于序列分类的变换器模型有什么不同。

ModelforSequenceClassification 是从粘合数据训练而来的吗? 我期待有人的回复谢谢。

我想看一下实际的实现是最容易理解的,我随机选择了RobertaModelRobertaForSequenceClassification作为例子。然而,该结论也适用于所有其他模型。

您可以找到 RobertaForSequenceClassification here 的实现,大致如下所示:

class RobertaForSequenceClassification(RobertaPreTrainedModel):
    authorized_missing_keys = [r"position_ids"]

    def __init__(self, config):
        super().__init__(config)
        self.num_labels = config.num_labels

        self.roberta = RobertaModel(config, add_pooling_layer=False)
        self.classifier = RobertaClassificationHead(config)

        self.init_weights()

    [...]
    def forward([...]):
        [...]

正如我们所看到的,这里没有关于预训练的指示,它只是在上面添加了另一个线性层(RobertaClassificationHead的实现可以在更下面找到,即here):

class RobertaClassificationHead(nn.Module):
    """Head for sentence-level classification tasks."""

    def __init__(self, config):
        super().__init__()
        self.dense = nn.Linear(config.hidden_size, config.hidden_size)
        self.dropout = nn.Dropout(config.hidden_dropout_prob)
        self.out_proj = nn.Linear(config.hidden_size, config.num_labels)

    def forward(self, features, **kwargs):
        x = features[:, 0, :]  # take <s> token (equiv. to [CLS])
        x = self.dropout(x)
        x = self.dense(x)
        x = torch.tanh(x)
        x = self.dropout(x)
        x = self.out_proj(x)
        return x

因此,回答您的问题:这些模型顶部没有任何预训练的附加层,您可以轻松地自己实现它们*。
现在是星号:虽然自己包装它可能很容易,但还要注意它是继承的 class RobertaPreTrainedModel。这有几个优点,最重要的一个是不同实现之间的一致设计(序列 class 化模型、序列标记模型等)。此外,他们还提供了一些简洁的功能,例如包含大量参数(填充、掩码、注意输出等)的前向调用,这将花费相当多的时间来实现。

最后但同样重要的是, 现有的基于这些特定实现的训练模型,您可以在 Huggingface Model Hub. There, you might find models that are fine-tuned on a sequence classification task (e.g., this one) 上搜索,然后 直接将其权重加载到RobertaForSequenceClassification模型中。如果您有自己的序列 class 化模型实现,加载和对齐这些 pre-trained 权重会非常复杂。

我希望这能解决您的主要问题,但请随时详细说明(作为评论或新问题)任何未解决的问题!