李宏毅深度学习笔记(三)——调整模型的技巧

在训练神经网络的时候,如果没有得到好的结果,我们就需要使用一些特殊的技巧。下面分别讨论在两种不同的情况下,调整模型的方法。

1.训练集上得到的误差很大

如果模型在训练集上得到的误差就已经很大,说明可能是你没有选择合适的函数集或者是漏掉了最优解,针对这两种情况,可以选择两种改进方法。

(1)修改激活函数(activation function)

在之前两篇文章中使用的激活函数是sigmoid函数,但是sigmoid函数的问题在于它对于输入的变化是不敏感的,也就是说,输入产生的变化对输出的影响是很小的。

于是,每经过一次sigmoid函数,输入的变化就会衰减一次,在经过很多层Hidden Layer之后,输入对于输出的结果就几乎没有什么影响了。这会导致我们的训练误差偏大。

选用其他的激活函数可以解决这个问题。

ReLU:在z<0时,函数值为0;在z>0时,函数值等于输入。这样z<0的部分对于整个神经网络没有影响,z>0的部分,函数是线性的,\Delta a=\Delta z,解决了衰减的问题。

 

Maxout:把原本要作为激活函数的输入的值进行分组(分组的方式和数量人为指定),取每组的最大值作为输出。

这样的结构代表了激活函数的形式是可学习的。它能包含许多函数形式在内,包括ReLU。下图展示了Maxout如何实现与ReLU相同的效果。

 当然,Maxout也可以实现更多的函数形式。这些函数都是分段的,并且每一段都是线性的。

但是有一个问题,这样的激活函数是不能微分的,那么如何使用梯度下降的方法训练这样的神经网络呢?答案是如果每次只使用分段函数的一段就可以避免这个问题。我们注意到,在取max之后,只有一个神经元的输入发挥了作用。这意味着,对于一组固定的输入而言,删去那些没有被用到的神经元对整个神经网络的学习是没有影响的,激活函数等同于一个线性的函数。所以在训练的时候只需要考虑这些发挥作用的神经元的参数即可。

如下图所示,在训练过程中,针对输入x1和x2,第一层只有z_{1}^{1}z_{4}^{1}发挥了作用,此时相当于删除了神经元z_{2}^{1}z_{3}^{1},激活函数是\sigma(z)=z。这样我们就能像处理一般的神经网络一样,使用Backpropagation训练参数。

那没有被考虑到的神经元呢?他们的参数如何训练?答案是在训练神经网络的过程中,通常会提供多批输入数据,数据不同,被训练到的神经元也不同。只要多次训练模型,就可以保证每个神经元的参数都被训练到。

(2)采用不固定的学习率

RMSProb:如下图所示是RMSProp的递推式,其中α是一个超参,取值范围是0到1。α越大,代表越重视之前的计算出的梯度;α越小代表越重视刚计算出的梯度。

Momentum:假设从\theta_{0}处开始计算,定义一个量Movement,每次迭代的方向变就变成该点梯度(Gradient)和Movement的矢量和。具体的迭代式子如下图所示,其中 \lambda\eta是常数。

这个过程与物理过程类似。如图中的小球,假如从一个比较高的的地方滚下来的话,有可能借助惯性翻过比较大的局部最小值,从而达到更小的局部最小值,得到更优解。

Adam:这种方法综合了前两种方法,能得到更好的效果。

 2.训练集上得到的误差较小,但是测试集的误差较大

如果在训练集上得到的误差较小,但是在测试集上的误差较大,说明有可能出现了过拟合的情况。有三种常见的方法能解决该问题。

 (1)及时停止

为了避免在测试集上的误差过大,采用让训练的迭代次数减少的方法可以减少过拟合的情况。与一般机器学习使用方法相同。

(2)正则化 

为了防止过拟合,可以在Loss function中增加正则项,来增加对参数过多的“惩罚”。与一般的机器学习使用方法相同。

 (3)Dropout

Dropout是在深度学习特有的一种方法。在训练之前,把每个神经元以p%的概率删除,用得到的新的神经网络训练参数。在测试的的时候,保留所有的神经元,但是每个神经元的weight都要乘1-p%。通常p%取0.5.

 dropout神奇的地方在于,这样的做法与集成的做法(训练许多神经网络然后对结果取平均)得到的结果是相似的。而且如果使用类似线性的激活函数,dropout的效果往往比其他的函数效果要好。

最后要指出的是调整模型一定要对症下药,先判断出目前的模型处于什么状态再做出改变,否则可能无济于事甚至得到更差的结果。比如,模型在训练集上就表现得不好,如果此时再使用dropout的方法,模型可能就会越来越差。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值