深度学习之GoogLeNet-v2解读

来源:互联网 发布:淘宝主图多少尺寸 编辑:程序博客网 时间:2024/06/06 01:40

  • 为什么提出
    • 提出的背景
  • 基本思想及其过程
    • Batch Normalization的优点
    • 减少内部协变量的偏移问题
    • 通过Mini-Batch统计量归一化
      • 利用批处理网络进行训练和推理
      • 批处理卷积网络
      • BN允许高学习率
      • BN能正则化模型
    • inception v2


为什么提出?

—由于网络结构中每层的参数都会变化,训练每层的输入使得深度神经网络的训练变得非常复杂,在要求低学习率以及比较好的参数初始化情况下,要训练出具有饱和非线性结构的神经网络是非常困难的。

提出的背景

  • 为了提升GoogLeNetv1训练速度,提出对模型结构的部分做归一化处理,也就是对每个训练的mini-batch做归一化,叫做Batch Normalization。

基本思想及其过程

GoogLeNet主要就是提出了Batch Normalization,提升了训练的速度,使得网络的训练可以用更快的学习率以及不再那么担心参数的初始化对网络训练的影响。不但如此,在某些时候,还表现出一种不需要dropout就能实现的一种正则化处理。
相比于V1来说,训练的次数少了14倍,并且在ImageNet分类任务中,在top-5达到了4.9%测试误差(4.8%测试误差),甚至超过了人类的识别准确率。
我们都知道在神经网络最后我们需要利用SGD(随机梯度下降法)当然还有他的变体如momentum,Adagrad来求得使得损失函数最小化的参数θ,如
                θ = argmin1NNi=1l(xi,θ)

N表示训练样本总数,xi表示训练数据集。
但是在每一步中,考虑用mini-batch,即不需要每次都把所有样本放进去求梯度,而是每次只放固定数量的样本m进去,如下计算
                1ml(xi,θ)θ
那就有人问了,为什么不只用一个呢?首先,在一个mini-batch中求得的损失函数的梯度是对整个训练集梯度的一个估计,估计的准确度随着mini-batch的尺寸而增高。第二,由于现在计算平台提供的并行性,使得计算一个批次比单独计算m个单独样例要更加有效。
其次,由于网络结构中每层参数都会变化,每层输入分布的变化也带来了一个问题,那就是每层都需要连续不断的适应新的分布。
考虑一个网络中计算
                l=F2(F1(u,θ1),θ2)
其中F1F2代表任意变换,参数θ1θ2是为了最小化损失函数l的参数,如果输入x=F1(u,θ1),那么
                l=F2(x,θ2)
那么,梯度下降即为
                θ2=θ2αmmi=1F2(xi,θ2)θ2
由于对于一个独立网络F2来说,批的大小m和学习率都是不变的,因此输入分布的性质使得训练更加有效,如果输入分布x总是保持不变的话,θ2就不必为了x的变化而重新调整这么麻烦影响训练效率。
对于一个子网络来说输入分布的固定对于子网络之外的层有着积极的作用,考虑一个激活层z=g(Wu+b),u代表输入层,W是权值矩阵,b是偏置矩阵,,并且g(x)是一个sigmoid激活函数g(x)=11+exp(x),当x增加时,g(x)趋向于0。
由于x受权值W和偏置b以及之前所有层的参数的影响,改变之前层的参数的话,x的许多维也将处于一个非线性的饱和状态,并且收敛非常的慢,这种情形在网络深度加深时更加明显。实际中,饱和问题和导致梯度减小通常利用ReLu、初始化以及小的学习率来解决。

Batch Normalization的优点

为了解决内部协变量偏移情况导致的影响训练速度的问题,提出了Batch Normalization来加快训练,它一步就可以减少内部协变量的偏移,也就是通过归一化来将输入的均值和方差固定,Batch Normalization也能通过减小梯度对参数和初始值的依赖,从而使得减少梯消失,梯度爆炸的问题,从而使得我们能够用更快的学习率(原来使用太快的学习率就是怕不能收敛,梯度消失\爆炸)。不仅如此,Batch Normalization还对网络进行了正则化处理,减小了对dropout的需要,还能使用饱和非线性防止网络陷入饱和状态。

减少内部协变量的偏移问题

内部协变量的偏移就是指由于训练时网络参数的改变使得网络激活的分布变化,为了提升训练速度,就要减少内部协变量的偏移,也就是想到通过固定输入x的统计量(均值和方差),众所周知,如果输入白化\归一化,那么网络训练的收敛速度更快。所以在每一层的输入都进行白化处理,从而消除内部协变量带来的偏移问题。
但是如果白化/归一化处理时还穿插着梯度下降等优化步骤时,可能会因为由于梯度下降更新参数时必然影响归一化(减均值,除方差)也需要更新,这样就会影响梯度下降的效率。
为了解决这个问题,网络总是针对特定的分布来产生激活。也就是将x看作一个数组,X看作是所有这些训练数据集上的输入的集合,对输入的归一化就可以对X而不是单独的x,但这样做代价比较大,因为要计算矩阵的协方差以及它对平方根的逆,还有这些变换的反向传播中的求导变换,Conv[x]=ExX[xxT]E[x]E[xT]
Cov[x]12(xE[x])

通过Mini-Batch统计量归一化

由于上面介绍的原因,所以不得不采取其他的方式来归一化。第一种方式,对每个标量特征进行独立的归一化,让其拥有0均值和1方差,也就是对训练数据中的每一维都进行归一化,
               xˇ(k)=x(k)E[x(k)]Var[x(k)]
这里的均值和方差的都是在训练集上得到的。这种归一化的方式在特征都不相关的时候,加速了收敛。
而对于每一层的激活x(k),利用缩放和平移得到归一化值
y(k)=γ(k)xˇ(k)+β(k)
上面的两个参数都随着原始网络参数学习,并且存储了网络的表达能力。然后关键地方在于可以设置γ(k)=Var[x(k)]β(k)=E[x(k)],最理想的情况下,归一化后这样可以恢复原始的激活。因为这种方式还是需要对全部训练集处理,如果用随机优化的方式,这样做太慢了,有种标准梯度下降不如随机梯度下降方式的区别,所以自然而然想到第二种方式就是,Mini-Batch!
假设有一个batchβ={x1...m}
且参考上面的线性变换有BNγ,β:x1...my1...m
下面即为Batch Normalizing Transform。其中ϵ是常数。
这里写图片描述
得到的参数需要经过经过反向传播也就是利用链式规则传递。
这里写图片描述
由于BN变换是可微变换可以将归一化值送到网络中,就保证了模型训练的时候,层之间可以继续学习输入的分布从而有更小的协变量偏移,因而更加聚焦于训练。

利用批处理网络进行训练和推理

使用无偏方差估计即Var[x]=mm1Eβ[δ2β]
由于均值和方差在推理中都是固定的,归一化就变成了应用在激活上的简单的线性变化。下面即是一个训练批处理网络的过程。
这里写图片描述

批处理卷积网络

BN变换用于非线性激活函数之前,对x=Wu+b进行归一化处理,归一化能产生更加稳定分布的激活。由于进行BN变换时,b被归入了参数β中,因此其实可以忽略b的影响,变成了
               z=g(BN(Wu)),其中g()为非线性激活函数。

BN允许高学习率

在传统的深度网络中,太高的学习率可能会导致梯度消失或者爆炸,那是因为高学习率可能增加层参数的规模,就放大了梯度导致模型爆炸,还可能陷入局部最小值。但是通过利用BN可以防止参数的一些小的改变随着网络传输而变大,因为反向传播通过每一层的时候都不会影响到参数的规模,如
               BN(Wu)=BN((aW)u)
更有
这里写图片描述
由于更大的权重会导致更小的梯度,因此BN可以使得参数的增长更稳定。

BN能正则化模型

当利用BN训练时,由于一个样本和其他在batch中的样本都有联系,因此训练网络不在对给定的一个样本产生相应确定的值,实验表明,这有利于网络的泛化能力。并且一般dropout都是用来防止过拟合的,但是利用了BN之后,dropout的需求就没有那么大了,可以移除。

inception v2

由于加入了BN,原始v1的网络结构也有了比较大的变化。
(1)增加学习率。
(2)移除Dropout。加速训练的同时不会增加过拟合。
(3)减少L2权值正则化的影响。也就是L2范数前面的因子减少到原来的5分之1。
(4)降低了学习速率衰减的倍数。
(5)移除LRN局部响应归一化层。
(6)更彻底地打乱训练样本。防止相同的那些样本总是一起出现在mini-batch中。
(7)减少光度扭曲。由于训练速度变快,观察每张训练样本的时间很少了,为了让训练器更加聚焦于真实样本,只能扭曲他们更少。

网络结构图如下:
这里写图片描述

原创粉丝点击