在深度学习过程中,我们会遇到很多问题,并不是所有的问题都是overfitting。
比如下面这个很经典的例子:
这个例子中,随着迭代次数的增加,50-layers的网络在训练集上本身就比20-layers的网络表现差。而在测试集上也表现差,这类问题我们不能只看测试集的结果就说是一个overfitting的例子。还要看训练集。因此,在深度学习的过程中我们会遇到很多问题,不同的问题有不同的解决办法。 当下主要有以下办法:
- New activation function(使用新的或者变化的激活函数)
- Adaptive Learning rate(适应性变化的学习率)
- Early stopping(早结束)
- Regularization(正则化)
- Dropout
part1 : New activation function
问题:梯度消失(Vanish Gradient )
首先我们对梯度消失的问题进行解释:通过训练我们发现刚network的左端刚开始的部分梯度比较小,对应的学习的比较慢,几乎还保持在刚开始赋予的随机值周围。但是在network的右端梯度比较大,学习的非常快,并且已经接近收敛。这种收敛可并不是什么好现象,因为后端的输入是前端的输出,在输出结果还近似于随机值时,后端开始收敛,那么并没有学习到什么有效的信息。
为什么会出现这种情况呢?我们假设一开始权重的差值 Δ \Delta Δw比较大,然后经过一层sigmoid函数, Δ \Delta Δw变小了,然后再经过一层sigmoid函数变得更小,一层一层直到输出层。在 Δ \Delta Δl不变的情况下, Δ \Delta Δw不断变小,使得梯度 ∂ l ∂ w \frac{\partial l}{\partial w} ∂w∂l不断变大。看来问题是出现在激活函数sigmoid上面了,我们需要改变它。
这时候,我们将sigmoid函数替换成Relu函数。为什么换成Relu呢,很简单它容易计算,可以看成无限个sigmoid叠加,更重要的是它可以避免梯度消失。
Relu是一种特殊的Maxout,Maxout人如其名就是让比较大的东西输出。Maxout最杰出的地方在于它可以使得激活函数变成可以学习的,也就是说随着训练,激活函数会不断变化。Maxout主要有两个步骤:一个是分组,这个是事先自己规定好的。第二是比大小,选出最大的,进入下一层。
如上图所示,我们将(5,7)分为一组,(-1,1)分为一组然后进行选出其中比较大的7和1进入下一组。我们前面有说道,Relu是特殊的Maxout,我们来进行一下解释。
我们将另外两个权重为0,也就是我们对于两个节点的值可以绘出两条直线: z 1 = w x + b z_{1}=wx+b z1=wx+b和