快速和慢速的分词器产生不同的结果。

3
使用HuggingFace的pipeline工具时,我惊讶地发现使用快速和慢速分词器输出有显著差异。具体来说,当我运行填充掩码管道时,用于填充掩码的单词被分配的概率在快速和慢速分词器中是不同的。此外,尽管快速分词器的预测结果不受输入的句子数量和长度的影响,但对于慢速分词器却不是这样。以下是一个最简示例:
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]的每个单词所分配的概率对于所有示例都不相同。最后3个示例给出了相同的概率,但第一个示例给出了不同的概率。这些差异非常大,以至于两个组中的前5个结果不一致。

根据我所知,造成这种情况的原因是快速和慢速分词器返回不同的输出。快速分词器通过填充0来标准化序列长度为512,然后创建阻止填充的注意力掩码。相反,慢速分词器仅填充到最长序列的长度,并且不创建这样的注意力掩码。而是将填充的令牌类型ID设置为1(而不是非填充令牌的类型0)。根据我对HuggingFace实现的理解(在here中找到),这些不是等效的。

有没有人知道这是故意的吗?


如果你还没有这样做,我强烈建议你在他们的Github页面上发布此问题的错误报告,因为最好由他们直接回答。如果你这样做了,请在Stackoverflow问题中也链接相应的问题。 - dennlinger
1个回答

8

看起来这个bug在transformers-2.5.0transformers-2.8.0 或者 tokenizers-0.5.0tokenizers-0.5.2之间的某个时间点被修复了。升级我的transformers(和tokenizers)安装程序解决了这个问题。

(如果此问题/答案无关紧要,则应删除)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接