【花师小哲】当代炼金术(神经网络)前沿(29)——Make RNN Great Again
虽然本系列专栏的名称是当代炼金术(神经网络)前沿,但讲的大部分都是大模型。当然,也没办法,这个就是前沿。虽然很多期都把某个知识点当做是常识了,但这里还是说一下,目前大家看到的大模型底层都是transformer架构,或者说attention机制。这个在很早之前的科普就提过:
但,今天这篇同样来自于谷歌的论文要做的事情就是:Make RNN Great Again。


1.讲讲几个架构对比
transformer可以说是谷歌研究成果的集大成,似乎transformer就是一切神经网络架构的重点,即使是MoE等方法也不是推翻attention机制,只是在其他方向找出路罢了。
传统上,计算机视觉用的是CNN,自然语言处理用的是RNN,而transformer可以取代这两套架构,成为类似于大一统的底层架构。
然而并不是说这些传统的方法就没有用了,例如即使在Diffusion大行其道的时候,也有团队在继续研究GAN,为GAN正名。
这点对于RNN也是一样,虽然transformer很强大,但RNN的各种变体——以LSTM和SSM为例,仍然在各种地方发挥着难以被替代的作用。
不过本文算是回归初心,在原始的RNN基础上进行修改

2.为什么需要重新研究RNN
虽然transformer很强大,但不代表它没有劣势,实际上,劣势还是挺多的。
(1)transformer处理的序列总归是有上限的。这个上限在设计网络时就已经定下来了,我们使用ChatGPT有输入长度限制就是来源于此。虽然GPT-4大大扩展了这个数值,但总归是有限制的,但如果我要处理非常、非常长的序列呢?即使我们有一些办法能够“延长”transformer能够处理的序列长度,但总归还是有上限。而RNN可以说是没有上限的方法(虽然到后面很可能是会失控的)
(2)transformer计算复杂度高。因为transformer实际上可以看成是一种全连接图神经网络。之前也讲过,因为attention机制是要显式地建立“个体”之间的联系的,所以计算复杂度会很高,而RNN是一个个输入进去的,下一个输入只和上一个结果有关(虽然也不是只以来上一个输入了),整体就比较简单。当然transformer是可以靠并行来续命的,但从理论分析上来讲,计算量还是摆在那里的
所以上,基于以上的分析,我们确实可以尝试做一件事——Make RNN Great Again:


3.如何改进RNN
本文的核心方法非常简单——线性化。
稍微有些神经网络基础的朋友一定很熟悉激活函数,例如sigmoid:

简单来说,激活函数就是在每个神经元“汇总”上一层的数值后对结果用一个函数处理一下,或者用简单的式子表示:y=f(Ax)(A是一个矩阵,这里用了简化的写法)。我们可以看到,sigmoid函数是非线性的,这就意味着如果多套几层的话会出现这样一个算式:y=f(Af(Af(Ax))),如果f函数是非线性的,整体计算就很复杂了。
那么有朋友就问了:那我们把非线性函数去掉不就可以了。
没错,谷歌也是这么想的。那问题来了,为什么之前一直没想着去掉呢?
一个很显而易见的观点是:非线性函数一般意味着更高的计算复杂度,也往往有着更好的性能。虽然在深度网络中人们常用ReLU(RNN中还常用tanh),但ReLU本身其实也不是线性函数,只是有线性部分。
另一个点是:我们可以证明使用tanh或sigmoid的单层RNN是图灵完备的。可能就是这一点很吸引人,导致一直没有去掉。
但谷歌的实验证明,我们可以去掉非线性函数,在某些情况下表现会更好。

4.线性化带来的优势
线性化之后,很多事情就好做了:
(1)我们观察之前的式子y=f(Ax),如果f(x)=x,整个式子就是y=Ax,那么多加几层就是y=(A^N)x。哎,是不是感觉计算简单多了。并且,学过线性代数的朋友应该看出来了,如果我们把A对角化是不是计算就更简单了。什么,你说不是所有矩阵都可以对角化的?没有关系,我们可以变到复数域去做。
(2)复数域的重新构筑。变到复数域之后,复数并不是很好处理,但复数和实数并不是完全分割的(例如欧拉公式),所以我们可以改变一下整个式子的形式,这样我们就有了可以训练的参数了。与此同时,这里还用了一些优美的数学在某种程度上解决梯度爆炸、梯度消失等问题(所以去非线性没那么简单啊)
(3)并行化。这样做之后我们也可以对RNN做并行,进一步提升速度

5.结语
OK,再经过这一套理论水平max的连招后,RNN变得焕然一新,但是这样就可以和attention-based模型抗衡了吗?很可惜,有人做实验证明还有差距。
不过毕竟RNN还是有可以处理无限长序列等优势,只能说未来可期,莫欺少年穷,我们都有光明的未来。