私がアクセスpretrainedモデルにHuggingFaceトランスフォーマーパッケージを使用しています。私のユースケースは、英語とアラビア語の両方のための機能を必要とするように、私は使用していますBERT塩基多言語-同棲 pretrainedモデル。私は、コサイン類似度などのものを使用して文章の類似性を比較できるようにする必要があります。これを使用するには、私が最初にそれぞれの文の埋め込みベクトルを取得する必要があり、その後、コサイン類似度を計算することができます。
まず、BERTモデルからセマンティック埋め込みをextratcするための最良の方法は何ですか?うは、文章で十分に供給された後、モデルの最後の隠された状態を取りますか?
import torch
from transformers import BertModel, BertTokenizer
model_class = BertModel
tokenizer_class = BertTokenizer
pretrained_weights = 'bert-base-multilingual-cased'
tokenizer = tokenizer_class.from_pretrained(pretrained_weights)
model = model_class.from_pretrained(pretrained_weights)
sentence = 'this is a test sentence'
input_ids = torch.tensor([tokenizer.encode(sentence, add_special_tokens=True)])
with torch.no_grad():
output_tuple = model(input_ids)
last_hidden_states = output_tuple[0]
print(last_hidden_states.size(), last_hidden_states)
これが私の文章からの埋め込みを取得するのに十分な方法であれば第二に、私は今、埋め込みベクトルは、元の文章の長さに応じて、異なる長さを持っている別の問題を抱えています。形状出力される[1, n, vocab_size]
場合は、n
任意の値を持つことができます。
二つのベクトルコサイン類似度を計算するために、彼らは同じ長さにする必要があります。どのように私はここにこれを行うことができますか?全体の第1の加算としてナイーブようなものでしたaxis=1
、まだ仕事は?私は他のどのようなオプションがありますか?
あなたは使用することができ[CLS]
、シーケンス全体のための表現としてのトークンを。このトークンは、一般的に前処理ステップの間に、あなたの文の先頭に付加されます。一般的な分類作業に使用される。このトークン(中図2と段落3.2を参照してくださいBERT紙)。
これは、埋め込みの非常に最初のトークンです。
応じて、より良い結果をもたらすことができる、(あなたが最初の(?)軸の上に言うように)別の方法としては、シーケンスの平均ベクトルを取ることができhuggingfaceのドキュメント(第三の先端を)。
BERTは、私の経験では、それはまともな結果が得られないものの、コサイン距離を使用して文の類似性のために設計されていないことに注意してください。