一、Deep Learning
有关发展历史不再一一赘述,看深度学习的发展过程,我理解的深度学习即为输入、输出、中间网络构成。其中中间网络通过多层的叠加实现不断地特征学习,学习出想要达到的目的的网络,这整个过程即可理解为深度学习。
二、Why Deep
在为什么深度学习需要多层网络的解释上,李宏毅老师首先将其比作一个模块化的过程。
首先看上面第一幅图,图中可以看出长发男这一样本集很少,但经过模块化之后可以获得较好的学习效果。这个过程可以从第二幅图中进行解释。首先我们训练过程中不去直接找出长发男这一类别,而是分别看长发与短发、男与女,这样长发男原本小数据量的情况在经过粗略分类之后他融入了一个较大的数据集,即可获得较好的训练效果。而深度学习多层神经网络就可以这样理解,分为多层是为了层层提取特征,第一层提取的是最大类的特征,比如男女,而下一层再去分析他是长发还是短发。这样的过程很明显会比一层直接计算长发男这一选项获得的效果要好。下面给出手写数字识别的实例,随着隐藏层的增加,学习的结果对于数字的分类越来越明确。
三、Tips for Deep Learning
首先需要明确,深度学习分为训练时使用的数据集和用于测试训练结果好坏的测试用的数据集。如果训练出的结果对训练时的数据集效果不好,说明模型欠拟合;而如果对训练集很好,对测试集很差,说明模型过拟合,针对不同情况,分出不同的解决策略。
(一)欠拟合
对于欠拟合,李宏毅老师给出了两点建议:
1、New Activation Function
这里老师提出了之前一直在用的sigmoid函数的问题。由于sigmoid函数导数均小于0.25,在反向传播过程时梯度相乘最终会趋近于零,也就是最后会出现梯度消失,不再更新。同时由于它是指数计算,很消耗计算资源。
基于上述问题,这里引入了ReLU算法。ReLU不仅解决了梯度消失的问题,同时由于他是线性的,计算速度很快,有效解决了sigmoid的种种问题。
2、Adaptive Learning Rate
这里之前有提过,不再详述,老师提到了Adagrad、RMSProp、Momentum以及RMSProp+Momentum形成的Adam。这些方法都使学习率随着不断学习而改变,使得训练过程更加合理。
(二)过拟合
对于过拟合,老师给出三点建议:
1、Early Stopping
这里即为之前提到的,对于训练集训练的次数存在最优次数。随着对训练集训练的迭代次数增加,虽然模型对训练集的拟合效果会越来越好,但是会出现过拟合的现象。因此要合理控制迭代次数,找到最优次数后即可停止训练。
2、Regularization
正则化在之前也讲过,相当于给一个飞行灵活的蚊子加一重物,使其不那么灵敏,即减弱样本特征对模型的影响效果。下一篇有关Regularization的实验将进一步详述。
3、Dropout
有关Dropout可以理解为在训练过程中随机舍弃一部分神经元,这样丢失一部分学习信息也会使得学习过程得结果不过分拟合训练集,并且能获得更好的训练效果。其中需要注意的是,舍弃神经元的操作只在训练时使用,在测试时不舍弃;并且如果训练时舍弃率为p%,那么在进行测试时需要将计算时的权重乘以(1-p%)。
四、Backpropagation
在深度学习发展的一开始,梯度下降方法思想为前向传播,每次计算一个权重的改变情况,然后多次计算,实现一次完整的梯度下降。但是由于深度学习参数量巨大,这种计算方式十分耗时。于是有人提出了反向传播,以实现高效的梯度下降。反向传播即从out端向前反方向计算结果针对各参数的梯度。
为什么反向传播可以提高计算效率?
首先假使使用前向传播,每个参数的梯度下降都需要计算一次前向传播,假如有m个参数,那么就需要m次前向传播计算。但如果使用反向传播,只需要一次前向和一次后向,时间相当于两次前向传播计算的时间。可以看出极大缩短了计算时间。这里用一个极简的神经网络进行模拟。
从这个图中可以看出,经过一次前向计算和反向计算之后获得了结果对b1的导数,但在这个公式中其实包含了b2、b3、b4有关代价函数的所有的梯度。也就是说反向传播只需要前向计算一次C,然后反向计算一次,就能获得所有参数关于代价函数的偏导数。极大缩短了计算时间,实现了高效的梯度下降过程。