Loading
The trophy didn't fit in the suitcase because it was too big.
你知道 "it" 指的是什么。把一个词从 big 换成 small,你也毫不费力地知道答案反转了——因为你理解什么装得进什么。
这是一个 Winograd 句式,也是我所知最干净的一种检验:注意力是不是在做人们以为它在做的事。
关键结论: 对你而言瞬间而显然的那次反转,对模型是不可见的。不是微弱存在,不是部分察觉,而是不可见。
The trophy didn't fit in the suitcase because it was too big.
没有一个头移动过。对你来说显而易见的反转,对模型是不可见的。
两个只差一个形容词的句子。读者对 “it” 的理解在两句之间反转。胜者按位置比较,因为对两个头来说,胜者正是被替换的那个形容词本身。
换掉形容词,模型几乎不动。落在 trophy 上的 rollout 质量从 0.0611 变成 0.0616。落在 suitcase 上的从 0.0680 变成 0.0740——它朝着读者会去的方向轻微漂移,而两个句子都仍然把更多权重放在 suitcase 上,无论哪一个才是正确答案。
然后是那个定论的数字:十六个头里,零个改变了自己的胜者。
在任何一层,没有一个头在答案改变时为 it 选出不同的词。无论这些头在计算什么,指代消解都不在其中。
一点方法上的说明,因为它差点让我给出错误结论。我最初的比较是按词来匹配胜者的,报告说有两个头发生了变化。而这两个头选中的都是形容词本身——一句里是 big,另一句里是 small——那是同一个位置换了个标签。按位置比较,结果是零。一个指标可以合理、可以站得住脚,同时又在你真正想问的问题上悄悄地错着。
模型无法解析指代。这是关于一个四层编码器的事实,而诚实的回应不是把它藏起来,而是把它放在它真正咬人的地方。
那些模型无法还原其指代对象的词——it、he、she、they、this、以及所有格——在你聚焦它们时,会在排名中带上一条警告。不是页脚里的免责声明,而是附在该限制真正适用的那一行上的注记。
而且这类句子被完全排除在建议句池之外。奖杯那句话会诱使访客去问一个模型答不上来的问题,而一个抛出自己无法回答的问题的工具,在正常工作时反而显得是坏的。
关系代词被刻意排除在那份名单之外。 Who、which、that 依靠句法而非世界知识连接到先行词,而模型处理得很对:that → Birds 0.860、who → Students 0.700、that → letters 0.680。在一行已经正确解析的结果之上警告"注意力无法解析指代",是同一个错误的反方向版本——过度谨慎同样是不准确。
十篇之后,这是一份诚实的清单。
它告诉你: 在某一层的某一个头里,一个位置的 value 向量以何种比例进入了另一个位置的输出。这是关于一次真实计算的真实事实;而这个模型确实编码了你读一遍就能核对的局部句法——动词到宾语、介词到其宾语、形容词到其名词、关系代词到先行词、跨越几个词的主谓一致。
它没有告诉你: 模型理解了某种关系;这个权重对输出有影响(第 9 篇测量了这道缺口,发现它相当可观);指代已被解析;任何类似推理的事情发生过。
这两份清单之间的缺口,正是几乎所有误导性注意力可视化的栖身之地。它们不是靠编造数字——数字通常是真的——而是让读者把第一份清单里的印象,带进了第二份。
这个项目让我付出代价换来的五件事,按学到的顺序排列。
算术正确不等于正确。 这里每一个值得写下来的缺陷都是同一个形状:数学是对的,呈现在误导。这种失效模式不会出现在测试里,因为测试检查的是数学。
你的直觉无法裁判数值输出。 一个被微妙弄坏的 Transformer,看起来和正常的一模一样。去建第二个实现。在信任它之前先验证它。并接受它偶尔会是错的那一个。
无法失败的检查不算检查。 故意弄坏自己的代码,确认每一道防线都会触发。我的比较脚本有两个环节在打印误差却什么都不断言,而我只是因为扰动了数据看会发生什么,才发现这一点。
先测量再动工,并且先定好放弃条件。 范数加权那个想法很有说服力、引用充分,落地大概只要一天。测量它花了一个下午,答案是否定的。而事先写下"否定"长什么样,正是它没有在事后变成一套合理化说辞的原因。
披露是功能,不是认错。 这个工具每一处说出"这个数字不代表什么"的地方,都让它更有用,而不是更没用。那个把限定条件藏起来的版本,既更不可信,也并不更令人印象深刻。
一台会告诉你它看不见什么的仪器,比一台暗示自己什么都看得见的仪器更有价值。这就是全部的论点——而抵达它,花了十篇文章和一个被删掉的功能。
仪器在 /projects/mind-map/scene。输入一句话;它从不离开你的设备。