我将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
,还是对所有输入标记的隐藏状态进行某种池化?
谢谢你的帮助。