1.前言
目前的神经网络普遍采用反向传播(BP算法)方法来计算梯度并更新w和b参数(其实就是导数的链式法则,就是有很多乘法会连接在一起),由于深层网络中层数很多,如果每层都使用类似sigmoid这样的函数,它们的导数都小于1,这样在反向传播中可能会导致最初几层的w和b参数更新的幅度非常小或者几乎不更新,也就是我们所说的梯度消失现象。
目前的神经网络改用relu作为激活函数就是为了减轻梯度消失的现象,因为relu函数求导后导数为1。
更好的办法就是高速路神经网络(Highway Networks)。它主要解决网络深度加深、梯度信息回流受阻,造成网络训练困难的问题
从ImageNet竞赛的几个前几名的模型来看,神经网络的深度对模型效果确实有很大的作用。可是传统的神经网络随着深度的增加,训练越来越困难,这篇paper基于门机制提出了Highway Network,使用简单的SGD就可以训练很深的网络,而且optimization更简单,甚至收敛更快!
传统的神经网络
一个典型的神经网络是一个仿射变换加一个非线性函数。
y
=
H
(
x
,
W
H
)
y = H(\mathbf x,W_H)
y=H(x,WH)
x 表示输入,
W
H
W_H
WH 表示权重.
2.highway network
小博标记版论文下载地址
所谓Highway网络,无非就是输入某一层网络的数据一部分经过非线性变换,另一部分直接从该网络跨过去不做任何转换,就想走在高速公路上一样,而多少的数据需要非线性变换,多少的数据可以直接跨过去,是由一个权值矩阵和输入数据共同决定的。
受lstm门机制的启发,Highway network基于门机制引入了transform gate T 和carry gate C ,输出output是由tranform input和carry input组成:
y
=
H
(
x
,
W
H
)
⋅
T
(
x
,
W
T
)
+
x
⋅
C
(
x
,
W
C
)
y = H(\mathbf x,W_H) \cdot T(\mathbf x,W_T)+\mathbf x \cdot C(\mathbf x,W_C)
y=H(x,WH)⋅T(x,WT)+x⋅C(x,WC)
其中
x
\mathbf x
x是原来的输入(在resnet中叫identity mapping),
H
(
x
,
W
H
)
H(\mathbf x,W_H)
H(x,WH)是前言中说的仿射函数;T算出来的是一个向量
(
a
1
,
a
2
,
…
…
a
n
)
(a_1,a_2,……a_n)
(a1,a2,……an),其中每个数字都是(0,1)之间的浮点数,代表y中由x变化后的内容所占的比例;
x
,
y
,
H
(
x
,
W
H
)
,
T
(
x
,
W
T
)
x,y,H(x,W_H),T(x,W_T)
x,y,H(x,WH),T(x,WT)必须是同样的维度。
为了简单,设置 C = 1 - T . 公式变为:
y = H ( x , W H ) ⋅ T ( x , W T ) + x ⋅ ( 1 − T ( x , W T ) ) y = H(\mathbf x,W_H) \cdot T(\mathbf x,W_T)+\mathbf x \cdot (1-T(\mathbf x,W_T)) y=H(x,WH)⋅T(x,WT)+x⋅(1−T(x,WT))
特别的,
y
=
{
x
,
i
f
T
(
x
,
W
T
)
=
0
H
(
x
,
W
H
)
,
i
f
T
(
x
,
W
T
)
=
1
y = \left\{\begin{matrix} \mathbf x ,& if T(\mathbf x,W_T)=0\\ H(\mathbf x,W_H), & if T(\mathbf x,W_T)=1 \end{matrix}\right.
y={x,H(x,WH),ifT(x,WT)=0ifT(x,WT)=1
那么该层的雅可比变为:
d
y
d
x
=
{
I
,
i
f
T
(
x
,
W
T
)
=
0
H
′
(
x
,
W
H
)
,
i
f
T
(
x
,
W
T
)
=
1
\frac {dy}{dx} = \left\{\begin{matrix} I ,& if T(\mathbf x,W_T)=0\\ H'(\mathbf x,W_H), & if T(\mathbf x,W_T)=1 \end{matrix}\right.
dxdy={I,H′(x,WH),ifT(x,WT)=0ifT(x,WT)=1
可以看到Highway Network其实就是对输入一部分进行处理(和传统神经网络相同),一部分直接通过.
类比于传统的神经网络plain layer计算第 i 个神经元输出,
y
i
=
H
i
(
x
)
y_i = H_i(\mathbf x)
yi=Hi(x). 我们引入block的概念, 那么计算
i
i
i 个block的输出需要计算a block state
H
i
(
x
)
H_i(\mathbf x)
Hi(x)和transform gate output
T
i
(
x
)
T_i(\mathbf x)
Ti(x) . 所以block output就是:
y
=
H
i
(
x
)
⋅
T
i
(
x
)
+
x
i
⋅
(
1
−
T
i
(
x
)
)
y = H_i(\mathbf x) \cdot T_i(\mathbf x)+\mathbf x_i \cdot (1-T_i(\mathbf x))
y=Hi(x)⋅Ti(x)+xi⋅(1−Ti(x))
另外我们设置transform gate计算方法为:
T
(
x
)
=
σ
(
W
T
T
x
+
b
T
)
T(\mathbf x) = \sigma {(W_T^T \mathbf x + b_T)}
T(x)=σ(WTTx+bT)
其中 W T W_T WT是权重矩阵, b T b_T bT是bias vector.初始化时可以给 b T b_T bT初始化一个负值,相当于网络在开始的时候侧重于搬运行为(carry behavior),就是什么处理都不做。
b T b_T bT 一般设置为负值(例如-1,-3),使得网络初始的时候更偏向carry behavior. 还有一个比较有意思的是 σ ( x ) ∈ ( 0 , 1 ) \sigma(x) \in (0, 1) σ(x)∈(0,1) , 公式(4)永远都不会是True, 这就使得highway network的behavior介于transform和carry之间.
在实验中还发现将 b T b_T bT 设置成负值,即是网络层数很深, 用各种各样的方法初始化用不同的激活函数都可以让网络高效的学习.
3.实验结果
作者分别训练相同深度的plain network 和 highway network,实验发现10层的神经网络plain layer效果好于highway network, 但是随着深度的增加plainnetwork越来越难optimize, 但是highway network到了100层都可以很好的optimize,效果比plain layer刚好,收敛也更快.
更多详情参考experiment 结果
4.对比resnet
今天讲的这两种网络结构都是最新被业界针对图像处理问题提出的最新的结构,主要解决就是超深层的网络在训练优化中遇到的问题。
之前看过残差网络的小伙伴可能会有印象,resnet原理特别像,关于更多resnet相关知识可以参考我之前的一篇文章:残差网络(Deep Residual Learning for Image Recognition)
其实深度残差网络和Highway网络这两种网络结构都能够让一部分的数据可以跳过某些变换层,而直接到后面的层中去,只不过Highway网络需要一个权值来控制每次直接通过的数据量,而深度残差网络就直接让一部分数据通到了后面。从大量的实验中,我感觉这两种网络只有在很深的场景中才能发挥出“威力”,如果本身网络层数较浅,勉强使用这两种结构是很难得到好的结果的。