#nlp #pytorch #word-embedding
#python #nlp #pytorch #встраивание слов
Вопрос:
Я хотел бы использовать современный LM T5, чтобы получить вектор встраивания предложений. Я нашел этот репозиторий https://github.com/UKPLab/sentence-transformers Как я знаю, в BERT я должен взять первый токен в качестве токена [CLS], и это будет вложение предложения. В этом репозитории я вижу такое же поведение в модели T5:
cls_tokens = output_tokens[:, 0, :] # CLS token is first token
Правильно ли это поведение? Я взял кодировщик из T5 и закодировал с его помощью две фразы:
"I live in the kindergarden"
"Yes, I live in the kindergarden"
Косинусное сходство между ними составляло всего «0,2420».
Мне просто нужно понять, как работает встраивание предложений — должен ли я обучать сеть находить сходство для достижения правильных результатов? Или мне достаточно базовой предварительно подготовленной языковой модели?
Ответ №1:
Для того, чтобы получить встраивание предложений из T5, вам необходимо взять last_hidden_state
вывод кодировщика T5:
model.encoder(input_ids=s, attention_mask=attn, return_dict=True)
pooled_sentence = output.last_hidden_state # shape is [batch_size, seq_len, hidden_size]
# pooled_sentence will represent the embeddings for each word in the sentence
# you need to sum/average the pooled_sentence
pooled_sentence = torch.mean(pooled_sentence, dim=1)
Теперь у вас есть встраивание предложений из T5
Комментарии:
1. Кроме того, обратите внимание, что вы должны игнорировать маску при выполнении среднего:
(output.last_hidden_state * attn.unsqueeze(-1)).sum(dim=-2) / attn.sum(dim=-1)
2. Чтобы поддержать эту идею дальше, в предложении-T5 они показывают, что встраивание среднего токена является отличным выбором для T5.