Классифицирует ли BertForSequenceClassification вектор CLS? - PullRequest
1 голос
/ 27 марта 2020

Я использую пакет 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 или выполняет какое-либо объединение скрытых состояний всех входных токенов?

Спасибо за любую помощь.

1 Ответ

1 голос
/ 27 марта 2020

Краткий ответ: Да , вы правы. Действительно, они используют токен CLS (и только этот) для BertForSequenceClassification.

. Рассмотрение реализации BertPooler показывает, что он использует первое скрытое состояние, которое соответствует на [CLS] токен. Я кратко проверил еще одну модель (RoBERTa), чтобы убедиться в ее совместимости между моделями. Здесь также классификация выполняется только на основе [CLS] токена, хотя и менее очевидного (проверьте строки 539-542 здесь ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...