pytorch3

pytorch3


批量归一化和残差网络

利用小批量上的均值和标准差,不断调整神经网络中间输出,从而使整个神经网络在各层的中间输出的数值更稳定。

对全连接层做批量归一化

位置:全连接层中的仿射变换和激活函数之间。
全连接:

批量归一化:

这⾥ϵ > 0是个很小的常数,保证分母大于0

引入可学习参数:拉伸参数γ和偏移参数β。若$\boldsymbol{\gamma} = \sqrt{\boldsymbol{\sigma}_\mathcal{B}^2 + \epsilon}$和$\boldsymbol{\beta} = \boldsymbol{\mu}_\mathcal{B}$,批量归一化无效。

对卷积层做批量归⼀化

位置:卷积计算之后、应⽤激活函数之前。
如果卷积计算输出多个通道,我们需要对这些通道的输出分别做批量归一化,且每个通道都拥有独立的拉伸和偏移参数。
计算:对单通道,batchsize=m,卷积计算输出=pxq
对该通道中m×p×q个元素同时做批量归一化,使用相同的均值和方差。

预测时的批量归⼀化

训练:以batch为单位,对每个batch计算均值和方差。
预测:用移动平均估算整个训练数据集的样本均值和方差。

残差网络

深度学习的问题:深度CNN网络达到一定深度后再一味地增加层数并不能带来进一步地分类性能提高,反而会招致网络收敛变得更慢,准确率也变得更差。

残差块(Residual Block)

恒等映射:
左边:f(x)=x
右边:f(x)-x=0 (易于捕捉恒等映射的细微波动)

Image Name

在残差块中,输⼊可通过跨层的数据线路更快 地向前传播。

凸优化

优化与估计

尽管优化方法可以最小化深度学习中的损失函数值,但本质上优化方法达到的目标与深度学习的目标并不相同。

  • 优化方法目标:训练集损失函数值
  • 深度学习目标:测试集损失函数值(泛化性)

优化在深度学习中的挑战

局部最小值

鞍点

梯度消失

凸性

在凸性下,优化变得容易被解决。

Jensen 不等式

即函数值的期望大于期望的函数值

$f^{‘’}(x) \ge 0 \Longleftrightarrow f(x)$ 是凸函数

必要性 ($\Leftarrow$):

对于凸函数:

故:

充分性 ($\Rightarrow$):

令 $a < x < b$ 为 $f(x)$ 上的三个点,由拉格朗日中值定理:

根据单调性,有 $f^{\prime}(\beta) \geq f^{\prime}(\alpha)$, 故:

梯度下降

牛顿法

在 $x + \epsilon$ 处泰勒展开:

最小值点处满足: $\nabla f(\mathbf{x})=0$, 即我们希望 $\nabla f(\mathbf{x} + \epsilon)=0$, 对上式关于 $\epsilon$ 求导,忽略高阶无穷小,有:

动态学习率

补充:矩阵微积分

在数学中,矩阵微积分是进行多变量微积分的一种特殊符号,特别是在矩阵的空间上。 它将关于许多变量的单个函数的各种偏导数和/或关于单个变量的多变量函数的偏导数收集到可以被视为单个实体的向量和矩阵中。 这大大简化例如找到多元函数的最大值或最小值,以及求解微分方程组的操作。 这里使用的符号通常用于统计和工程中,而张量指数符号在物理学中是比较常用的。

矩阵微积分是指一组不同的符号,这组符号使用矩阵和向量来收集因变量的每个分量相对于自变量的每个分量的导数。总的来说,自变量可以是标量,向量,或者是一个矩阵,因变量也可以是上述的三者之一。每一种不同的自变量和因变量的组合都有不同的一套运算规则。

前面两种情况中的每一种都可以被认为是使用适当大小的向量对向量求导数的应用。类似地,我们将发现涉及矩阵的导数将以相应的方式减少到涉及向量的导数。
对函数向量(一个向量其组成是函数)$\mathbf{y}=\left[\begin{aligned}\begin{matrix}y_1\\y_2\\\vdots\\y_m\end{matrix}\end{aligned}\right]$,对一个输入向量$\mathbf{x}=\left[\begin{aligned}\begin{matrix}x_1\\x_2\\\vdots\\x_m\end{matrix}\end{aligned}\right]$求导(使用分子布局),可以写成:

这里展示的是基础,关于更多内容,可以参考这篇博客矩阵求导术

优化算法进阶

Section 11.4 中,我们提到,目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向。因此,梯度下降也叫作最陡下降(steepest descent)。在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度更新自变量。然而,如果自变量的迭代方向仅仅取决于自变量当前位置,这可能会带来一些问题。对于noisy gradient,我们需要谨慎的选取学习率和batch size, 来控制梯度方差和收敛的结果。

ill-condition

Condition Number of Hessian Matrix:

where $\lambda_{max}, \lambda_{min}$ is the maximum amd minimum eignvalue of Hessian matrix.

让我们考虑一个输入和输出分别为二维向量$\boldsymbol{x} = [x_1, x_2]^\top$和标量的目标函数:

对于ill-condition , 其主要问题在于在不同的维度上,所期望得到的合适的lr是不同的,因此,考虑将其放缩到相近的大小上:

在二阶优化中,我们使用Hessian matrix的逆矩阵(或者pseudo inverse)来左乘梯度向量 $i.e. \Delta_{x} = H^{-1}\mathbf{g}$,这样的做法称为precondition,相当于将 $H$ 映射为一个单位矩阵,拥有分布均匀的Spectrum,也即我们去优化的等价标函数的Hessian matrix为良好的identity matrix。

  • Preconditioning gradient vector: applied in Adam, RMSProp, AdaGrad, Adelta, KFC, Natural gradient and other secord-order optimization algorithms.
  • Averaging history gradient: like momentum, which allows larger learning rates to accelerate convergence; applied in Adam, RMSProp, SGD momentum.

Momentum Algorithm

动量法的提出是为了解决梯度下降的上述问题。设时间步 $t$ 的自变量为 $\boldsymbol{x}_t$,学习率为 $\eta_t$。
在时间步 $t=0$,动量法创建速度变量 $\boldsymbol{m}_0$,并将其元素初始化成 0。在时间步 $t>0$,动量法对每次迭代的步骤做如下修改:

Another version:

其中,动量超参数 $\beta$满足 $0 \leq \beta < 1$。当 $\beta=0$ 时,动量法等价于小批量随机梯度下降。

在解释动量法的数学原理前,让我们先从实验中观察梯度下降在使用动量法后的迭代轨迹。

对于动量算法,其主要考虑了当前梯度下降方向前的历史记录对于其的影响,使得其能够在某些情况下避免到ill-condition问题。

可以通过移动加权平均的方式来考察理解动量法。

AdaGrad

其实质上是利用考虑Hessian matrix的方式来使得之前的问题得到处理

Algorithm

AdaGrad算法会使用一个小批量随机梯度$\boldsymbol{g}_t$按元素平方的累加变量$\boldsymbol{s}_t$。在时间步0,AdaGrad将$\boldsymbol{s}_0$中每个元素初始化为0。在时间步$t$,首先将小批量随机梯度$\boldsymbol{g}_t$按元素平方后累加到变量$\boldsymbol{s}_t$:

其中$\odot$是按元素相乘。接着,我们将目标函数自变量中每个元素的学习率通过按元素运算重新调整一下:

其中$\eta$是学习率,$\epsilon$是为了维持数值稳定性而添加的常数,如$10^{-6}$。这里开方、除法和乘法的运算都是按元素运算的。这些按元素运算使得目标函数自变量中每个元素都分别拥有自己的学习率。

其问题在于下降的后期可能会导致梯度消失

word2vec

Word2Vec 词嵌入工具的提出正是为了解决上面这个问题,它将每个词表示成一个定长的向量,并通过在语料库上的预训练使得这些向量能较好地表达不同词之间的相似和类比关系,以引入一定的语义信息。基于两种概率模型的假设,我们可以定义两种 Word2Vec 模型:

  1. Skip-Gram 跳字模型:假设背景词由中心词生成,即建模 $P(w_o\mid w_c)$,其中 $w_c$ 为中心词,$w_o$ 为任一背景词;

Image Name

  1. CBOW (continuous bag-of-words) 连续词袋模型:假设中心词由背景词生成,即建模 $P(w_c\mid \mathcal{W}_o)$,其中 $\mathcal{W}_o$ 为背景词的集合。

Image Name

二次采样

对于某些高频词,其实际上的意义是不大的,因此需要考虑丢弃这些高频词。采用如下的方式进行二次采样:

其中 $f(w_i)$ 是数据集中词 $w_i$ 的个数与总词数之比,常数 $t$ 是一个超参数(实验中设为 $10^{−4}$)。可见,只有当 $f(w_i)>t$ 时,我们才有可能在二次采样中丢弃词 $w_i$,并且越高频的词被丢弃的概率越大。

Skip-Gram 跳字模型

在跳字模型中,每个词被表示成两个 $d$ 维向量,用来计算条件概率。假设这个词在词典中索引为 $i$ ,当它为中心词时向量表示为 $\boldsymbol{v}_i\in\mathbb{R}^d$,而为背景词时向量表示为 $\boldsymbol{u}_i\in\mathbb{R}^d$ 。设中心词 $w_c$ 在词典中索引为 $c$,背景词 $w_o$ 在词典中索引为 $o$,我们假设给定中心词生成背景词的条件概率满足下式:

由于词量较大,因此需要考虑采用负采样的方式来解决此问题:

负采样方法用以下公式来近似条件概率 $P(w_o\mid w_c)=\frac{\exp(\boldsymbol{u}_o^\top \boldsymbol{v}_c)}{\sum_{i\in\mathcal{V}}\exp(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}$:

其中 $P(D=1\mid w_c,w_o)=\sigma(\boldsymbol{u}_o^\top\boldsymbol{v}_c)$,$\sigma(\cdot)$ 为 sigmoid 函数。对于一对中心词和背景词,我们从词典中随机采样 $K$ 个噪声词(实验中设 $K=5$)。根据 Word2Vec 论文的建议,噪声词采样概率 $P(w)$ 设为 $w$ 词频与总词频之比的 $0.75$ 次方。

目标检测

目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边缘从而更准确地预测目标的真实边界框(ground-truth bounding box)。不同的模型使用的区域采样方法可能不同。这里我们介绍其中的一种方法:它以每个像素为中心生成多个大小和宽高比(aspect ratio)不同的边界框。这些边界框被称为锚框(anchor box)。我们将在后面基于锚框实践目标检测。

假设输入图像高为 $h$,宽为$w$。我们分别以图像的每个像素为中心生成不同形状的锚框。设大小为$s\in (0,1]$且宽高比为$r > 0$,那么锚框的宽和高将分别为$ws\sqrt{r}$和$hs/\sqrt{r}$。当中心位置给定时,已知宽和高的锚框是确定的。

下面我们分别设定好一组大小$s_1,\ldots,s_n$和一组宽高比$r_1,\ldots,r_m$。如果以每个像素为中心时使用所有的大小与宽高比的组合,输入图像将一共得到$whnm$个锚框。虽然这些锚框可能覆盖了所有的真实边界框,但计算复杂度容易过高。因此,我们通常只对包含$s_1$或$r_1$的大小与宽高比的组合感兴趣,即

也就是说,以相同像素为中心的锚框的数量为$n+m-1$。对于整个输入图像,我们将一共生成$wh(n+m-1)$个锚框。

交并比

我们刚刚提到某个锚框较好地覆盖了图像中的狗。如果该目标的真实边界框已知,这里的“较好”该如何量化呢?一种直观的方法是衡量锚框和真实边界框之间的相似度。我们知道,Jaccard系数(Jaccard index)可以衡量两个集合的相似度。给定集合$\mathcal{A}$和$\mathcal{B}$,它们的Jaccard系数即二者交集大小除以二者并集大小:

实际上,我们可以把边界框内的像素区域看成是像素的集合。如此一来,我们可以用两个边界框的像素集合的Jaccard系数衡量这两个边界框的相似度。当衡量两个边界框的相似度时,我们通常将Jaccard系数称为交并比(Intersection over Union,IoU),即两个边界框相交面积与相并面积之比,如图9.2所示。交并比的取值范围在0和1之间:0表示两个边界框无重合像素,1表示两个边界框相等。

Image Name

在模型预测阶段,我们先为图像生成多个锚框,并为这些锚框一一预测类别和偏移量。随后,我们根据锚框及其预测偏移量得到预测边界框。当锚框数量较多时,同一个目标上可能会输出较多相似的预测边界框。为了使结果更加简洁,我们可以移除相似的预测边界框。常用的方法叫作非极大值抑制(non-maximum suppression,NMS)。