时空之章:将Attention视为平方复杂度的RNN
By 苏剑林 | 2024-03-18 | 46489位读者 |近年来,RNN由于其线性的训练和推理效率,重新吸引了不少研究人员和用户的兴趣,隐约有“文艺复兴”之势,其代表作有RWKV、RetNet、Mamba等。当将RNN用于语言模型时,其典型特点就是每步生成都是常数的空间复杂度和时间复杂度,从整个序列看来就是常数的空间复杂度和线性的时间复杂度。当然,任何事情都有两面性,相比于Attention动态增长的KV Cache,RNN的常数空间复杂度通常也让人怀疑记忆容量有限,在Long Context上的效果很难比得上Attention。
在这篇文章中,我们表明Causal Attention可以重写成RNN的形式,并且它的每一步生成理论上也能够以$\mathcal{O}(1)$的空间复杂度进行(代价是时间复杂度非常高,远超平方级)。这表明Attention的优势(如果有的话)是靠计算堆出来的,而不是直觉上的堆内存,它跟RNN一样本质上都是常数量级的记忆容量(记忆瓶颈)。
超越线性的RNN #
RNN的支持者通常会给出一个看上去让人难以反驳的观点:想想你的大脑是RNN还是Attention?
直觉来想,RNN推理的空间复杂度是常数,而Attention的KV cache是动态增长的,再考虑到人的脑容量是有限的,从这一点来看不得不说确实RNN更接近人脑。然而,即便可以合理地认为脑容量限制了人每步推理的空间复杂度是常数,但它并没有限制每步的时间复杂度是常数,又或者换个说法,即便人的每步时间复杂度是常数,但人处理长度为$L$的序列时未必只扫描一遍序列(比如“翻书”),所以总的推理步数可能明显超出$L$,从而导致了非线性的时间复杂度。
考虑到这一点,笔者“突发奇想”:是否可以一般化地考虑常数空间复杂度、非线性时间复杂度的RNN模型,来补足主流RNN的所没有的能力(比如上面说的翻书)?对于语言模型任务,假设样本是a b c d e,那么训练任务就是输入a b c d,预测b c d e,常见的RNN如下图:
这种RNN的问题就是没有翻书能力,每个输入读完就丢了。而Attention的特点就是每读一个token,就完整地翻一遍历史,虽然这个做法可能存在效率问题,但它无疑是引入翻书能力的最简单粗暴的方式。而为了给RNN补上翻书能力,我们完全可以模仿Attention的做法来使用RNN:
跟Attention一样,每读一个新的token,就翻一遍完整的历史。当然,也可以说这其实没有设计一种新的RNN,只是RNN的一种新用法,单纯修改了输入,不管是RWKV还是Mamba都可以套上去。在这种用法之下,解码依旧可以在常数空间复杂度内完成,但每一步推理的时间复杂度在线性增长,从而总的时间成本是$\mathcal{O}(L^2)$。
注意力也是RNN #
事实上,图二所代表的模型非常广泛,甚至于Attention也只不过是它的一个特例,如下图所示:
跟图二相比,图三有几个箭头虚化了,代表这几处位置实际上是断开的,所以说Attention只不过是图二的一个特例。具体来说,Attention的计算公式为:
\begin{equation}o_i = \sum_{j=1}^i a_{i,j}v_j = \frac{\sum_{j=1}^i e^{q_i\cdot k_j} v_j}{\sum_{j=1}^i e^{q_i\cdot k_j}}\end{equation}
很明显,分子分母的求和都可以写成递归的形式:
\begin{equation}
\begin{pmatrix} y_i^{(t)} \\ z_i^{(t)} \end{pmatrix} = \begin{pmatrix} y_i^{(t-1)} \\ z_i^{(t-1)} \end{pmatrix} + e^{q_i\cdot k_{i-t+1}}\begin{pmatrix} v_{i-t+1} \\ 1 \end{pmatrix}\quad,\quad o_i = \frac{y_i^{(i)}}{z_i^{(i)}}
\end{equation}
根据笔者所阅读的文献,最早提出上式并用它来优化Attention计算的文献是《Self-attention Does Not Need O(n^2) Memory》,上式的分块矩阵版本正是当前主流的加速技术Flash Attention的理论基础。由于在Self Attention中,Q、K、V都是由同一个输入通过token-wise的运算得到,所以上述递归形式正好就可以表示为图三。
当然,图三只画出了一层Attention,多层自然也可以画出来,但连接看起来会有点复杂,比如两层的情况如下图所示:
常数空间复杂度 #
本文开头已经说了,RNN的常见优点是可以常数空间复杂度、线性时间复杂度进行推理,既然Attention也可以写成RNN,那么自然的问题是在这种写法下它也有这两个优点吗?
很明显,由于Attention对应的RNN是一个序列长度增加到了$\mathcal{O}(L^2)$的RNN,所以线性时间复杂度那是不用想了,唯一值得思考的是能不能做到常数空间复杂度?大家的第一反应也许是不能,因为众所周知Attention解码有一个动态线性增长的KV cache。但这只是通常情况下比较高效率的实现,如果我们不计成本地用时间换空间,那么空间复杂度可以进一步降低到多少呢?
答案可能让人意外:如果真的将时间换空间做到极致,那么确实可以将空间复杂度降低到$\mathcal{O}(1)$!
其实这个结论并不难想象。首先,图三所示的单层Attention,形式跟普通的单层RNN没什么两样,因此显然是可以用固定大小的储存空间就可以完成推理;接着,我们来看图四所示的多层Attention,它的层与层之间的连接比较复杂,所以通常需要将历史K、V缓存起来才能比较高效地计算,但如果我们坚决不存KV cache,那么每一层、每一步推理所输入的K、V,完全从最原始输入进行重新计算得到(重计算),这会导致非常多的重复计算,所以总的时间复杂度会远超平方复杂度,非常不环保,但空间复杂度确实可以保持在$\mathcal{O}(1)$。
以两层Attention为例,第二层Attention用到了第一层Attention的输出作为输入,而第一层Attention的每个输出都可以在$\mathcal{O}(1)$空间内计算得到,所以只要我们愿意牺牲效率去重计算,第二层Attention也只需要在$\mathcal{O}(1)$空间就可以完成。依此类推,第三层Attention用到了第二层Attention的输出作为输入,第$N$层Attention用到了第$N-1$层Attention的输出作为输入,由于上一层都可以通过重计算在$\mathcal{O}(1)$空间就可以完成,所以每一层乃至整个模型都可以在$\mathcal{O}(1)$空间完成计算。
这就再次回到了文章开头的观点:如果Attention相比RNN真的存在什么优势,那也只是靠更多的计算达到的,直觉上的扩大了“内存”,只是用空间换时间的表象,它跟RNN一样本质上都具有常数容量的记忆瓶颈。
当然,也许有读者觉得:用时间换空间不是很常见的做法吗?这看上去并不是什么有价值的结论?的确,时间换空间确实很常见,但并非总是能做到的。换句话说,并不是所有问题都可以通过时间换空间来将空间复杂度降低到$\mathcal{O}(1)$的,这是一个常见但非平凡的特性。
模型能力的思考 #
之所以指出Attention的这一特性,并不是真的要用这个特性去推理,而是通过它来帮助我们进一步思考Attention的能力瓶颈。
首先,真的要抠细节的话,$\mathcal{O}(1)$其实是不对的,更严格来说应该是$\mathcal{O}(L)$,因为平方复杂度的RNN需要反复扫描历史序列,这至少需要把原始输入和生成过程的输出都存下来,即至少需要存$L$个整数token id,这个所需要的空间是$\mathcal{O}(L)$的,如果$L$足够大,那么$\mathcal{O}(L)$将会比$\mathcal{O}(1)$更大。然而,这里的$\mathcal{O}(1)$主要说的是LLM中间的计算层所需要的最少空间,相当于作为RNN时的hidden_state,至少有(hidden_size * num_layers * 2)个分量,而$\mathcal{O}(L)$的空间则体现在输入和输出。一个直观的类比是将Attention当作一台具有无限硬盘、固定内存的计算机,它不断从硬盘中读取数据,然后在内存中进行计算,同时把结果写进硬盘中。
我们知道,如果内存本身很大而处理的数据不大时,那么我们自己在编程时通常都会更加“任性”一点,甚至可能将所有数据加载到内存,中间计算过程完全不依赖于硬盘的读写。同样,在“大模型、短序列”背景之下训练出来的LLM,会更倾向于使用模型scale带来$\mathcal{O}(1)$级别的固定“内存”,而不是由序列长度带来的动态“硬盘”,因为在当前LLM的scale之下前者会足够大,SGD会“偷懒”将模型当成一个具有无限静态内存的机器来训练(因为对短序列来说内存总是足够),但实际上模型的静态内存是有限的,因此对于那些不可能在$\mathcal{O}(1)$空间完成的任务,基于Attention的模型也不能够泛化到任意长度的输入。
举个例子,我们要计算$2^x$的十进制表示$y$,用Attention进行条件建模$p(y|x)$,训练语料就是$\{x,\color{red}{[sep]},y\}$拼接,只算$y$的loss。注意这里的$y$可以由输入$x$唯一确定,那么理论上应该可以学出100%的准确率。但如果没有思维链(CoT)来动态增加序列长度,模型只能将所有计算过程隐式地放到“内存”中,这对于短输入总是有效的。但事实上,内存是有限的,而计算$2^x$所需要的空间则随着$x$的增加而增加,所以必然存在一个足够大的$x$,使得$p(y|x)$的准确率无法做到100%(哪怕是训练准确率)。这跟《Transformer升级之路:16、“复盘”长度外推技术》所讨论的长度外推问题不一样,它不是由位置编码的OOD导致的,而是没有足够CoT引导时“大模型、短序列”的训练所带来的的能力缺陷。
那为什么当前主流的scale up方向依然是增大LLM的内存,即增加模型的hidden_size和num_layers,而不是去研究诸如CoT等增加seq_len的方案呢?后者当然也是主流研究之一,但核心问题是如果内存成为瓶颈,会降低模型的学习效率和普适性。就好比内存不大而数据量很大时,我们就需要及时保存结果到硬盘中并清空内存,这意味着算法上要更加精巧、难写,而且有可能还要根据具体的任务来定制算法细节。那什么情况下会出现内存瓶颈呢?以LLAMA2-70B为例,它的num_layers为80、hidden_size为8192,两者相乘是640K,再乘个2刚好是1M左右。换句话说,当输入长度达到1M tokens的这个级别,那么LLAMA2-70B的“内存”就可能成为瓶颈。尽管目前训练1M tokens级别的LLM依然不容易,但已经不再是遥不可及,比如Kimi就已经上线了1M级别的模型内测。
所以,不断增加模型的context length(硬盘),以容纳更多的输入和CoT,同时提高模型本身的scale,使得“内存”不至于是瓶颈,就成为了当前LLM的主旋律。
同时,这还否定了笔者之前的一个想法:是否可以通过缩小模型规模、增加seq_len来达到跟大模型一样的效果?答案大概是不行,因为小模型存在内存瓶颈,要靠seq_len带来的硬盘来补足的话,需要给每个样本都设置足够长的CoT才行,这难度比直接训练大模型更加大,如果只是通过repeat等简单方案来增加seq_len,由于没有带来额外信息,那么是没有有实质收益的。不过,如果增加seq_len是通过prefix tuning的方式来实现的,那么是有可能补足空间复杂度上的差距的,因为prefix的参数并非由输入序列计算出来,而是单独训练的,这就相当于额外插了一系列“内存条”,从而增大了模型的内存。
时空之旅的尾声 #
在这篇文章中,我们从平方复杂度RNN的角度审视了Attention,并发现了它具有常数空间复杂度的瓶颈,这表明Attention相比RNN本质上并没有增加“内存”,而只是增加了非常多的计算量。这个瓶颈的存在,表明Attention对某些任务的长度泛化可能存在理论上的困难(内存不足),如何引导模型更好地利用seq_len维度所带来的动态“硬盘”,也许是解决这个困难的关键之处。
转载到请包括本文地址:https://spaces.ac.cn/archives/10017
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Mar. 18, 2024). 《时空之章:将Attention视为平方复杂度的RNN 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/10017
@online{kexuefm-10017,
title={时空之章:将Attention视为平方复杂度的RNN},
author={苏剑林},
year={2024},
month={Mar},
url={\url{https://spaces.ac.cn/archives/10017}},
}
March 18th, 2024
你好,那麼我想問,是否有可能讓 Attention 真正的增加內存呢?比方說讓他從 $\mathcal{O}(1)$ 變成 $\mathcal{O}(L)$? 因為平方太大,log又太小,如果能讓空間隨著序列長度呈現性增長,把中間的輸出暫時儲存到一個空間中,是不是就能像一個無限長紙帶一樣?
我想到一個可能的做法,原本的RNN是一組模型參數用到底,所以他的空間是$\mathcal{O}(1)$;那如果我們可以動態生成模型參數呢?每一步生成下一步要使用的模型參數,然後把下一步的輸入餵給剛生成的參數的模型中。這樣,每一步其實都是用到新生成的模型,並非一個模型用到底。新生成的模型數量隨著長度L增加,就相當於一個動態長度的記憶一樣。
不過,如果只是這樣,每次都生成新的模型,他的空間還是$\mathcal{O}(1)$ 級別的,因為我們還是可以每次都從頭生成。所以,我想到,或許可以加入模型參數的EMA。先把每步生成的模型參數儲存起來,當下次生成到step t的參數時,把過去(上一個batch)儲存的step t的模型參數拿出來算EMA,產生EMA後的模型參數,再用來計算step t的輸出。
類似於 https://kexue.fm/archives/7980 這篇中提到的 BYOL使用的模型參數滑動平均。這樣一來,過去儲存的模型參數就不可能每次都用從頭計算的方式算出來(因為隨機的batch,除非把整個batch歷史記下來,否則不可能從頭計算。)。所以對於長度L的序列,就必須要儲存L個模型參數,因此所佔用的空間為$\mathcal{O}(L)$。這L個模型又會跟新生成的參數做滑動平均,相當於這個長度L的「紙帶」內容被更新了。所以這是一個可以更新模型參數記憶內容的方法。
而這長度L的紙帶,其實也記載了過去的歷史記憶,是以模型參數的方式儲存。當生成的序列長度不斷增加時,或許我們可以「複用」這些模型參數,就好像提取記憶一樣。結果是在推論階段,我們有一個pool儲存過去模型參數(長期記憶),另外一個pool儲存當前更新的參數(工作記憶)。需要較長步驟推論的問題,就可以像是我們在紙上計算一樣,把一部分的計算結果搬到外部去(工作記憶),最後再把結果merge起來。
而訓練階段就是定期的把工作記憶搬到長期記憶的pool中,以供未來複用。至於怎麼搬、怎麼複用,或許可以結合MoE的方式,每次篩選出一些expert 來使用。
这篇文章经过了几次修改,一开始的表述有些事实性错误,你这个评论应该基于最早的版本,你可以参考最新版本后重新修改一下。
主要的修改:更正了关于token_ids的空间复杂度至少为$\mathcal{O}(L)$,所以理论上它确实已经存在一个无限纸带,但要教会模型学会利用这个无限纸带,需要充分的CoT;至于本文强调的$\mathcal{O}(1)$空间,则体现在模型计算过程(除了输入输出)中的空间瓶颈,类似计算机有限的内存,而输入输出类似于无限的硬盘。
理论上无限的硬盘可以处理无限大的计算,但由于内存有限,所以会加大算法复杂度,所以主流LLM都在scale up模型的“内存”,当然CoT也是主流研究之一。
重新看了一下,你說的 $\mathcal{O}(L)$ 是指 token_ids,但 token_ids 不過就是一個整數,其所占的空間遠小於模型參數所占用的空間。所以整體來看,這個L要非常大才有可能佔主導地位。
但我思考的是,有沒有可能,讓模型參數隨著L增長呢?也就是說,每生成一個token,同時也生成一組新的模型參數。這樣,隨著L的增加,模型的參數也隨之增長。對於更長更複雜的推論序列,就可以不受限於一開始訓練的模型大小,而可以隨著推論長度的增加,動態的增加模型參數。
你提到:「RNN的支持者通常会给出一个看上去让人难以反驳的观点:想想你的大脑是RNN还是Attention?」
但事實上大腦也不像RNN,因為大腦的神經元是會增生的,神經元連結也是會變動的,而且分很多區塊,每個區塊相對獨立負責某項任務,卻又互相可以溝通。可以說,每次的input都會影響大腦,改變大腦連結,使大腦參數跟上一個時刻不相同。在極端情況下,t 時刻跟t+1時刻可能具有完全不同的大腦參數,從而可以認為是兩個不同的模型。
然而RNN 的假設是在不同的時刻t都共用一組模型參數,不會成長或更新,這點就跟大腦不同了。這假設是基於過去很長一段時間中,人們認為大腦神經元數量從出生後就固定了,不會新增也不會改變。但現代醫學對大腦的了解是神經元是無時無刻都在變動的,這樣RNN的假設就有問題。
我認為,目前所有的AI模型都是屬於靜態模型,即訓練好之後,基本上參數就固定了,不會新增也不會減少。這明顯跟大腦的運作方式不同。若要突破目前AI的瓶頸,應該要朝向動態模型發展。即在訓練好之後,在推論過程中也能動態新增或減少模型參數,讓模型的參數量大小是「自適應」的,隨著序列長度或問題的困難度,自適應的調用更多參數。
1、你可能没理解全文:在文本的极限分析下,attention的内存瓶颈是常数,这个常数的大小大致是所有hidden_state的两倍,而不是kv cache,也不是整个模型的参数,它只是hidden_size * num_layers * 2的一个向量,对于LLAMA2-70B来说这个数字是1M左右,token_ids虽然只是一个整数,但context length达到1M并非没有可能,所以attention的内存瓶颈并非遥遥无期。
2、【大腦的神經元是會增生的】这就过于发散了;【神經元連結也是會變動的,而且分很多區塊,每個區塊相對獨立負責某項任務,卻又互相可以溝通】这些无所谓,因为我们讨论的是模型的决策过程更加类似一个RNN(因为脑容量有限),至于脑子怎么运作,等价于模型内部怎么设计,其实并不在讨论范围内。
最近這篇 https://arxiv.org/abs/2407.04620 ,號稱超越 Transformer 與 Mamba ,有點接近我前面提出的概念:「每生成一個 token ,同時也生成一組新的模型參數。」給你參考一下
TTT说白了,就是将RNN的state视为某个小模型的参数,RNN的递归过程视为小模型的SGD,与其说它是一个新方法,倒不如说它只是RNN的一种新诠释。从这个角度来讲,我也可以将Attention的KV Cache视为模型的参数,Attention在不断处理输入的过程中,也在不断更新自己的参数(KV Cache)。
「我也可以将Attention的KV Cache视为模型的参数,Attention在不断处理输入的过程中,也在不断更新自己的参数(KV Cache)。」
對,但問題就是 KV Cache 會隨 token 數不斷增長,像一個無限長紙帶,而RNN 的 hidden state 雖然不會增長,但表達能力有限,在test time 階段,表達能力基本上就固定了。而TTT 用一個小模型代替hidden state,可在 test time 更新參數,增加表達能力,又維持固定的參數量,這跟大腦的運作方式比較接近。
它的題目 Learning to (Learn at Test Time),顧名思義,就是它的目標是去學習如何在 test time 做 SGD 更新模型參數,不同於傳統的 Transformer 或 RNN,在 test time 基本上是固定的(當然,你也可以說 KV Cache 隨 token 增長是一種參數更新,但隨著 token 長度越長,前面固定的部分占比越來越大,後面更新的占比就越來越小。) 相較之下,TTT 在test time 用SGD 更新參數,可更新的是整個小模型範圍內的參數,所以在context越來越長的情況下,它能更新的部分應該遠超transformer,表達能力應該更強。
后续见@苏剑林|comment-24818
March 18th, 2024
和这篇文章「Transformers are Multi-State RNNs」的观点很类似。
不一样,本文要强调的是Transformer可以视为有限状态的RNN,而不是无限状态。
March 18th, 2024
> 是否可以通过缩小模型规模、增加seq_len来达到跟大模型一样的效果?答案是不行,因为至少“内存”是比不上的大模型的
我理解一下:
1. 缩小模型规模、增加seq_len,那就是对比一个短seq_len的大模型,和一个长seq_len的小模型的效果
2. 若 seq_len 等价于计算机可用剩余内存,模型参数量类比于存放代码的内存量,那 “大 seq_len” + "短程序" 能否可能等于 “小 seq_len” + "长程序" 的效果呢?或者严谨一点:任意任务(集合),以及一个能够解决此任务的 “小 seq_len” + "长程序",是否一定能够找到
“大 seq_len” + "短程序",使得其也能完成此任务(集合)?
3. 用 Kolmogorov 复杂度的角度来看,假如一个任务(集合)的答案序列(之和)的 Kolmogorov 复杂度是 X,再假设运行 X 所需最大内存是 M,那么似乎取 “小 seq_len=M” + "长程序= X" , 那么一定不存在 “大 seq_len > M” + "短程序 < X" 解决此任务了
的确,我相信了这个结论。
但是,如果允许与真实世界交互的话,上面的推理就不一定成立了。因为有了真实世界的反馈作为外挂,"短程序" 原则也能用上整个宇宙本身作为自身的一部分。比如一个没有智商的随机字符生成器 + 进行万能判断的真言机;或者更直接一点,小模型把大模型当作外挂。此刻就不会存在这种限制,但是结论也是 trivial 的。
所以如果加上真实世界交互也应该限制其整体的信息范围,那似乎又会回到一开始推理的情况了。
学习了!感谢
March 19th, 2024
请问为什么是a->ba->cba->dcba 而不是 a->ab->abc->abcd?
因为Attention不能表示为后者。Attention需要先输入$q_i$,才能去算它跟$k_i,k_{i-1},\cdots,k_2,k_1$的注意力,所以要倒序才能不重复输入下标为$i$的q、k、v。
那是不是可以说Attention更像一个bi-directional的RNN。
Attention更像是无向的,文中的形式只是认为指定了一个较为统一的方向,实际上比如[d c b a],你换成[d a b c]、[d b a c]等,对Attention依然成立。
March 19th, 2024
Transformer 固然可以靠 hidden state 绕过 O(L) token memory 的瓶颈,但此时会面临 O(1) 并行时间复杂度的限制(其能力不超过 finite depth circuits 或者 O(1) 时间停机的并行图灵机)。而绕过 O(1) 并行时间复杂度的唯一方式就是依靠 O(L) token memory,也就是说 Transformer 只能在两瓶毒药中选择一瓶:
* 要么接受 O(L) token memory bottleneck
* 要么接受 O(depth) time limit
这可能解释了为什么 LLM 倾向于 inductive thinking(并行地找样例并模仿可以在 O(1) 时间完成)而不擅长 abstraction & deductive thinking(建立新概念和抽象既需要长时间的思考也需要丰富的表示空间)
学习了!我理解这跟我最后几段表达的内存和硬盘瓶颈本质上是一致的。想要无限外推,需要利用好无限的硬盘,这需要足够优秀的CoT来增加长度,但增加长度又会带来内存瓶颈,从而增加学习难度。所以LLM的主旋律都是在不断scale up模型规模和序列长度。
March 20th, 2024
在head数目固定下,如果attention是稀疏的,增加num_layers比增长seq_len感觉更有效些(num_heads x num_layers x seq_len)
注意,这里的rnn视角下,attention没有动态增长的kv cache,增加seq_len本质上只是带来了token_ids的增长,这个增长不管是稀疏attention还是full attention都是一样的。
抱歉苏老师,我表达不清楚。我是指如果计算得到的attention weight是稀疏的,只有少量的1和大量的0,0的梯度就会被截断,虽然每个query都会有梯度下降,但是key & value的梯度只有attention weight为1的部分,则显式地每个层中的key & value训练的数据就相比于有更多头或者层数更深的网络训练数据更少。
所以你要表的是训练不充分的问题?但即便如此,attention的可训练weight都是token-wise的,也就是说只要有一个token被select出来,它就能被训练,而且在稀疏情况,你言下的“训练数据更少”实际上是适应固定的稀疏pattern的训练方案,我认为不存在什么问题。
当然,如果你是指动态稀疏pattern的情况下用这个hard截断注意力的方式去训练,那么确实可能存在一些问题,比如“赢者通吃”等,包括MoE也有类似问题,通常的解决方案是加一些正则项,以及引入随机采样等。
March 26th, 2024
常数空间复杂度这一节倒数第二段的‘只是用空间换时间的表象’应该写反了吧,是时间换空间?
你说的这里的“空间换时间”没有写错,指的是KV cache的写法本质上是“空间换时间”的体现。
April 10th, 2024
在计算中,对于图3中的虚线箭头应该怎么理解呢?前向过程中,是否意味着重置RNN的隐含状态;在反向传播中意味着stop gradeint?
它实际上就是标准的平方复杂度的Attention。如果推广到一般的RNN,那确实意味着重置和stop gradient
April 22nd, 2024
苏神你好,我一直很疑惑,为什么基于attn结构的输出还必须是seq2seq的一个一个字往下推?理论上来说文字并不像解微分方程这种,前后依赖性特别强。在encoder的部分,其实attn就可以看成一堆多重线性映射和几个非线性映射的组合,然后将原始的字的emb扭成了上下文相关的某种emb,那decoder为什么不能类似这样做,搞一个反卷积啥的,或者类似训练gan这样的结构呢?假设牺牲掉字不等长这个假设,我就假设输出是1024长度的,如果像图像一样,利用空间不相关特性做并行推理,我觉得工程上的帮助还是很大的,毕竟seq2seq实在是时间太长了。
首先,decoder本身就不是逐“字”递归,而是逐“token”递归。简单理解,token是连续多个相关性比较强的字的组合,所以多数情况下,decoder每步生成都是多个字而不是一个字。
至于用其他方式,比如取更细颗粒度的token(比如一个byte作为一个token),然后通过模型的改进一次性预测多个token,这些工作也有,比如megabyte,但目前仍属于非主流研究,因为如果是均匀切分边界的话,可能还不如目前的tokenizer效果好,非均匀切分的话,不容易端到端训练。
April 22nd, 2024
这个想法真的非常有趣,一直在思考 Linear Attention/RNN vs Self-Attention 的本质区别