nlp基础-深度学习的博客及其提炼

fp16,fp32,bp16

配合参数量,显存,训练加速博客一起食用,理解更深
FP32:大部分呢机器都支持
FP16:范围大大减小,容易溢出(Nan)
BF16:范围与FP32一致,精度降低
TF32:NVIDIA提出,只在部分操作中实现,不是存储数据类型,只是计算数据类型

T5是TPU上用bf16训练的,所以如果用fp16的话,精度对不上,效果雪崩
用半精度,计算速度减半,batch size 翻倍;大致会有4倍的速度提升

image

混合精度训练

为了想让深度学习训练可以使用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值进行存储。

image

动态损失缩放(Dynamic Loss Scaling):就是每当梯度溢出时候减少缩放倍数,并且间歇性地尝试增加缩放倍数(随着训练,梯度会慢慢变小,需要增加缩放倍数),从而实现在不引起溢出的情况下使用最高损失缩放因子,充分利用FP16的动态范围。

精度累加(Precision Accumulated)

就是利用FP16进行矩阵相乘,利用FP32来进行加法计算弥补丢失的精度。 减少计算过程中的舍入误差

Norm

浅谈Transformer的初始化、参数化与标准化

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。

image

posted @   shiiiilong  阅读(151)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示