深度学习之ANN、CNN、RNN
一、神经网络基础
1.1 结构组成
神经网络由输入层、隐藏层、输出层构成:
- 输入层:接收原始数据,每个神经元对应一个特征维度。
- 隐藏层:核心计算层。每一层执行两步操作:
1. 线性变换:z = Wx + b,其中 W 为权重矩阵,b 为偏置。
2. 非线性激活:a = f(z),为网络引入非线性表达能力。 - 输出层:根据任务类型输出结果,如分类概率或回归值。
1.2 前向传播
数据从输入层开始,逐层计算线性变换与激活,直至输出层得到预测值。
对于第 l 层:z[l] = W[l] a[l-1] + b[l],a[l] = f[l](z[l]),其中 a[0] = x 为输入,最终输出 ŷ = a[L]。
1.3 反向传播
目标:通过计算损失函数对每个参数的梯度,沿网络反向更新权重,以减小损失。
核心工具:链式法则。
从输出层损失 L 开始,逐层计算:∂L/∂W[l] = (∂L/∂z[l]) · (∂z[l]/∂W[l]),∂L/∂b[l] = ∂L/∂z[l]。
误差项 δ[l] = ∂L/∂z[l] 从后向前传递:δ[l] = (W[l+1])T δ[l+1] ⊙ f'(z[l])。最终用梯度下降更新参数。
二、损失函数详解
2.1 分类任务
交叉熵损失 (Cross-Entropy Loss)
对于多分类,模型输出经 Softmax 后得到概率分布 ŷi,真实标签为 one-hot 向量 yi:L = -∑i yi log(ŷi)。PyTorch 中 CrossEntropyLoss 已整合 LogSoftmax 和 NLLLoss。
二分类交叉熵 (BCE Loss)
L = -[y log(ŷ) + (1-y) log(1-ŷ)]。通常先对输出做 Sigmoid 转为概率。实践中推荐使用 BCEWithLogitsLoss,它将 Sigmoid 与损失合并,数值更稳定。
2.2 回归任务
均方误差 (MSE / L2 Loss)
L = (1/n) ∑i=1n (yi - ŷi)2。梯度与误差成正比,对异常值敏感(放大误差)。
平均绝对误差 (MAE / L1 Loss)
L = (1/n) ∑i=1n |yi - ŷi|。梯度为常数(+1 或 -1),对异常值更鲁棒,但零点不可导(实践中可使用次梯度)。
Smooth L1 Loss
结合 L1 与 L2 的优点,误差绝对值小于 1 时用 L2 部分(梯度平缓),否则用 L1(梯度恒定):当 |yi - ŷi| < 1 时 L = 0.5 (yi - ŷi)2,否则 L = |yi - ŷi| - 0.5。常用于目标检测中的回归。
三、激活函数详解
| 函数 | 公式 | 值域 | 导数 | 特点与适用场景 |
|---|---|---|---|---|
| Sigmoid | σ(x) = 1/(1+e-x) | (0,1) | σ(x)(1-σ(x)) | 输出可解释为概率,两端饱和区梯度接近 0,易梯度消失;用于二分类输出层。 |
| Tanh | tanh(x) = (ex - e-x)/(ex + e-x) | [-1,1] | 1 - tanh2(x) | 零中心,梯度消失问题略轻于 Sigmoid;常用于隐藏层。 |
| ReLU | max(0, x) | [0, +∞) | 1 (x>0), 0 (x<0) | 计算简单,正区间梯度恒为 1,缓解梯度消失;负区间输出为 0,可导致神经元“死亡”(权重无法更新)。 |
| Leaky ReLU | max(αx, x) | (-∞, +∞) | 1 (x>0), α (x<0) | 给负区间一个很小的斜率(如 α=0.01),缓解死亡 ReLU 问题。 |
| PReLU | 同 Leaky ReLU,但 α 为可学习参数 | (-∞, +∞) | 同上,α 通过梯度更新 | 自适应负区间斜率。 |
| RReLU | α 在训练时随机采样,测试时固定平均 | (-∞, +∞) | 类似,随机斜率 | 具备正则化效果。 |
| Softmax | exi / ∑j exj | (0,1) 且和为 1 | 较复杂(雅可比矩阵) | 将任意实数向量转换为概率分布,用于多分类输出层。 |
为什么 ReLU 能缓解梯度消失?因为它在正区间的导数为 1,反向传播时梯度不会像 Sigmoid/Tanh 那样快速衰减,允许深层网络训练。
四、梯度下降与优化器
4.1 核心思想
梯度下降的目标是最小化损失函数 L(θ)。每次迭代,参数沿负梯度方向更新:θt+1 = θt - η ∇θ L(θt),其中 η 为学习率。直觉类比:盲人下山,每一步沿当前最陡峭方向迈出步长 η。
4.2 三种变体
| 变体 | 每次更新使用数据 | 优点 | 缺点 |
|---|---|---|---|
| 批量梯度下降 (BGD) | 全量训练集 | 梯度准确,收敛平稳 | 计算代价高,内存可能不足 |
| 随机梯度下降 (SGD) | 单一样本 | 速度快,可在线学习 | 梯度噪声大,损失震荡剧烈 |
| 小批量 SGD (Mini-batch) | 小批量(如 32/64) | 平衡效率与稳定性,最常用 | 需调节批量大小 |
通常所说的 SGD 即指 Mini-batch SGD。
4.3 面临的挑战
- 局部最小与鞍点:在高维空间中,鞍点(梯度为 0 但非极值)远比局部最小常见,普通梯度下降可能停滞。
- 学习率选择:太小收敛慢,太大则震荡甚至不收敛。
- 参数尺度不同:不同参数可能需要不同更新步长。
4.4 优化器详解
4.4.1 Momentum(动量法)
累积历史梯度,产生速度效应,帮助跃出平坦区域和鞍点。
vt = γ vt-1 + η ∇θ L(θt),θt+1 = θt - vt。
γ 通常取 0.9。比喻:小球从山滚下,惯性使其冲过小坑。
4.4.2 Nesterov 加速梯度 (NAG)
在 Momentum 基础上,先按历史动量移动一步,再计算该位置的梯度,具有“前瞻”校正能力。
vt = γ vt-1 + η ∇θ L(θt - γ vt-1),θt+1 = θt - vt。
4.4.3 AdaGrad
自适应学习率,对频繁更新的参数减小学习率,适合稀疏特征。
Gt = Gt-1 + gt2(gt = ∇L(θt)),θt+1 = θt - (η / √(Gt + ε)) ⊙ gt。
缺陷:Gt 单调递增,学习率会过早接近零,导致训练停滞。
4.4.4 RMSProp
将累积改为指数加权移动平均,避免学习率过快衰减。
St = β St-1 + (1-β) gt2,θt+1 = θt - (η / √(St + ε)) ⊙ gt。
β 常用 0.9,使得学习率只反映最近梯度的幅度。
4.4.5 Adam
结合 Momentum 和 RMSProp:维护一阶矩 mt(梯度均值)和二阶矩 vt(梯度未中心化方差),并进行偏差校正。
mt = β1 mt-1 + (1-β1) gt,vt = β2 vt-1 + (1-β2) gt2。
偏差校正(因初值为 0):m̂t = mt / (1 - β1t),v̂t = vt / (1 - β2t)。
更新:θt+1 = θt - (η / (√v̂t + ε)) m̂t。
默认超参:η=0.001, β1=0.9, β2=0.999, ε=1e-8。Adam 兼具快速收敛和逐参数自适应。
4.5 优化器选择建议
- Adam:通用首选,收敛快,超参鲁棒。
- SGD + Momentum:追求极致性能时,配合精心调参(学习率衰减、长训练)可能获得更好泛化。
4.6 学习率调度
- 等间隔衰减:每 k 个 epoch 学习率乘以 0.1。
- 指定间隔衰减:在固定 epoch(如 [30, 60, 80])降低学习率。
- 指数衰减:ηt = η0 · γt。
- 余弦退火:ηt = ηmin + 0.5(η0 - ηmin)(1 + cos(tπ/T)),可带热重启。
- 线性衰减:从初始值线性减小至终止值。
4.7 梯度裁剪
当梯度的 L2 范数超过阈值 τ 时,将其缩放至 τ:g = g · (τ / ‖g‖2)。有效防止 RNN 等结构中的梯度爆炸。
五、卷积神经网络 (CNN)
5.1 核心思想
CNN 专为网格状数据(如图像)设计,通过两个关键特性降低参数量并提取平移不变特征:
- 局部连接:每个神经元仅连接输入的一个局部区域(感受野)。
- 权值共享:同一个卷积核在整个输入上滑动,参数不变。
5.2 卷积层
一个卷积核(滤波器)大小为 F × F × Cin,对输入进行点积运算,生成特征图(Feature Map)。多个卷积核输出多个通道。
超参数:核尺寸 F、步长 S、填充 P。
输出尺寸计算(向下取整):Hout = ⌊(Hin - F + 2P) / S⌋ + 1,同理计算宽度 Wout。
填充目的:控制输出尺寸,保留边缘信息。常用的“SAME”填充使输出尺寸不变(当 S=1 时,P = (F-1)/2)。
5.3 池化层
下采样操作,减小特征图尺寸,降低计算量和参数量,同时提供一定平移不变性。
- 最大池化 (Max Pooling):取局部窗口内的最大值。
- 平均池化 (Average Pooling):取局部窗口内的平均值。
通常池化层不使用填充,步长等于窗口大小。
5.4 典型结构
输入 → [卷积 → 激活(ReLU) → 池化] × N → 全连接层 → 输出。
5.5 感受野
某层特征图上一个像素点在原始输入上映射的区域大小。计算公式(递推):RFl = RFl-1 + (Fl - 1) × ∏i=1l-1 Si。深层特征具有更大感受野,能捕捉全局语义信息。
六、循环神经网络 (RNN) 与改进
6.1 基本 RNN 结构
处理序列数据,核心是隐藏状态 ht 随时间传递。
ht = tanh(Wih xt + bih + Whh ht-1 + bhh),ŷt = f(Who ht + bo)。所有时间步共享同一套参数 W。
反向传播通过时间 (BPTT):梯度需沿时间步反向传播,涉及矩阵连乘:∂L/∂ht ∝ ∏k=tT (WhhT diag(tanh'(zk)))。当 Whh 的特征值小于 1 时,连乘导致梯度消失;大于 1 则导致梯度爆炸。这使得 RNN 难以捕捉长距离依赖。
6.2 LSTM(长短期记忆网络)
通过门控机制和细胞状态 Ct 缓解梯度消失。
- 遗忘门:决定丢弃多少旧记忆。ft = σ(Wf · [ht-1, xt] + bf)
- 输入门:决定采用多少候选记忆。it = σ(Wi · [ht-1, xt] + bi),C̃t = tanh(WC · [ht-1, xt] + bC)
- 细胞状态更新(线性求和,梯度可直接流动):Ct = ft ⊙ Ct-1 + it ⊙ C̃t
- 输出门:决定输出多少细胞状态作为隐藏状态。ot = σ(Wo · [ht-1, xt] + bo),ht = ot ⊙ tanh(Ct)
线性加法操作使得梯度可以跨越多个时间步而不易衰减。
6.3 GRU(门控循环单元)
将隐藏状态与细胞状态合并,使用两个门控,参数更少。
- 重置门 rt:控制如何混合新旧信息。rt = σ(Wr · [ht-1, xt])
- 更新门 zt:控制保留多少旧状态、加入多少新状态。zt = σ(Wz · [ht-1, xt])
- 候选隐藏状态:h̃t = tanh(W · [rt ⊙ ht-1, xt])
- 最终状态:ht = (1 - zt) ⊙ ht-1 + zt ⊙ h̃t。当 zt 接近 1 时更依赖新候选状态;接近 0 时保留过去。
6.4 双向 RNN
Bi-LSTM / Bi-GRU:由前向层和后向层组成,每个时间步的最终表示是两者隐藏状态的拼接:ht = [ht→; ht←]。能同时捕捉过去和未来的上下文信息,在序列标注、机器翻译等任务中效果显著。
七、注意力机制与 Seq2Seq
7.1 注意力机制的 Q/K/V 理解
Q(查询)、K(键)、V(值)均来自同一输入的线性变换:Q = X WQ,K = X WK,V = X WV。
- Q:代表当前要“查询”的目标,表达“我需要关注什么”。
- K:代表每个位置的“索引”信息,用于与 Q 匹配。
- V:代表每个位置实际存储的“内容”信息。
注意:K 是连续向量,不是离散索引,通过点积与 Q 计算相似度。
7.2 注意力计算通用框架
- 计算相似度分数:eij = score(Qi, Kj)
- 点积:eij = QiT Kj
- 缩放点积:eij = QiT Kj / √dk(防止点积过大进入 softmax 饱和区)
- 加性注意力:eij = vT tanh(W Qi + U Kj) - 归一化注意力权重:αij = softmax(eij) = exp(eij) / ∑k exp(eik)
- 上下文向量输出:contexti = ∑j αij Vj
Q 与 K 的匹配决定聚焦何处,最终提取的是 V 的加权内容。
7.3 Seq2Seq 中的注意力
传统编码器-解码器模型将整个输入压缩为固定向量,存在信息瓶颈。引入注意力机制后:
- 编码器:每个时间步输出一个隐藏状态 hj,构成源信息的集合。
- 解码器:在生成第 i 个词时,用当前状态 si 作为 Q,所有编码器隐藏状态作为 K 和 V:αij = exp(score(si, hj)) / ∑k exp(score(si, hk)),ci = ∑j αij hj。
- 生成:将上下文 ci 与解码状态结合,预测输出词。
这样,每个生成步骤都能动态访问源序列的任意位置,极大改善了长序列翻译、摘要等任务的性能。
7.4 自注意力简介
在自注意力中,Q、K、V 均来自同一序列,使每个位置都能关注同一序列内的其他位置,是 Transformer 的核心机制。其缩放点积公式为:Attention(Q, K, V) = softmax(QKT / √dk) V。
此总结整合了神经网络基础、CNN、RNN 及其变体、梯度下降优化器家族、注意力机制等深度学习关键知识点,力求详尽准确,可作为复习与查阅的结构化资料。
更多推荐




所有评论(0)