1

我目前正在使用该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),所以我不可能在这里错过任何东西。

根据源代码,相应的钩子简单地覆盖以返回张量中的相应行,所以我在这里看不到任何转换。我在这里是否缺少明显的东西,或者这是否偏离了预期的行为?

4

1 回答 1

0

这背后似乎有一个更精细的加权方案,它也解释了每个序列中的[CLS][SEP]token 输出。

spaCy 开发人员的问题帖子也证实了这一点。

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

于 2019-12-10T14:28:00.733 回答