8456 字
42 分钟
OceanAI-Chapter6:PLUS深度学习重点

概述#

这份笔记依据第 13、14 课课堂录音和第 16 课深度学习复习课整理,目标是回答两个问题:

  1. 哪些内容必须真正理解?
  2. 哪些计算必须能够脱离代码手算?

老师在复习课中反复强调:考试和实际使用都更看重对计算流程的理解,不要求机械背诵大量公式。最需要形成的“脑内流程图”是:

输入数据
前向传播:线性变换 + 非线性激活
模型预测
损失函数:衡量预测与真实值的差异
反向传播:用链式法则计算梯度
优化器:用梯度更新权重和偏置
进入下一轮训练

本部分的掌握优先级如下。

优先级内容要求
★★★神经网络前向传播会根据权重、偏置和激活函数逐层手算
★★★CNN 卷积计算会移动卷积核并计算特征图
★★★CNN 输出尺寸会根据输入、卷积核、步幅、填充计算空间尺寸
★★★CNN 参数量会计算单通道、多通道、多卷积核情况下的参数量
★★★自注意力会计算 QKTQK^T、缩放、Softmax 权重与对 VV 的加权和
★★☆反向传播与参数更新理解链式法则,会做简单的一层或两层梯度计算
★★☆损失函数会计算 MSE、MAE、交叉熵,知道如何选择
★★☆RNN 隐藏状态和梯度问题会做简单状态递推,理解梯度消失与爆炸
★☆☆Adam、正则化、BatchNorm重点掌握作用和使用逻辑,复杂手算要求较低
★☆☆BERT、GPT、ViT、LLM 流程以概念辨析为主
WARNING

老师在复习课中明确提示,本部分大致会出现一道计算题和一道概念题。因此不能只背结论,应至少能够独立完成:

  1. 前向传播;
  2. 卷积核滑动、输出尺寸和参数量;
  3. 注意力分数、Softmax 权重与加权输出。

目录#


一、神经网络前向传播与损失函数#

1. 单个人工神经元#

单个人工神经元先计算输入的加权和,再经过激活函数:

z=i=1Dwixi+b=wTx+bz=\sum_{i=1}^{D}w_i x_i+b=\mathbf{w}^{T}\mathbf{x}+ba=f(z)a=f(z)

其中:

  • DD:输入特征的数量;
  • xix_i:第 ii 个输入;
  • wiw_i:第 ii 个输入对应的权重;
  • bb:偏置;
  • zz:预激活值,即激活函数之前的线性组合;
  • f()f(\cdot):激活函数;
  • aa:神经元最终输出,也称激活值;
  • x\mathbf{x}:输入向量;
  • w\mathbf{w}:权重向量。

整体意义:

神经元先判断各输入应占多大权重,再把这些信息加总,最后通过非线性函数决定输出。

生物神经元与人工神经元可以做松散类比:

生物神经元人工神经元
树突接收信号输入 xix_i
突触强度权重 wiw_i
细胞体整合信号加权求和
神经元是否激活激活函数
轴突输出输出 aa

2. 多层网络的前向传播#

ll 层的一般形式是:

z[l]=W[l]a[l1]+b[l]\mathbf{z}^{[l]}=\mathbf{W}^{[l]}\mathbf{a}^{[l-1]}+\mathbf{b}^{[l]}a[l]=f[l](z[l])\mathbf{a}^{[l]}=f^{[l]}\left(\mathbf{z}^{[l]}\right)

其中:

  • ll:网络层编号;
  • a[l1]\mathbf{a}^{[l-1]}:上一层的输出,也是当前层的输入;
  • W[l]\mathbf{W}^{[l]}:第 ll 层的权重矩阵;
  • b[l]\mathbf{b}^{[l]}:第 ll 层的偏置向量;
  • z[l]\mathbf{z}^{[l]}:第 ll 层预激活向量;
  • f[l]f^{[l]}:第 ll 层激活函数;
  • a[l]\mathbf{a}^{[l]}:第 ll 层激活值。

第一层输入通常记为:

a[0]=x\mathbf{a}^{[0]}=\mathbf{x}

最后一层输出为模型预测:

y^=a[L]\hat{\mathbf{y}}=\mathbf{a}^{[L]}

其中 LL 是网络总层数。

做题顺序必须固定:

  1. 先算 z[1]\mathbf{z}^{[1]}
  2. 再算 a[1]\mathbf{a}^{[1]}
  3. a[1]\mathbf{a}^{[1]} 作为下一层输入;
  4. 重复直到得到 y^\hat{\mathbf{y}}
  5. y^\hat{\mathbf{y}} 和真实值 y\mathbf{y} 计算损失。

3. 为什么必须使用非线性激活函数#

若各层都没有非线性激活函数,则:

a[1]=W[1]x\mathbf{a}^{[1]}=\mathbf{W}^{[1]}\mathbf{x}a[2]=W[2]a[1]=W[2]W[1]x\mathbf{a}^{[2]}=\mathbf{W}^{[2]}\mathbf{a}^{[1]} =\mathbf{W}^{[2]}\mathbf{W}^{[1]}\mathbf{x}

令:

W=W[2]W[1]\mathbf{W}'=\mathbf{W}^{[2]}\mathbf{W}^{[1]}

则:

a[2]=Wx\mathbf{a}^{[2]}=\mathbf{W}'\mathbf{x}

即使堆叠很多层,最终仍然只是一次线性变换。

TIP

老师在课堂和复习课中多次强调:

没有非线性激活函数,多层神经网络会退化为线性模型,无法学习复杂的非线性关系。

4. 常用激活函数#

ReLU#

ReLU(z)=max(0,z)\operatorname{ReLU}(z)=\max(0,z)

导数:

ReLU(z)={1,z>00,z<0\operatorname{ReLU}'(z)= \begin{cases} 1,&z>0\\ 0,&z<0 \end{cases}

z=0z=0 处通常按实现约定取 0。

特点:

  • 计算简单;
  • 正数区域梯度为 1;
  • 负数区域输出和梯度均为 0;
  • 可能出现“死亡 ReLU”。

Sigmoid#

σ(z)=11+ez\sigma(z)=\frac{1}{1+e^{-z}}

导数:

σ(z)=σ(z)[1σ(z)]\sigma'(z)=\sigma(z)\left[1-\sigma(z)\right]

特点:

  • 输出范围为 (0,1)(0,1)
  • 常用于二分类概率输出;
  • z|z| 很大时梯度接近 0,容易发生梯度消失。

Tanh#

tanh(z)=ezezez+ez\tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}

导数:

ddztanh(z)=1tanh2(z)\frac{d}{dz}\tanh(z)=1-\tanh^2(z)

特点:

  • 输出范围为 (1,1)(-1,1)
  • 以 0 为中心;
  • 也会发生梯度消失。

Softmax#

CC 个类别的 logits z1,,zCz_1,\ldots,z_C

pi=ezij=1Cezjp_i=\frac{e^{z_i}}{\sum_{j=1}^{C}e^{z_j}}

其中:

  • ziz_i:第 ii 类的原始得分;
  • pip_i:第 ii 类的预测概率;
  • CC:类别总数;
  • 所有 pip_i 均大于 0,且 ipi=1\sum_i p_i=1

5. 损失函数#

均方误差 MSE#

单样本:

LMSE=(yy^)2L_{\mathrm{MSE}}=(y-\hat y)^2

也常写成:

L=12(yy^)2L=\frac{1}{2}(y-\hat y)^2

加入 12\frac12 是为了求导时抵消平方产生的 2。

多样本:

LMSE=1Ni=1N(yiy^i)2L_{\mathrm{MSE}}=\frac{1}{N}\sum_{i=1}^{N}(y_i-\hat y_i)^2

适用:回归任务。

平均绝对误差 MAE#

LMAE=1Ni=1Nyiy^iL_{\mathrm{MAE}}=\frac{1}{N}\sum_{i=1}^{N}|y_i-\hat y_i|

特点:对异常值比 MSE 更稳健。

二元交叉熵 BCE#

LBCE=[ylogp+(1y)log(1p)]L_{\mathrm{BCE}} =-\left[y\log p+(1-y)\log(1-p)\right]

其中:

  • y{0,1}y\in\{0,1\}:真实类别;
  • pp:模型预测属于正类的概率。

多分类交叉熵#

若真实类别为 cc

L=logpcL=-\log p_c

更一般地,用 one-hot 标签 yiy_i 表示:

L=i=1CyilogpiL=-\sum_{i=1}^{C}y_i\log p_i

例题 1:单神经元与 ReLU#

已知:

x=[23],w=[0.51],b=1\mathbf{x}= \begin{bmatrix} 2\\ 3 \end{bmatrix}, \quad \mathbf{w}= \begin{bmatrix} 0.5\\ -1 \end{bmatrix}, \quad b=1

激活函数为 ReLU,求输出。

解答#

先计算预激活值:

z=wTx+bz=\mathbf{w}^{T}\mathbf{x}+bz=0.5×2+(1)×3+1z=0.5\times2+(-1)\times3+1z=13+1=1z=1-3+1=-1

经过 ReLU:

a=max(0,1)=0a=\max(0,-1)=0

答案:

a=0\boxed{a=0}

理解: 加权和为负,ReLU 将其截断为 0,因此该神经元在这个输入下没有被激活。


例题 2:两层网络前向传播#

已知输入:

x=[12]\mathbf{x}= \begin{bmatrix} 1\\ 2 \end{bmatrix}

第一层:

W[1]=[110.50.5],b[1]=[00]\mathbf{W}^{[1]}= \begin{bmatrix} 1&-1\\ 0.5&0.5 \end{bmatrix}, \quad \mathbf{b}^{[1]}= \begin{bmatrix} 0\\ 0 \end{bmatrix}

使用 ReLU。第二层:

W[2]=[21],b[2]=0.5\mathbf{W}^{[2]}= \begin{bmatrix} 2&-1 \end{bmatrix}, \quad b^{[2]}=0.5

第二层不使用激活函数,求 y^\hat y

第一步:第一层线性变换#

z[1]=W[1]x+b[1]\mathbf{z}^{[1]} = \mathbf{W}^{[1]}\mathbf{x}+\mathbf{b}^{[1]}=[110.50.5][12]+[00]= \begin{bmatrix} 1&-1\\ 0.5&0.5 \end{bmatrix} \begin{bmatrix} 1\\ 2 \end{bmatrix} + \begin{bmatrix} 0\\ 0 \end{bmatrix}=[120.5+1]=[11.5]= \begin{bmatrix} 1-2\\ 0.5+1 \end{bmatrix} = \begin{bmatrix} -1\\ 1.5 \end{bmatrix}

第二步:ReLU 激活#

a[1]=ReLU([11.5])=[01.5]\mathbf{a}^{[1]} = \operatorname{ReLU} \left( \begin{bmatrix} -1\\ 1.5 \end{bmatrix} \right) = \begin{bmatrix} 0\\ 1.5 \end{bmatrix}

第三步:输出层#

y^=W[2]a[1]+b[2]\hat y = \mathbf{W}^{[2]}\mathbf{a}^{[1]}+b^{[2]}=[21][01.5]+0.5= \begin{bmatrix} 2&-1 \end{bmatrix} \begin{bmatrix} 0\\ 1.5 \end{bmatrix} +0.5=2×01×1.5+0.5=1=2\times0-1\times1.5+0.5=-1

答案:

y^=1\boxed{\hat y=-1}
WARNING

前向传播最常见错误:

  1. 忘记加偏置;
  2. 先激活再线性变换;
  3. 矩阵维度写反;
  4. 忘记 ReLU 会把负值变成 0。

例题 3:Softmax 与多分类交叉熵#

某三分类模型输出 logits:

z=[210]\mathbf{z}= \begin{bmatrix} 2\\ 1\\ 0 \end{bmatrix}

真实类别为第 1 类,求 Softmax 概率和交叉熵损失。

第一步:计算指数#

为提高数值稳定性,可先减去最大值 2:

z=[012]\mathbf{z}'= \begin{bmatrix} 0\\ -1\\ -2 \end{bmatrix}

于是:

ez=[1e1e2][10.36790.1353]e^{\mathbf{z}'} = \begin{bmatrix} 1\\ e^{-1}\\ e^{-2} \end{bmatrix} \approx \begin{bmatrix} 1\\ 0.3679\\ 0.1353 \end{bmatrix}

总和:

1+0.3679+0.1353=1.50321+0.3679+0.1353=1.5032

第二步:计算概率#

p1=11.50320.6652p_1=\frac{1}{1.5032}\approx0.6652p2=0.36791.50320.2447p_2=\frac{0.3679}{1.5032}\approx0.2447p3=0.13531.50320.0900p_3=\frac{0.1353}{1.5032}\approx0.0900

因此:

p[0.66520.24470.0900]\mathbf{p} \approx \begin{bmatrix} 0.6652\\ 0.2447\\ 0.0900 \end{bmatrix}

第三步:交叉熵#

真实类别为第 1 类:

L=logp1L=-\log p_1L=log(0.6652)0.4076L=-\log(0.6652)\approx0.4076

答案:

p(0.6652,0.2447,0.0900)\boxed{\mathbf{p}\approx(0.6652,0.2447,0.0900)}L0.4076\boxed{L\approx0.4076}

例题 4:MSE、MAE 与二元交叉熵#

(1)回归损失#

真实值 y=5y=5,预测值 y^=3\hat y=3

MSE:

LMSE=(53)2=4L_{\mathrm{MSE}}=(5-3)^2=4

MAE:

LMAE=53=2L_{\mathrm{MAE}}=|5-3|=2

(2)二分类损失#

真实标签 y=1y=1,模型预测正类概率 p=0.8p=0.8

LBCE=[1log0.8+(11)log(10.8)]L_{\mathrm{BCE}} =-[1\log0.8+(1-1)\log(1-0.8)]=log0.80.2231=-\log0.8\approx0.2231

结论:

  • 回归误差越大,MSE 增长得比 MAE 更快;
  • 对正确类别给出较高概率时,交叉熵较小;
  • y=1y=1pp 接近 0,交叉熵会非常大。

二、反向传播、梯度下降与训练方法#

1. 反向传播的本质#

反向传播的任务是:

从损失函数开始,沿计算图反向应用链式法则,计算损失对每个参数的偏导数。

它解决的是:

LW,Lb\frac{\partial L}{\partial W}, \qquad \frac{\partial L}{\partial b}

反向传播只负责计算梯度

优化器负责根据梯度更新参数

这两个概念必须严格区分。

反向传播:我应该往哪个方向改?每个参数影响损失多少?
优化器:具体改多少?怎样结合过去的梯度来改?

2. 链式法则#

若:

y=f(g(x))y=f(g(x))

则:

dydx=dfdgdgdx\frac{dy}{dx} = \frac{df}{dg} \frac{dg}{dx}

深度网络可视为很多函数的嵌套,因此:

LW[l]=La[L]a[L]a[L1]a[l]W[l]\frac{\partial L}{\partial W^{[l]}} = \frac{\partial L}{\partial \mathbf{a}^{[L]}} \frac{\partial \mathbf{a}^{[L]}}{\partial \mathbf{a}^{[L-1]}} \cdots \frac{\partial \mathbf{a}^{[l]}}{\partial W^{[l]}}

3. 梯度下降#

基本更新式:

θt+1=θtηθL\theta_{t+1} = \theta_t-\eta\nabla_{\theta}L

其中:

  • θ\theta:待学习参数,可代表权重或偏置;
  • tt:迭代步;
  • η\eta:学习率;
  • θL\nabla_{\theta}L:损失对参数的梯度;
  • 负号:沿梯度反方向更新,因为梯度方向是损失增长最快的方向。

学习率过大:

  • 越过最优点;
  • 损失震荡;
  • 可能发散或出现 NaN。

学习率过小:

  • 收敛很慢;
  • 长时间停留在平台区。

4. SGD 与 mini-batch#

全批量梯度下降:

θL=1Ni=1NθLi\nabla_{\theta}L = \frac{1}{N} \sum_{i=1}^{N} \nabla_{\theta}L_i

每次使用全部样本,梯度稳定,但计算代价高。

随机梯度下降 SGD:

θt+1=θtηθLi\theta_{t+1} = \theta_t-\eta\nabla_{\theta}L_i

每次只使用一个样本,更新快但噪声大。

mini-batch:

θLB=1BiBθLi\nabla_{\theta}L_{\mathcal B} = \frac{1}{|\mathcal B|} \sum_{i\in\mathcal B} \nabla_{\theta}L_i

实际训练通常使用小批量,在速度、稳定性和 GPU 并行效率之间折中。

5. Momentum#

课堂讲义采用的形式:

mt+1=βmt+(1β)gt\mathbf{m}_{t+1} = \beta\mathbf{m}_t + (1-\beta)\mathbf{g}_tθt+1=θtηmt+1\theta_{t+1} = \theta_t-\eta\mathbf{m}_{t+1}

其中:

  • gt=θLt\mathbf{g}_t=\nabla_\theta L_t:当前梯度;
  • mt\mathbf{m}_t:累计的运动方向;
  • β\beta:动量系数,常接近 1;
  • η\eta:学习率。

作用:

  • 平滑随机梯度中的噪声;
  • 减少狭长损失谷中的左右震荡;
  • 在梯度方向长期一致时加速前进。

6. Adam#

Adam 同时维护梯度的一阶矩和二阶矩。

一阶矩:

mt=β1mt1+(1β1)gt\mathbf{m}_t = \beta_1\mathbf{m}_{t-1} + (1-\beta_1)\mathbf{g}_t

二阶矩:

vt=β2vt1+(1β2)gt2\mathbf{v}_t = \beta_2\mathbf{v}_{t-1} + (1-\beta_2)\mathbf{g}_t^2

偏差修正:

m^t=mt1β1t\hat{\mathbf{m}}_t = \frac{\mathbf{m}_t}{1-\beta_1^t}v^t=vt1β2t\hat{\mathbf{v}}_t = \frac{\mathbf{v}_t}{1-\beta_2^t}

参数更新:

θt=θt1ηm^tv^t+ε\theta_t = \theta_{t-1} - \eta \frac{\hat{\mathbf{m}}_t} {\sqrt{\hat{\mathbf{v}}_t}+\varepsilon}

其中:

  • β1\beta_1:一阶矩衰减率;
  • β2\beta_2:二阶矩衰减率;
  • ε\varepsilon:防止分母为 0 的小常数;
  • gt2\mathbf{g}_t^2:逐元素平方。

老师复习课中的使用结论:

  • Adam:大多数深度学习任务的安全默认选择;
  • 带 Momentum 的 SGD:模型已经较稳定、需要精细微调时常有优势,尤其常见于视觉任务。

7. 正则化与 Batch Normalization#

L2 正则化 / 权重衰减#

Ltotal=Ldata+λ2W22L_{\mathrm{total}} = L_{\mathrm{data}} + \frac{\lambda}{2}\|\mathbf{W}\|_2^2

其中:

  • LdataL_{\mathrm{data}}:原始数据损失;
  • λ\lambda:正则化强度;
  • W22\|\mathbf{W}\|_2^2:权重平方和。

它惩罚过大的权重,降低过拟合风险。

Dropout#

训练时以一定概率把神经元输出置零,减少神经元之间的共适应。

  • 训练时:随机丢弃部分神经元;
  • 测试时:使用完整网络。

Batch Normalization#

对一个 mini-batch 中某一特征:

μB=1mi=1mxi\mu_{\mathcal B} = \frac{1}{m} \sum_{i=1}^{m}x_iσB2=1mi=1m(xiμB)2\sigma_{\mathcal B}^2 = \frac{1}{m} \sum_{i=1}^{m}(x_i-\mu_{\mathcal B})^2

标准化:

x^i=xiμBσB2+ε\hat x_i = \frac{x_i-\mu_{\mathcal B}} {\sqrt{\sigma_{\mathcal B}^2+\varepsilon}}

再进行可学习的缩放和平移:

yi=γx^i+βy_i=\gamma\hat x_i+\beta

其中:

  • mm:批次大小;
  • μB\mu_{\mathcal B}:批均值;
  • σB2\sigma_{\mathcal B}^2:批方差;
  • γ,β\gamma,\beta:可学习参数。

作用:

  • 稳定各层输入分布;
  • 允许使用较大学习率;
  • 改善梯度传播;
  • 带来一定正则化效果。

例题 1:单层线性模型反向传播#

模型:

y^=wx+b\hat y=wx+b

损失:

L=12(y^y)2L=\frac12(\hat y-y)^2

已知:

x=2,w=1,b=0,y=5x=2,\quad w=1,\quad b=0,\quad y=5

学习率 η=0.1\eta=0.1,完成一次前向传播和参数更新。

第一步:前向传播#

y^=1×2+0=2\hat y=1\times2+0=2

第二步:计算损失#

L=12(25)2=12×9=4.5L=\frac12(2-5)^2 =\frac12\times9 =4.5

第三步:计算梯度#

先求:

Ly^=y^y=25=3\frac{\partial L}{\partial\hat y} = \hat y-y = 2-5=-3

因为:

y^w=x=2\frac{\partial\hat y}{\partial w}=x=2

所以:

Lw=Ly^y^w=(3)×2=6\frac{\partial L}{\partial w} = \frac{\partial L}{\partial\hat y} \frac{\partial\hat y}{\partial w} = (-3)\times2=-6

又因为:

y^b=1\frac{\partial\hat y}{\partial b}=1

所以:

Lb=3\frac{\partial L}{\partial b}=-3

第四步:更新参数#

wnew=wηLww_{\mathrm{new}} = w-\eta\frac{\partial L}{\partial w}=10.1×(6)=1.6=1-0.1\times(-6)=1.6bnew=00.1×(3)=0.3b_{\mathrm{new}} = 0-0.1\times(-3)=0.3

答案:

wnew=1.6,bnew=0.3\boxed{w_{\mathrm{new}}=1.6,\quad b_{\mathrm{new}}=0.3}

更新后对同一输入:

y^new=1.6×2+0.3=3.5\hat y_{\mathrm{new}}=1.6\times2+0.3=3.5

它比原来的 2 更接近真实值 5,说明更新方向正确。


例题 2:两层线性网络的链式法则#

网络:

a=w1xa=w_1xy^=w2a\hat y=w_2aL=12(y^y)2L=\frac12(\hat y-y)^2

已知:

x=2,w1=0.5,w2=3,y=5x=2,\quad w_1=0.5,\quad w_2=3,\quad y=5

Lw1\frac{\partial L}{\partial w_1}Lw2\frac{\partial L}{\partial w_2}

前向传播#

a=w1x=0.5×2=1a=w_1x=0.5\times2=1y^=w2a=3×1=3\hat y=w_2a=3\times1=3L=12(35)2=2L=\frac12(3-5)^2=2

计算 w2w_2 的梯度#

Ly^=y^y=2\frac{\partial L}{\partial\hat y} = \hat y-y=-2y^w2=a=1\frac{\partial\hat y}{\partial w_2}=a=1Lw2=(2)×1=2\frac{\partial L}{\partial w_2} = (-2)\times1=-2

计算 w1w_1 的梯度#

根据链式法则:

Lw1=Ly^y^aaw1\frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial\hat y} \frac{\partial\hat y}{\partial a} \frac{\partial a}{\partial w_1}

分别有:

y^a=w2=3\frac{\partial\hat y}{\partial a}=w_2=3aw1=x=2\frac{\partial a}{\partial w_1}=x=2

所以:

Lw1=(2)×3×2=12\frac{\partial L}{\partial w_1} = (-2)\times3\times2=-12

答案:

Lw2=2,Lw1=12\boxed{ \frac{\partial L}{\partial w_2}=-2, \qquad \frac{\partial L}{\partial w_1}=-12 }

理解: w1w_1 位于更前面,损失对它的影响需要经过 aay^\hat y 两个中间节点,因此要连续乘多个局部导数。


例题 3:ReLU 导数与死亡 ReLU#

已知:

z=wx+bz=wx+ba=ReLU(z)a=\operatorname{ReLU}(z)

取:

x=2,w=1,b=0x=-2,\quad w=1,\quad b=0

上游梯度为:

La=3\frac{\partial L}{\partial a}=3

Lw\frac{\partial L}{\partial w}

第一步:前向传播#

z=1×(2)+0=2z=1\times(-2)+0=-2a=ReLU(2)=0a=\operatorname{ReLU}(-2)=0

第二步:ReLU 的局部导数#

因为 z<0z<0

az=0\frac{\partial a}{\partial z}=0

第三步:链式法则#

Lw=Laazzw\frac{\partial L}{\partial w} = \frac{\partial L}{\partial a} \frac{\partial a}{\partial z} \frac{\partial z}{\partial w}=3×0×(2)=0=3\times0\times(-2)=0

答案:

Lw=0\boxed{\frac{\partial L}{\partial w}=0}

此时权重无法更新。若一个 ReLU 神经元对所有训练样本长期满足 z<0z<0,它会持续输出 0,形成“死亡 ReLU”。


例题 4:Momentum 与 Adam 的一步更新#

(1)Momentum#

已知:

θ0=2,m0=0,η=0.1,β=0.9\theta_0=2,\quad m_0=0,\quad \eta=0.1,\quad \beta=0.9

第 1 步梯度:

g1=4g_1=4

采用:

m1=βm0+(1β)g1m_1=\beta m_0+(1-\beta)g_1

所以:

m1=0.9×0+0.1×4=0.4m_1=0.9\times0+0.1\times4=0.4

参数更新:

θ1=20.1×0.4=1.96\theta_1=2-0.1\times0.4=1.96

若第 2 步梯度为 g2=2g_2=2

m2=0.9×0.4+0.1×2=0.56m_2=0.9\times0.4+0.1\times2=0.56θ2=1.960.1×0.56=1.904\theta_2=1.96-0.1\times0.56=1.904

Momentum 没有只看当前梯度 2,还保留了上一轮梯度方向的信息。

(2)Adam 的第 1 步#

设:

g1=4,β1=0.9,β2=0.999,η=0.001g_1=4,\quad \beta_1=0.9,\quad \beta_2=0.999,\quad \eta=0.001

初始 m0=v0=0m_0=v_0=0

一阶矩:

m1=0.9×0+0.1×4=0.4m_1=0.9\times0+0.1\times4=0.4

二阶矩:

v1=0.999×0+0.001×42=0.016v_1=0.999\times0+0.001\times4^2=0.016

偏差修正:

m^1=0.410.9=4\hat m_1=\frac{0.4}{1-0.9}=4v^1=0.01610.999=16\hat v_1=\frac{0.016}{1-0.999}=16

参数改变量约为:

Δθ=ηm^1v^1+ε0.001×44=0.001\Delta\theta = \eta \frac{\hat m_1}{\sqrt{\hat v_1}+\varepsilon} \approx 0.001\times\frac{4}{4} =0.001

因此:

θ1θ00.001\theta_1\approx\theta_0-0.001
TIP

Adam 的复杂手算通常不是本课程最优先的计算目标。重点掌握:

  1. 一阶矩平滑方向;
  2. 二阶矩估计梯度尺度;
  3. 对不同参数自适应调整实际步长;
  4. 通常作为默认优化器。

三、卷积神经网络必须掌握的计算#

1. 二维卷积#

给定输入矩阵 XX 和卷积核 KK,输出位置 (i,j)(i,j) 的值为:

Yi,j=u=0Kh1v=0Kw1XiSh+uPh,  jSw+vPwKu,v+bY_{i,j} = \sum_{u=0}^{K_h-1} \sum_{v=0}^{K_w-1} X_{iS_h+u-P_h,\;jS_w+v-P_w} K_{u,v} +b

其中:

  • XX:输入特征图;
  • YY:输出特征图;
  • KK:卷积核;
  • Kh,KwK_h,K_w:卷积核高度和宽度;
  • Sh,SwS_h,S_w:垂直和水平方向步幅;
  • Ph,PwP_h,P_w:填充;
  • bb:该输出通道的偏置。

手算时可按更直观的方法:

  1. 把卷积核盖在输入局部区域上;
  2. 对应元素相乘;
  3. 将所有乘积相加;
  4. 加偏置;
  5. 按步幅移动卷积核。
TIP

深度学习框架中的 Conv2d 实际常执行互相关,即卷积核不翻转。课程计算题一般直接按课件中的“对应元素相乘后求和”处理。

2. 输出尺寸公式#

输入高度为 HinH_{\mathrm{in}},卷积核大小为 KhK_h,步幅为 ShS_h,填充为 PhP_h,则:

Hout=Hin+2PhKhSh+1H_{\mathrm{out}} = \left\lfloor \frac{H_{\mathrm{in}}+2P_h-K_h}{S_h} \right\rfloor+1

宽度:

Wout=Win+2PwKwSw+1W_{\mathrm{out}} = \left\lfloor \frac{W_{\mathrm{in}}+2P_w-K_w}{S_w} \right\rfloor+1

其中 \lfloor\cdot\rfloor 表示向下取整。

若考虑 dilation DD,有效卷积核大小为:

Keff=D(K1)+1K_{\mathrm{eff}}=D(K-1)+1

本课程基础题通常令 D=1D=1

常见情况#

Valid 卷积:

P=0P=0

输出通常缩小。

Same 卷积:

KK 为奇数、S=1S=1 时,取:

P=K12P=\frac{K-1}{2}

可保持输入和输出空间尺寸相同。

3. 卷积层参数量#

若:

  • 输入通道数:CinC_{\mathrm{in}}
  • 输出通道数:CoutC_{\mathrm{out}}
  • 卷积核:Kh×KwK_h\times K_w
  • 每个输出通道有一个偏置;

则参数量:

Nparam=(KhKwCin+1)CoutN_{\mathrm{param}} = \left( K_hK_wC_{\mathrm{in}}+1 \right)C_{\mathrm{out}}

不使用偏置时:

Nparam=KhKwCinCoutN_{\mathrm{param}} = K_hK_wC_{\mathrm{in}}C_{\mathrm{out}}

为什么乘 CoutC_{\mathrm{out}}

每个输出通道都有一组独立卷积核,而每组卷积核必须覆盖全部输入通道。

4. 参数共享为什么高效#

卷积核在图像所有位置复用同一组参数。

因此,卷积层参数量取决于:

  • 卷积核大小;
  • 输入通道数;
  • 输出通道数;

通常不直接取决于图像的高度和宽度。

一句话:

同一个卷积核在整张图像上滑动并共享权重,使参数量只由局部滤波器及通道数决定,远少于把每个像素与每个输出神经元全部连接的全连接层。

5. 池化层#

若池化窗口大小为 KK,步幅为 SS,填充为 PP,输出尺寸公式与卷积相同:

Hout=Hin+2PKS+1H_{\mathrm{out}} = \left\lfloor \frac{H_{\mathrm{in}}+2P-K}{S} \right\rfloor+1

最大池化:

Yi,j=max(u,v)Ωi,jXu,vY_{i,j}=\max_{(u,v)\in\Omega_{i,j}}X_{u,v}

平均池化:

Yi,j=1Ωi,j(u,v)Ωi,jXu,vY_{i,j} = \frac{1}{|\Omega_{i,j}|} \sum_{(u,v)\in\Omega_{i,j}}X_{u,v}

池化层通常没有可学习参数。


例题 1:完整计算一次二维卷积#

输入:

X=[1201013122101012]X= \begin{bmatrix} 1&2&0&1\\ 0&1&3&1\\ 2&2&1&0\\ 1&0&1&2 \end{bmatrix}

卷积核:

K=[1001]K= \begin{bmatrix} 1&0\\ 0&-1 \end{bmatrix}

步幅 S=1S=1,填充 P=0P=0,偏置 b=0b=0

第一步:确定输出尺寸#

Hout=421+1=3H_{\mathrm{out}} = \frac{4-2}{1}+1=3Wout=3W_{\mathrm{out}}=3

所以输出为 3×33\times3

第二步:计算左上角#

取输入左上角 2×22\times2

[1201]\begin{bmatrix} 1&2\\ 0&1 \end{bmatrix}

对应相乘:

1×1+2×0+0×0+1×(1)=01\times1+2\times0+0\times0+1\times(-1)=0

所以 Y1,1=0Y_{1,1}=0

第三步:卷积核向右移动#

取:

[2013]\begin{bmatrix} 2&0\\ 1&3 \end{bmatrix}2×1+0×0+1×0+3×(1)=12\times1+0\times0+1\times0+3\times(-1)=-1

所以 Y1,2=1Y_{1,2}=-1

继续计算所有位置,得到:

Y=[011203211]Y= \begin{bmatrix} 0&-1&-1\\ -2&0&3\\ 2&1&-1 \end{bmatrix}

答案:

Y=[011203211]\boxed{ Y= \begin{bmatrix} 0&-1&-1\\ -2&0&3\\ 2&1&-1 \end{bmatrix} }

例题 2:计算卷积输出尺寸#

输入图像大小:

7×77\times7

卷积核:

3×33\times3

步幅:

S=2S=2

填充:

P=1P=1

求输出尺寸。

解答#

Hout=7+2×132+1H_{\mathrm{out}} = \left\lfloor \frac{7+2\times1-3}{2} \right\rfloor+1=62+1=3+1=4= \left\lfloor \frac{6}{2} \right\rfloor+1 =3+1=4

宽度同理:

Wout=4W_{\mathrm{out}}=4

答案:

4×4\boxed{4\times4}

直观检查#

填充后输入从 77 变成 99,长度为 3 的卷积核每次移动 2 格,可放置位置为:

0,  2,  4,  60,\;2,\;4,\;6

共 4 个位置,与公式一致。


例题 3:计算多通道卷积参数量#

输入:

32×32×332\times32\times3

卷积层:

  • 卷积核大小:3×33\times3
  • 输出通道数:16;
  • 每个输出通道有偏置。

求参数量。

每一个输出通道#

每个卷积核需要覆盖 3 个输入通道:

3×3×3=273\times3\times3=27

加一个偏置:

27+1=2827+1=28

共 16 个输出通道#

Nparam=28×16=448N_{\mathrm{param}} = 28\times16=448

答案:

448\boxed{448}
WARNING

常见错误是只算 3×3×163\times3\times16,遗漏输入通道数;或者只加一个总偏置。实际上通常每个输出通道各有一个偏置。


例题 4:比较卷积层与全连接层参数量#

输入图像:

224×224×3224\times224\times3

希望生成 64 个特征。

方案一:全连接层#

将图像展平:

224×224×3=150528224\times224\times3=150528

连接到 64 个神经元,含偏置:

NFC=(150528+1)×64N_{\mathrm{FC}} = (150528+1)\times64=9633856=9\,633\,856

方案二:3×33\times3 卷积层#

输入通道 3,输出通道 64:

NConv=(3×3×3+1)×64N_{\mathrm{Conv}} = (3\times3\times3+1)\times64=28×64=1792=28\times64=1792

比较#

NFCNConv5376\frac{N_{\mathrm{FC}}}{N_{\mathrm{Conv}}} \approx5376

全连接层参数量约为卷积层的 5376 倍。

原因:

  • 全连接层为每个输入像素到每个输出神经元设置独立权重;
  • 卷积层只学习局部卷积核,并在所有空间位置共享。

四、RNN、LSTM 与 GRU 的计算和判断#

1. RNN 隐藏状态#

基本 RNN:

ht=f(Wxhxt+Whhht1+bh)\mathbf{h}_t = f\left( \mathbf{W}_{xh}\mathbf{x}_t + \mathbf{W}_{hh}\mathbf{h}_{t-1} + \mathbf{b}_h \right)

输出:

yt=g(Whyht+by)\mathbf{y}_t = g\left( \mathbf{W}_{hy}\mathbf{h}_t+\mathbf{b}_y \right)

其中:

  • tt:时间步;
  • xt\mathbf{x}_t:当前输入;
  • ht1\mathbf{h}_{t-1}:上一时间步隐藏状态;
  • ht\mathbf{h}_t:当前隐藏状态,可理解为当前“记忆”;
  • Wxh\mathbf{W}_{xh}:输入到隐藏状态的权重;
  • Whh\mathbf{W}_{hh}:上一隐藏状态到当前隐藏状态的权重;
  • Why\mathbf{W}_{hy}:隐藏状态到输出的权重;
  • ff:隐藏状态激活函数,常用 Tanh;
  • gg:输出激活函数,分类时可用 Softmax。

最重要的特点:

不同时间步共享同一组参数。

2. 通过时间反向传播#

由于:

ht=f(Whhht1+)\mathbf{h}_t = f(\mathbf{W}_{hh}\mathbf{h}_{t-1}+\cdots)

较早时刻隐藏状态对较晚时刻的影响包含多个雅可比矩阵乘积:

hthtk=j=tk+1thjhj1\frac{\partial \mathbf{h}_t} {\partial \mathbf{h}_{t-k}} = \prod_{j=t-k+1}^{t} \frac{\partial \mathbf{h}_j} {\partial \mathbf{h}_{j-1}}

如果每一步的导数因子大多小于 1,连乘后趋近 0;大多大于 1,连乘后迅速增大。

3. 梯度消失与梯度爆炸#

用标量近似理解:

gearlyλkglateg_{\mathrm{early}} \approx \lambda^k g_{\mathrm{late}}

其中:

  • λ\lambda:每一步反向传播的平均放缩因子;
  • kk:跨越时间步数量。

若:

λ<1|\lambda|<1

则梯度消失。

若:

λ>1|\lambda|>1

则梯度爆炸。

梯度消失的后果:

  • 早期输入几乎收不到学习信号;
  • 模型难以学习长距离依赖;
  • 参数更新接近 0。

梯度爆炸的后果:

  • 参数更新过大;
  • 损失剧烈震荡;
  • 可能出现无穷大或 NaN。

解决思路:

  • 梯度裁剪:主要解决梯度爆炸;
  • LSTM、GRU:缓解长序列中的梯度消失;
  • 注意力:让远距离位置直接建立联系。

4. LSTM 的细胞状态更新#

遗忘门:

ft=σ(Wf[ht1,xt]+bf)\mathbf{f}_t = \sigma \left( \mathbf{W}_f[\mathbf{h}_{t-1},\mathbf{x}_t] +\mathbf{b}_f \right)

输入门:

it=σ(Wi[ht1,xt]+bi)\mathbf{i}_t = \sigma \left( \mathbf{W}_i[\mathbf{h}_{t-1},\mathbf{x}_t] +\mathbf{b}_i \right)

候选状态:

C~t=tanh(WC[ht1,xt]+bC)\tilde{\mathbf{C}}_t = \tanh \left( \mathbf{W}_C[\mathbf{h}_{t-1},\mathbf{x}_t] +\mathbf{b}_C \right)

细胞状态:

Ct=ftCt1+itC~t\mathbf{C}_t = \mathbf{f}_t\odot\mathbf{C}_{t-1} + \mathbf{i}_t\odot\tilde{\mathbf{C}}_t

输出门:

ot=σ(Wo[ht1,xt]+bo)\mathbf{o}_t = \sigma \left( \mathbf{W}_o[\mathbf{h}_{t-1},\mathbf{x}_t] +\mathbf{b}_o \right)

隐藏状态:

ht=ottanh(Ct)\mathbf{h}_t = \mathbf{o}_t\odot\tanh(\mathbf{C}_t)

其中:

  • ft\mathbf{f}_t:保留多少旧记忆;
  • it\mathbf{i}_t:写入多少新信息;
  • C~t\tilde{\mathbf{C}}_t:候选新记忆;
  • Ct\mathbf{C}_t:细胞状态;
  • ot\mathbf{o}_t:输出多少记忆;
  • \odot:逐元素乘法。

老师强调的核心:

LSTM 用门控和加法式细胞状态更新,为信息与梯度提供更稳定的长期通路。

5. LSTM 与 GRU 的选择#

项目LSTMGRU
遗忘、输入、输出门更新、重置门
状态隐藏状态与细胞状态分开合并
参数量更多更少
长序列能力通常更强通常足够
计算成本较高较低
推荐场景很长、复杂序列资源受限、边缘设备、较短序列

例题 1:RNN 隐藏状态递推#

标量 RNN:

ht=tanh(Wxxt+Whht1+b)h_t=\tanh(W_xx_t+W_hh_{t-1}+b)

已知:

Wx=1,Wh=0.5,b=0,h0=0W_x=1,\quad W_h=0.5,\quad b=0,\quad h_0=0

输入序列:

x1=1,x2=0x_1=1,\quad x_2=0

h1,h2h_1,h_2

第 1 个时间步#

h1=tanh(1×1+0.5×0)h_1 = \tanh(1\times1+0.5\times0)=tanh(1)0.7616=\tanh(1)\approx0.7616

第 2 个时间步#

h2=tanh(1×0+0.5×0.7616)h_2 = \tanh(1\times0+0.5\times0.7616)=tanh(0.3808)0.3634=\tanh(0.3808)\approx0.3634

答案:

h10.7616,h20.3634\boxed{h_1\approx0.7616,\quad h_2\approx0.3634}

虽然 x2=0x_2=0h2h_2 仍不为 0,因为它继承了 h1h_1 中的历史信息。


例题 2:判断梯度消失#

假设反向传播跨越每个时间步时,梯度都乘以 0.5。跨越 8 步后,梯度还剩原来的多少?

解答#

0.58=1256=0.003906250.5^8 = \frac{1}{256} = 0.00390625

即只剩:

0.390625%0.390625\%

结论:

经过 8 步后梯度已非常小,早期时间步几乎无法收到有效学习信号,属于梯度消失。


例题 3:判断梯度爆炸与梯度裁剪#

假设每步反向传播把梯度放大 1.5 倍,跨越 6 步:

1.56=11.3906251.5^6=11.390625

若末端梯度为 2,则早期梯度近似:

2×11.390625=22.781252\times11.390625=22.78125

若设置梯度范数上限为 5,则可将梯度按比例缩放:

gclip=g5g\mathbf{g}_{\mathrm{clip}} = \mathbf{g} \frac{5}{\|\mathbf{g}\|}

若标量梯度为 22.78125,则裁剪后为:

gclip=5g_{\mathrm{clip}}=5

结论:

  • 裁剪限制了更新幅度;
  • 它能控制爆炸;
  • 它不能从根本上恢复已经消失的梯度。

例题 4:LSTM 细胞状态更新#

已知某一维上的门值:

ft=0.8,Ct1=0.5,it=0.3,C~t=0.6,ot=0.7f_t=0.8,\quad C_{t-1}=0.5,\quad i_t=0.3,\quad \tilde C_t=0.6,\quad o_t=0.7

CtC_thth_t

细胞状态#

Ct=ftCt1+itC~tC_t = f_tC_{t-1}+i_t\tilde C_t=0.8×0.5+0.3×0.6=0.8\times0.5+0.3\times0.6=0.4+0.18=0.58=0.4+0.18=0.58

隐藏状态#

ht=ottanh(Ct)h_t=o_t\tanh(C_t)=0.7tanh(0.58)=0.7\tanh(0.58)

由于:

tanh(0.58)0.5227\tanh(0.58)\approx0.5227

所以:

ht0.7×0.5227=0.3659h_t\approx0.7\times0.5227=0.3659

答案:

Ct=0.58,ht0.3659\boxed{C_t=0.58,\quad h_t\approx0.3659}

五、自注意力与 Transformer 必须掌握的计算#

1. Q、K、V 的含义#

对输入矩阵 XX 做三组线性变换:

Q=XWQQ=XW_QK=XWKK=XW_KV=XWVV=XW_V

其中:

  • XX:输入 token 的嵌入矩阵;
  • WQ,WK,WVW_Q,W_K,W_V:可学习投影矩阵;
  • QQ:Query,表示“我正在寻找什么”;
  • KK:Key,表示“我包含什么可供匹配的信息”;
  • VV:Value,表示“如果被关注,我实际提供什么内容”。

信息检索类比:

  • Query:检索请求;
  • Key:索引标签;
  • Value:真正返回的内容。

2. 缩放点积注意力#

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

分四步:

第一步:相似度分数#

S=QKTS=QK^T

每个元素 SijS_{ij} 表示第 ii 个 Query 与第 jj 个 Key 的点积相似度。

第二步:缩放#

S~=Sdk\tilde S=\frac{S}{\sqrt{d_k}}

其中 dkd_k 是 Key/Query 向量维数。

第三步:Softmax#

A=softmax(S~)A=\operatorname{softmax}(\tilde S)

Softmax 通常逐行计算。每一行代表一个 Query 对所有 Key 的注意力权重,行和为 1。

第四步:对 Value 加权求和#

O=AVO=AV

其中 OO 是上下文化后的输出。

3. 为什么除以根号 (d_k)#

若 Query 和 Key 各维分量近似独立、均值为 0、方差为 1,则点积:

qk=r=1dkqrkrq\cdot k=\sum_{r=1}^{d_k}q_rk_r

其方差随 dkd_k 增大,典型尺度约为 dk\sqrt{d_k}

若不缩放:

  • dkd_k 较大时点积绝对值很大;
  • Softmax 输出会非常接近 one-hot;
  • Softmax 进入饱和区;
  • 梯度变小;
  • 训练变得不稳定。

除以 dk\sqrt{d_k} 可把分数保持在较合适的范围。

4. Softmax 的关键性质#

对分数 sis_i

αi=esijesj\alpha_i = \frac{e^{s_i}}{\sum_j e^{s_j}}

性质:

  1. αi>0\alpha_i>0
  2. iαi=1\sum_i\alpha_i=1
  3. 分数越大,权重越大;
  4. 分数为 0 不等于权重为 0;
  5. 只要分数有限,Softmax 输出通常严格大于 0;
  6. 给所有分数同时加同一个常数,Softmax 结果不变。
WARNING

老师在复习课中特别提出:

Query 与 Key 内积为 0 时,attention score 为 0;但经过 Softmax 后,对应注意力权重通常不为 0。

这是非常容易出概念题的地方。

5. 多头注意力与位置编码#

若模型维数为 dmodeld_{\mathrm{model}},有 hh 个头,通常:

dk=dv=dmodelhd_k=d_v=\frac{d_{\mathrm{model}}}{h}

rr 个头:

headr=Attention(QWQ(r),KWK(r),VWV(r))\operatorname{head}_r = \operatorname{Attention} \left( QW_Q^{(r)}, KW_K^{(r)}, VW_V^{(r)} \right)

拼接:

MultiHead(Q,K,V)=Concat(head1,,headh)WO\operatorname{MultiHead}(Q,K,V) = \operatorname{Concat} (\operatorname{head}_1,\ldots,\operatorname{head}_h)W_O

多头的意义:

  • 不同头可学习不同关系;
  • 有的关注语法;
  • 有的关注语义相似性;
  • 有的关注共指或长距离依赖。

自注意力本身不知道 token 顺序,因此需要位置编码:

Xinput=Xtoken+XpositionX_{\mathrm{input}} = X_{\mathrm{token}} + X_{\mathrm{position}}

课程重点是理解作用,不要求死记正弦位置编码的完整公式。


例题 1:一个 Query 对两个 Key 的注意力#

给定:

q=[10]q= \begin{bmatrix} 1\\ 0 \end{bmatrix}k1=[10],k2=[01]k_1= \begin{bmatrix} 1\\ 0 \end{bmatrix}, \qquad k_2= \begin{bmatrix} 0\\ 1 \end{bmatrix}v1=[20],v2=[04]v_1= \begin{bmatrix} 2\\ 0 \end{bmatrix}, \qquad v_2= \begin{bmatrix} 0\\ 4 \end{bmatrix}

dk=2d_k=2,求注意力输出。

第一步:点积分数#

qTk1=1q^Tk_1=1qTk2=0q^Tk_2=0

所以:

S=[10]S= \begin{bmatrix} 1&0 \end{bmatrix}

第二步:缩放#

S~=12[10]=[0.70710]\tilde S = \frac{1}{\sqrt2} \begin{bmatrix} 1&0 \end{bmatrix} = \begin{bmatrix} 0.7071&0 \end{bmatrix}

第三步:Softmax#

α1=e0.7071e0.7071+e00.6698\alpha_1 = \frac{e^{0.7071}} {e^{0.7071}+e^0} \approx0.6698α2=1e0.7071+10.3302\alpha_2 = \frac{1} {e^{0.7071}+1} \approx0.3302

第四步:对 Value 加权#

o=0.6698v1+0.3302v2o = 0.6698v_1+0.3302v_2=0.6698[20]+0.3302[04]= 0.6698 \begin{bmatrix} 2\\ 0 \end{bmatrix} + 0.3302 \begin{bmatrix} 0\\ 4 \end{bmatrix}=[1.33961.3208]= \begin{bmatrix} 1.3396\\ 1.3208 \end{bmatrix}

答案:

o[1.33961.3208]\boxed{ o\approx \begin{bmatrix} 1.3396\\ 1.3208 \end{bmatrix} }

例题 2:分数为零时注意力是否为零#

一个 Query 对两个 Key 的缩放分数均为 0:

S~=[00]\tilde S= \begin{bmatrix} 0&0 \end{bmatrix}

求 Softmax。

解答#

α1=e0e0+e0=12\alpha_1 = \frac{e^0}{e^0+e^0} = \frac12α2=12\alpha_2=\frac12

所以:

softmax([00])=[0.50.5]\operatorname{softmax} \left( \begin{bmatrix} 0&0 \end{bmatrix} \right) = \begin{bmatrix} 0.5&0.5 \end{bmatrix}

结论:

score=0 不代表 attention weight=0\boxed{\text{score}=0\ \text{不代表 attention weight}=0}

它只表示原始相似度为 0;Softmax 会根据所有候选分数的相对大小分配概率。

若希望某位置权重真正接近 0,通常需要:

  • 它的分数远小于其他位置;
  • 或使用 mask,把对应分数设为一个极大的负数。

例题 3:矩阵形式完整计算自注意力#

设:

Q=[1001],K=[1001],V=[1234]Q= \begin{bmatrix} 1&0\\ 0&1 \end{bmatrix}, \quad K= \begin{bmatrix} 1&0\\ 0&1 \end{bmatrix}, \quad V= \begin{bmatrix} 1&2\\ 3&4 \end{bmatrix}

dk=2d_k=2

第一步:计算 (QK^T)#

由于 KT=KK^T=K

QKT=[1001]QK^T= \begin{bmatrix} 1&0\\ 0&1 \end{bmatrix}

第二步:缩放#

S~=12[1001]\tilde S = \frac{1}{\sqrt2} \begin{bmatrix} 1&0\\ 0&1 \end{bmatrix}[0.7071000.7071]\approx \begin{bmatrix} 0.7071&0\\ 0&0.7071 \end{bmatrix}

第三步:逐行 Softmax#

第一行:

[0.7071,0][0.6698,0.3302][0.7071,0] \rightarrow [0.6698,0.3302]

第二行:

[0,0.7071][0.3302,0.6698][0,0.7071] \rightarrow [0.3302,0.6698]

所以:

A[0.66980.33020.33020.6698]A\approx \begin{bmatrix} 0.6698&0.3302\\ 0.3302&0.6698 \end{bmatrix}

第四步:计算 (AV)#

O=AVO=AV

第一行:

0.6698[1,2]+0.3302[3,4]0.6698[1,2]+0.3302[3,4]=[1.6604,2.6604]=[1.6604,2.6604]

第二行:

0.3302[1,2]+0.6698[3,4]0.3302[1,2]+0.6698[3,4]=[2.3396,3.3396]=[2.3396,3.3396]

因此:

O[1.66042.66042.33963.3396]\boxed{ O\approx \begin{bmatrix} 1.6604&2.6604\\ 2.3396&3.3396 \end{bmatrix} }

理解:

  • 第一个 Query 更关注第一个 Value;
  • 第二个 Query 更关注第二个 Value;
  • 输出仍是两个 token,但每个 token 已融合另一个位置的信息。

例题 4:多头注意力的维度#

已知:

dmodel=512d_{\mathrm{model}}=512

多头数量:

h=8h=8

求每个头的 dkd_k,并说明拼接后的维度。

每个头#

dk=dmodelh=5128=64d_k=\frac{d_{\mathrm{model}}}{h} =\frac{512}{8}=64

每个头的 Query、Key、Value 通常维度均为 64。

拼接#

8 个头各输出 64 维:

8×64=5128\times64=512

拼接后重新回到:

512 维\boxed{512\text{ 维}}

再经过输出投影矩阵 WOW_O,仍保持 dmodel=512d_{\mathrm{model}}=512


六、必须掌握的概念辨析#

1. 反向传播与优化器#

概念作用
反向传播通过链式法则计算损失对各参数的梯度
梯度下降 / 优化器根据梯度更新参数
损失函数定义“预测有多差”
学习率控制每次参数更新幅度

正确表达:

反向传播求梯度,优化器使用梯度更新参数。

2. SGD、Momentum 与 Adam#

SGD#

  • 结构简单;
  • 每个 mini-batch 计算一次梯度;
  • 噪声较大;
  • 可能在损失谷中来回震荡。

Momentum#

  • 累积过去方向;
  • 抑制震荡;
  • 在持续一致方向上加速;
  • 微调阶段常有效。

Adam#

  • 同时估计梯度均值和平方均值;
  • 对各参数自适应调整步长;
  • 对初始学习率相对不敏感;
  • 常作为默认优化器。

3. BERT 与 GPT#

项目BERTGPT
Transformer 部分编码器解码器
上下文方向双向单向 / 因果
预训练目标掩码语言建模等下一个 token 预测
擅长任务理解、分类、命名实体识别、抽取文本生成、续写、对话
是否可看未来 token预训练时可利用左右文生成时不能看未来 token

为什么 BERT 适合命名实体识别?

判断一个词属于人名、地点或机构时,左右两侧上下文都可能重要;BERT 的双向编码能同时利用前文和后文。

为什么 GPT 适合生成?

GPT 使用因果 mask,只根据已经出现的 token 预测下一个 token,与自然语言从左到右生成的过程一致。

4. CNN 与 ViT#

CNN#

  • 用卷积核局部滑动;
  • 强调局部连接和参数共享;
  • 逐层扩大感受野;
  • 具有较强图像结构先验。

ViT#

  1. 将图像切成固定大小 patch;
  2. 每个 patch 展平;
  3. 线性映射成 token 向量;
  4. 加位置编码;
  5. 输入 Transformer 编码器;
  6. 用自注意力学习不同 patch 的全局关系。

若图像大小为 H×WH\times W,patch 大小为 P×PP\times P,则 patch 数量:

N=HPWPN=\frac{H}{P}\frac{W}{P}

例如:

224×224224\times224

使用:

16×1616\times16

patch:

N=14×14=196N=14\times14=196

5. LLM 的训练流程#

第一阶段:预训练#

  • 使用互联网规模文本;
  • 目标通常是预测下一个 token;
  • 学习语言规律、知识和一般能力。

第二阶段:监督微调 SFT#

  • 使用高质量“指令—回答”数据;
  • 让模型学习遵循人类指令;
  • 改善回答格式和任务适配。

第三阶段:RLHF 或 DPO#

  • RLHF:从人类偏好训练奖励模型,再优化语言模型;
  • DPO:直接使用偏好对优化模型;
  • 目标是提高有用性、安全性和与人类偏好的对齐程度。

6. 训练中常见问题#

现象可能原因处理
损失不下降学习率太小、梯度断裂、代码错误检查梯度,适当增大学习率
损失震荡学习率过大、SGD 噪声大降低学习率,使用 Momentum / Adam
损失爆炸或 NaN梯度爆炸、数值不稳定梯度裁剪,降低学习率
训练集好、验证集差过拟合Dropout、权重衰减、数据增强、早停
激活大量为 0死亡 ReLU调整初始化或学习率,使用 Leaky ReLU
深层网络难训练梯度消失 / 爆炸合理初始化、BatchNorm、残差连接
RNN 记不住远处信息长距离梯度消失LSTM、GRU、注意力、Transformer

七、考前速查表#

1. 前向传播#

z[l]=W[l]a[l1]+b[l]\mathbf{z}^{[l]}=\mathbf{W}^{[l]}\mathbf{a}^{[l-1]}+\mathbf{b}^{[l]}a[l]=f[l](z[l])\mathbf{a}^{[l]}=f^{[l]}(\mathbf{z}^{[l]})

必须检查:

  • 矩阵维度;
  • 偏置;
  • 激活函数;
  • 最后一层任务类型。

2. 常用损失#

回归:

LMSE=1Ni(yiy^i)2L_{\mathrm{MSE}}=\frac1N\sum_i(y_i-\hat y_i)^2

多分类:

L=logptrueL=-\log p_{\mathrm{true}}

二分类:

L=[ylogp+(1y)log(1p)]L=-[y\log p+(1-y)\log(1-p)]

3. 梯度下降#

θθηLθ\theta\leftarrow\theta-\eta\frac{\partial L}{\partial\theta}

4. CNN 输出尺寸#

Hout=Hin+2PKS+1H_{\mathrm{out}} = \left\lfloor \frac{H_{\mathrm{in}}+2P-K}{S} \right\rfloor+1

宽度同理。

5. CNN 参数量#

Nparam=(KhKwCin+1)CoutN_{\mathrm{param}} = (K_hK_wC_{\mathrm{in}}+1)C_{\mathrm{out}}

6. RNN#

ht=f(Wxhxt+Whhht1+bh)h_t=f(W_{xh}x_t+W_{hh}h_{t-1}+b_h)

7. LSTM 核心状态更新#

Ct=ftCt1+itC~tC_t=f_t\odot C_{t-1}+i_t\odot\tilde C_t

8. 自注意力#

Q=XWQ,K=XWK,V=XWVQ=XW_Q,\qquad K=XW_K,\qquad V=XW_VAttention(Q,K,V)=softmax(QKTdk)V\operatorname{Attention}(Q,K,V) = \operatorname{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right)V

计算顺序:

Q 与 K 做点积
→ 除以 sqrt(d_k)
→ 逐行 Softmax
→ 对 V 加权求和

9. 模型选择#

数据 / 任务典型模型
表格数据MLP
图像CNN / ViT
时间序列RNN / LSTM / GRU / Transformer
文本理解BERT
文本生成GPT
超长复杂序列LSTM / Transformer
资源受限序列任务GRU

八、自测题#

以下题目先独立完成,再对照前文。

自测 1:前向传播#

x=[21],W=[1211],b=[01]x= \begin{bmatrix} 2\\ -1 \end{bmatrix}, \quad W= \begin{bmatrix} 1&2\\ -1&1 \end{bmatrix}, \quad b= \begin{bmatrix} 0\\ 1 \end{bmatrix}

使用 ReLU,求输出。

答案z=[1211][21]+[01]=[02]z= \begin{bmatrix} 1&2\\ -1&1 \end{bmatrix} \begin{bmatrix} 2\\ -1 \end{bmatrix} + \begin{bmatrix} 0\\ 1 \end{bmatrix} = \begin{bmatrix} 0\\ -2 \end{bmatrix}

ReLU 后:

a=[00]a= \begin{bmatrix} 0\\ 0 \end{bmatrix}

自测 2:卷积输出尺寸#

输入 32×3232\times32,卷积核 5×55\times5,步幅 1,填充 2。

答案32+451+1=32\frac{32+4-5}{1}+1=32

输出为:

32×3232\times32

自测 3:卷积参数量#

输入通道 32,输出通道 64,卷积核 3×33\times3,有偏置。

答案(3×3×32+1)×64(3\times3\times32+1)\times64=(288+1)×64=18496=(288+1)\times64=18496

自测 4:注意力#

q=[1,1],k1=[1,0],k2=[0,1]q=[1,1],\quad k_1=[1,0],\quad k_2=[0,1]

不考虑缩放,求两个 score 和 Softmax 权重。

答案qk1=1,qk2=1q\cdot k_1=1,\qquad q\cdot k_2=1

因此:

softmax([1,1])=[0.5,0.5]\operatorname{softmax}([1,1])=[0.5,0.5]

自测 5:概念判断#

“反向传播就是梯度下降。”

答案

错误。

反向传播负责计算梯度;梯度下降或 Adam 等优化器利用梯度更新参数。

自测 6:概念判断#

“Query 与 Key 的点积为 0,因此对应的 Softmax 注意力权重一定为 0。”

答案

错误。

点积为 0 只代表原始 score 为 0;Softmax 根据所有分数的相对大小分配正权重。例如:

softmax([0,0])=[0.5,0.5]\operatorname{softmax}([0,0])=[0.5,0.5]

最终掌握标准#

复习完成后,应能够不看答案完成以下任务:

  1. 给出一个小型网络,逐层计算 zzaa 和最终预测;
  2. 根据真实值计算 MSE 或交叉熵;
  3. 对简单标量网络用链式法则求梯度并更新参数;
  4. 对矩阵与卷积核做完整卷积;
  5. 计算任意基础卷积层的输出尺寸;
  6. 计算卷积层参数量并解释参数共享;
  7. 根据 RNN 递推式计算隐藏状态;
  8. 用连乘解释梯度消失或爆炸;
  9. 根据 Q,K,VQ,K,V 计算缩放点积注意力;
  10. 解释分数为 0 为什么不代表 Softmax 权重为 0;
  11. 区分反向传播、SGD、Momentum、Adam;
  12. 区分 BERT 与 GPT、CNN 与 ViT、LSTM 与 GRU。
TIP

真正可靠的复习方法是:遮住答案,独立把每道例题完整写一遍。只“看懂”计算过程并不能保证考场上能够完成。

OceanAI-Chapter6:PLUS深度学习重点
https://www.sleepyfish2031.top/posts/课程笔记/海洋人工智能基础/深度学习重点及必须掌握的计算/
作者
Sleepyfish
发布于
2026-06-17
许可协议
CC BY-NC-SA 4.0