nlp基础-深度学习的博客及其提炼
fp16,fp32,bp16
配合参数量,显存,训练加速博客一起食用,理解更深
FP32:大部分呢机器都支持
FP16:范围大大减小,容易溢出(Nan)
BF16:范围与FP32一致,精度降低
TF32:NVIDIA提出,只在部分操作中实现,不是存储数据类型,只是计算数据类型
T5是TPU上用bf16训练的,所以如果用fp16的话,精度对不上,效果雪崩
用半精度,计算速度减半,batch size 翻倍;大致会有4倍的速度提升
混合精度训练
为了想让深度学习训练可以使用FP16的好处,又要避免精度溢出和舍入误差。于是可以通过FP16和FP32的混合精度训练(Mixed-Precision),混合精度训练过程中可以引入权重备份(Weight Backup)、损失放大(Loss Scaling)、精度累加(Precision Accumulated)三种相关的技术。
权重备份(Weight Backup)
主要用于解决舍入误差的问题
激活activations、梯度 gradients、中间变量等数据,在训练中都利用FP16来存储
同时复制一份FP32的权重参数weights,用于训练时候的更新。
训练中的内存占用大头是优化器状态,所以权重备份的增加只是小头
损失缩放(Loss Scaling)
如下图灰色曲线,在训练后期,梯度值越来越小,使用FP16表示会造成了数据下溢出(Underflow)的问题,导致模型不收敛。
- Scale up阶段,网络模型前向计算后在反响传播前,将得到的损失变化值DLoss增大2^K倍。
- Scale down阶段,反向传播后,将权重梯度缩2^K倍,恢复FP32值进行存储。
动态损失缩放(Dynamic Loss Scaling):就是每当梯度溢出时候减少缩放倍数,并且间歇性地尝试增加缩放倍数(随着训练,梯度会慢慢变小,需要增加缩放倍数),从而实现在不引起溢出的情况下使用最高损失缩放因子,充分利用FP16的动态范围。
精度累加(Precision Accumulated)
就是利用FP16进行矩阵相乘,利用FP32来进行加法计算弥补丢失的精度。 减少计算过程中的舍入误差
Norm
RMSNorm:去掉了LayerNorm的均值,只保留了方差
Pre-norm和Post-norm的对比:
- 为什么Pre-norm效果更差数学解释
- Pre-norm模型没有Post-norm '深',所以理论上限更低
- Pre-norm的残差连接作用更明显,Post-norm弱化了残差连接数学解释,所以Pre-norm更容易收敛
激活函数
单一的激活函数
- Sigmoid:
- 会梯度消失
- 计算量大(exp())
- Tanh:值域[-1,1],中心对称(相当于-1到1的sigmoid
- 会梯度消失
- ReLU:\(max(0,x)\)
- x<0 时,梯度为0,后向传播梯度无法传递。
- Leaky ReLU:\(max(0.1x,x)\)
- GeLU:ReLU+Dropout (Bert,GPT2)
- \(x* P(x<X)\) X为标准正太分布的累计分布,x越小,被drop的概率越大(soft的drop)
- Swish: \(sigmoid(\beta x)*x\),\(\beta\)常取1或0.5
- SiLU: \(sigmoid(x)*x\),\(\beta\)取1的特例
GLU(Gated linear Units)系列
以LLM常用的FFN举例
\(FFN_{ReLU}=max(xW_1,0)W_2\)
\(FFN_{Swish}=Swish_1(xW_1)W_2\)
GLU:两个矩阵,第一个是gate
\(GLU(x,W,V,b,c)=sigmoid(xW+b)*(xV+c)\)
\(ReGLU(x,W,V,b,c)=max(0,xW+b)*(xV+c)\)
\(SwiGLU(x,W,V,b,c)=Swish_{\beta}(xW+b)*(xV+c)\)
替换现有的FFN(FFN的矩阵数量从2->3)
\(FFN_{SwiGLU}(x,W,V,W_2)=(Swish_1(xW)*xV)*W_2\)
梯度消失和梯度爆炸
梯度消失:例如sigmoid的两端梯度饱和,容易梯度消失
梯度爆炸:例如w权重初始化不合理,(极端例子,w都很大,会导致算出的梯度很大)
位置编码
Sinusoidal位置编码追根溯源
RoPE 作者博客
更长上下文的拓展:
- 外插:直接按照RoPE的算法算更长位置的位置编码
- 效果差,更长位置的编码在训练时未出现过
- 内插:目标位置等比例放缩到模型支持的位置处
- 分辨率降低,相邻位置的差异变小。类似于要看清一个大物体的全貌,你需要退后,但是退后的同时原来能看清的细节变得模糊了。
- 需要少量长文本训练
- NTK 扩展:NTK-Aware Scaled RoPE 易懂的解释
- 位置编码 低维->高维:分辨率 高->低:内插->外插
- 不需要额外训练
MHA,MQA,GQA
我的理解是:计算速度的提升,来自于减少了计算K,Q时的计算量(需要算的头数变少)
-
MHA(Multi-head Attention)是标准的多头注意力机制,h个Query、Key 和 Value 矩阵。
-
MQA(Multi-Query Attention,Fast Transformer Decoding: One Write-Head is All You Need)是多查询注意力的一种变体,也是用于自回归解码的一种注意力机制。与MHA不同的是,MQA 让所有的头之间共享同一份 Key 和 Value 矩阵,每个头只单独保留了一份 Query 参数,从而大大减少 Key 和 Value 矩阵的参数量。
-
GQA(Grouped-Query Attention,GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints)是分组查询注意力,GQA将查询头分成G组,每个组共享一个Key 和 Value 矩阵。GQA-G是指具有G组的grouped-query attention。GQA-1具有单个组,因此具有单个Key 和 Value,等效于MQA。而GQA-H具有与头数相等的组,等效于MHA。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?