現在、spacy-pytorch-transformer
パッケージを使用して、それぞれの埋め込みを実験しています。
紹介記事 (本質的には GitHub README) を読んだとき、トークンレベルの埋め込みは、対応するすべての単語部分の埋め込みの平均である、つまりembed(complex)
と同じであると理解しました1/2 * embed(comp#) * embed(#lex)
。
BERT の論文によると、これは単にlast_hidden_state
ネットワークのプロパティを利用する必要がありますが、以下の私の MCVE は、これが Spacy 2.1.8 と spacy-pytorch-transformers 0.4.0 では同じではないことを示しています。他のモデルでは検証されていません):
import spacy
import numpy as np
nlp = spacy.load("en_pytt_robertabase_lg") # either this or the BERT model
test = "This is a test" # Note that all tokens are directly aligned, so no mean has to be calculated.
doc = nlp(test)
# doc[0].vector and doc.tensor[0] are equal, so the results are equivalent.
print(np.allclose(doc[0].vector, doc._.pytt_last_hidden_state[1, :]))
# returns False
隠れ状態のオフセット 1 は<CLS>
、文分類タスクに対応する最初の入力としてのトークンによるものです。私は自分の文に使用可能な他のトークンを使用してチェックしたこともあり (これには によるトークンの配置の問題doc._.pytt_alignment
はありません)、ここで何かを見逃すことはありません。
ソース コード によると、対応するフックはテンソル内の対応する行を返すために単純に上書きされるため、ここでは変換は見られません。ここで私が見逃していることは明らかですか、それとも予想される動作から逸脱していますか?