我目前正在使用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,相应的钩子只是简单地覆盖以返回张量中的相应行,因此在这里看不到任何变换。是否有明显的我想念的地方,或者这偏离了预期的行为?
答案 0 :(得分:0)
似乎在此后面有一个更精细的加权方案,它也说明了每个序列中的[CLS]
和[SEP]
令牌输出。
issue post from the spaCy developers也对此进行了确认。
不幸的是,自那以后,这部分代码似乎已随着重命名移至spacy-transformers
。