本文仅用于学习记录,以下内容均为学习过程中,翻译记录所得,由于从word复制过来,公式出错,所以请结合原论文公式看。
相比较于传统的sigmoid激活函数的网络,修正网络更容易去训练。但是一个不好的初始化可能在高度非线性的系统中阻碍学习。在本节,我们提出了一个强壮的初始化方法,为训练非常深的rectifier networks扫清障碍。
最近的深度卷积网络大多通过随机符合高斯分布的权重来初始化参数。在VGG小组的报道和我们自己的实验中观察到非常深的模型()8层卷积层)难以收敛由于固定了标准差(0.01)。为了解决这个问题,VGG小组预训练了8层的卷积网络来初始化更深的模型。但是这种策略需要大量的训练时间,并且有可能导致较差局部最优。也有通过在中间层添加辅助分类器来帮助收敛。
Glorot and Bengio 提出采用按适当比例缩小的均匀分作来初始化。这被称为“Xavier”初始化。他的推导是基于假设激活是线性的,这种假设对于ReLU和PReLU无效。
接下来,我们从理论上推导出一种更适合ReLU和PReLU的初始化,在我们的试验中,我们的初始化方法可以使非常深的网络收敛(30层卷积或者全连接层),而‘Xavier’不行。
前向传播的例子
我们的推导式基于‘Xavier’的推导,中心思想是去研究每一层对策的方差。
对于一个卷积层,一种对策是:
yl=Wlxl+bl
这里的x 是一个k2c * 1的向量,就是对应的k*k*c的卷积核变成1维的向量,c为通道数,k是这层空间滤波器的大小。设n=k2c ,其中W 是一个d*n 的矩阵,d 是滤波器的个数,W 每一列是一个滤波器的权值,b 是向量的偏置,然后y 是输出层的像素向量。我们用l 来表示一层。我们得到xl=f(yl-1) ,其中f 是激活函数,我们还有cl=dl-1 。
我们让Wl 中的初始化元素独立同分布。像‘Xavier’中一样,我们也假设xl 中的元素也是独立同分布的。且xl 和Wl 相对独立。我们可以得到:
Varyl=nlVar[wlxl]
其中yl , xl , wl 分别是随机变量的元素。我们让wl 是零均值,可以得到:
Varyl=nlVarwlE[xl2]
其中E[xl2] 是xl2 的期望,我们不难得出E[xl2]≠Var[xl] 除非xl 为零均值。对于ReLU激活:xl=max(0,yl-1) ,并且不是零均值,这里我们得到了论文[7]中不一样的结论。
如果我们让wl-1 在0周围对称分布,并且bl-1=0 ,则yl-1 有零均值,并且在0周围对称分布。这就会导致Exl2=12Var[yl-1] ,当激活函数为ReLU的时候,将这个带入上式:
Varyl=12nlVarwlVaryl-1
将L层放在一起,我们得到:
VaryL=Var[y1]l=2L12nlVarwl
这个公式是初始化设计的关键,一个合适的初始化方式应该避免以指数形式减小或放大输入信号的大小,所以我们希望上面的式子可以有一个合适的标量(比如1),充分条件是:
12nlVarwl=1 ∀l
这会形成一个零均值的高斯分布,标准偏差为2n ,这是我们初始化的方式,我们初始化
b=0
对于第一层来说(l=1 ),我们应该让n1Varw1=1 ,因为输入信号没有应用ReLU激活函数,但是1/2仅仅存在于1层,那么他就不重要了,所以方便起见,我们也在第一层使用上面的式子。
反向传播的例子:
对于反向传播来说,一个卷积层的梯度计算可以用公式:
∆xl=Wl∆yl
其中的∆x 和∆y 分别是梯度(∂ε∂x和∂ε∂y )的简单表示,∆y 表示k*k 像素,有d 个通道,被重新塑造成一个k2d*1 的向量,我们设n=k2d ,并且n≠n=k2c 那么W 就是一个c*n 的矩阵,是滤波器在反向传播中的重新排列。可以得到W和W 可以通过转换得到彼此。∆x 是一个c*1 的向量,表示该一个像素在该层的梯度。综上,我们假设wl 和∆yl 相互独立,∆xl 对于所有l 都是零均值,wl 初始化为在0两边均匀分布。
在反向传播中,我们依然存在∆yl=f'(yl)∆xl+1 ,其中f' 是f 的导数,对于ReLU来说f'(yl) 等于0或1,并且两者概率相等,我们假设f'(yl) 和∆xl+1 是相互独立的,因此我们可以得到:E∆yl=E∆xl+12=0 ,并且有E∆yl2=Var∆yl=12Var[∆xl+1] ,然后,我们计算
∆xl=Wl∆yl
梯度的方差:
Var∆xl=nlVarwlVar∆yl=12nlVarwlVar[∆xl+1]
我们可以发现1/2 在
Varyl=12nlVarwlVaryl-1
Var∆xl=nlVarwlVar∆yl=12nlVarwlVar[∆xl+1]
两个式子中都存在,虽然推导方式不同,对于L层的输入,我们有:
Var∆x2=Var[xL+1]l=2L12nlVarwl
我们考虑一个充分条件,使得梯度不是呈指数增长的:
12nlVarwl=1 ∀l
这个式子和
12nlVarwl=1 ∀l
唯一的不同在于nl=kl2dl 当nl=kl2cl=kl2dl-1 .
式子
12nlVarwl=1 ∀l
的结果是一个均值为0,标准差为2n 的高斯分布。
对于第一层(l=1 ),我们需要去计算∆xl ,因为他表示的是图像域,但是我们在第一层还是采用上面的式子,和前向传播的原因相同(一层的系数 不会使得全部的乘积呈指数增长趋势)。
对于上述的两个充分条件,我们只能单独使用,因为,如果我们使用了
12nlVarwl=1 ∀l
那么
l=2L12nlVarwl=1
但是,由于nl=kl2dl 当nl=kl2cl=kl2dl-1
l=2L12nlVarwl=l=2Lnlnl=l=2Lcldl=c2dL
这个乘积在一般的网络中不是递减的,也就是说如果我们可以找到一个对于反向传播好的初始化的比例,这也是前向的信号的情况,反之亦然,本文中所有的模型,两种形式都可以使得他们收敛。
讨论:
如果前向/后向信号在每一层是一个不合适的比例缩放β 的话,在L层之后的反向信号将被缩放βL 倍,L 可以代表一些层,也可以代表所有层。当L 很大时,如果β>1 ,将被极度放大,最后会输出无穷,如果β<1 的话,将会被极度缩小,也就是说,这个算法将不再收敛,前者是发散的,后者是停滞的。
我们的推导也解释了为什么固定标准偏差为0.01会导致很深的网络凝滞。我们用VGG小组的model B 作为一个例子。模型由10层卷积层组成,且均使用3*3的滤波器,第一层和第二层滤波器数量(dl )为64.第三层和第四层是128,第五层和第六层是256,剩下的都为512。由12nlVarwl=1 ∀l ,我们可以知道标准差为2n ,带入数据算出0.059,0.042,0.029和0.021当滤波器的数量分别为64,128,256,512的时候,如果标准差固定为0.01,那么标准差从第 10层传递到第2层的梯度将会等于1(5.9*4.22*2.92*2.14)=11.7*104 。着个数据可以解释为什么梯度下降在试验中被观察。
同样值得注意的是,输入信号的方差将被保留,从第一层到最后一层。所以如果输入不是归一化的,是range of [-128,128],那么最后的到数据会非常大,导致softmax操作溢出。
那么就有一个问题就是去归一化输入数据,但是这会影响其他的超参数。另一个问题就是在一些或者所有层中的权值上加一个小系数,像L1/128 在L层上。在训练的时候,前两个全连接层我们会使用标准差为0.01的高斯分布,之后的所有层都用标准差为0.001的高斯分布。这些数据比实际的要小,并且这样可以解决[-128,128]随机图像的归一化问题。
对于PReLU情况的初始化,我们容易得到12nlVarwl=1 ∀l 变为 12(1+a2)nlVarwl=1 ∀l 其中a 就是初始化的系数,当a=0 时,就是ReLU的情况,当a=1 时就是线性的情况,同理另一个式子也是这样。
实施细节:
训练:
对于一个缩放后的图片,短边为s,从上面随机选取一个224*224的裁剪,然后每一个像素值减去均值。缩放的s从[256,512]中随机选择。一半的样本是水平转换得到的,随机改变颜色也被运用了。
缩放规模的抖动不是只运用于微调阶段,我们把他运用在了训练的起始阶段。进一步的,我们不是使用浅层模型去初始化深层模型,我们直接训练非常深的模型,使用我们在2.2中提到的初始化方法,使用的是反向传播的公式。我们端对端的训练可能能帮助提高精度,因为他能避免较差的局部最优。
其他可能重要的超参数:权重衰退参数为0.0005,动量为0.9,Dropout(50%),应用在前两个FC层,mini-batch的大小固定为128。学习率为0.01,0.001,0.0001,在错误达到稳定时切换,80次epochs一个模型。