4

我将Huggingface Transformer包和 BERT 与 PyTorch 一起使用。我正在尝试进行 4 向情感分类,并正在使用BertForSequenceClassification来构建一个模型,该模型最终会导致 4 向 softmax。

我阅读 BERT 论文的理解是,输入CLS标记的最终密集向量用作整个文本字符串的表示:

每个序列的第一个标记始终是一个特殊的分类标记 ([CLS])。与该标记对应的最终隐藏状态用作分类任务的聚合序列表示。

那么,BertForSequenceClassification真的训练并使用这个向量来执行最终的分类吗?

我问的原因是因为当 I 时print(model),对我来说CLS向量正在被使用并不明显。

model = BertForSequenceClassification.from_pretrained(
    model_config,
    num_labels=num_labels,
    output_attentions=False,
    output_hidden_states=False
)

print(model)

这是输出的底部:

        (11): BertLayer(
          (attention): BertAttention(
            (self): BertSelfAttention(
              (query): Linear(in_features=768, out_features=768, bias=True)
              (key): Linear(in_features=768, out_features=768, bias=True)
              (value): Linear(in_features=768, out_features=768, bias=True)
              (dropout): Dropout(p=0.1, inplace=False)
            )
            (output): BertSelfOutput(
              (dense): Linear(in_features=768, out_features=768, bias=True)
              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
              (dropout): Dropout(p=0.1, inplace=False)
            )
          )
          (intermediate): BertIntermediate(
            (dense): Linear(in_features=768, out_features=3072, bias=True)
          )
          (output): BertOutput(
            (dense): Linear(in_features=3072, out_features=768, bias=True)
            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
            (dropout): Dropout(p=0.1, inplace=False)
          )
        )
      )
    )
    (pooler): BertPooler(
      (dense): Linear(in_features=768, out_features=768, bias=True)
      (activation): Tanh()
    )
  )
  (dropout): Dropout(p=0.1, inplace=False)
  (classifier): Linear(in_features=768, out_features=4, bias=True)

我看到有一个池化层BertPooler通向Dropout一个Linear可能执行最终 4-way softmax 的通向 a。但是,BertPooler我不清楚使用的。它是仅对 的隐藏状态进行操作CLS,还是对所有输入标记的隐藏状态进行某种池化?

谢谢你的帮助。

4

1 回答 1

4

简短的回答:的,你是对的。事实上,他们使用 CLS 令牌(仅此而已)用于BertForSequenceClassification.

查看 的实现会BertPooler发现它正在使用第一个隐藏状态,它对应于[CLS]令牌。我简要检查了另一个模型(RoBERTa),看看这在模型之间是否一致。在这里,分类也仅基于[CLS]令牌进行,尽管不太明显(请查看此处的第 539-542 行)。

于 2020-03-27T09:14:00.457 回答