Transformer八股
目录Self-Attention 的注意力分数计算公式
\[score = Softmax(\frac{QK^T}{\sqrt{d_k}}) \]为什么要进行scaling?
当 \(QK^T\) 的方差很大时,不同的 key 和 query 点积之后的结果可能会相差很大,从而 softmax 之后的分数趋近于 0 或 1,导致 softmax 函数的梯度很小,反向传播时参数无法得到更新。
softmax 公式为:
求偏导得:
\[\frac{\partial}{\partial x_i}S(x_i)=S(x_i)(1-S(x_i)) \]\[\frac{\partial}{\partial x_j}S(x_i)=-S(x_i)S(x_j) \]\(x_i\)为点积后的结果
- 当 \(x_i\) 相对于其他的 \(x_j\) 特别大时,\(S(x_i)\) 趋近于 1,\(S(x_j)\) 趋近于 0,则\(\frac{\partial}{\partial x_i}S(x_i)\) 和 \(\frac{\partial}{\partial x_j}S(x_i)\) 都趋近于 0
- 当 \(x_i\) 相对于其他的 \(x_j\) 特别小时,\(S(x_i)\) 趋近于 0,,则\(\frac{\partial}{\partial x_i}S(x_i)\) 和 \(\frac{\partial}{\partial x_j}S(x_i)\) 也都趋近于 0
为什么是 \(\sqrt{d_k}\)?
假设 query 和 key 向量中的元素都是相互独立的均值为 0,方差为 1 的随机变量。
\[\begin{align*} &E(q_i)=E(k_i)=0 \\ &Var(q_i)=Var(k_i)=1 \end{align*} \]那么这两个向量的内积 \(q^Tk=\sum_{i=1}^{d_k}q_ik_i\) 的期望和方差为:
\[\begin{align*} E(\sum_{i=1}^{d_k}q_ik_i) &= \sum_{i=1}^{d_k} E(q_ik_i) \\ &= \sum_{i=1}^{d_k} E(q_i)E(k_i) \\ &= 0 \\ Var(\sum_{i=1}^{d_k}q_ik_i) &= \sum_{i=1}^{d_k} Var(q_ik_i) \\ &= \sum_{i=1}^{d_k} \left(E[(q_ik_i)^2]-E^2[q_ik_i]\right) \\ &= \sum_{i=1}^{d_k} \left(E(q_i^2)E(k_i^2)-0\right) \\ &= d_k \end{align*} \]所以除以 \(\sqrt{d_k}\) 使得方差为 1
Position Embedding
参考
https://zhuanlan.zhihu.com/p/454482273
https://kazemnejad.com/blog/transformer_architecture_positional_encoding/
第 \(t\) 个位置编码的向量计算方式:
Transformer位置编码的性质
- 能为每个时间步输出一个独一无二的编码;
- 使用多个周期不同的周期函数组成的多维度编码和递增序列编码是等价的;
- 不同的位置向量是可以通过线性转换得到的,即能表示相对位置;
- 模型能轻松泛化到更长的句子;
- 它的值是有界的,取值范围为 \([-1, 1]\) ,并且是确定性的;