在这节课之前,李宏毅老师还介绍了一些其他与DL相关的知识,包括Backpropagation(反向传播),和Keras的使用方法,不过这部分比较简单,所以我不单独再做笔记。
DL与ML的一个重要区别
在ML中,很少会出现对于training data 拟合程度不够的情况,也就是训练完function后,一般来说它在训练集上的表现都十分良好,甚至可以达到完美的正确率,我们担心的往往是function在testing中的表现很差。
但是在DL中,情况完全不一样。由于DL结构的复杂性,很多时候经过了大量的训练后,得到的NN甚至是在训练集上都没有好的表现的。
所以我们在完成DL的训练后,不应该急着去用testing data去测试它,而是应该用training data 去测试一下这个function是不是一个好的function,如果是的话再去测试testing data。也就是按照下图的流程去执行。
只有在确认训练集上有好的结果的时,测试集结果很差,这才是过拟合。
下面这张图也说明了这一点:在测试集结果很差的时候,不要急着去说这就是overfitting了,这也可能是在训练集上就不好。而过拟合是在训练集上过度拟合导致测试集很差的一种现象。
Tips for Deep Learning(training)
下面是关于deep learning 的过程中,training部分的一些 tips。
问题:梯度消失
有这样一个现象:层次越深的神经网络对训练集的拟合就越差。梯度消失现象常常是一个原因。
梯度消失问题在使用激活函数为sigmoid 函数时经常会出现。
我们可以通过下图来理解为什么出现了梯度消失问题。L对当前Wi的微分可以通过比较ΔW和ΔL来得到。分析sigmoid函数,我们可以发现,在靠近input层的参数Wi,它变化了ΔW,得到的变化的结果经过sigmoid函数后会被缩小,而这个缩小后的输出会作为输入继续向后传递,等传递到最后一层也就是L处的时候,这个ΔW造成的ΔL实际上是非常小的,所以越是靠前的W它的微分越小。
同理,靠后层的Wi他的微分会相比前面而言大得多。
这就造成了这样一个结果:前面的参数微分很小,收敛很慢:后面的参数微分大,收敛很快。所以训练完毕后,可能后面的参数已经收敛了,但是前面的参数还是停留在初始设置的random值。
New activation function
可以使用一些新的激活函数来代替sigmoid函数,让其不再具有梯度消失的性质。
ReLU
ReLU的优点如下,首先是更好计算,然后是能够解决梯度消失问题。
根据ReLU的性质,在X在自己一定的范围内波动时,一些ReLU可以看做是直线,一些ReLU可以看做是0。
那么简化后的NN图如下所示,首先是对于输出为0的节点,这些神经元可以直接去掉,因为它们对之后的神经元不会有影响(对之后的神经元输出为0)。而且由于剩下的神经元它们的激活函数是直线,所以不会出现类似于sigmoid函数那样梯度消失的问题。
ReLU还有一些变式,如下所示。
Maxout
首先,ReLU是一种特殊的Maxout。
Maxout与一般的神经元不同,他的机制很特殊,一般的神经元经过一组计算得到一个数据然后经过激活函数得到一个输出,但是Maxout需要多组计算的数据来产生输出,可以是两个也可以是多个。
下图左是ReLU,下图右是一个Maxout。可以看到,如果把右边的Maxout的关于Z2的两个权值取为0,实际上就是一个ReLU函数。
也就是说,如果我们在设计函数的model时,将激活函数设为Maxout,并且设计其参数是可以变动的,那么在学习的过程中,这个参数也可以自动的学习到根号的值。
所以Maxout的一个最大的特点就是可以自主学习!他的函数是可以设置成多段,再学习的,几个输入的数据就决定了这个Maxout最终会有几段。
Adaptive Learning Rate
RMSProp
我们在前面的课程中学习过 Adagrad。他会在每次update的时候用到之前所有出现过的微分值。
下面给出一种新的改变learning rate的方式:RMSProp。
Momentum
Momentum 是“动力、冲量”的意思。
这个算法基于一个很巧妙的思想,首先看一下下图,这个在ML中就出现过多次的梯度下降算法。这个算法有几个比较麻烦的地方在于,下降的过程中如何不停在鞍点,如何能够越过local minima 到达 global minima。
而在有惯性的物理世界中,这样的小球就可以越过这个local minima到达之后的global minima。
于是就可以想象出这样一种算法,每次 update 参数的时候,不仅仅是考虑gradient 的方向,还要考虑之前的位移,用之前的位移来代表惯性。
如下图,每次真实的update方向是由位移和gradient合成的。
具体到公式,那就是第t+1次的update,是由第 t 次的位移和第 t 次的参数的gradient决定的。也就是下图右侧部分所描述的。
本次笔记的内容就到这里,下一篇将会讲述在testing过程中的一些关于DL的tips。