本文来自微信公众号:新智元 (ID:AI_era),作者:新智元编辑部,原文标题:《ChatGPT危了!「注意力公式」8年神秘bug首曝光,Transformer模型恐大受冲击》,题图来源:unsplash
“注意力公式”中存在了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使用了一个长度为3204嵌入向量。
半精度浮点数计算为6KB+,仅仅是为了表示词汇表中的一个单词,而词汇表通常包含30000~50000个条目。
现在,如果你是节省内存的C程序员,你可能会想,为什么这些AI goober要使用6KB,来表示应该只需要2字节就能搞定的事情?
如果他们的词汇表小于216=65384,我们只需要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之后的所有模型),Q、K和V都来自同一输入序列。
虽然它们并不相同,因为它们在途中被以不同的方式投影,但在每一层中,它们都始于相同的已注释(已添加到)嵌入向量。
现在:^正在寻找不同位置的token(嵌入)向量之间的相关性,实际上正在构建一个相关性(点积按1/√缩放)值的方阵,其中每列和行对应一个token位置。
然后,这个方阵的每一行都经过softmax处理,得到的概率用作矩阵中的值向量的混合函数。概率混合后的矩阵被加到输入向量中,并将其传递到神经网络中进行进一步处理。
多头注意力在每个层中同时经过这个过程,进行多次处理。它基本上将嵌入向量划分成多个部分,每个头使用整个向量中的信息来注释输出向量的一个(不重叠的)段。
如果你对原始Transformer论文中的Concatenation操作感到困惑,那就是在发生的事情:头1向段1添加信息,头2向段2添加信息,依此类推。
使用softmax的问题在于,它迫使每个注意力头都要进行注释,即使它没有任何信息可以添加到输出向量中。
在离散选择之间使用softmax是很好的;但作为可选注释(即输入到加法中)使用它,就有点不太好。其中,多头注意力则会加剧这个问题,因为专门的头比通用的头更有可能想要“通过”。
现在,可能应该全面替换softmax,但它在大部分情况下效果还不错,除了一个小问题,它阻止了注意力头发出空白注释。
因此,我提出了一个非常小的调整,我愿意将所有未来的互联网声明都寄托在这个正确性上。
这个调整是如此小,又是如此明显,自从注意力被发明(2014年)以来一直在大家的眼皮底下。
softmax1和Quiet Attention
现在,经过改造的softmax Super-Mod公式来了!
不过,实际上只是在分母上加了一个“1”。
作者表示,如果愿意的话,这可以让整个向量趋向于零,但除此之外,就只是将数值缩小了一些,而这将会在归一化过程中得到补偿。其中,归一化过程会在注意力之后进行。
关键的区别在于负极限,当x中的条目明显小于零且模型试图完全避免一个注释时。
比较原始softmax的极限行为:
与新的改进softmax1的极限行为:
可以看到,原始的softmax总是会产生相同的总权重;softmax1虽然看起来大部分相同,但在负半轴中有一个逃生通道。
此外,softmax1还有其他一些特点。比如,它的导数是正数,因此我们始终有非零梯度;它的和在0和1之间,因此输出不会失控。
同时,softmax1还会保持如下函数性质,即输出向量中的相对值保持不变。
而原始的softmax即便采用更高的精度,也无法解决这些问题。也就是说,所有的Transformers都受到影响。
尽管softmax1表面上看起来相当普通,但作者有99.44%的把握,它可以解决量化的离群反馈循环问题。
对于改进后的机制,作者称之为——QuietAttention,因为它允许注意力头保持安静:
基于此,作者认为可以很快地编写一个测试:
“如果在每个输入上下文前加上一个零向量,并确保选择的神经网络中不会增加任何偏差(包括位置编码),那么零向量应该会原封不动地通过,并且在每个后续的softmax分母中都添加一个单位。这样,也就不必纠结于梯度代码了。”
此外,作者还认为可以使用一个使用固定嵌入和特殊前缀token的LLaMA模型来完成这项工作。
不过,由于仍然需要重新训练模型,所以暂时不要在Raspberry Pi上进行尝试。
顺便,如果你真的进行测试了的话,记得把结果发给这位作者——他想在即将发表的arXiV论文中制作一张漂亮的表格。
三、论文作者介绍
本文作者Evan Miller其实说起来并不是那么有名。他的履历和出身和一些科学大牛相比,确实是比不过。但并不影响他能做出本文所讲的重大发现。
Miller本科、硕士和博士三个阶段其实都没有主修计算机科学。本科阶段,他在威廉姆斯学院学的是物理。后来又在芝加哥大学攻读了经济学的博士。
而除了学业生涯,Miller写过很有名的排名算法,目前在很多网站上都有应用。他设计的统计软件还曾被顶级医学期刊引用。
目前,Miller在一家名为 Eppo 的初创公司担任统计工程师。
而Miller在他自己的网站上所展示的内容,可以看出这哥们快是个全才了。开源项目,做过7个:
各个专业的博客、文章、论文啥的,多的数不过来。有编程类的,应用数学类的,甚至还有生意经。
参考资料
https://news.ycombinator.com/item?id=36851494
https://twitter.com/EvMill/status/1683508861762695168
https://www.evanmiller.org/attention-is-off-by-one.html
本文来自微信公众号:新智元 (ID:AI_era),作者:新智元编辑部