RobertaModel、RobertaSequenceClassification有什么区别(抱脸)
What's difference RobertaModel, RobertaSequenceClassification (hugging face)
我尝试使用抱脸变形器api。
当我导入库时,我有一些问题。如果有知道答案的,请告诉我你的知识。
变形金刚库有几个经过训练的模型。 transformers 不仅提供像 'BertModel, RobertaModel, ... 这样的裸模型,还提供像 'ModelForMultipleChoice' , 'ModelForSequenceClassification', 'ModelForTokenClassification' , ModelForQuestionAnswering.
这样方便的头
我想知道自己添加新线性变换的裸模型和序列分类模型有什么区别。
自定义模型(具有随机初始化线性的预训练模型)和用于序列分类的变换器模型有什么不同。
ModelforSequenceClassification 是从粘合数据训练而来的吗?
我期待有人的回复谢谢。
我想看一下实际的实现是最容易理解的,我随机选择了RobertaModel
和RobertaForSequenceClassification
作为例子。然而,该结论也适用于所有其他模型。
您可以找到 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 权重会非常复杂。
我希望这能解决您的主要问题,但请随时详细说明(作为评论或新问题)任何未解决的问题!
我尝试使用抱脸变形器api。 当我导入库时,我有一些问题。如果有知道答案的,请告诉我你的知识。
变形金刚库有几个经过训练的模型。 transformers 不仅提供像 'BertModel, RobertaModel, ... 这样的裸模型,还提供像 'ModelForMultipleChoice' , 'ModelForSequenceClassification', 'ModelForTokenClassification' , ModelForQuestionAnswering.
这样方便的头我想知道自己添加新线性变换的裸模型和序列分类模型有什么区别。 自定义模型(具有随机初始化线性的预训练模型)和用于序列分类的变换器模型有什么不同。
ModelforSequenceClassification 是从粘合数据训练而来的吗? 我期待有人的回复谢谢。
我想看一下实际的实现是最容易理解的,我随机选择了RobertaModel
和RobertaForSequenceClassification
作为例子。然而,该结论也适用于所有其他模型。
您可以找到 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 权重会非常复杂。
我希望这能解决您的主要问题,但请随时详细说明(作为评论或新问题)任何未解决的问题!