Я использую пакет Huggingface Transformer и BERT с PyTorch. Я пытаюсь провести 4-х стороннюю классификацию настроений и использую BertForSequenceClassification для построения модели, которая в конечном итоге приводит к 4-х стороннему softmax в конце.
Мое понимание после прочтения BERT Бумага состоит в том, что конечный плотный вектор для входного CLS
токена служит представлением всей текстовой строки:
Первый токен каждой последовательности всегда является специальным классификационным токеном ([CLS]) , Окончательное скрытое состояние, соответствующее этому токену, используется в качестве представления совокупной последовательности для задач классификации.
Итак, действительно ли 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-х ходовой софтмакс. Однако использование BertPooler
мне не совсем понятно. Работает ли он только в скрытом состоянии CLS
или выполняет какое-либо объединение скрытых состояний всех входных токенов?
Спасибо за любую помощь.