我目前正在使用该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,这并不相同,至少对于 BERT 和 RoBERTa(有未针对更多型号进行验证):
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>
token 作为第一个输入,对应句子分类任务;我什至为我的句子检查了任何可用的其他标记(根据 没有标记对齐问题doc._.pytt_alignment
),所以我不可能在这里错过任何东西。
根据源代码,相应的钩子简单地覆盖以返回张量中的相应行,所以我在这里看不到任何转换。我在这里是否缺少明显的东西,或者这是否偏离了预期的行为?