你或许可以轻松的使用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
(未完待续……)
网友评论