当前位置: 首页 > news >正文

大模型详细配置

Transformer结构

目前主力大模型都是基于Transformer的,以下是Transformer的具体架构

它由编码器(Encoder)以及解码器(Decoder)组成,前者主要负责对输入数据进行理解,将每个输入 词元都编码成一个上下文语义相关的表示向量;后者基于来自编码器编码后的最后一层 的输出表示以及已经由模型生成的词元序列,执行后续的序列生成任务。两个部分都是可以单独使用的,事实上GPT系列就是Decoder-only架构。

归一化方法

数据归一化是为了处理模型训练过程中不稳定的情况,不止在LLM领域,其它领域也需要这种技术,因此也存在多种数据Norm技术,比如BatchNormLayerNorm等等。LLM领域常用的Norm技术主要有Layer NormRMSNormDeepNorm等等

Layer Norm

相比于Batch Norm这种以批次数据为单位进行归一化的操作,Layer Norm是对向量内部数据进行归一化的,其复杂度不依赖于batch大小
LayerNorm ( x ) = x − μ σ γ + β μ = 1 H ∑ i = 1 H x i ,    σ = 1 H ∑ i = 1 H ( x i − μ ) 2 \text{LayerNorm}(x) = \frac{x-\mu}{\sigma}\gamma+\beta\\ \mu = \frac{1}{H}\sum_{i=1}^{H}x_{i},\ \ \sigma = \sqrt{\frac{1}{H}\sum_{i=1}^{H}(x_{i}-\mu)^2 } LayerNorm(x)=σxμγ+βμ=H1i=1Hxi,  σ=H1i=1H(xiμ)2
当然其手法与batchNorm还是一致的,都是尝试让参数重新分布到均值为0,方差为1的分布上去,然后再做线性变换保持信息量。

RMSNorm

其归一化单元与LayerNorm是一致的,但是并不需要那么大的计算量要求。
RMSNorm ( x ) = x RMS ( x ) γ RMS ( x ) = 1 H ∑ i = 1 H x i 2 \text{RMSNorm}(x) = \frac{x}{\text{RMS}(x)}\gamma\\ \text{RMS}(x) = \sqrt{ \frac{1}{H}\sum_{i=1}^{H}x_{i}^2 } RMSNorm(x)=RMS(x)xγRMS(x)=H1i=1Hxi2

DeepNorm

DeepNorm 在 LayerNorm 的基础上,在残差连接中对 之前的激活值 x 按照一定比例 α 进行放缩。通过这一简单的操作,Transformer 的层数可以被成功地扩展至 1,000 层
DeepNorm ( x ) = LayerNorm ( α x + Sublayer ( x ) ) \text{DeepNorm}(x) = \text{LayerNorm}(\alpha x+\text{Sublayer}(x)) DeepNorm(x)=LayerNorm(αx+Sublayer(x))

PreNorm VS PostNorm

根据归一化操作使用的位置,可以分为PreNorm,PostNorm

PostNorm可以表示为
PostNorm ( x ) = Norm ( x + f ( x ) ) \text{PostNorm}(x) = \text{Norm}(x+f(x)) PostNorm(x)=Norm(x+f(x))
其在子层之后使用归一化操作,可以加速网络收敛。但是因为破坏了原本resnet的直接梯度传播通道,训练并不是那么稳定。
事实上这也正是DeepNorm可以与其互补的地方,DeepNorm引入超参 α \alpha α之后,通过调节可以缓解梯度控制的问题,一定程度上保证训练的稳定性。

PreNorm可以表示为
PreNorm ( x ) = x + f ( norm ( x ) ) \text{PreNorm}(x) = x + f(\text{norm}(x)) PreNorm(x)=x+f(norm(x))
表示在每一个子层之前使用归一化操作,这里 norm \text{norm} norm泛指任意一种norm操作。有文章指出,这种操作其实更像是扩展了模型宽度而非深度,因此其性能相比PostNorm可以差一点,但是因为保留了梯度通道,训练更加稳定。

注意力机制

这部分可以参考我之前的博客

位置编码

位置编码的引入,是因为Transformer架构中的attention,并不能区分位置信息。如果我们希望最终学到的embedding是上下文相关的,那么我们就需要引入位置信息,也就是对位置进行编码

绝对位置编码

可以表示为
x t = v t + p t (1) x_{t} = v_{t}+p_{t}\tag{1} xt=vt+pt(1)
其中 p t p_{t} pt表示位置 t t t的位置编码, v t v_{t} vt表示该位置的词元的embedding, x t x_{t} xt就是其最终embedding
其中 p t p_{t} pt 可以表示为
p t , i = { sin ⁡ ( t / 1000 0 ( i − 2 ) / H ) i m o d    2 = 0 sin ⁡ ( t / 1000 0 ( i − 1 ) / H ) i m o d    2 = 1 (2) p_{t,i} = \left\{\begin{matrix} \sin(t/10000^{(i-2)/H}) & i\mod2=0\\ \sin(t/10000^{(i-1)/H}) & i\mod2=1 \end{matrix}\right. \tag{2} pt,i={sin(t/10000(i2)/H)sin(t/10000(i1)/H)imod2=0imod2=1(2)
注意到我们添加的信息只与词元所在位置有关,因此它编码的是绝对位置信息。

相对位置编码

由于上下文信息需要的更多是相对位置信息,因此后续对其做出修改。先来看看为什么上述绝对位置编码在实践中没有相对位置信息。
在Transformer架构中,multi-attention层需要对输入数据进行attention操作。记 X ∈ R n × d X\in \mathbb{R}^{n\times d} XRn×d表示该层的输入数据, W q , W k , W v ∈ R d × d W_{q},W_{k},W_{v}\in \mathbb{R}^{d\times d} Wq,Wk,WvRd×d代表对应的操作矩阵,我们有
attention ( X ) = softmax ( ( X W q ) ( X W k ) T d ) ( X W v ) ∈ R n × d (3) \text{attention}(X) = \text{softmax}(\frac{(XW_{q})(XW_{k})^T}{\sqrt{ d }})(XW_{v})\in \mathbb{R}^{n\times d}\tag{3} attention(X)=softmax(d (XWq)(XWk)T)(XWv)Rn×d(3)
这里 X X X就是已经添加了位置信息的embedding
那么词元 i i i与词元 j j j之间的 attention score \text{attention score} attention score可以表示为
A i , j = ( v i + p i ) W q W k T ( v j + p j ) T (4) A_{i,j} = (v_{i}+p_{i})W_{q}W_{k}^T(v_{j}+p_{j})^T \tag{4} Ai,j=(vi+pi)WqWkT(vj+pj)T(4)
其中位置信息在绝对位置编码 p ( ⋅ ) p_{(\cdot)} p()
事实上上式可以拆分为
A i , j a b s = v i W q W k T v j T + v i W q W k T p j T + p i W q W k T v j T + p i W q W k T p j T A_{i,j}^{abs} = v_{i}W_{q}W_{k}^Tv_{j}^T + v_{i}W_{q}W_{k}^Tp_{j}^T\\ +p_{i}W_{q}W_{k}^Tv_{j}^T + p_{i}W_{q}W_{k}^Tp_{j}^T Ai,jabs=viWqWkTvjT+viWqWkTpjT+piWqWkTvjT+piWqWkTpjT
其中第一部分不包含 p ( ⋅ ) p(\cdot) p(),第二三部分只包含一个 p ( c d o t ) p_{(cdot)} p(cdot),所以只有最后一部分有可能包含相对位置信息(同时包含 p i , p j p_{i},p_{j} pi,pj)。
事实上最后一部分如果不包含线性变换操作,只有 p i p j T p_{i}p_{j}^T pipjT的话,是可以保留相对位置信息的,但是因为线性变换是由attention引入的,我们不好直接去除,所以这也导致相对信息丢失。
所以一个改进措施就是直接在attention中引入相对位置信息。对 ( 5 ) (5) (5)进行改写,得到
A i , j r e l = v i W q W k T v j T + v i W q W k T R i − j T + u T W k T v j T + v T W k T R i − j T (5) A_{i,j}^{rel} = v_{i}W_{q}W_{k}^Tv_{j}^T + v_{i}W_{q}W_{k}^T\textcolor{red}{R_{i-j}^T}\\ +\textcolor{blue}{u^T}W_{k}^Tv_{j}^T + \textcolor{blue}{v^T}W_{k}^T\textcolor{red}{R_{i-j}^T} \tag{5} Ai,jrel=viWqWkTvjT+viWqWkTRijT+uTWkTvjT+vTWkTRijT(5)
改进如下:

  • 将所有的 p j p_{j} pj都改成了 R i − j R_{i-j} Rij,前者由绝对位置信息编码,后者由相对位置信息 i − j i-j ij编码,其生成也是基于正弦波的,但是因为只依赖 i − j i-j ij,显然它会包含相对位置信息
  • 有了相对位置信息之后,相关注意力分数应当与词元本身的绝对位置无关,所以需要将 p i W q T p_{i}W_{q}^T piWqT替换掉,由于 W q T W_{q}^T WqT是一个可学习参数,因此替换为可学习参数 u , v u,v u,v

此时整个attention过程中就只包含相对位置信息了

旋转位置编码RoPE

上述改进操作是基于attention的,后续提出的RoPE,其相对位置信息的编码可以与attention操作解耦,并且相对来说更加优美。
重新思考编码过程。记 q m , k n q_{m},k_{n} qm,kn是两个词元的embedding,简单起见限定它们的维度为2,即 q m , k n ∈ R 2 q_{m},k_{n}\in R^2 qm,knR2,此时它们的内积可以用复数乘积来表示
< q m , k n > = R e [ q m , k n ˉ ] (6) <q_{m},k_{n}> =\mathrm{Re}[q_{m},\bar{k_{n}}]\tag{6} <qm,kn>=Re[qm,knˉ](6)
其中 x ˉ \bar{x} xˉ表示复数形式下 x x x的共轭。上式并不难证明。
此时如果我们将绝对位置 t t t的编码过程定义为乘上 e i t θ e^{it\theta} ei,那么就有
< q m e i m θ , k n e i n θ > = R e [ q m k n ˉ e i ( m − n ) θ ] (7) <q_{m}e^{im\theta},k_{n}e^{in\theta}> = \mathrm{Re}[q_{m}\bar{k_{n}}e^{i(m-n)\theta}]\tag{7} <qmeimθ,kneinθ>=Re[qmknˉei(mn)θ](7)
非常神奇的是,原本只跟绝对位置相关的编码 e i m θ , e i n θ e^{im\theta},e^{in\theta} eimθ,einθ,在内积操作之后只跟相对位置 m − n m-n mn有关了,也就是说我们非常自然地就包含了相对位置信息。
上式需要在实数范畴内实现。记位置 t t t的向量为 q t = ( x , y ) q_{t} = (x,y) qt=(x,y),注意到
q t e i t θ = ( x + y i ) ( cos ⁡ t θ + i sin ⁡ t θ ) = ( x cos ⁡ t θ − y sin ⁡ t θ ) + i ( x sin ⁡ t θ + y cos ⁡ t θ ) (8) q_{t}e^{it\theta} = (x+yi)(\cos t\theta + i\sin t\theta) = (x\cos t\theta-y\sin t\theta) + i(x\sin t\theta+y\cos t\theta)\tag{8} qtei=(x+yi)(cos+isin)=(xcosysin)+i(xsin+ycos)(8)

从而我们的绝对位置编码过程可以表示为
f ( q t , t ) = ( cos ⁡ t θ − sin ⁡ t θ sin ⁡ t θ cos ⁡ t θ ) ( x y ) (9) f(q_{t},t) = \begin{pmatrix} \cos t\theta & -\sin t\theta\\ \sin t\theta & \cos t\theta \end{pmatrix}\binom{x}{y}\tag{9} f(qt,t)=(cossinsincos)(yx)(9)
这就在实数范围内实现了上述复数操作,后续attention操作时自然就会带上相对位置信息。注意到上式实际上就是对向量的旋转操作,所以这种编码方式也被成为旋转位置编码

接下来的问题是对向量维度的扩展,因为目前只支持二维向量的操作。当向量维数 d d d是偶数时,我们只需要将 ( 9 ) (9) (9)式中的旋转矩阵在对角线上不断重复即可,即
f ( q t , t ) = ( cos ⁡ t θ 1 − sin ⁡ t θ 1 0 0 … 0 0 sin ⁡ t θ 1 cos ⁡ t θ 1 0 0 … 0 0 0 0 cos ⁡ t θ 2 − sin ⁡ t θ 2 … 0 0 0 0 sin ⁡ t θ 2 cos ⁡ t θ 2 … 0 0 ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ 0 0 0 0 … cos ⁡ t θ d 2 − 1 − sin ⁡ t θ d 2 − 1 0 0 0 0 … sin ⁡ t θ d 2 − 1 cos ⁡ t θ d 2 − 1 ) ⏟ R t ( x 0 x 1 x 2 x 3 ⋮ x d − 2 x d − 1 ) (10) f(q_{t},t) = \underbrace{\begin{pmatrix} \cos t\theta_{1} & -\sin t\theta_{1} & 0 &0 & \dots & 0 & 0\\ \sin t\theta_{1} & \cos t\theta_{1} & 0 &0 & \dots & 0 & 0\\ 0& 0 & \cos t\theta_{2} & -\sin t\theta_{2} & \dots & 0 & 0\\ 0& 0 & \sin t\theta_{2}& \cos t\theta_{2} & \dots& 0& 0\\ \vdots& \vdots &\vdots &\vdots & \vdots & \vdots &\vdots \\ 0& 0& 0& 0& \dots& \cos t\theta_{\frac{d}{2}-1}& -\sin t\theta_{\frac{d}{2}-1}\\ 0& 0& 0& 0& \dots& \sin t\theta_{\frac{d}{2}-1} & \cos t\theta_{\frac{d}{2}-1} \end{pmatrix}}_{R_{t}}\begin{pmatrix} x_{0}\\ x_{1}\\ x_{2}\\ x_{3}\\ \vdots\\ x_{d-2}\\ x_{d-1} \end{pmatrix}\tag{10} f(qt,t)=Rt costθ1sintθ10000sintθ1costθ1000000costθ2sintθ20000sintθ2costθ2000000costθ2d1sintθ2d10000sintθ2d1costθ2d1 x0x1x2x3xd2xd1 (10)
通过将 d d d分为若干个互不相干的部分,每一个部分都可以独立实现之前的相对编码,从而完成维数的扩展。
具体实现的时候,可以用哈达玛积来取代稀疏矩阵乘法。
根据之前结论不难得到,
R m R n T = R m − n (11) R_{m}R_{n}^T = R_{m-n}\tag{11} RmRnT=Rmn(11)
此时对 ( 4 ) (4) (4)式进行重写,有
A i , j = v i W q R i T ( v j W k R j ) T = v i W q R i T R j W k T v j T = v i W q R i − j T W k T v j T (12) A_{i,j} = v_{i}W_{q}R_{i}^T(v_{j}W_{k}R_{j})^T\\ =v_{i}W_{q}R_{i}^TR_{j}W_{k}^Tv_{j}^T\\ =v_{i}W_{q}R_{i-j}^TW_{k}^Tv_{j}^T \tag{12} Ai,j=viWqRiT(vjWkRj)T=viWqRiTRjWkTvjT=viWqRijTWkTvjT(12)

混合专家模型MoE


类似于推荐系统中的MoE的概念,LLM中的MoE,也是通过聚合多个专家来实现特征增广的同时网络不会过拟合。
这里每一个专家都是一个FFN
F F N ( X ) = σ ( X W 1 + b 1 ) W 2 + b 2 FFN(X) = \sigma(XW_{1}+b_{1})W_{2}+b_{2} FFN(X)=σ(XW1+b1)W2+b2
其中 σ \sigma σ是激活函数
通过一个gating网络对专家输出进行选择和加权,选择是为了保证一定的稀疏性,即只使用 t o p k topk topk个专家用于之后的加权操作。
最后MoE层的输出就由加权结果乘上每一个专家的输出给出。

后续可能会具体讲一下LLM中的MoE与推荐系统中的MoE的区别。

相关文章:

  • 人工智能之数学基础:线性方程组求解的得力助手——增广矩阵
  • HarmonyOS Next~鸿蒙系统架构设计解析:分层、模块化与智慧分发的技术革新
  • DeDeCMS靶场攻略
  • pytest的测试报告allure
  • MongoDB 配合python使用的入门教程
  • 微软产品的专有名词和官方视频教程
  • 柔性PZT压电薄膜触觉传感器在人形机器人的应用
  • Android Launcher3终极改造:全屏应用展示实战!深度解析去除Hotseat的隐藏技巧
  • 如何设计大模型意图识别?
  • 学习笔记|arduino uno r3|DS1307时钟芯片|Atmega328P| 设置时间|读取时间|无源晶振:DS1307时钟芯片实验
  • 2025 使用docker部署centos7容器并且需要centos7容器能通过ssh登录SSH 登录的CentOS7容器
  • Linux CentOS7 安装 ffmpeg教程
  • 【总结】常用API架构类型
  • C++异常处理时的异常类型抛出选择
  • 2021-06-15 C逆序存入数组的元素
  • 韩顺平 一周学会Linux | Linux 实操篇-定时任务调度
  • 使用C#创建安装Windows服务程序
  • 第一个Spring程序基于Spring6
  • ROS从小白到入门:知识点速通与面试指南
  • CatFlag 原理
  • 京东回应外卖系统崩溃:订单暴涨所致,已恢复
  • 黄仕忠丨戏曲文献研究之回顾与展望
  • AI含量非常高,2025上海教育博览会将于本周五开幕
  • 人民日报评外卖平台被约谈:摒弃恶性竞争,实现行业健康发展
  • 白天气温超30℃的北京,晚间下起了冰雹
  • 上海首发经济“卷”到会展业,浦东签约三个年度“首展”