·5342 words·11 mins
写完 Multi-Head Attention 和 Causal Attention 之后,我一直觉得 Attention 这条线已经差不多了——公式拆过了,routing space 的 factorization 也想明白了,Causal Mask 的因果约束也理清了。
直到最近看 Llama 2 的模型配置,发现一行让我停下来的参数:
·4700 words·10 mins
最近在看 MIT 6.S191 Lecture 9 讲 Context Parallelism 的时候,碰到了一个词:Causal Attention。
我对 Self-Attention 的公式并不陌生——之前那篇已经把 QKV 和 routing score table 拆得比较清楚了。但 Causal Attention 这个概念我一直没有认真想过。回头看,我写 Attention 公式、写 Multi-Head、写 FlashAttention 的时候,脑子里跑的都是"所有 token 都能看到所有 token"的 Full Self-Attention。
·4480 words·9 mins
之前的几篇把 Self-Attention 的公式拆得比较清楚了,从 QKV 的计算含义到 Multi-Head 的分工。另一条线是 GPU 性能——Arithmetic Intensity、memory bound、HBM 带宽这些概念也已经聊过。关于 HBM 和片上存储的物理区别,可以参考GPU 存储层级那篇。
·5299 words·11 mins
上一篇结尾我留了一个问题:一组 \(W_Q, W_K, W_V\) 只定义了一个 matching / routing space,如果不同类型的信息需求需要不同的 routing 策略,一个 space 够吗?
这个问题让我停了下来。因为到 single-head self-attention 为止,每个 token 已经可以访问整个 sequence 了——任意两个位置之间的通路都是通的。如果表达能力不够,加大 \(d_k\) 不就行了?为什么还要搞出 Multi-Head?
·7286 words·15 mins
上一篇结尾留了三个问题:谁和我相关?相关程度是多少?我该从对方那里读什么?
Self-attention 允许 sequence 内的位置之间直接建立通路,不再需要沿着 recurrent state 一步步搬运。但"允许直接交互"和"知道怎么交互"是两件事——architecture 把路打通了,到底是谁在决定走哪条路、读多少、读什么?
·6504 words·13 mins
上一篇《从 RNN / LSTM / GRU 到早期 Attention》结尾我留了一句话:早期的 attention 并不是为了取代 RNN 而出现的,它只是夹在 encoder–decoder 中间解决 fixed-context bottleneck;但“根据当前需求去读取一组 representation”这种机制,并不一定要依附在 RNN 上。这篇接着讲那个“另一个故事”。
·5757 words·12 mins
上一篇《从 RNN 到 LSTM,再到 GRU》把 gate 机制理了一遍:LSTM / GRU 把 recurrent state 的信息流变成了可学习的动态控制,决定什么写入、什么保留、什么暴露。写到那里,我以为 RNN 这条线差不多收尾了。