我们来回顾一下deep learning的步骤,定义一个函数的集合,然后找损失函数,然后在函数集和里挑选一个最佳的函数,这个最佳的函数就是Neural network,然后再看训练集上的表现如何?如果不好就重新进行红框框住的部分,如果训练集表现好,那么就看测试集上表现怎么样,如果测试集上表现不好,就说明过拟合了!!如果测试集表现好,则说明这个function是ok的。 不要总是把loss大归因于过拟合,如下图:当我们看到测试集上56层的NN居然比20层的NN表现差,不能直接说是过拟合,还要再看看训练集上的表现,训练集表现差自然测试集也差 对于训练集差或测试集差,我们有不同的方法去解决!!
如果训练集上表现很差,我们不妨换一个激活函数。 下图是sigmoid函数,在达到第七层时性能急剧下降!!
sigmoid性能为什么会急剧下降??这是因为“消失的梯度”!! 回想一下反向传播算法更新梯度!!如下图: Sigmoid的derivative是[0,0.25]的,通过上式,我们看出,通过Backpropagation求梯度时,每往回传播一层,就要多乘以一项δ‘(z),也就是说,随着向回传递的深入,梯度会呈指数级的衰减,直至缩减到0,导致前层的权重无法更新,也就是层数越多,导致C对w1的偏导无限趋于0,然后就无法更新梯度!! 经过上述说明,看下图,越接近输出层的梯度就越大,学习速率就越快。
如下图,我们发现当输入有大的变动时,经过层层递减,最终输出只有很小的改变。
为了解决梯度消失问题,我们可以使用relu这个激活函数。 结合上图和下图,我们可以将激活函数为零的神经元给抹去。就变成了一个很瘦的线性网络,且a=z,就不会出现衰减了。
下面还有Relu的两个变种,原来的relu在z小于0的时候微分是0,就没办法upgrade我的参数,所以才有了下面两种变形。其中第二种Relu的z小于0时,α可以通过梯度下降去学习。
Maxout是可以自己学习的激活函数。如下图,我们把sigmoid函数换掉了,不再将z传入sigmoid了,而是将若干个z分组,下图是每两个分一组,我们选出每个组里最大的作为下一个神经元的输入。 ReLU是Maxout的一种特例。如下图所示,z1=wx+b,而z2直接为0,那么将z1和z2的图画出来,然后取最大的部分,这就得到了relu
我们还能得到更多种类的ReLU,如下图:z1和z2,然后我们取Max的部分,参数w,w’,b,b’都是可以自动学习的。 Maxout可能有很多段线性函数,有多少段取决于每组有多少元素,如下图: 给定训练数据,我们可以知道哪一个z是最大的。 由于是取Max,所以可以删掉某些连线,这就变成了一个很瘦的线性网络。 那么有一个问题,我只训练Max相连的网络,会不会有些参数没有被训练到?当然不会,因为对于不同的样本,Max是不同的,所以有不同的瘦的线性网络。
之前我们讲过Adagrad这种梯度下降法,这里不再赘述。 越陡峭的方向上的学习率越大,反之越小。且某一个方向上要么一直平坦,要么一直陡峭。
下面有一种复杂的情况,就算是同一个维度,比如说同一个方向方向如w1,是先平坦后陡峭,这时用adagrad就不太够了,我们需要一种更动态的方法更改学习率,这里介绍了RMSProp 如下图是具体做法,我们可以将α的值调小一点,说明我更倾向于当前的梯度。 在一个参数很多的神经网络中,其实出现局部最低点的概率是很小的。
在物理中,我们从高处放下一个球,他到了一个局部最低点,然后利用惯性逃离局部最低点,那么将这种特性用到梯度下降里面就是Momentum 我们先来回顾一下原始的梯度下降。 Momentum的做法还是先指定一个初始点θo,然后定义一个movement vo=0,然后计算下一步的movement v1,然后θ1就是θo+偏移量v1,movement是上一个时间点的movement减去当前η*梯度。红色虚线是梯度下降方向,绿色虚线是movement方向,两者相加是一个新的方向。 来看一下直观的解释,当到了局部最低点时,偏导数为0,但momentum不为0,他还会往右边走一段,有一定概率跳出这个坑。
将RMSProp结合Momentum就是Adam,这里先不具体讲。
如下图,我们就训练至validation set的loss最小时停下来即可。
L1,L2正则化,寻找一些w,不仅要使最开始的损失函数最小,还要是接近于0.
下面我们来画图直观感受一下L2和L1,同心圆是原本得损失函数,那么圆心那个蓝点就是梯度最小得地方,但是这种只关心原来损失函数梯度的做法可能会导致过拟合的问题,数据在训练集上确实损失最少,但是在测试集上只要数据稍加变动,差别就很大,对数据太敏感了,于是我们还要考虑找到合适的w值,使函数平滑,不要那么敏感。我们可以看到下图左面是L2正则化,正则项与原来损失函数的交点就是最佳的,因为这一点的w最小,w如果太大了,那么只要数据变一点,就会放大这个差异,只有使w尽可能的小才行;右边的是L1正则化,我们发现只有四个顶点与原来的loss相交的概率最大,且都是在坐标轴上相交,它可以在一定程度上解决过拟合问题,同时也可以使矩阵稀疏化,因为他能使有些w变为0.
在训练集中,每一个神经元都有p%的概率被干掉 某些神经元被干掉后就会变成下图所示细长的network,每一次训练所用的神经网络结构都不一样。在训练集上的表现可能会很差,因为有些神经元不在了。 在训练集上怎么做?在训练集上不做dropout,然后如果在训练集上的dropout为p%,那么在测试集上所有的w都要乘1-p% 直觉上就是在训练时绑上重物,然后在测试时拿下重物,战力就提升了。 直观的解释,在训练时,分为同一组的两个神经元如果有一个神经元知道另一个神经元随时会挂掉,那么这个神经元一定会全力以赴的工作,因为partner靠不住,所以得到的结果可能还行。当在测试时,没有人会中途退出,所以得到的结果是更好的。 假设每个神经元的挂掉率是50%,如下图,训练集上挂了一半的神经元,如果测试集上每一个权重不乘1-50%,那么z‘就约等于2z,所以我们必须要乘上1-p%,这才能使z’约等于z。
由于dropout是随机的,可能每一个训练样本都会产生不同的神经网络 在测试集上相当于传入数据,将该数据放在不同的神经网络结构中得出一个结果,然后把总和求平均。
举一个具体例子,训练集上有四种情况,将这四种情况加起来求平均正好是在测试集上每个权重乘以1-p%再乘对应xi之和