Attention
注意力机制通过关联这些序列的不同位置(token)来表示输入序列。 计算和实现注意力的方法有很多种:
- Self-attention:所有查询、键和值都来自同一个输入
- Cross-attention: q代表当前序列,k,v是同一个输入,对应的encoder最后一层的输出结果,对decoder端的每一层来说,k和 v 保持不变。
- Full Attention: self-attention的简单实现。
- Sparse Attention: self-attetion 的时间复杂度为 O(n^2 ),当将 LLM 扩展到很长的上下文时,计算量爆炸。 Sparse Attention 是一种近似计算,极大地增强了 GPT like LLM 在合理时间内处理更多数量 token 的能力。
- Flash Attention: 不同于稀疏注意力,Flash Attention只是分块计算,而不是近似计算,Flash Attention与原生注意力的结果是完全等价的。更多介绍 https://zhuanlan.zhihu.com/p/639228219
Encoding Positions
不同于RNN、CNN等模型,对于Transformer模型来说,位置编码是必不可少的,因为纯粹的Attention模块是无法捕捉输入顺序的,即无法区分不同位置的Token。为此大体有两个选择:
1、想办法将位置信息融入到输入中,这构成了绝对位置编码的一般做法;
2、微调 Attention 结构,使得它有能力分辨不同位置的 token,这构成了相对位置编码的一般做法(Alibi,RoPE)。
更多介绍 https://zhuanlan.zhihu.com/p/639228219
Activation Functions
激活函数在神经网络的曲线拟合能力中起着至关重要的作用。 LLM 中使用的现代激活函数与早期的压缩函数不同,对于 LLM 的成功至关重要。
- Sigmoid(logistic回归使用的激活函数)
- ReLU(Rectified linear unit):ReLU(x) = max(0, x)
- GeLU (Gaussian Error Linear Unit ): 使用最广泛的激活函数
- GLU variants (Gated Linear Unit): 是一个神经网络层,输入的线性变换和 sigmoid 变换 (σ) 线性投影的逐元素乘积 (⊗):GLU(x, W, V, b, c) = (xW + b) ⊗ σ(xV + c)
- ReGLU(x, W, V, b, c) = max(0, xW + b)⊗
- GEGLU(x, W, V, b, c) = GELU(xW + b) ⊗ (xV + c)