热门话题
#
Bonk 生态迷因币展现强韧势头
#
有消息称 Pump.fun 计划 40 亿估值发币,引发市场猜测
#
Solana 新代币发射平台 Boop.Fun 风头正劲
为什么会发生这种情况?模型相信有一个海马表情符号,当然,但这为什么会导致它输出一个*不同*的表情符号呢?这是来自每个人最喜欢的被低估的可解释性工具,logit lens 的线索!
在 logit lens 中,我们以一种奇怪的方式使用模型的 lm_head。通常,lm_head 用于将残差(在模型层中构建的内部状态)转换为最终层后的令牌概率集。但在 logit lens 中,我们在*每一层*之后使用 lm_head - 向我们展示如果该层是最后一层,模型将输出哪些令牌。
对于早期层,这会导致难以解释的状态。但随着我们通过层的推进,模型迭代地将残差首先朝向有助于继续文本的概念,然后朝向最终预测。
再次查看图像,在最后一层,我们得到了模型的实际输出 - ĠðŁ, IJ, ł - 也就是,一个表情符号字节前缀后面跟着其余的鱼表情符号。
(由于令牌化的怪癖,它看起来像是 unicode 胡言乱语 - 不用担心。如果你感兴趣,可以问 claude 关于这行代码:`bytes([byte_decoder[c] for c in 'ĠðŁIJł']).decode('utf-8') == ' 🐠'`)
但看看中间层发生了什么 - 我们不仅仅得到表情符号字节!我们得到了那些*概念*,特别是海马的概念。例如,在第 52 层,我们得到了 "sea horse horse"。稍后,在 top-k 中,我们得到了 "sea"、"horse" 和那个表情符号前缀 "ĠðŁ" 的混合。
那么模型在想什么?海马 + 表情符号!它试图构建一个海马表情符号的残差表示。
它为什么要这样做?好吧,让我们看看 lm_head 实际是如何工作的。lm_head 是一个巨大的与令牌 ID 相关的残差大小向量矩阵。当一个残差被传入时,它将与每个令牌向量进行比较,并与采样器协调,选择与残差最相似的令牌 ID。(更技术性地说:这是一个没有偏置的线性层,因此 v @ w.T 对每个反嵌入向量进行点积,然后 log_softmax 和 argmax/温度采样。)
因此,如果模型想要输出单词 "hello",它需要构建一个与 "hello" 输出令牌的向量相似的残差,以便 lm_head 可以将其转换为 hello 令牌 ID。如果模型想要输出一个海马表情符号,它需要构建一个与海马表情符号输出令牌的向量相似的残差 - 理论上可以是任何任意值,但实际上是海马 + 表情符号,word2vec 风格。
唯一的问题是海马表情符号并不存在!因此,当这个海马 + 表情符号的残差到达 lm_head 时,它会对所有向量进行点积,采样器选择最接近的令牌 - 一个鱼表情符号。
现在,这种离散化是有价值的信息!你可以在 Armistice 的例子中看到,当令牌被自回归地放回上下文中时,模型可以告诉它不是一个海马表情符号。因此它再试一次,调整残差并得到一个稍微不同的表情符号,反复进行,直到它意识到发生了什么,放弃,或用完输出令牌。
但在模型从 lm_head 得到错误的输出令牌之前,它并不知道 lm_head 中没有海马表情符号。它假设海马 + 表情符号将产生它想要的令牌。
------------------
为了进一步推测,我想知道这是否是 RL 的一部分好处 - 它为模型提供了关于其 lm_head 的信息,而这些信息在层堆的末尾很难获取。(记住,基础模型并不是在自己的输出/回放上训练的 - 这仅在 RL 中发生。)

164.15K
热门
排行
收藏