原创 PENG Bo 2025-09-14 20:59 广东
本篇接前篇(理解LLM系列:文字vs图像)
💡Tips本篇接前篇(理解LLM系列:文字vs图像)。转自知乎用户 PENG Bo,原文链接:
三、升级RNN的常见路线
据传,除了已公布的,最近国内还有很多家在做RNN。
各家做了之后,必定就会大吹“创新”以及RNN的优点,一改此前全员黑RNN的态势。
我看,我还是直接写一篇,覆盖各种常见的RNN升级路线,因为都“过于落后,可以公开”。
某些“做研究靠考古”的朋友,这里教你做事,照着做就可以灌n篇。
第1招:扩大State
这是朴素的想法,也是典型的误区。例如,扩大head size,给内部模型加大参数量,当然还有混合模型,等等。
State越大,性能越好,但bsz受限,未来必败。
我先给出一种通用的理解。
我的观点,这里有一个“状态的阶梯”:scalar state => vector state => matrix state(目前新型RNN的位置)=> tensor state(偶尔有论文写) => function state(注意attention实际是一种例子) => functional state => … 后面还能写很多,懂数学就知道。
当然,还可以脱离线性代数,从其它观点看(群,李群,微分几何,泛函,范畴,等等)。以及,新型硬件可改变其中的某些复杂度。一切才刚刚开始。
言归正传,举例,肯定有人搞tensor state,那么,其实我在Discord说过,如果只在部分头用tensor state(例如在衰减很慢的头用),会有一定性价比。
可以用sum_{i,j} a[i] b[j] s[i,j,n](别用落后的 sum_{i,j} a[i] a[j] s[i,j,n]),用64x64x64维state。
由于我这么说,如果真有人这么做(或者在部分层做),或许就想换个做法,那可以组合后续的招数。
此外,RWKV-4的state特别小,其实有显著改进空间。
第2招:缩小State
这里的玩法极多。sparse state, structured state, shared state, compressed state, low-rank state, quantized state等等。这和kv cache的玩法相通,可以灌无数篇。
这里的灌水法,是考察六个维度,若按我的习惯命名,是:
B:batch size,T:ctxlen,H:head,N:head_size,L:layer,Q:bytes。
RNN state size = f(B,H,N,L,Q),Attention state size = f(B,T,H,N,L,Q)。
每个维度,都可以用每种技巧,所以,排列组合就是几十种。
举例,在 H 维度的 sparse,可在外用 router,也可在里用 router:让每个head有多组state,每步只选一组使用。于是,state扩大n倍,存储存取量不变。
举例,在 L 维度的 share,经典例子是 kv cache 的层间共享。那么 RNN state 当然也可以做。
举例,在 L 维度的 sparse,无需永远经过全部层。
举例,在 T 维度的 compress,把序列逐渐压短,token合成super-token,以至于无需 tokenizer,也大有可为。
这完全可以写成一个bingo,看各家会灌多少篇。
第3招:混合State
肯定有效的:头间的state混合,层间的state混合。这个贵,可以偶尔做。也可以在readout做,便宜点。
以及经典的,把这个token的最后层,和下个token的最早层,打通。这是做层循环的方向。
举个例子,一个L层网络,打通一步,就可变成一个2L层的网络,这是完全可训的。
第4招:复杂演化
如果现在是A,那么exp(sA)-1,1/(1-sA)等等级数都可试。这是常识。数值稳定性未知。
这也包括DeltaProduct和换内部优化器。这也包括,在从TTT观点看时,把模型内部的小模型做得更复杂。
都必定有好处。问题只在于【深度为L1的用复杂演化的模型】vs【深度为L2的用简单演化的模型】对齐速度后,两边的胜负。
在这4招之外,还有很多跳出框架的招数,本篇不提。本篇只谈常识。
如果有能力的读者,想知道跳出框架的招数,欢迎加入RWKV,也欢迎实习,可以写很多篇论文。
如果本篇的赞和评论够多,我也考虑再写一些。
题外话。从前有种种事情(包括token-shift/short-conv/induction-head,包括引入decay,包括纯RNN最早scale到14B),是我最早做的,没人给我credit,我认为无妨。
说个趣事。那时我在知乎的文章,标题是《中文语言模型研究:(1) 乘性位置编码》,因为我说,此前其它人的都是“加性位置编码”。我具体提出的是“使用实数的乘性位置编码”。
有人对此念念不忘:
后来,有一天,就出现了“使用复数的乘性位置编码”:
其实【部分“无位置编码”+部分“使用实数的乘性位置编码”】训练效果完全相当于【部分“无位置编码”+部分“使用复数的乘性位置编码”】。复数在此完全没用。
这些事情,我早就知道,我是真懒得说。既然反复挑衅,就送你一程。
总之,后来我就会少说一些我知道的东西。
但是,后来我发现,某些研究者,反而会颠倒黑白,说我抄他们的东西,滑天下之大稽。
这里就略多说点,看看你们还有什么招。
从更长远看,这里的一切,都只有历史价值。
因为深度学习,神经网络,梯度下降,已经就卡在这个位置了。
现在这种RNN也很原始,只是给它续点命。我更关注于设计真正的下一代技术。
