【发布时间】:2020-07-07 15:00:17
【问题描述】:
我正在使用 Huggingface Transformer 包和带有 PyTorch 的 BERT。我正在尝试进行 4 向情感分类,并正在使用 BertForSequenceClassification 构建一个模型,最终最终导致 4 向 softmax。
我阅读 BERT 论文的理解是,输入 CLS 标记的最终密集向量用作整个文本字符串的表示:
每个序列的第一个标记始终是一个特殊的分类标记 ([CLS])。这个token对应的最终隐藏状态作为分类任务的聚合序列表示。
那么,BertForSequenceClassification 真的会训练并使用这个向量来执行最终分类吗?
我问的原因是因为当我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。但是,我不清楚BertPooler 的使用。它是仅在 CLS 的隐藏状态上运行,还是对所有输入标记的隐藏状态进行某种池化?
感谢您的帮助。
【问题讨论】:
标签: python machine-learning pytorch bert-language-model huggingface-transformers