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

时间:2019-09-24 16:32:50

标签: python nlp pytorch spacy spacy-pytorch-transformers

我目前正在使用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>标记作为第一个输入而产生的,它对应于句子分类任务;我什至检查了句子中是否有其他可用的令牌(根据doc._.pytt_alignment,令牌没有对齐问题),所以我在这里没有任何遗漏。

According to the source code,相应的钩子只是简单地覆盖以返回张量中的相应行,因此在这里看不到任何变换。是否有明显的我想念的地方,或者这偏离了预期的行为?

1 个答案:

答案 0 :(得分:0)

似乎在此后面有一个更精细的加权方案,它也说明了每个序列中的[CLS][SEP]令牌输出。

issue post from the spaCy developers也对此进行了确认。

不幸的是,自那以后,这部分代码似乎已随着重命名移至spacy-transformers