目录

复习笔记只记录一些重点内容和需要记住的公式


01线性分类器

线性分类器:非常重要的概念——低维不可分但是高维可分

也是由于上面的特质使得线性分类器一般作为深度神经网络的最后一层 😼

图像分类任务

图像分类任务的困难——语义鸿沟(semantic gap):人眼看到的图像和机器处理的输入数据之间存在巨大的差异

挑战:视角差异、形变、光照变化、类内差异、杂乱的背景、类间混淆、遮挡、环境干扰

KNN

记住所有数据和标签,将测试图像预测为与其最相似的训练图像的标签

  • 对于 1 近邻的情况,存在的问题是无法处理离群点
  • 而多近邻的情况,会出现空白区域问题

不可以直接使用像素之间的距离作为度量标准,不具备鲁棒性!

线性分类器

SVM 的损失函数可以表示为

$$ L = \frac{1}{N} \sum_{i=1}^{N} \sum_{j \neq y_i} \max(0, s_j - s_{y_i} + \Delta) \quad (\text{PPT中 } \Delta = 1) $$

$Q_1$: 损失函数的最大值可以逼近正无穷,最小值为0

$Q_2$: 如果将 Loss 中的 sum 换成 mean,那么新损失函数的值会等缩小,从而减小梯度

$Q_3$: 如果将每一个样本的损失函数替换成

$$ L_i = \sum_{j \neq y_i} \max(0, s_j - s_{y_i} + \Delta)^2 $$

那么新损失函数会对错误分类的样本有更大的惩罚力度

$Q_4$: 当训练开始是,如果 w 的值非常小,那么所有样本的分类分数都接近0,从而每个样本的损失值都接近 $(C-1) \times \Delta$ ($C$ 为类别数)

$Q_5$: 当我们对所有类别都求和(包含正确类别)时,损失函数的值会增大,且比原损失函数大 $\Delta$

softmax 的损失函数可以表示为

$$ L_i = -\log \left( \frac{e^{s_{y_i}}}{\sum_{j} e^{s_j}} \right) $$

PPT 在这里突然介绍了 KL 散度

$$D_{KL}(P||Q) = \sum_{x} P(x) \log \frac{P(x)}{Q(x)}$$

感觉有点突兀,还没有捣鼓出这里的逻辑关联


02正则化与优化

内容组成: 正则化 + 模型优化

正则化

引入正则化的目的很简单——防止模型过拟合,最简单的例子就是上一节中介绍的 SVM 的参数 W ,把最优的 W 值翻倍仍可以得到 Loss 不变的结果,那么我们更希望 W 的值越小越好

简单来说可以总结成下面两点:

正则化:偏好简单的模型

  • 降低模型对训练数据的过拟合
  • 降低噪声对模型的干扰

💡 奥卡姆剃刀:Among multiple competing hypotheses, the simplest is the best (如无必要,勿增实体)

$Q_1$: 使用正则化:(1)表达对模型参数的偏好 (2)使模型简单,使其适用于测试数据 (3)改进模型优化

正则化的一个方法是在 Loss 中添加正则化项(当然 Dropout、Batch Normalization、Stochastic Depth 这些方法也可以看作是正则化手段)

$$ L = \frac{1}{N} \sum_{i=1}^{N} L_i + \lambda R(W) $$

常见的正则化项有 L1 正则化和 L2 正则化

  • L1 正则化:$R(W) = \sum_{i,j} |W_{i,j}|$ (使得权重稀疏)
  • L2 正则化:$R(W) = \sum_{i,j} W_{i,j}^2$ (偏好分散的权重)

💡 相当不错的参考文章 深入理解L1、L2正则化 - MrLi的文章

模型优化

模型优化的目标是最小化损失函数 $L(w)$ ,其中 $w$ 是模型的参数

$$ \theta^* = \arg \min_{\theta} -\sum_{i=1}^{N} \log P(y_i | x_i; \theta) + \lambda R(\theta) $$

数值法 & 解析法

数值梯度计算

$$\nabla_w L \approx \frac{L(w + h) - L(w)}{h}$$

缺点:

  • 计算量大,尤其是参数较多时
  • 求的是近似值 优点:
  • 实现起来比较简单

解析梯度计算 通过对损失函数进行求导,得到梯度的精确表达式 优点:

  • 计算效率高
  • 得到的是精确值 缺点:
  • 实现起来比较复杂,尤其是对于复杂的模型

结合两种方式可进行 梯度检查:用数值法计算梯度,然后与解析法计算的梯度进行比较,验证解析法的正确性(不过这种方法仅限于小模型)

参数更新

现代参数优化方法都是在批量上进行计算

$$\begin{aligned} L(W) = & \frac{1}{N} \sum_{i=1}^{N} L_i(x_i,y_i;W) + \lambda R(W) \\ \nabla_w L = & \frac{1}{N} \sum_{i=1}^{N} \nabla_W L_i + \lambda \nabla_W R(W) \end{aligned}$$

1.SGD

$$\begin{aligned} L(w) = & \frac{1}{N} \sum_{i=1}^{N} L_i(w) + \lambda R(w) \\ \nabla_w L = & \frac{1}{N} \sum_{i=1}^{N} \nabla_w L_i + \lambda \nabla_w R(w) \\ w = & w - \eta \nabla_w L \end{aligned}$$

问题 :

  • 如果不同方向梯度差异大,很容易出现一个方向抖动一个方向更新慢
  • 当前梯度最陡的方向不一定是最优的方向
  • 损失函数存在局部最优值,会落入局部最优解或者鞍点

区分鞍点和局部最优解可以使用 Hessian 矩阵,Hessian 矩阵的特征值全为正 or 负则为局部最优解,正负混合则为鞍点

一个解决上述问题的想法

  • 如果连续的梯度优化步指向不同的方向,应该对优化方向进行修正
  • 如果连续的梯度优化步指向相似的方向,应该朝那个方向走得更快

基于这个想法,出现了 SGD + Momentum 方法

2.动量法(SGD + Momentum)

$$\begin{aligned} v = & \rho v + \nabla_w L \\ w = & w - \alpha v \end{aligned}$$

想法二:如果梯度的值出现了巨大改变,那么需要对学习率进行动态调整

  • 对每个维度的梯度大小进行归一化

基于上面的想法,出现了 RMSProp、AdaGrad、Adam 等优化方法

3.RMSProp

$$\begin{aligned} s = & \beta s + (1 - \beta) (\nabla_w L)^2 \quad (\beta \text{是 decay rate}) \\ w = & w - \alpha \frac{\nabla_w L}{\sqrt{s} + \epsilon} \end{aligned}$$

让陡峭的方向更新变小,平坦的方向更新变大,从而加快收敛速度

4AdaGrad

$$\begin{aligned} s = & s + (\nabla_w L)^2 \\ w = & w - \alpha \frac{\nabla_w L}{\sqrt{s} + \epsilon} \end{aligned}$$

小结:

  • AdaGrad 适合处理凸优化问题,学习率会随着时间推移不断减小(需要在学习率减小到一定程度前完成训练)
  • RMSProp 往往更适合深度学习

想法三:结合 momentum 和 RMSProp 的优点 5.Adam

$$\begin{aligned} m = & \beta_1 m + (1 - \beta_1) \nabla_w L \\ v = & \beta_2 v + (1 - \beta_2) (\nabla_w L)^2 \\ \hat{m} = & \frac{m}{1 - \beta_1^t} \\ \hat{v} = & \frac{v}{1 - \beta_2^t} \\ w = & w - \alpha \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon} \end{aligned}$$

前一部分是 momentum + RMSProp,中间两行是 bias correction,最后一行是参数更新

bias correction 的作用是补偿初始时刻 m 和 v 偏向于 0 的问题

6.AdamW 标准的 Adam 并没有考虑正则化项对参数更新的影响,AdamW 在参数更新时加入了正则化项的影响

$$ w = w - \alpha \left( \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon} + \lambda w \right) $$

学习率的优化

ResNet 在30、60、90 epoch 时将学习率降低为原来的十分之一

cosine

$$ \eta_t = \eta_{min} + \frac{1}{2} (\eta_{max} - \eta_{min}) \left( 1 + \cos \left(\frac{T_{cur}}{T_{max}} \pi \right) \right) $$

PPT 中的版本 min = 0 max = 初始学习率

Linear

$$ a_t =a_0(1 - \frac{t}{T}) $$

Inverse

$$ a_t = \frac{a_0}{\sqrt{t}} $$

此外,还可以采用 Warm up 的方法,在训练初期使用较小的学习率,逐渐增大到设定的学习率,从而避免训练初期参数更新过大导致的不稳定

上面的方法都是 一阶优化 当然也存在 二阶优化,只是计算成本很高,一般不使用


03神经网络与反向传播

激活函数

Sigmoid

$$\sigma(x) = \frac{1}{1 + e^{-x}}$$

问题:

  • 饱和时存在梯度消失
  • 输出不是以 0 为中心
  • 指数函数计算成本高

tanh

$$\tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}$$

问题:

  • 梯度存在消失问题

ReLU

$$\text{ReLU}(x) = \max(0, x)$$

计算效率非常高,收敛更快

问题:

  • 输出不是以 0 为中心
  • 负数区域存在神经元死亡问题,梯度为 0

Leaky ReLU

$$\text{Leaky ReLU}(x) = \begin{cases} x & x \geq 0 \\ 0.01 x & x < 0 \end{cases}$$

计算效率高,收敛快,任何时候梯度都不为 0

如果将 0.01 用参数 a 代替则是 PReLU

GELU

$$\text{GELU}(x) = x \cdot \Phi(x) = x \cdot \frac{1}{2} \left( 1 + \text{erf} \left( \frac{x}{\sqrt{2}} \right) \right)$$

0 处的导数可以计算,而且平滑函数有助于训练

问题:

  • 计算成本较高,较大负值处梯度为 0

ELU

$$\text{ELU}(x) = \begin{cases} x & x \geq 0 \\ \alpha (e^{x} - 1) & x < 0 \end{cases}$$

具有 ReLU 的优点,同时负数区域有非零梯度,比 Leaky ReLU 更稳定

问题:

  • 计算成本较高

给 x 乘以一个 $\lambda$ 可以变成 SELU,适合更深的网络,且可以在不进行 BN 处理下训练

Maxout

$$\text{Maxout}(x) = \max(w_1^T x + b_1, w_2^T x + b_2)$$

非线性,具有 leaky relu 的优点,不会饱和梯度不会为0,但是参数数量翻倍

为什么以 0 为中心很重要

如果激活函数不是以 0 为中心的话,如果像是 sigmoid 这种输出恒为正的情况,在反向传播过程中会导致各个参数的梯度方向相同,如果两个参数的目标梯度方向并不一致,就会发生 Zig-zag 现象,从而导致收敛速度变慢

计算图 + 反向传播

标量 这一节需要记住的感觉就是如何绘制计算图以及如何利用计算图进行反向传播的计算了

需要格外关照的是 add、mul、copy、max 四种 gate 的反向传播特点

  • 算一遍 PPT 上的例题
  • 找一些简单的函数实例绘制计算图并标注反向传播每一步的值

向量

向量导数的三种形式

$$ \boxed{\begin{aligned} \text{标量对向量} & : \frac{\partial y}{\partial \mathbf{x}} = \left[ \frac{\partial y}{\partial x_1}, \frac{\partial y}{\partial x_2}, \ldots, \frac{\partial y}{\partial x_n} \right] \\ \text{向量对标量} & : \frac{\partial \mathbf{y}}{\partial x} = \left[ \frac{\partial y_1}{\partial x}, \frac{\partial y_2}{\partial x}, \ldots, \frac{\partial y_n}{\partial x} \right]^T \\ \text{向量对向量} & : \frac{\partial \mathbf{y}}{\partial \mathbf{x}} = \begin{bmatrix} \frac{\partial y_1}{\partial x_1} & \frac{\partial y_1}{\partial x_2} & \ldots & \frac{\partial y_1}{\partial x_n} \\ \frac{\partial y_2}{\partial x_1} & \frac{\partial y_2}{\partial x_2} & \ldots & \frac{\partial y_2}{\partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_m}{\partial x_1} & \frac{\partial y_m}{\partial x_2} & \ldots & \frac{\partial y_m}{\partial x_n} \end{bmatrix} \end{aligned} } $$

向量计算梯度时有一个非常重要的性质: $\frac{\partial L}{\partial \mathbf{x}}$ 结果与原向量维度相同

当 雅可比矩阵 稀疏时,不要显示计算,直接根据链式法则隐式推导即可

矩阵

$$ y_{n,m} = \sum_{d} x_{n,d}w_{d,m} $$

Q1: y 的哪些部分会受到 x 的一个元素的影响? A: $x_{n,d}$ 会影响 y 的整个行 $y_n$

$$ \frac{\partial L}{\partial x_{n,d}} = \sum_{m} \frac{\partial L}{\partial y_{n,m}} \cdot \frac{\partial y_{n,m}}{\partial x_{n,d}} = \sum_{m} \frac{\partial L}{\partial y_{n,m}} \cdot w_{d,m} $$

Q2: $x_{n,d}$ 会对 $y_{n,m}$ 产生多大影响? A: 影响大小为 $w_{d,m}$

$$\begin{aligned} Y = & XW \\ \frac{\partial L}{\partial W} = & \frac{\partial L}{\partial Y} \cdot \frac{\partial Y}{\partial W} = X^T \cdot \frac{\partial L}{\partial Y} \\ \frac{\partial L}{\partial X} = & \frac{\partial L}{\partial Y} \cdot \frac{\partial Y}{\partial X} = \frac{\partial L}{\partial Y} \cdot W^T \end{aligned}$$

04卷积神经网络

卷积层

基本概念

线性分类器学习的是每个类别的模版(将 $W_k$ reshape 成图像)

全连接神经网络学习的是整张图像的模版库(每个隐藏层神经元都是一个模版)

而卷积神经网络学习的是图像的局部模版库

第一层滤波器则侧重提取边缘颜色纹理等特征,层级越往后学习的概念抽象级越高

针对大图像需要很多卷积层才能提取到整张图像信息:

  • 下采样
  • 增大步长
  • 池化层

池化层不含参数,引入了空间不变性

计算方法

卷积运算输出

假设输入特征图尺寸为 $H \times W \times C$ ,滤波器尺寸为 $F_H \times F_W \times C$ ,输出特征图尺寸为 $H' \times W' \times K$ ,步幅为 $S$ ,填充为 $P$ ,则有

$$\begin{aligned} H' = & \frac{H - F_H + 2P}{S} + 1 \\ W' = & \frac{W - F_W + 2P}{S} + 1 \end{aligned}$$

参数量

K个滤波器,每个滤波器有 $F_H \times F_W \times C$ 个权重,再加上 K 个偏置

$$\text{参数量} = F_H \times F_W \times C \times K + K \quad (\text{偏置})$$

感受野:最重要的概念 ❗️ 感受野指的是输出特征图上的一个位置在输入特征图上对应的区域大小

  • 单层卷积层的感受野:$F_H \times F_W$
  • 多层卷积层的感受野:假设第 $i$ 层卷积层的滤波器尺寸为 $F_i \times F_i$ ,步幅为 $S_i$ ,则第 $k$ 层卷积层的感受野为
$$\begin{aligned} L_k &= L_{k-1} + (F_k - 1) \times \prod_{i=1}^{k-1} S_i \\ &= 1 + \sum_{i=1}^{k} (F_i - 1) \times \prod_{j=1}^{i-1} S_j \end{aligned}$$

批归一化层

Batch Normalization(BN)

提出 BN 是为了解决问题:

  • 输入不是以 0 为中心,存在较大的偏置
  • 输入的每个元素具有不同的缩放比例

具有上述两种特征的输入会使得深度网络难以训练

BN 的核心思想是对每个 mini-batch 的数据进行归一化处理,使得每个特征的均值为 0,方差为 1,并且为了避免过度归一化引入了可学习的缩放和平移参数

$$\begin{aligned} \mu_B = & \frac{1}{m} \sum_{i=1}^{m} x_i \\ \sigma_B^2 = & \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu_B)^2 \\ \hat{x}_i = & \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} \\ y_i = & \gamma \hat{x}_i + \beta \end{aligned}$$

训练与测试:训练时使用 mini-batch 的均值和方差进行归一化,测试时使用整个训练集的均值和方差进行归一化,对于缩放与平移参数 $\gamma$ 和 $\beta$ 则始终使用训练时学习到的值

意义:使深度神经网络更容易训练

  • 改善梯度流
  • 允许更高的学习率,更快的收敛
  • 网络对于初始化更佳稳健
  • 在训练过程中起到正则化作用

考试回忆

纯粹的背书课,背多少拿多少分,后面全是小分值的简答题,还需要默写 LSTM 和 Transformer 的架构图,两小时只够勉强写完所有题目,难度虽然不大但架不住题量大,就看小脑袋瓜能塞进去多少结论了 😤

一些需要重点记忆的知识点(不完全统计):

  • 各种激活函数以及优缺点
  • 各种优化器的更新公式以及优缺点
  • 正则化项的公式及作用
  • 向量、矩阵求导的几种形式
  • 计算图的绘制方法及反向传播计算方法
  • 卷积神经网络中输出尺寸和感受野的计算方法
  • 一些经典卷积网络(AlexNet、VGG、ResNet、GoogleNet Inception)的创新点
    • 需要掌握每层的显存、参数量和计算复杂度是如何计算的
  • Batch Normalization 的计算公式以及训练和测试时的区别
  • RNN、LSTM、Transformer 的架构图,RNN 和 LSTM 的梯度计算式
  • 语义分割、目标检测、实例分割对应的经典网络结构和创新点