为什么使用 ReLu 函数?
前面我们介绍的 BP 算法中,是这样更新权重值的:
δ
h
=
o
h
(
1
−
o
h
)
∑
k
∈
后续
(
h
)
δ
k
w
k
h
\delta_h = o_h(1 - o_h)\sum_{k\in 后续(h)}\delta_kw_{kh}
δh=oh(1−oh)k∈后续(h)∑δkwkh
Δ
w
j
i
=
η
δ
j
x
j
i
\Delta w_{ji} = \eta \delta_jx_{ji}
Δwji=ηδjxji
w
j
i
=
w
j
i
+
Δ
w
j
i
w_{ji} = w_{ji} + \Delta w_{ji}
wji=wji+Δwji
BP 算法中主要是根据后一层的 δ \delta δ 值计算前一层的 δ \delta δ 值,一层一层反向传播。由 δ \delta δ 的计算公式可以看到,每次都要乘一个 o h ( 1 − o h ) o_h(1-o_h) oh(1−oh) ,其中 o h o_h oh 是神经元 h 的输出。当采用 sigmoid 激活函数时, 取值在 0、1 之间,无论 o h o_h oh 接近 1 还是接近 0, o h ( 1 − o h ) o_h(1-o_h) oh(1−oh) 的值都比较小,即便是最大值也只有 0.25(当 o h = 0.5 o_h = 0.5 oh=0.5 时)。如果神经网络的层数比较多的话,反复乘以一个比较小的数,会造成靠近输入层的 o h o_h oh 趋近于 0,从而无法对权重进行更新,失去了训练的能力。这一现象称作梯度消失。而 o h ( 1 − o h ) o_h(1-o_h) oh(1−oh) 刚好是 sigmoid 函数的导数,所以用 sigmoid 激活函数的话,很容易造成梯度消失。而如果换成 ReLU 激活函数的话,由于 ReLU(net)=max(0, net),当 net>0 时,ReLU 的导数等于 1, o h ( 1 − o h ) o_h(1-o_h) oh(1−oh)这一项就可以用 1 代替了,从而减少了梯度消失现象的发生。当然,梯度消失并不完全是激活函数造成的,为了建造更多层的神经网络,研究者也提出了其他的一些减少梯度消失现象发生的方法。
引入 1×1 卷积有两个作用。第一,1×1 卷积核由于还有个厚度,相当于在每个通道上的相同位置各选取一个点进行计算,每个点代表了某种模式特征,不同通道代表不同特征,所以其结果就相当于对同一位置的不同特征进行了一次特征组合。第二,就是用 1×1 卷积对输入输出的通道数做变换,减少通道数或者增多通道数,如果输出的通道数少于输入的通道数,就相当于进行降维,反之则是升维。比如输入是 100 个通道,如果用了 60 个 1×1 的卷积核,则输出具有 60 个通道,通道数减少了 40%,就实现了降维操作。在 inception 中增加的 3 个 1×1 卷积,都是为了降维的,所以这种模块被称为带降维的 inception 模块。
假设 inception 的输入有 192 个通道,使用 32 个 5×5 的卷积核,那么共有多少个参数呢?
如果在 5×5 卷积前增加一层具有 32 个卷积核的 1×1 的卷积的话,则总参数又是多少个呢?
在没有降维前参数共有 153632 个,降维后的参数量只有 31808 个,只占降维前参数量的 20%左右,可见降维的作用明显。
这里在最大池化后面加入 1×1 卷积层是为了降维了,因为输入的通道数可能比较多,用 1×1 卷积把通道数降下来。
BP 算法是通过反向传播方法一层一层由输出层向输入层将梯度反传到神经网络的每一层的,在神经网络层数比较多的情况下,梯度值可能会逐步衰减趋近于 0,从而造成距离输入层比较近的神经元的权重无法修正,达不到训练的目的。这种现象称为梯度消失问题。
为了消除梯度消失问题带来的影响,提出了一些解决方法。
当激活函数采用 sigmoid 函数时这种现象尤为严重,因为在 BP 算法中每次传播都要乘一个激活函数的导数,而 sigmoid 函数的导数值一般比较小,更容易造成梯度消失问题。用 ReLU 激活函数代替 sigmoid 函数是一种消除梯度消失问题的有效手段,因为 ReLU 函数当输入大于 0 时,其导数值为 1,不会由于在反传过程中乘以激活函数的导数而导致梯度消失。这也是这些年来 ReLU 激活函数被广泛使用的原因之一。
在 GoogLeNet 中,为了解决梯度消失问题,除了使用 ReLU 激活函数外,还在神经网络的不同位置设置了 3 个输出,损失函数将三部分综合在一起,减少了梯度消失问题带来的不良影响。GoogLeNet 由多个 inception 模块串联组成,每个 inception 模块中采用了不同大小的卷积核,将不同粒度的特征综合在一起。同时采用 1×1 卷积核做信息压缩,有效减少了训练参数,加快了训练速度。
原则上来说,神经网络越深其性能应该越好,但是一些实验表明,当网络加深到一定程度之后,即便是在训练集上也会出现随着网络加深而性能下降的现象,这一现象称为网络退化。这是个比较复杂的问题,并不是单纯的梯度消失造成的,还有待于从理论上进行分析和解释。
为解决网络退化问题,提出了残差网络 ResNet。残差网络由多个残差模块串联而成,每个残差模块含有两个卷积层,并通过一个恒等映射和卷积层的输出按位相加在一起。从消除梯度消失的角度来说,残差网络由于恒等映射的存在,可以将梯度传递到任意一个残差模块;从消除网络退化的角度来说,残差网络由于恒等映射的存在,每增加一个残差模块都会把前面的神经网络输出直接“引用”过来,而残差模块中的 F(X)部分相当于起到一个“补充”的作用,弥补前面神经网络不足的部分,二者加起来作为输出,这样既很好地保留了前面神经网络的信息,又通过新增加的残差模块提供了新的补充信息,有利于提高神经网络的性能。