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

【面试向】大模型应用岗 —— Transformer 篇

  • 大模型的基础 —— Transformer
  • 必备知识
    • 数学基础公式

华为 AI 应用工程师岗位 要求:熟悉主流大模型应用开发框架,掌握大模型原理(如Transformer架构、微调技术、向量数据库等),具备模型微调、推理优化、API集成等实际项目经验;或有大模型(如GPT、DeepSeek、SD系列等)应用开发经验,熟悉NLP/知识图谱/智能问答/对话系统/文生图/文生视频等领域;

大模型的基础 —— Transformer

Transformer 是怎么提出的?Transformer 和传统 Seq2seq 模型有什么区别?

RNN 是一种 Seq2seq,计算 b4b^4b4 必须先计算出 b3b^3b3b3b^3b3 要先计算 b2b^2b2,这样就不能并行计算

在这里插入图片描述
有人提出使用 CNN 来替代 RNN,但是要想学到长距离的依赖关系,就要经过很多卷积层,那么就要经过越多的非线性变换(卷积层+激活函数),梯度在反向传播时更容易消失

2017 年 Google 发布的《Attention is all you need》 提出新的 自注意力 Layer 取代了 RNN,其输入也是 Seq,输出也是 Seq,但是它能同时计算 b1b^1b1b4b^4b4
在这里插入图片描述

Transformer 是第一个完全依赖自注意力机制的序列转换模型,用来自行计算输入和输出的表示,而无需使用序列对齐的 RNN 或卷积。

Transformer 的 Self-Attention 计算流程和复杂度分析?

Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^T}{\sqrt{d_k}} \right)V Attention(Q,K,V)=softmax(dkQKT)V

Query 按「列」排,K⊤QK^\top QKQ 版(详细推理版)

  • 首先,输入 x1x^1x1x4x^4x4 是一个 Sequence,每一个 input 先通过 Embedding,也就是乘上一个 WWW 矩阵,得到嵌入表示 a1a^1a1a4a^4a4(嵌入表示中应还包含 位置嵌入 Positional Embedding);

  • 然后把嵌入表示 aia^iai 丢进 Self-Attention Layer,在该层里,每一个嵌入表示都分别乘上三个不同的矩阵,产生三个不同的向量 qi,ki,viq^i, k^i, v^iqi,ki,vi;也就是通过三组可学线性变换,得到查询(Query)、键(Key)、值(Value)向量。

在这里插入图片描述

  • 接下来要做的是,拿每个 query qiq^iqi 去对每个 kik^iki 做 attention,即缩放点积注意力,以 q1q^1q1 去对每个 kik^iki 做 attention 为例,就是 α1,i=q1⋅ki/d\alpha_{1,i} = q^1 \cdot k^i / \sqrt dα1,i=q1ki/d,这里的 dddqqqkkk 的 dimmension。

    在这里插入图片描述

  • 接下来需要做 Softmax,继续以 q1q^1q1 去对每个 kik^iki 做 attention 的结果为例,也就是把 α1,1\alpha_{1,1}α1,1α1,4\alpha_{1,4}α1,4 通过一个 Softmax Layer,得到 α^1,1\hat \alpha_{1,1}α^1,1α^1,4\hat \alpha_{1,4}α^1,4。Softmax 做的事情就是把每一个 α1,i\alpha_{1,i}α1,i 先取 exp()exp()exp(),然后再除以一个归一化因子,即所有 α1,j\alpha_{1,j}α1,jexp()exp()exp() 后的总和。

    在这里插入图片描述

  • 然后,把各个 α^1,i\hat \alpha_{1, i}α^1,iviv^ivi 相乘,这些结果加起来得到向量 b1b^1b1。而 Self-attention 就是输入一个 Seq,输出也是一个 Seq,那么现在已经得到这个输出 Seq 的第一个向量 b1b^1b1 了。
    在这里插入图片描述
    注意,这个 b1b^1b1 其实已经用了整个输入 Seq,即产生 b1b^1b1 时已经看到了 a1a^1a1a4a^4a4 了。如果不想考虑全局的信息,只想考虑 Local 信息,那么只需要让产生的 α^1,3\hat \alpha_{1,3}α^1,3α^1,4\hat \alpha_{1,4}α^1,4 变成 0。

注意,上面是计算 b1b^1b1,但是可以同时计算 b2,b3,b4...b^2, b^3, b^4...b2,b3,b4...

在这里插入图片描述

来梳理一下一步一步从单个 Query 向量推到整条序列上并行计算(从向量到并行大矩阵计算)的思路,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意这里的公式和论文里的公式不同,这里其实只是向量在矩阵里是按行存还是按列存的约定不同点乘的结果矩阵(i,j)(i,j)(i,j) 的值永远都是 “第 iii 个 Query 和第 jjj 个 Key 的内积”。

  1. 论文里 Query 按「行」排QK⊤QK^\topQK:把序列长度 nnn 放在维度,隐藏维 dkd_kdk 放在维度,所以上下文里
    Q∈Rn×dk,K∈Rn×dk.Q \in \mathbb{R}^{n\times d_k},\quad K \in \mathbb{R}^{n\times d_k}. QRn×dk,KRn×dk.
    那么 QK⊤∈Rn×nQK^\top \;\in\;\mathbb{R}^{n\times n}QKRn×nQQQ 的第 kkk 行就是 qkq^kqk(一个 ddd-维列向量),KKK 的第 kkk 行就是 kkk^kkk。这样两个矩阵相乘写作
    (QK⊤)i,j=∑k=1dQi,k(K⊤)k,j=∑k=1dQi,kKj,k=qi⋅kj.(QK^\top)_{i,j}=\sum_{k=1}^d Q_{i,k}\;(K^\top)_{k,j}=\sum_{k=1}^d Q_{i,k}\;K_{j,k}=q^i\cdot k^j. (QK)i,j=k=1dQi,k(K)k,j=k=1dQi,kKj,k=qikj.
  2. 图里 Query 按「列」排K⊤QK^\top QKQ:图里为了演示把每个 qqq 串成一行, 每个 kkk 也串成一行,所以把
    Q=[q1,q2,…,qn]∈Rdk×n,K=[k1,k2,…,kn]∈Rdk×n.Q = [\,q^1,\;q^2,\;\dots,\;q^n\,]\;\in\;\mathbb{R}^{d_k\times n},\quad K = [\,k^1,\;k^2,\;\dots,\;k^n\,]\;\in\;\mathbb{R}^{d_k\times n}. Q=[q1,q2,,qn]Rdk×n,K=[k1,k2,,kn]Rdk×n.
    那么 K⊤Q∈Rn×nK^\top Q\;\in\;\mathbb{R}^{n\times n}KQRn×nQQQ 的第 kkk 列就是 qkq^kqk(一个 ddd-维列向量),KKK 的第 kkk 列就是 kkk^kkk。这样要算所有 qiq^iqikjk^jkj 的点积,就写成
    (K⊤Q)i,j=∑k=1d(K⊤)i,kQk,j=∑k=1dKk,iQk,j=∑k=1dQk,jKk,i=qj⋅ki.(K^\top Q)_{i,j}= \sum_{k=1}^d (K^\top)_{i,k}\;Q_{k,j}=\sum_{k=1}^d K_{k,i}\;Q_{k,j}= \sum_{k=1}^d Q_{k,j}\;K_{k,i}= q^j\cdot k^i. (KQ)i,j=k=1d(K)i,kQk,j=k=1dKk,iQk,j=k=1dQk,jKk,i=qjki.

Query 按「行」排,QK⊤QK^\topQK 版(论文原版 + 简要回答版)

记输入长度为 nnn、隐藏维度为 dmodeld_\text{model}dmodel、头数为 hhh,每头维度 dk=dv=dmodel/h=64d_k = d_v = d_\text{model}/h=64dk=dv=dmodel/h=64

一、Self-Attention 计算流程

第一步,线性映射

输入序列为长度为 nnn 的向量序列 {x1,x2,…,xn}\{x^1, x^2, \dots, x^n\}{x1,x2,,xn},每个 xi∈Rdmodelx^i\in\R^{d_\text{model}}xiRdmodel。通过三组可学线性变换,得到查询(Query)、键(Key)、值(Value)矩阵:
Q=XWQ,K=XWK,V=XWV,Q = XW^Q,\quad K = XW^K,\quad V = XW^V, Q=XWQ,K=XWK,V=XWV,

其中 X∈Rn×dX\in\R^{n\times d}XRn×dWQ,WK,WV∈Rd×dkW^Q,W^K,W^V\in\R^{d\times d_k}WQ,WK,WVRd×dk,通常 dk=dv=d/hd_k = d_v = d/hdk=dv=d/h(每个头的维度)。

第二步:计算打分矩阵并缩放

对所有 Query–Key 成对计算点积得分
S=QK⊤∈Rn×n,Si,j=(qi)⊤kj=qi⋅qj.S \;=\; QK^\top\;\in\;\R^{n\times n},\quad S_{i,j} \;=\;(q^i)^\top k^j = q^i \cdot q^j. S=QKRn×n,Si,j=(qi)kj=qiqj.
为了缓解 高维点积值过大 带来的 梯度消失,除以缩放因子 dk\sqrt{d_k}dk
S~=Sdk.\widetilde S \;=\;\frac{S}{\sqrt{d_k}}. S=dkS.

第三步:Softmax 归一化

S~\widetilde SS 的每一行(对应每个 Query)做 softmax使注意力权重在 Key 维度上分布
A=softmax(S~)即Ai,j=exp⁡(S~i,j)∑m=1nexp⁡(S~i,m).A \;=\;\mathrm{softmax}(\widetilde S) \quad\text{即}\quad A_{i,j} = \frac{\exp(\widetilde S_{i,j})}{\sum_{m=1}^n \exp(\widetilde S_{i,m})}. A=softmax(S)Ai,j=m=1nexp(Si,m)exp(Si,j).

此时每行之和均为 1。

第四步:加权求和得输出

将注意力权重矩阵 AAA 与 Value 矩阵点乘,得到 Self-Attention 的输出:
Attention(Q,K,V)=AV∈Rn×dv.\mathrm{Attention}(Q,K,V) \;=\; A\,V \;\in\;\R^{n\times d_v}. Attention(Q,K,V)=AVRn×dv.
对多头(HHH 头)并行计算上述过程,再将各头结果拼接并通过线性映射,完成多头注意力(Multi-Head Attention)。

MultiHead(Q,K,V)=Concat(head1,…,headh)WOheadi=Attention(QWiQ,KWiK,VWiV)\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W^O \\[5pt] \text{head}_i = \text{Attention}(QW^Q_i, KW^K_i, VW^V_i) MultiHead(Q,K,V)=Concat(head1,,headh)WOheadi=Attention(QWiQ,KWiK,VWiV)

投影矩阵分别为参数矩阵 WiQ∈Rdmodel×dkW^Q_i \in \mathbb{R}^{d_{\text{model}} \times d_k}WiQRdmodel×dkWiK∈Rdmodel×dkW^K_i \in \mathbb{R}^{d_{\text{model}} \times d_k}WiKRdmodel×dkWiV∈Rdmodel×dvW^V_i \in \mathbb{R}^{d_{\text{model}} \times d_v}WiVRdmodel×dvWO∈Rhdv×dmodelW^O \in \mathbb{R}^{h d_v \times d_{\text{model}}}WORhdv×dmodel

论文中采用了 h=8h = 8h=8 个并行的注意力层(或称为头)。对于每个头,使用 dk=dv=dmodel/h=64d_k = d_v = d_{\text{model}} / h = 64dk=dv=dmodel/h=64

二、复杂度分析

记输入长度为 nnn、隐藏维度为 ddd、头数为 hhh,每头维度 dk=dv=dmodel/hd_k = d_v = d_\text{model}/hdk=dv=dmodel/h

阶段时间复杂度空间复杂度
线性映射 XWQ,XWK,XWVXW^Q,XW^K,XW^VXWQ,XWK,XWV3⋅O(n⋅dk⋅d)≈O(nd2)3\cdot O(n \cdot d_k \cdot d)\approx O(n d^2)3O(ndkd)O(nd2)
输出 n⋅dkn\cdot d_kndk 个元素,每个元素做 ddd 次乘加
O(ndk)O(n d_k)O(ndk) 三个矩阵
计算打分矩阵 QK⊤QK^\topQKO(n2dk)O(n^2 d_k)O(n2dk)
输出 n⋅nn\cdot nnn 个得分,每个得分做 dkd_kdk 次乘加
O(n2)O(n^2)O(n2)
Softmax & 缩放O(n2)O(n^2)O(n2)O(n2)O(n^2)O(n2)
加权求和 AVA\,VAVO(n2dv)O(n^2 d_v)O(n2dv)O(ndv)O(n d_v)O(ndv)
合计(单头)O(nd2+n2d/H)O(n d^2 + n^2 d/H)O(nd2+n2d/H)O(n2+nd/H)O(n^2 + n d/H)O(n2+nd/H)
合计(多头)HHH 倍单头 →\to O(nd2+n2d)O(n d^2 + n^2 d)O(nd2+n2d)O(n2+nd)O(n^2 + n d)O(n2+nd)
  • 时间:对比传统 RNN 的 O(nd2)O(n d^2)O(nd2) 逐步串行,Self-Attention 的关键在于 O(n2d)O(n^2 d)O(n2d) 的全局交互:序列长度 nnn 越大,计算量呈二次上升。
  • 空间:需要存储 n×nn\times nn×n 的注意力矩阵,对大序列(如 n>4,096n>4{,}096n>4,096)的显存压力较大。

总结:Self-Attention 通过矩阵乘法实现全局依赖建模,其并行性突出,但二次时间/空间复杂度是其在长序列场景的主要瓶颈。

优化方向

  1. 局部/稀疏注意力:仅在局部窗口或稀疏模式下计算注意力,降低至 O(nwd)O(n\,w\,d)O(nwd)O(nlog⁡nd)O(n\,\log n\,d)O(nlognd)
  2. 低秩分解 / 核方法:通过近似低秩分解或核函数估计,将 n2n^2n2 复杂度降至线性。
  3. 渐进式分层架构:先做粗粒度下采样的全局注意力,再做细粒度局部注意力,结合多尺度信息

得分矩阵为什么要缩放?

原论文中作者推测:对于较大的 dkd_kdk 值,点积的数值很大,将 softmax 推入梯度极小的区域。

在 Self-Attention 中,对原始打分矩阵 S=QK⊤S = QK^\topS=QK 的每一个元素除以 dk\sqrt{d_k}dk,是为了 控制点积的方差,防止 softmax 饱和 导致梯度消失。

  • 当向量维度 dkd_kdk 较大时,两个随机向量 qiq^iqikjk^jkj 的点积 (qi)⊤kj(q^i)^\top k^j(qi)kj 的方差会随着 dkd_kdk 线性增大。
  • 如果直接把它送入 softmax,数值可能非常大,导致 softmax 输出接近「one-hot」(极端 0/1 分布),从而梯度几乎为零,学习变得极其缓慢。
  • 除以 dk\sqrt{d_k}dk 后,打分的方差被归一化到大约 1 的量级,使得 softmax 在初始阶段既不过于平坦,也不过于尖锐,保持适当的梯度尺度。

直观小结:“除以 dk\sqrt{d_k}dk” 其实就是个“标准差归一化”操作,让点积打分的分布在维度变化时保持稳定,防止 softmax 的梯度消失或爆炸,从而大幅提升训练的稳定性和效果。

那么为什么打分方差随维度增长,不缩放时会导致梯度几乎为零呢?
下面从 Softmax 的偏导数出发,记一行缩放前的打分向量为 s=(s1,…,sn)\mathbf{s}=(s_1,\dots,s_n)s=(s1,,sn),Softmax 定义为
pi=esi∑k=1nesk,i=1,…,n.p_i \;=\;\frac{e^{s_i}}{\sum_{k=1}^n e^{s_k}}\,,\quad i=1,\dots,n. pi=k=1neskesi,i=1,,n.
我们要算 ∂pi∂sj\displaystyle \frac{\partial p_i}{\partial s_j}sjpi

  1. i=ji=ji=j 时:
    ∂pi∂si=esi⁣(∑kesk)−esiesi(∑kesk)2=esi∑kesk(1−esi∑kesk)=pi(1−pi).\frac{\partial p_i}{\partial s_i} =\frac{e^{s_i}\!\bigl(\sum_k e^{s_k}\bigr) - e^{s_i}\,e^{s_i}}{\bigl(\sum_k e^{s_k}\bigr)^2} =\frac{e^{s_i}}{\sum_k e^{s_k}} \Bigl(1 - \frac{e^{s_i}}{\sum_k e^{s_k}}\Bigr) =p_i\,(1 - p_i). sipi=(kesk)2esi(kesk)esiesi=keskesi(1keskesi)=pi(1pi).
  2. i≠ji\neq ji=j 时:
    ∂pi∂sj=0−esiesj(∑kesk)2=−esi∑keskesj∑kesk=−pipj.\frac{\partial p_i}{\partial s_j} =\frac{0 - e^{s_i}\,e^{s_j}}{\bigl(\sum_k e^{s_k}\bigr)^2} =-\,\frac{e^{s_i}}{\sum_k e^{s_k}} \,\frac{e^{s_j}}{\sum_k e^{s_k}} =-\,p_i\,p_j. sjpi=(kesk)20esiesj=keskesikeskesj=pipj.
    合并写成矩阵形式,就是著名的
    ∂pi∂sj=pi(δij−pj),\frac{\partial p_i}{\partial s_j} =\;p_i\,(\delta_{ij} - p_j), sjpi=pi(δijpj),
    其中 δij\delta_{ij}δij 是克罗内克 δ\deltaδ(Kronecker delta)。

交叉熵损失下对 sjs_jsj 的梯度
常见的做法是对某一行注意力分布用交叉熵(Cross-Entropy)或直接考虑下游梯度。以交叉熵为例,若“真实”分布为 one-hot y\mathbf{y}y(假设 yt=1y_t=1yt=1),损失 L=−∑iyiln⁡pi=−ln⁡pt\mathcal L=-\sum_i y_i\ln p_i=-\ln p_tL=iyilnpi=lnpt。那么
∂L∂sj=∑i∂L∂pi∂pi∂sj=−ytpt∂pt∂sj.\frac{\partial \mathcal L}{\partial s_j} =\sum_i\frac{\partial \mathcal L}{\partial p_i}\,\frac{\partial p_i}{\partial s_j} =-\,\frac{y_t}{p_t}\,\frac{\partial p_t}{\partial s_j}. sjL=ipiLsjpi=ptytsjpt.
只剩下 ∂pt/∂sj\partial p_t/\partial s_jpt/sj,带入上式:

  • j=tj=tj=t
    ∂L∂st=−1pt(pt(1−pt))=−(1−pt).\frac{\partial \mathcal L}{\partial s_t} =-\,\frac{1}{p_t}\,\bigl(p_t (1-p_t)\bigr) =-(1-p_t). stL=pt1(pt(1pt))=(1pt).
  • j≠tj\neq tj=t
    ∂L∂sj=−1pt(−ptpj)=pj.\frac{\partial \mathcal L}{\partial s_j} =-\,\frac{1}{p_t}\,\bigl(-p_t\,p_j\bigr) =p_j. sjL=pt1(ptpj)=pj.

如果 s\mathbf{s}s 的方差很大,那么 raw Softmax 输出会非常尖锐:

  • 对于最大分 sts_{t}st,有 pt≈1p_t\approx1pt1∂L/∂st=−(1−pt)≈0\partial\mathcal L/\partial s_t=-(1-p_t)\approx0L/st=(1pt)0
  • 对于任何非最大分 sjs_jsj,有 pj≈0p_j\approx0pj0∂L/∂sj=pj≈0\partial\mathcal L/\partial s_j=p_j\approx0L/sj=pj0

为什么要选择 Softmax?

在这里插入图片描述

在 Self-Attention 中,需要把打分矩阵 SSS(经过缩放后的 S~\widetilde SS)转成一组“注意力权重”,对每个 Query 给出的所有 Key 分配一个非负、且总和为 1 的权重分布

Softmax 是最常用的归一化函数:

  1. 非负且归一化:Softmax 输出 ai,j=eS~i,j∑meS~i,m\displaystyle a_{i,j} = \frac{e^{\widetilde S_{i,j}}}{\sum_{m}e^{\widetilde S_{i,m}}}ai,j=meSi,meSi,j 恒为正,且对每一行(每个 Query)∑jai,j=1\sum_j a_{i,j} = 1jai,j=1。这满足“注意力分配”、“加权平均”时的概率分布直观。

  2. 可微且梯度良好:Softmax 在整个实数域上都是平滑可导的,便于反向传播。结合交叉熵或 MSE 损失时,梯度不至于消失,有较好的训练稳定性。

  3. 强调差异指数函数会放大打分之间的差距,分数高的 Key 会得到更大权重,分数低的被压得更小,使模型能聚焦于更相关的信息

指数函数如何放大差距
令两个位置的原始分数差为 Δ=si−sj\Delta = s_i - s_jΔ=sisj,在温度 TTT 下,它们对应的概率比为
pipj=esi/Tesj/T=e(si−sj)/T=eΔ/T.\frac{p_i}{p_j} \;=\; \frac{e^{s_i/T}}{e^{s_j/T}} \;=\; e^{(s_i - s_j)/T} \;=\; e^{\Delta/T}. pjpi=esj/Tesi/T=e(sisj)/T=eΔ/T.

  • Δ>0\Delta>0Δ>0:指数放大作用使得 pi/pj=eΔ/T>1p_i/p_j = e^{\Delta/T} > 1pi/pj=eΔ/T>1,而且 Δ\DeltaΔ 增大时,比值呈指数级增长。
  • Δ<0\Delta<0Δ<0:同理,pi/pjp_i/p_jpi/pj 会迅速趋向于 0,弱化低分项的权重。

因此,指数函数“拉开”了原本线性差值,使得“更大一点”的分数在概率空间中变得优势更明显,“更小一点”的分数被压得更低

Softmax 的温度?

指数函数 e(⋅)e^{(\cdot)}e() 会把分数差值指数化,放大小差距,促使注意力聚焦。温度 TTT 控制这种放大的程度

当用(Softmax)把得分向量 s=(s1,…,sn)\mathbf{s}=(s_1,\dots,s_n)s=(s1,,sn) 转成概率分布时,核心公式是

pi=esi/T∑j=1nesj/T=esi/τ∑jesj/τ.p_i \;=\;\frac{e^{s_i/T}}{\sum_{j=1}^n e^{s_j/T}}=\frac{e^{s_i/\tau}}{\sum_j e^{s_j/\tau}}. pi=j=1nesj/Tesi/T=jesj/τesi/τ.

其中 T>0T>0T>0 (常记为 τ\tauτ)就是温度(temperature)参数。在 Transformer 中,把 T=dkT=\sqrt{d_k}T=dk 作为缩放因子。

  • τ<1\tau<1τ<1(低温):相当于把所有分数都“放大”——等同于用更大的 Δ/τ\Delta/\tauΔ/τ 代替原始差分。指数放大效应更强,分布更“尖锐”(peaky),某几项会占据几乎全部概率。
  • τ>1\tau>1τ>1(高温):相当于把分数“压缩”——使用更小的 Δ/τ\Delta/\tauΔ/τ。指数放大效应减弱,分布更“平滑”(flat),不同项之间更加均匀。

示例:假设两分数 (s1,s2)=(2,1)(s_1,s_2)=(2,1)(s1,s2)=(2,1),则

  • τ=1\tau=1τ=1 时,p1/p2=e1=2.72\,p_1/p_2 = e^{1}=2.72p1/p2=e1=2.72
  • τ=0.5\tau=0.5τ=0.5 时,p1/p2=e2=7.39\,p_1/p_2 = e^{2}=7.39p1/p2=e2=7.39,更尖锐;
  • τ=2\tau=2τ=2 时,p1/p2=e0.5=1.65\,p_1/p_2 = e^{0.5}=1.65p1/p2=e0.5=1.65,更平滑。

Transformer 的结构和工作原理?

大多数厉害的神经序列转换模型都采用 编码器-解码器结构,Transformer 也遵循这种整体结构,使用 堆叠的自注意力机制和逐点的全连接层,分别用于编码器和解码器,各自由 N=6N=6N=6 层相同的层堆叠而成。

在这里插入图片描述

  1. 首先是 Input Embedding + Positional Encoding

    • Token Embedding:将 离散的词 ID 映射为 ddd 维向量
    • Positional Encoding:因为自注意力无序列顺序信息,需加上 固定或可学的 位置编码(sin/cos 或 learnable),使模型识别 单词在序列中的位置
  2. 然后是 Encoder(编码器),每层包含两大子层:

    • Multi-Head Self-Attention输入序列自身做注意力每个位置都能看到序列上所有位置的信息

    • Position-wise Feed-Forward:两层全连接网络,逐位置 iii 独立作用,增加非线性。
      FFN(xi)=W2(ReLU(W1xi+b1))+b2,\mathrm{FFN}(x_i)=W_2\bigl(\mathrm{ReLU}(W_1 x_i + b_1)\bigr) + b_2,FFN(xi)=W2(ReLU(W1xi+b1))+b2,

      其中 W1∈Rd×dff,W2∈Rdff×dW_1\in\R^{d\times d_\mathrm{ff}},\,W_2\in\R^{d_\mathrm{ff}\times d}W1Rd×dff,W2Rdff×d,原论文中 d=512,dff=2048d=512, d_{ff}=2048d=512,dff=2048

    每个子层后都有 残差连接 + LayerNorm,即
    Out=LayerNorm(x+SubLayer(x)).\text{Out} = \mathrm{LayerNorm}\bigl(x + \mathrm{SubLayer}(x)\bigr). Out=LayerNorm(x+SubLayer(x)).

    一方面 残差连接 使梯度更稳定,另一方面 LayerNorm 使训练更平滑。

  3. 然后是 Decoder(解码器),每层包含三大子层:

    • Masked Multi-Head Self-Attention对目标序列自身做注意力,并用 mask 遮住未来位置,保证只能看见已生成的词。
    • Encoder-Decoder AttentionQuery 来自 Decoder 的上一子层输出Key/Value 来自 Encoder 最后一层输出,用于对源信息做注意力。
    • Position-wise Feed-Forward

    同样,每个子层后跟残差连接 + LayerNorm。

  4. 最后 输出 Projection + Softmax:Decoder 最后一层的输出 先做线性映射到词表维度,再通过 Softmax 得到下一个词的概率分布

训练时为什么要 mask,推理时也需要吗?两处有什么区别?推理时的 sequence length 和训练时一样吗?

为什么 Transformer 用 LayerNorm 而不是 BatchNorm?

在这里插入图片描述

该图介绍了 NLP 里常见的三维张量(Batch × 序列长度 × 特征维度)上 LayerNorm 和 BatchNorm(或 PowerNorm)是在哪些维度上做归一化。整个立方体中的每个小方块就是“一个样本(句子)里某个位置(token)、某个特征(隐藏状态维度)的激活值”。

Layer Normalization(左图):表示对 同一个位置(同一行、同一个 batch 样本),把所有特征一起求均值和方差,做归一化。对应的统计量是:
μ=1d∑f=1dxf,σ2=1d∑f=1d(xf−μ)2\mu = \frac1d\sum_{f=1}^d x_f,\quad \sigma^2=\frac1d\sum_{f=1}^d(x_f-\mu)^2 μ=d1f=1dxf,σ2=d1f=1d(xfμ)2

只有特征维度在起作用,不管这个位置属于哪个句子、哪个 batch。

Batch/Power Normalization(右图):表示对 所有样本、所有位置(但针对同一个特征通道)一起求均值和方差,做归一化。对应的统计量是:
μ=1N⋅L∑b=1N∑t=1Lxb,t,σ2=1N⋅L∑b,t(xb,t−μ)2\mu = \frac1{N\cdot L}\sum_{b=1}^N\sum_{t=1}^L x_{b,t},\quad \sigma^2=\frac1{N\cdot L}\sum_{b,t}(x_{b,t}-\mu)^2 μ=NL1b=1Nt=1Lxb,t,σ2=NL1b,t(xb,tμ)2

先固定一个 feature,再把这个 feature 在 batch 内、在序列上所有位置的激活都揪出来算统计量。

为什么 Transformer 用 LayerNorm 而不是 BatchNorm?

  • 序列并行性:Transformer 的核心是自注意力机制,它对每个位置(token)独立地计算注意力权重,并行处理整个序列。使用 LayerNorm(层归一化)可以对单个样本的所有特征通道进行归一化,不依赖于批次大小 或 其它样本的统计信息,保证 每个 token 在任何位置、任何时刻 都能 稳定地得到规范化处理
  • 适应变长序列自然语言序列长度不固定,LayerNorm 只依赖于当前位置的特征维度,不会受到序列长度或批次内其它样本长度差异的影响。
  • 训练与推理一致性LayerNorm 在训练和推理阶段都使用相同的统计量(每个位置自身的均值和方差),而不像 BatchNorm 那样 在推理时要维护滑动平均的全局统计,会带来分歧。

Transformer 中有哪些加速收敛,防止过拟合的操作?

在实践中,标准 Transformer(及其后续变体)中累计了多种有助于快速收敛、提升泛化、抑制过拟合的设计与技巧,大致可以分为「架构层面」和「训练层面」两大类:

架构层面的收敛与正则化手段:

方法作用
残差连接(Residual)缓解深层网络梯度消失/爆炸,使信息和梯度能跨层直接传递,显著加快收敛。
LayerNorm对每个 token 的特征做归一化,稳定子层输入分布,配合残差一并使用,进一步提升训练稳定性。
多头注意力(Multi-Head)并行从不同子空间捕捉多种关联,不仅增加表达能力,也让梯度更丰富、更易优化。
Position-wise FFN在注意力之后加入两层小型 MLP,强化非线性表达,同时位置独立的操作也有轻微正则化效果。
Embedding×√d将 token embedding 乘以 d\sqrt{d}d 后再加位置编码,让输入方差与内部权重匹配,避免刚开始训练时梯度过小。

训练层面的收敛加速与正则化:

方法作用
Adam + Learning-Rate Warmup
& Decay
初期用较小 lr warmup,让模型先稳定拟合;中期高 lr 加速收敛;后期 decay 防止震荡,提升最优解质量。
Dropout在注意力权重、FFN 中随机丢弃一定比例神经元,阻止共适应、提升泛化。
Label Smoothing在交叉熵损失中对“真标签”做轻微平滑(如 0.9/0.1 分布),防止模型过于自信,改善泛化。
Weight Decay对所有可训练参数施加 L2 正则化,限制权重增长、缓解过拟合。
Gradient Clipping限制梯度范数上界,避免偶发的大梯度导致训练不稳定或“爆炸”。
Early Stopping在验证性能不再提升时提前终止训练,防止过拟合训练集过度迭代。
Mixed-Precision Training使用 FP16 半精度加速矩阵运算,提高吞吐;配合动态 loss scaling 保证数值稳定。

必备知识

数学基础公式

点积的交换律保证了
qi⋅kj=(qi)⊤kj=(kj)⊤qi=kj⋅qi.q^i\cdot k^j \;=\;(q^i)^\top k^j \;=\;(k^j)^\top q^i \;=\;k^j\cdot q^i. qikj=(qi)kj=(kj)qi=kjqi.
两种写法的区别:

  1. 符号形式(qi)⊤kj(q^i)^\top k^j(qi)kj 强调的是“把列向量 qiq^iqi 转置成行向量,再做矩阵乘法”;qi⋅kjq^i\cdot k^jqikj 则直接用“点积”符号,表达相同的求分量乘积再求和的操作。

  2. 语义侧重:矩阵形式(qi)⊤kj(q^i)^\top k^j(qi)kj在写推导、实现时更靠近通用的矩阵乘法 QK⊤QK^\topQK;点积形式 qi⋅kjq^i\cdot k^jqikj更加直观,强调“取两向量对应分量相乘再求和”的几何意义。

回顾最基本的「矩阵乘法+下标定义」,

  • X∈Ra×bX\in\R^{a\times b}XRa×bY∈Rb×cY\in\R^{b\times c}YRb×c,那么
    (XY)i,j=∑k=1bXi,kYk,j.(X\,Y)_{i,j} \;=\;\sum_{k=1}^b X_{i,k}\,Y_{k,j}. (XY)i,j=k=1bXi,kYk,j.
  • 对于转置矩阵 (X⊤)∈Rb×a(X^\top)\in\R^{b\times a}(X)Rb×a(假设原来 X∈Ra×bX\in\R^{a\times b}XRa×b),有
    (X⊤)j,i=Xi,j.(X^\top)_{j,i} \;=\; X_{i,j}. (X)j,i=Xi,j.
http://www.lryc.cn/news/613252.html

相关文章:

  • 输电线路电气参数与阻抗计算全解析
  • 从库存一盘货到全域智能铺货:巨益科技全渠道平台助力品牌业财一体化升级
  • 从零开始掌握Hardhat开发
  • 【tips】css模仿矢量图透明背景
  • 小红书开源多模态视觉语言模型DOTS-VLM1
  • Ubuntu 22 下脚本登录MFA堡垒机
  • 嵌入式学习---在 Linux 下的 C 语言学习 Day10
  • 指针——练习
  • OLMo 2 架构深度解析:开放语言模型的技术革命
  • A Logical Calculus of the Ideas Immanent in Nervous Activity(神经网络早期的M-P模型)
  • 【数字图像处理系列笔记】Ch05:傅里叶变换与频率域滤波
  • 【实时Linux实战系列】实时分布式计算架构的实现
  • Mongodb常用命令简介
  • MongoDB学习专题(六)复制集和分片集群
  • 02电气设计-安全继电器电路设计(让电路等级达到P4的安全等级)
  • 内存泄漏系列专题分析之三十二:高通相机CamX ION/dmabuf内存管理机制CmdBuffer
  • VC6800智能相机:赋能智能制造,开启AI视觉新纪元
  • vue2+elementui select框可以选择可以回车添加新的option
  • Godot ------ 中级人物血条制作01
  • ElementUI之表格
  • Oracle 19C In-Memory 列存储技术测试
  • Renesas Electronics RA8M1语音套件(VK-RA8M1)
  • 深入解析Go设计模式:责任链模式实战
  • Electron 中 license-keys 的完整集成方案
  • 网络虚拟化是啥啊?
  • 自然语言处理×第四卷:文本特征与数据——她开始准备:每一次输入,都是为了更像你地说话
  • 拥抱云原生:从传统架构到云原生架构的演进与实践
  • python题目练习 无重叠区间
  • 京东关键字搜索商品列表接口开发实战:从参数优化到分布式调用
  • yolo目标检测技术:基础概念(一)