ChatGPT危了!「注意力公式」8年神秘bug首曝光,Transformer模型恐大受冲击

转载
482 天前
4100
AIGC

文章转载来源:AIGC

原文来源:新智元

图片来源:由无界 AI‌ 生成

「注意力公式」中存在了8年的bug,竟被国外小哥发现了?

瞬间,这个话题就在网上炸开了锅。

现在基于Transformer打造的主流模型,GPT-4、Lalma 2、PaLM等都将受到影响。

Eppo初创公司的工程师Evan Miller今天在博客中介绍了这一重大发现,并表示:


研究人员上个月分离了bug——但是他们误失了一个简单的解决方案,「为什么LLM设计人员应该停止使用Softmax?」

那么,究竟是什么bug,能够暗藏8年?

作者在博文中,引用了维特根斯坦别有蕴意的一句话,「对于无法言说之事,必须保持沉默」。

注意力是Off By One

这篇博文标题为「注意力是Off By One」。

你能看到这个公式的差一错误吗?

要知道,注意力公式是现代人工智能的核心等式,但其中有一个bug在上周让作者Evan Miller抓狂。

由此,Miller决定就这个漏洞和修复建议写篇博文。

文章中,他解释了当前一代AI模型是如何在一个关键的地方出现差一错误,这使得每个人的Transformer模型都难以压缩和部署。

不过,作者强调这只是一篇观点文章,但如果网上有人想做一些实验来证明这是对的,可以一起合作验证。


全与「离群值」有关


首先,先谈谈为什么差一错误很重要。ChatGPT工作得很好,有什么问题吗?

作者第一次发现了不对劲的地方,是在忙自己的事情和阅读量化研究论文时发现,这是一种通过LLM Edgers将大型模型压缩到Mac Minis、Rasberry Pis,以及破解家用恒温器的技术。

在AI领域,每个人都会受到RAM限制。

所以你使用的RAM越少,你就可以做的更多酷炫的事情,无论是在云端还是在边缘设备上。

LLM有数十亿的权重,如果我们可以让这些权重缩小,我们可以写出更好的十四行诗,或者剽窃更优秀的文章,又或者加速世界末日,这都取决于你使用语言的个人动机。

RAM存储信息,这听起来像是一种同义反复。信息是负对数概率,即我们需要多少位来存储事物。

如果一串数字流可预测,例如始终限制在一个有限的范围内,我们需要的比特数就会少一些。

如果一个数字流不可预测,比如偶尔出现一个超大数字,我们需要更多的二进制数字来编码这个庞然大物。

这就是在LLM中正在发生的事情(出于目前仅能部分理解的原因)。

Transformer模型包含这些离群权重(outlier weights),并且产生了相差一个数量级的巨大激活。

但是没有人能够消除它们。这些megalodons(研究命令行工具)看起来对这些模型的运行至关重要。

但是它们的存在与我们在构建优秀模型之前,所了解的关于神经网络的一切知识相矛盾。

已经有很多论文讨论这些离群值(outlier),人们已经想出了各种各样的位燃烧方案,以更少的1和0来进行编码。

因为现在,我们使用普通的比例和偏差整数量化得到的性能退化非常严重。

关于所有这些的最佳分析来自高通AI研究院的一篇论文:「Quantizable Transformers: Removing Outliers by Helping Attention Heads Do Nothing」。

论文地址:https://arxiv.org/pdf/2306.12929.pdf

作者们将这些离群值的存在,追溯到注意力机制的softmax函数。这个看似无辜的指数函数,没有人发现其能够产生如此严重的峰度异常。

而研究人员也就差点发现这个边界错误。

对此,作者表示,高通研究人员暂时还未回复自己电子邮件,但必须通过这种方式呼吁国际学者社区。如果你读了这篇链接的论文,就忽略他们的建议吧。

修剪后的softmax带有一个旋转式的零梯度,他们的门控注意力提议虽然可行,但是为了解决这只是一个增量的失败而引入了数百万个新的参数。

在作者看来,这里有一个简单而明显的解决方案,就自己阅读的所有内容中,还没有人想过去尝试。

接下来,一起谈谈softmax函数,以及为什么在处理注意力时,它并非最适合的工具。

Softmax出现的问题

为了解释这个错误,你真的需要理解注意力机制的目标。

这么做个类比吧,大多数数值错误都是程序员错误地实现方程。

然而,当你处理的不是错误的代码,而是错误的数学时,你需要理解这个等式来自哪里,以及你应该怎么做,才有可能修复它。

对此,作者不得不阅读了大约50篇arXiV论文来理解所有这些。

首先,从输入嵌入开始理解,这是一个浮点向量,它表示输入字符串中的一个单词。

这个向量似乎每年都在变高,比如,最近的LLaMA 2模型从Meta使用了一个长度为3,204嵌入向量。

半精度浮点数计算为6KB+,仅仅是为了表示词汇表中的一个单词,而词汇表通常包含30,000——50,000个条目。

现在,如果你是节省内存的C程序员,你可能会想,为什么这些AI goober要使用6KB,来表示应该只需要2字节就能搞定的事情?

如果他们的词汇表小于

,我们只需要16位就能表示一个条目,对吧?

这正是Transformer实际在做的事情:它将输入向量转换为相同大小的输出向量,这个最终的6KB输出向量需要编码绝对一切,以预测当前词语之后的词语。

每一层Transformer的工作就是,实实在在地向原始的单词向量添加信息。

这就是残差(née skip)连接的作用:所有的注意力机制只是向原始的两个字节信息添加补充材料,分析更大的上下文以指示。

例如,单词「pupil」指的是学生,而不是你的瞳孔。重复几十次注意力机制,你就掌握了英语和所有丰富的内容。

现在,Transformer 的最后一步是将这个输出向量与一个矩形矩阵相乘,并将结果的词汇长度向量塞入softmax,将那些指数输出视为下一个词的概率。

这是合理的,但每个人都知道它并非是完全正确的。

因为没有模型将那些输出概率视为正确,与之相反,每个实现和其他模型都使用采样机制来掩盖softmax过度表示低概率的事实。

这一切都很好,也可行。

在输出步骤中的softmax为词汇表中的每个词提供了梯度,这是一个合理的选择,直到有更好的词出现。

但作者想要辩论的是,Transformer的输出softmax与注意力机制的内部softmax有着不同的目的,我们都应该去除后者,或者至少用一些方便的东西支撑起它的分母。

那么什么是softmax?

softmax最初起源于统计力学中,用于基于能级预测状态分布:

然后经济学家意识到,如果人们的线性效用函数中的噪声项恰好遵循Gumbel分布,那么某人选择某个项目的概率将与效用输入的指数成比例:

而这也使得softmax在多项式逻辑函数中有了用武之地。

可以说,softmax是一种将实数映射为总和为1的概率的「作弊代码」。

在物理学中,它效果很好;在经济学中,它有点虚假,但是一旦它进入机器学习领域,每当涉及到离散选择时,它似乎就成为一种行之有效的东西。

这就是softmax的核心机制:它强制在竞争的替代方案中进行选择,无论是粒子选择能级状态,还是消费者选择汽车。

也就是说,如果softmax机制根本不想做出任何选择,softmax将需要进行修改,否则我们预期softmax在遇到实际数据时会产生扭曲。

就LLM而言,其中一个扭曲是对非语义token(逗号等)进行重点加权,而那些权重也就变成了难以压缩的异常值。

对此,高通AI研究人员发现,LLM中97%以上的异常激活发生在空白和标点位置。

哪里会出错?

接下来,让我们深入研究softmax在注意力中的使用,并看看它在哪里出错了:

分解一下:在仅解码器模型中(即ChatGPT之后的所有模型),