В соответствии с этим вопросом при использовании bert для классификации последовательностей модель использует токен «[CLS]», представляющий задачу классификации. Согласно документу:
Первый токен каждой последовательности всегда является специальным классификационным
токеном ([CLS]). Окончательное скрытое состояние, соответствующее этому токену,
используется в качестве совокупного представления последовательности для задач классификации.
Если посмотреть на репозиторий Huggingfaces, то в их BertForSequenceClassification используется метод bertpooler:
Код: Выделить всё
class BertPooler(nn.Module):
def __init__(self, config):
super().__init__()
self.dense = nn.Linear(config.hidden_size, config.hidden_size)
self.activation = nn.Tanh()
def forward(self, hidden_states):
# We "pool" the model by simply taking the hidden state corresponding
# to the first token.
first_token_tensor = hidden_states[:, 0]
pooled_output = self.dense(first_token_tensor)
pooled_output = self.activation(pooled_output)
return pooled_output
Мой вопрос:
Как они кодируют информацию из всего предложения в этот токен? Является ли токен CLS обычным токеном, имеющим собственный вектор внедрения, который «изучает» представление уровня предложения? Почему мы не можем просто использовать среднее значение скрытых состояний (выходные данные кодировщика) и использовать это для классификации?
EDIT: Немного подумав об этом: поскольку мы используем скрытое состояние токенов CLS для прогнозирования, обучаются ли встраивания токенов CLS задаче классификации, поскольку именно этот токен используется для классификации (таким образом, внося основной вклад в ошибку, которая возникает распространяется на его веса?)
Подробнее здесь: https://stackoverflow.com/questions/629 ... cls-vector