如何在 spacy-pytorch-transformers 中计算令牌向量

How are token vectors calculated in spacy-pytorch-transformers

我目前正在使用 spacy-pytorch-transformer 包来试验各自的嵌入。
在阅读介绍性文章(本质上是 GitHub README)时,我的理解是令牌级嵌入是所有相应词块的嵌入的平均值,即 embed(complex) 与 [= 相同13=].

根据 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

hidden states偏移1是因为<CLS>token作为第一个输入,对应句子分类任务;我什至检查了我的句子的任何其他标记(根据 doc._.pytt_alignment,它没有标记对齐问题),所以我不可能在这里遗漏任何东西。

According to the source code,相应的钩子只是简单地覆盖了张量中相应的行 return,所以我在这里看不到任何转换。是否有明显的我在这里遗漏的东西,或者这是否偏离了预期的行为?

这背后似乎有更精细的加权方案,它也考虑了每个序列中的[CLS][SEP]令牌输出。

issue post from the spaCy developers也证实了这一点。

不幸的是,这部分代码似乎已随着重命名为 spacy-transformers.

而移动