今天终于找到短的一点点时间写一下自己的想法。
如下是描述了 LLM(大语言模型)经过研究后发现的一个缺点,被称作“逆转诅咒”。
主要发现是:如果一个LLM在训练数据中学习到“A是B”这样的句子,它通常不能推导出反方向的“B是A”。比如模型学到“奥拉夫·朔尔茨是德国第九任总理”,但问它“谁是德国第九任总理”时,它不能回答“奥拉夫·朔尔茨”。
然后就可以看到各大营销号开始说:啊,LLM被曝重大缺陷!要寄了!
实际上寄了吗?还真不一定。
这下又得从我们的熟人变压器看起。
Transformer的架构上可以很容易看出它就是为了处理序列而存在的。但是,有一些不一样的地方在于,Transformer实际上是抛弃了一些之前RNN或者CNN做的假设,而采用了一种更加泛用的模式。
在CNN里,我们假设相邻的东西存在很强的关联性。当CNN的卷积核扫过整个图像时,它会将相邻部分的像素联系在一起并且压缩成一个更小更抽象的东西。当不断的聚合起来,我们最终也就能得到关于图像整体的抽象特征。但是,我们仍然可以看出,在形成对图像的整体认知之前,我们是先将小部分区域进行抽象,接下来再不断压缩而产生最终结果。Transformer不对空间做任何的假设。这就是CNN比Vision Transformer更好训练的原因。当CNN在局部只能考虑到附近的影响时候,Transformer可以去考虑更远距离的像素所带来的影响。
这样其实可以看到,当Transformer没有假设任何东西的时候,它就成为了任何东西。Vision Transformer的存在也代表了这一点。它可以在大量的数据之间学习到相邻像素的影响,从而成为类似卷积网络的东西(虽然不是很贴切的描述)。这样带来的坏处就是,学习的速度显著的慢了下来,因为我们没有通过结构给予模型任何先验假设。
同样,在RNN里,假设也是显而易见,也就是序列前面的数据会对后面造成影响,并且时间上越靠近,所带来的影响也就越大。但是后面发现,有些时候这个假设也是不太对,因为模型老会忘掉一些很早以前但是很重要的东西。接下来,LSTM就出现了,但是它无非是加强了一点假设,也就是说它认为除了最近的数据,很早以前但是很重要的东西也是要记住的。所以它利用了长期短期两个记忆输入输出。同样的,对于Transformer来说,它没有对时间做任何的假设,这就是Transformer需要Positional Encoding的原因。Positional Encoding存在的目的是让模型意识到位置上的区别,从而在时间上做出不同的注意力。但是Positional Encoding存在的假设同样是相邻的东西会更重要,这一点确实是在文本和时间序列上有体会的。但是Transformer的Attention给了他可以查询更远地方的可能性。也就是说,它不会选择忘记。
学习是什么,机器学习同样代表了什么。和教育感到类似,研究机器学习其实就是在研究如何学习,也就是“元学习”。当然在机器学习里同样有一个元学习是为了学习到如何学习。嵌套的概念让人眼花,但是这就和物理上的位移,速度,加速度,加加速度一样,可以无穷的嵌套下去。从无穷得到的微积分,本身也可以继续无穷嵌套下去。
当然,扯远了,其实我想要表达的就是,在机器学习里,模型的设计就是在注入先验条件,也就是人类本身的知识,对于世界的描述。当不假设任何东西时,我们可以学到一切,代价就是很慢。当存在假设时,我们可以学的很快,但是学不到假设之外的其它东西。在自然无限的蒙特卡洛过程中,人类作为其产物,保存了许多可以让我们存活的先验条件。设计AI,无非就是把这些知识传递下去而已。
Transformer其中重要的除了Attention,就是下面的全连接网络FFN。为什么要用FFN?其实不如说,为什么不用FFN?FFN是在机器学习最早期阶段就出现的东西,同样被证明是可以拟合一切函数的函数(只要加量)。我们从生物大脑学习到了如何仅凭借加量就可以适应一切的能力。然而,加量的代价就是时间的延长。如果有足够大的FFN和足够长的时间,它在图像上训练出来的结果可以媲美CNN,但是我们不这样做,因为FFN没有包含任何的假设。它足够灵活,却又极其的笨拙。
Transformer不仅仅在我看来,可能共识上就是模型架构上最伟大的发明之一,就如同 ResNet 一样巧妙,简单却又不失优雅,也是工程学上的完美胜利。它再一次证明了我们除了从生物体上借鉴解决方案,人类的知识也可以发展到如此地步,以至于跨领域的应用变得如家常一样简单。在FFN的基础上,它加上了数据可以切分成为Unit的假设,从而使得处理任意大小数据变为可能。而CNN与RNN在强假设上忽略掉了假设之外的内容,所以有最令人震撼的效果的模型大多数包含了Attention机制。这是理论与现实的平衡。
对于它产生的目的,文本相关的处理来说,它已经取得了足够高的成就,那就是LLM,大语言模型。
LLM作为自回归网络,它将历史的所有文本进行考虑,然后输出下一个词。如何考虑的,我们只能一瞥,细致的内容无法考究,因为这是它自己学习得到的。最近也有很多的研究也有了LLM的可解释性方面的进展,比如尝试用另外一个网络去解释它。
首先有的研究结果是,神经网络可以在这种东西上学习到抽象的语义表达。比如情绪,在文本具有不同情绪的情况下,LLM内部不同的神经元也会相应的激活,也就是说,很可能有神经元代表高兴的情绪,也有的代表生气。接下来的研究着重提取哪些神经元掌管哪种语义。因为神经网络所依赖的梯度下降算法本质上是另一种叠加算法,其实就相对于把所有数据按照叠加的方式印在所有的神经元里面(某种情况下,假如你让它分类图片,你甚至可以在权重里面找到具体的形状)。本质上来说,它和规范化的程式没有太大区别,都是死记硬背然后根据查询到的已经见过的东西输出答案。(Attention知道查询很重要所以把类似数据库的思维放了进来。)所以有些语义是由多个神经元同时激活而表达的,而这也是我们预料之内的东西。
根据这些已有的研究,我可以对“逆转诅咒”做出一些猜测。因为LLM输入的文本首先被转变成为文本向量,而向量则是一串具有特殊意义的数字。输出的时候,也是根据输出的向量进行匹配从而得到文本结果。在输入和输出的向量之间,我们可以显然看到一些链接,那就是输出的向量是由输入的向量进行了某种映射产生的。这个映射呢,肯定就是FFN来进行的。因为FFN可以拟合一切函数,而FFN又是非线性变换。进入的向量经过各种非线性变换最后产生了结果。假如我们从语义的角度进行考量,那么这些变换就极有可能是我们认知中的逻辑规则,比如按下开关灯泡就会亮一样。输入是的语义为“按下开关”,那么可能经过某一个FFN以后就变成了“亮灯”。但是这确实在语义层面上为单向的变换。当输入为“亮灯”时,它可以自动匹配到“按下开关吗”?很显然,我们并没有指定它这么做。而这个玩意遵循最小作用量原理,也就是说它很懒,你不让他做的事情就不考虑了。这样,翻转诅咒就产生了。也就是说,模型在根据句子的这种语义训练情况下,它是不可能学习到反向的东西,因为我们根本没让它这么学!
为什么反向诅咒在我们给了prompt以后就会消失呢?同理,反向的推理是在句子中很常见的,模型不可能直接学习到两个东西之间的反向映射,但是它可以学习到如何反向映射。 假如我给定”A是B“在context里面,它可以知道B是A,因为输入的数据和内部存储的映射是两码事。这就和你想要强行修改算法本身让它匹配相应的case一样,它明明可以匹配到所有的case,但是你修改它本身想要让它多匹配一个,那它只能啊吧啊吧了。
说白了就是,模型的目标和人类的不一致。我们以为它会在训练中学到反向,但是我们却没有要求它这么学。我们只要求它最终产出这个序列的可能性变高。这一点是造成预期不符合的重要原因。所以,当你发现事情和你预期不符的时候,不妨看看假设是不是错了,对吧。
如何解决这个问题呢?至少我感觉很浅显,就是直接把你想要的东西放入Prompt里面就好啦。
欸,但是我不想放这么长的Prompt怎么办?要么使用外接知识库,要么相同的,继续训练模型,但是一定不要那样子训练,因为模型是不能这么学到反向内容的。这个问题其实我在很久之前就在思考,如何才能把prompt固化到模型参数内。有些时候,模型参数和prompt起到相似的效果,但是它们在更改方式上也不尽相同。这就是函数本身和输入值的区别,虽然运算过程也可以用数值描述,但是总归不是同一种解释方法。目前针对现有的模型,我只能想到使用prompt生成模型各种可能的输出,然后再利用这部分输出训练模型。或者结合脉冲神经网络的启发,可以通过调高输入prompt激活的那些神经元的权重,来将prompt嵌入到模型内。总之两种方法我都没有实验过,或许等着相似想法的论文和实验出现,或者已经有人做过了,只是我不知道。
其实说白了还是,目前的大语言模型在设计结构上还是有严重的缺陷。我们不能只把语言生成看作简单的自回归问题。相反,应该利用Attention机制的优势,动态的改进思考的容量,将模型的逻辑思考能力最大化。我们的Attention,不应该只在Token之间。