深度学习d6:批量归一化和残差网络;凸优化;梯度下降

批量归一化(Batch-norm)

对深层神经网络来说,即使输入数据已做标准化,训练中模型参数的更新依然很容易造成靠近输出层输出的剧烈变化

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

  • 批量归一化层

  1. 对全连接层
    将批量归一化层置于全连接层中的仿射变换和激活函数之间。全连接层的输入为 u \boldsymbol{u} u,则输出为
    ϕ ( BN ( x ) ) , \phi(\text{BN}(\boldsymbol{x})), ϕ(BN(x)),其中 x = W u + b \boldsymbol{x} = \boldsymbol{W\boldsymbol{u} + \boldsymbol{b}} x=Wu+b对一个批量中的 x ( i ) \boldsymbol{x}^{(i)} x(i)标准化: x ^ ( i ) ← x ( i ) − μ B σ B 2 + ϵ , \hat{\boldsymbol{x}}^{(i)} \leftarrow \frac{\boldsymbol{x}^{(i)} - \boldsymbol{\mu}_\mathcal{B}}{\sqrt{\boldsymbol{\sigma}_\mathcal{B}^2 + \epsilon}}, x^(i)σB2+ϵ x(i)μB,
    其中ub为这个批量的均值,sigma为方差。

    标准化后,引入两个可学习的参数,拉伸(scale)参数 γ \boldsymbol{\gamma} γ 和偏移(shift)参数 β \boldsymbol{\beta} β
    y ( i ) ← γ ⊙ x ^ ( i ) + β . {\boldsymbol{y}}^{(i)} \leftarrow \boldsymbol{\gamma} \odot \hat{\boldsymbol{x}}^{(i)} + \boldsymbol{\beta}. y(i)γx^(i)+β.

    至此,我们得到了 x ( i ) \boldsymbol{x}^{(i)} x(i)的批量归一化的输出

  2. 对卷积层批量归一化
    对卷积层来说,批量归一化发生在卷积计算之后、应用激活函数之前。如果卷积计算输出多个通道,我们需要对这些通道的输出分别做批量归一化,且每个通道都拥有独立的拉伸和偏移参数,并均为标量。

    设小批量中有 m m m个样本。在单个通道上,假设卷积计算输出的高和宽分别为 p p p q q q。我们需要对该通道中 m × p × q m \times p \times q m×p×q个元素同时做批量归一化。

    对这些元素做标准化计算时,我们使用相同的均值和方差,即该通道中 m × p × q m \times p \times q m×p×q个元素的均值和方差。

  3. 预测时的批量归一化
    训练时,批量大小设大一些,可以让样本的均值和方差更准确。

    预测时,希望对任意输入都有确定的输出,故不应取决于批量归一化时随机小批量中的均值和方差。可通过移动平均估算整个训练数据集的样本均值和方差,并在预测时使用它们得到确定的输出。

    故和丢弃层一样,批量归一化层在训练模式和预测模式下的计算结果也是不一样的

残差网络(Resnet)

在实践中,添加过多的层,训练误差不降反升。残差网络可解决该问题。

  • 残差块深度学习d6:批量归一化和残差网络;凸优化;梯度下降_第1张图片

    我们希望学出的理想映射为 (),但残差网络需要拟合出的是()−,残差映射在实际中往往更容易优化,输入可通过跨层的数据线路更快地向前传播

    ResNet沿用了VGG全 3×3 卷积层的设计。残差块里首先有2个有相同输出通道数的 3×3 卷积层。每个卷积层后接一个批量归一化层和ReLU激活函数。然后我们将输入跳过这两个卷积运算后直接加在最后的ReLU激活函数前。这样的设计要求两个卷积层的输出与输入形状一样,从而可以相加。如果想改变通道数,就需要引入一个额外的 1×1 卷积层来将输入变换成需要的形状后再做相加运算。残差块的实现如下。它可以设定输出通道数、是否使用额外的1×1卷积层来修改通道数以及卷积层的步幅。

  • ResNet模型

    ResNet的前两层跟之前介绍的GoogLeNet中的一样:在输出通道数为64、步幅为2的 7×7卷积层后接步幅为2的 3×3 的最大池化层。不同之处在于ResNet每个卷积层后增加的批量归一化层。ResNet在后面接了使用4个由残差块组成的模块,每个模块使用若干个同样输出通道数的残差块。

残差块通过跨层的数据通道从而能够训练出有效的深度神经网络。

稠密连接网络(DenseNet)

与ResNet的主要区别为:
深度学习d6:批量归一化和残差网络;凸优化;梯度下降_第2张图片
即在DenseNet里模块 的输出不是像ResNet那样和模块 的输出相加,而是在通道维上连结。故模块 直接跟模块 后面的所有层连接在了一起。这也是它被称为“稠密连接”的原因。

  • 稠密块(定义了输入和输出如何连结)

    使用了ResNet改良版的“批量归一化、激活和卷积”结构,稠密块由多个conv_block组成,每块使用相同的输出通道数。但在前向计算时,我们将每块的输入和输出在通道维上连结

    卷积块的通道数控制了输出通道数相对于输入通道数的增长,因此也被称为增长率

  • 过渡层(用来控制通道数不过大)

    每个稠密块都会带来通道数的增加,使用过多则会带来过于复杂的模型。过渡层用来控制模型复杂度。它通过 1×1卷积层来减小通道数(若设定的通道数为n,则输出通道数就为n),并使用步幅为2的平均池化层减半高和宽,从而进一步降低模型复杂度。

  • DenseNet模型

    DenseNet首先使用同ResNet一样的单卷积层和最大池化层。接下来使用4个稠密块。可以设置每个稠密块使用多少个卷积层。使用过渡层来减半高和宽,并减半通道数。

优化

在优化中,损失函数通常被称作优化问题的目标函数(objective function)。依据惯例,优化算法通常只考虑最小化目标函数
本书中讨论的优化算法都是这类基于数值(不是解析解)方法的算法。

  • 局部最小值

    目标函数可能有若干局部最优值。当一个优化问题的数值解在局部最优解附近时,由于目标函数有关解的梯度接近或变成零,最终迭代求得的数值解可能只令目标函数局部最小化而非全局最小化。

  • 鞍点 (一阶和二阶导都为0)

    假设一个函数的输入为 维向量,输出为标量,那么它的海森矩阵(Hessian matrix)有 个特征值。

    该函数在梯度为0的位置上可能是局部最小值、局部最大值或者鞍点

    当函数的海森矩阵在梯度为零的位置上的特征值全为正时,该函数得到局部最小值。
    当函数的海森矩阵在梯度为零的位置上的特征值全为负时,该函数得到局部最大值。
    当函数的海森矩阵在梯度为零的位置上的特征值有正有负时,该函数得到鞍点。

    由于深度学习模型参数通常都是高维的,目标函数的鞍点通常比局部最小值更常见

梯度下降

  • 一维梯度下降

    梯度下降(沿着梯度反向更新自变量)算法可能降低目标函数值。(通过泰勒展开等可推导)
    如果通过 x ← x − η f ′ ( x ) x \leftarrow x - \eta f'(x) xxηf(x)
    来迭代 x x x,函数 f ( x ) f(x) f(x)的值可能会降低。
    因此在梯度下降中,我们先选取一个初始值 x x x和常数 η > 0 \eta > 0 η>0,然后不断通过上式来迭代 x x x,直到达到停止条件。

  • 学习率

    梯度下降算法中的正数 通常叫作学习率,若 过小,则更新缓慢,需要很多的迭代周期。但若 过大,那么可能会导致泰勒展开不再成立,无法保证迭代x会降低函数值。

  • 多维梯度下降

    目标函数的输入为向量,输出为标量。

    u \boldsymbol{u} u在梯度方向 ∇ f ( x ) \nabla f(\boldsymbol{x}) f(x)相反方向时,方向导数 D u f ( x ) \text{D}_{\boldsymbol{u}} f(\boldsymbol{x}) Duf(x)被最小化。因此,我们可能通过梯度下降算法来不断降低目标函数 f f f的值:
    x ← x − η ∇ f ( x ) . \boldsymbol{x} \leftarrow \boldsymbol{x} - \eta \nabla f(\boldsymbol{x}). xxηf(x).
    同样,其中 η \eta η(取正数)称作学习率。

随机梯度下降 SGD

stochastic gradient descent 

如果使用梯度下降,每次自变量迭代的计算开销为O(n),n为训练样本数,而SGD则减少了每次迭代的复杂度。

在随机梯度下降的每次迭代中,我们随机均匀采样的一个样本索引 i ∈ { 1 , … , n } i\in\{1,\ldots,n\} i{1,,n},并计算梯度 ∇ f i ( x ) \nabla f_i(\boldsymbol{x}) fi(x)来迭代 x \boldsymbol{x} x

x ← x − η ∇ f i ( x ) . \boldsymbol{x} \leftarrow \boldsymbol{x} - \eta \nabla f_i(\boldsymbol{x}). xxηfi(x).

随机梯度 ∇()是对梯度 ∇()的无偏估计

小批量随机梯度下降

在每轮迭代中随机均匀采样多个样本来组成一个小批量,然后使用这个小批量来计算梯度

基于随机采样得到的梯度的方差在迭代过程中无法减小,因此在实际中,(小批量)随机梯度下降的学习率可以在迭代过程中自我衰减

小批量随机梯度下降中每次迭代的计算开销为 O(|B|)。当批量大小为1时,该算法即为随机梯度下降;当批量大小等于训练数据样本数时,该算法即为梯度下降。当批量较小时,每次迭代中使用的样本少,这会导致并行处理和内存使用效率变低。这使得在计算同样数目样本的情况下比使用更大批量时所花时间更多

你可能感兴趣的:(深度学习)