【发布时间】:2020-07-24 18:00:29
【问题描述】:
使用 HuggingFace 的 pipeline tool,我惊讶地发现使用快速和慢速分词器时输出存在显着差异。
具体来说,当我运行填充掩码管道时,分配给将填充掩码的单词的概率对于快速和慢速分词器来说是不同的。此外,尽管无论输入句子的数量和长度如何,快速分词器的预测都保持不变,但对于慢速分词器而言,情况并非如此。
这是一个最小的例子:
from transformers import pipeline
slow = pipeline('fill-mask', model='bert-base-cased', \
tokenizer=('bert-base-cased', {"use_fast": False}))
fast = pipeline('fill-mask', model='bert-base-cased', \
tokenizer=('bert-base-cased', {"use_fast": True}))
s1 = "This is a short and sweet [MASK]." # "example"
s2 = "This is [MASK]." # "shorter"
slow([s1, s2])
fast([s1, s2])
slow([s2])
fast([s2])
每个管道调用都会产生可以填充[MASK] 的前 5 个令牌,以及它们的概率。为简洁起见,我省略了实际输出,但在所有示例中,分配给填充 [MASK] 和 s2 的每个单词的概率并不相同。最后 3 个示例给出了相同的概率,但第一个示例产生了不同的概率。差异如此之大,以至于两组的前 5 名并不一致。
据我所知,这背后的原因是快速和慢速分词器返回不同的输出。快速分词器通过用 0 填充将序列长度标准化为 512,然后创建一个注意掩码来阻止填充。相比之下,slow tokenizer 只填充最长序列的长度,并不会创建这样的注意掩码。相反,它将填充的令牌类型 id 设置为 1(而不是 0,这是非填充令牌的类型)。根据我对 HuggingFace 实现的理解(发现 here),这些并不等同。
有人知道这是不是故意的吗?
【问题讨论】:
-
如果您还没有,我强烈建议您将其作为错误报告发布在他们的 Github 页面上,因为这似乎最好由他们直接回答。如果你这样做,也请在 Stackoverflow 问题中链接相应的问题。
标签: python nlp huggingface-transformers bert-language-model huggingface-tokenizers