神经网络调试方法
性能不佳的检查步骤
神经网络所遇问题可大致分为两类——训练误差过高、测试误差过高。第一个需检查的问题并非测试误差过高,而是网络未训练好(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:
其中的 \(\alpha\) 是给定的,亦可考虑利用算法学习出 \(\alpha\),那便有了 Parameteric ReLU。
3. Maxout
Maxout 的核心思想是自动学习激活函数。很显然,ReLU 函数其实是 Maxout 函数的一种特例。

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

正则化
正则化可以使用 L1、L2 正则化等等。
L2 正则化
若用 L2 正则化,则 cost function 与其梯度为:
进而可得梯度下降公式为:
也即每次迭代前先对权重进行衰减,衰减系数为 \(1 - \alpha \lambda\) ,进而继续更新。
L1 正则化
同理得,L1 正则化亦是在真正更新前先对权重进行衰减,但其并非以百分比的方式衰减,而是在每次更新前先对权重加减一个固定的数:
对比
| 范数 | 性质 | 更新速度 |
|---|---|---|
| \(L_1\) | 权重分量尽量稀疏 | 权重很大时更新快 |
| \(L_2\) | 权重分量尽量均衡 | 权重很大时更新慢 |
Dropout
具体做法:训练时,在每次更新参数之前以概率 p 随机选择部分神经元进行更新,其余的则置之不理。测试时,每个神经元都要先乘以 1 - p 之后再进行传输。
直觉理解:
- 训练时,给网络提出更高的要求。则测试时,放松要求网络也能表现良好。
- Dropout 是一种终极 ensemble 方法。ensemble 的意思是:我们有很大的训练集,每次训练都只从其中抽取部分。这样即可获得很多过拟合(bias 很低但 variance 很高)的模型,将这些模型平均一下就很准了。

浙公网安备 33010602011771号