神经网络性能不佳的检查方法、更换激活函数(ReLU、Maxout)、正则化、早停、Dropout

性能不佳的检查步骤

神经网络所遇问题可大致分为两类——训练误差过高、测试误差过高。第一个需检查的问题并非测试误差过高,而是网络未训练好(not well trained)导致的训练误差过高。所以第一步要检查的是经验误差是否降到一定水平,其次才是检查是否是过拟合。

调用神经网络 神经网络调试_激活函数

训练误差过高

解决训练误差过高的问题有两个办法:采用不同的激活函数自适应学习率

不同激活函数

梯度消失问题:若神经网络层数很深,则往往输出层附近梯度更新会很快很大,但是在输入层附近的梯度基本维持不变。这就导致了当输入层附近网络还是 random 的时候,cost function 即近乎拟合。

激活函数

1. ReLU(Rectified Linear Unit)
ReLU 相对于 Sigmoid 来说运算更快、有生物学的支持,并且 ReLU 其实等同于无穷多个 Sigmoid function 叠加的结果,能有效解决梯度消失问题。
使用 ReLU 的过程中等同于给深度网络做了“瘦身”

使用 ReLU 是否等同于了线性模型?
Hornik 在 1989 年的一篇论文[Multilayer feedforward networks are universal approximators]中提出了:某网络即便只有一层隐含层,使用任意 squashing function 作为激活函数,在引入足够多的神经元的前提下,亦可拟合任意博雷尔可测函数(Borel measurable function)。
Definition of squashing functions:
A function \(f:R \rightarrow [0, 1]\) is a squashing function if it is non-decreasing, \(\lim_{\lambda \rightarrow \infty }f(\lambda ) = 1\) and \(\lim_{\lambda \rightarrow -\infty }f(\lambda ) = 0\)
单个 ReLU 并不符合上述定义,但若将两个 ReLU 神经元进行线性叠加,则有 \(f(\lambda ) = max \{ 0, \lambda \} - max \{ 0, \lambda - 1 \}\)

2. ReLU-variant: Leaky ReLU and Parametric ReLU
Leaky ReLU:

\[y = \left\{ \begin{matrix} x & x > 0\\ \alpha x & x \le 0 \\ \end{matrix}\right. \]

其中的 \(\alpha\) 是给定的,亦可考虑利用算法学习出 \(\alpha\),那便有了 Parameteric ReLU。

3. Maxout

Maxout 的核心思想是自动学习激活函数。很显然,ReLU 函数其实是 Maxout 函数的一种特例。

调用神经网络 神经网络调试_权重_02

测试误差过高

解决测试误差过高有三个方法:迭代早停、正则化、Dropout

迭代早停

调用神经网络 神经网络调试_正则化_03

正则化

正则化可以使用 L1、L2 正则化等等。

L2 正则化

若用 L2 正则化,则 cost function 与其梯度为:

\[\begin{matrix} J(\theta) &=& L(\theta ) + \lambda \cdot \frac{1}{2} \Vert \theta \Vert _2 ^2 \\ \frac{\partial J}{\partial \theta} &=& \frac{\partial L}{\partial \theta} + \lambda \cdot \theta \end{matrix} \]

进而可得梯度下降公式为:

\[\begin{matrix} \theta &:=& (1- \alpha \lambda ) \cdot \theta \\ \theta &:=& \theta - \alpha \cdot \frac{\partial L}{\partial \theta} \end{matrix} \]

也即每次迭代前先对权重进行衰减,衰减系数为 \(1 - \alpha \lambda\)

L1 正则化

同理得,L1 正则化亦是在真正更新前先对权重进行衰减,但其并非以百分比的方式衰减,而是在每次更新前先对权重加减一个固定的数:

\[\begin{matrix} \theta &:=& \theta - \alpha \lambda \cdot sign(\theta) \\ \theta &:=& \theta - \alpha \cdot \frac{\partial L}{\partial \theta} \end{matrix} \]

对比

范数

性质

更新速度

\(L_1\)

权重分量尽量稀疏

权重很大时更新快

\(L_2\)

权重分量尽量均衡

权重很大时更新慢

Dropout

具体做法:训练时,在每次更新参数之前以概率 p 随机选择部分神经元进行更新,其余的则置之不理。测试时,每个神经元都要先乘以 1 - p 之后再进行传输。
直觉理解:

  1. 训练时,给网络提出更高的要求。则测试时,放松要求网络也能表现良好。
  2. Dropout 是一种终极 ensemble 方法。ensemble 的意思是:我们有很大的训练集,每次训练都只从其中抽取部分。这样即可获得很多过拟合(bias 很低但 variance 很高)的模型,将这些模型平均一下就很准了。