神经网络训练的一些建议

你或许可以轻松的使用tensorflow等深度学习框架构建一个你想要的深度学习模型,但是在训练的过程中总是会出现一些这样那样的问题,那么下面就让我介绍一些常出现的问题和解决的方案,毕竟算法工程师也叫调参师嘛

先放上地表最强宝可梦大师的一张关于深度学习模型训练的图

《神经网络训练的一些建议》

神经网络的训练其实就是这么几步,那么下面我们就要说一下它容易出些什么样的问题,需要怎么去解决。

有的时候你有没有发现网络越深效果反而越差呢?

梯度爆炸和消失

其实这里第一个问题就是深层网络带来的梯度爆炸和梯度消失,层数越多问题就越加得明显,关于梯度爆炸和梯度消失的问题可以参考我的相关博文https://www.jianshu.com/p/9f919535e270

误差在反向传播的过程,一旦是梯度消失就会出现如下图所示的情况

《神经网络训练的一些建议》

梯度爆炸情况类似,离输出层的更新还靠谱些,离输出层越远情况就越糟糕。

梯度的问题大多来源于不合适的激活函数和过大的权值初始化,像sigmoid这种激活函数梯度最大的时候才0.25,乘几下就没有了,那能怎么办。

选择合适的激活函数

ReLU函数

《神经网络训练的一些建议》

《神经网络训练的一些建议》

Maxout函数

《神经网络训练的一些建议》

其实可以看的出来maxout是可以拟合出relu函数的,这边是两个元素的max,你可以设定任意你想要的一些个数

《神经网络训练的一些建议》

还有的问题就是你的优化算法不够好,像梯度下降这种简单的优化算法其实是很难得到好的结果的

这边讲三个关于学习率和梯度的优化算法,更多的优化算法请参考https://www.jianshu.com/p/61741ef524b3

首先是动量梯度下降法,也就是Momentu

《神经网络训练的一些建议》

它保留了前面梯度对下一梯度的影响,准确的说指数平均法,平均了t时刻前的所有梯度,下面是从吴恩达课程copy下来的图片

《神经网络训练的一些建议》

RMSprop

《神经网络训练的一些建议》

这边也是采用的指数平均,和Momentu有点异曲同工。很明显它限制住了学习率。

Adm

综合上面两种方法

《神经网络训练的一些建议》

这边出现了校正,其实吴恩达的课程中提过,因为指数平均初始值为0,后期也会有点飘,需要必要的校正。

还有问题那就是过拟合啦

首先是

《神经网络训练的一些建议》

思想很简单,我们提前终止训练,当测试集精度足够好的时候

正则化

《神经网络训练的一些建议》
《神经网络训练的一些建议》
《神经网络训练的一些建议》

dropout

《神经网络训练的一些建议》

几个注意点:
随机选取一些神经元扔掉,但是扔掉的需要备份,因为每一批次训练需要扔掉的可能都不一样,但是扔的时候必须保证所有的神经元都还是有的
训练好的权重需要*权重,1-p

(未完待续……)

    原文作者:NLP小学生
    原文地址: https://www.jianshu.com/p/a79dbe1f1add
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞