Attention 阶段核心包含以下几个数学公式:
- \(Q = X W_{Q}\)
- \(K = X W_{K}\)
- \(V = X W_{V}\)
- \(Y = \text{Attention}(Q, K, V) = \text{Softmax}(\frac{Q K^{T}}{\sqrt{d_k}})V\)
- \(Z = YW_{O}\)
- \(\text{Output} = \text{LayerNorm}(X+Z)\)
Attention 计算可以分为三大部分:
- 线性投影/矩阵乘法(linear projection/gemm):\(X\) 和 \(W_{Q}, W_{K}, W_{V}, W_{O}\) 相乘
- 注意力得分计算(attention score)
- 其他运算:layernorm
QKV
其中 gemm 的计算量和访存量如下表所示:
| operation | inference FLOPs | params | output shape |
|---|---|---|---|
| \(A[B,T,\textcolor{red}{D}] \cdot W_Q[\textcolor{red}{D},N,H]\) | \(2BTDNH\) | \(DNH\) | \(Q[B,T,D,H]\) |
| \(A[B,T,\textcolor{red}{D}] \cdot W_K[\textcolor{red}{D},K,H]\) | \(2BTDKH\) | \(DKH\) | \(K[B,T,K,H]\) |
| \(A[B,T,\textcolor{red}{D}] \cdot W_V[\textcolor{red}{D},K,H]\) | \(2BTDKH\) | \(DKH\) | \(V[B,T,K,H]\) |
| \(A[B,T,\textcolor{red}{N,H}] \cdot W_O[\textcolor{red}{N,H},D]\) | \(2BTDNH\) | \(DNH\) | \(\text{Z}[B,T,D]\) |
Attention Score
其中 attention score 的计算量如下表所示:
| operation | inference FLOPs | output shape |
|---|---|---|
| \(Q[\textcolor{blue}{B},T,\textcolor{blue}{K},G,\textcolor{red}{H}] \cdot K[\textcolor{blue}{B},S,\textcolor{blue}{K},\textcolor{red}{H}]\) | \(2BTSKGH=2BTSNH\) | \(\text{score}[B,T,S,K,G]=[B,T,S,N]\) |
| \(\text{softmax}_{S}\ L[B,T,S,K,G]\) | \(O(BTSKG)=O(BTSN)\) | |
| \(S[\textcolor{blue}{B},T,\textcolor{red}{S},\textcolor{blue}{K},G] \cdot V[\textcolor{blue}{B},\textcolor{red}{S},\textcolor{blue}{K},H]\) | \(2BTSKGH=2BTSNH\) | \(Y[B,T,K,G,H]=[B,T,N,H]\) |
根据以上推导,可以得到以下结论:
- Z 的 shape 和输入相同,都是 \([B,T,D]\),所以可以将两者直接相加,再进行 LayerNorm 得到 Output。
- Self Attention 的计算量取决于 q 和 k/v length。
- 如果忽略 softmax 的话,总共的计算量为 \(O(BTSNH)\)。
为了方便理解,我们考虑以下 \(B=1\)、\(N=1\) 的情况,计算过程为如下公式:
\[ \begin{aligned} Y&=\underbrace{\begin{bmatrix} \alpha_{11} & \alpha_{12} & \cdots & \alpha_{1s}\\ \alpha_{21} & \alpha_{22} & \cdots & \alpha_{2s}\\ \vdots & \vdots & \ddots & \vdots \\ \alpha_{t1} & \alpha_{t2} & \cdots & \alpha_{ts} \end{bmatrix}}_{\displaystyle \alpha=\operatorname{Softmax}\!\left(\frac{QK^{\top}}{\sqrt{d_k}}\right)} \begin{bmatrix} v_1\\ v_2\\ \vdots\\ v_s \end{bmatrix} \\[4pt] &=\begin{bmatrix} \alpha_{11}v_1+\alpha_{12}v_2+\cdots+\alpha_{1s}v_s\\ \alpha_{21}v_1+\alpha_{22}v_2+\cdots+\alpha_{2s}v_s\\ \vdots\\ \alpha_{t1}v_1+\alpha_{t2}v_2+\cdots+\alpha_{ts}v_s \end{bmatrix}. \end{aligned} \]
其中 \(\alpha_{ij}\) 是当前 token 和先前每一个 token 的注意力得分,通过以下方式计算出来,注意 Softmax 是按照行作用的:
\[ s_{ij}=\frac{q_i\cdot k_j}{\sqrt{d_k}},\qquad \alpha_{ij}=\frac{e^{s_{ij}}}{\sum_{t=1}^{n} e^{s_{it}}} \]
\[ \begin{align*} QK^{T} &= \begin{bmatrix} q_1 \\ q_2 \\ \vdots \\ q_t \end{bmatrix} \begin{bmatrix} k_1^T & k_2^T & \cdots & k_s^T \end{bmatrix} \\ &= \begin{bmatrix} q_1 \cdot k_1^T & q_1 \cdot k_2^T & q_1 \cdot k_3^T & \cdots & q_1 \cdot k_s^T \\ q_2 \cdot k_1^T & q_2 \cdot k_2^T & q_2 \cdot k_3^T & \cdots & q_2 \cdot k_s^T \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ q_t \cdot k_1^T & q_t \cdot k_2^T & q_t \cdot k_3^T & \cdots & q_t \cdot k_s^T \end{bmatrix} \\ &\xrightarrow{\text{softmax 逐行归一化}} \begin{bmatrix} \alpha_{11} & \alpha_{12} & \cdots & \alpha_{1s}\\ \alpha_{21} & \alpha_{22} & \cdots & \alpha_{2s}\\ \vdots & \vdots & \ddots & \vdots \\ \alpha_{t1} & \alpha_{t2} & \cdots & \alpha_{ts} \end{bmatrix} \end{align*} \]
注意力得分矩阵的 shape 为 \([T, S]\),行长度就是 query length,列长度就是 kv length,每行就是一个 token 和之前 token 的注意力打分,还需要乘上对应的 \(v\) 向量。再乘以 \(V\) 的时候收缩的维度是在行上,所以 contracting dimension 是 \(S\)。