深度神经网络优化(三)- Hyperparameter tuning, Batch Normalization

第三篇呢,是深度神经网络优化的最后一堂课的笔记,主要介绍的是关于超参数调节,batch normalization以及多分类

Hpyerparameter tuning

Tuning process

对于深度神经网络来说,我们有很多超参数需要调节

  1. learning_rate: α \alpha α
  2. momentum里的 β \beta β
  3. Adam里的 β 1 , β 2 , ϵ \beta1,\beta2,\epsilon β1,β2,ϵ
  4. layers,神经网络的层数
  5. hidden units,隐藏层的隐藏元数目
  6. learning rate decay的相关参数
  7. mini-batch size
    那么Andrew教授呢,给我们的建议是在这么多的超参数当中有些相对于另外一下要更重要一点,比如第一梯队就是1(对应上面的编号),第二梯队2,5,7,第三梯队4,6,对于Adam的参数采用默认的就好。

第一,调超参数的时候,最好不使用grid。
所谓grid如下图,在我们选定的大概范围里面呢,约定几个特定值,然后来回测,比如我现在在调 α \alpha α ϵ \epsilon ϵ,一个参数选5个值,然后一共25个组合,测25次选出一组error最小的参数。这样不好是因为,如果对于我们的网络一个参数的影响大于另一个参数, α \alpha α的作用大于 ϵ \epsilon ϵ ϵ \epsilon ϵ的调整几乎没有影响,那么运用grid我们相当于只测了5个值,而random的好处就在于我们可以测25个值。
这里写图片描述

第二 Coarse to fine, 由粗到细。我们先取一个大范围进行random测定,然后我们再zoom in,对error较小的点再进行random取值测定。
这里写图片描述

Using an appropriate scale to pick hyperparameters
  1. 对于比如神经网络层数,隐藏层单元数等参数,我们直接在范围内等概率随机取值是可行的,比如layers(2-5),units(50-100)
  2. 但对于比如学习率,momentum,Adam等参数,在范围内等概率随机取值就不合理。因为在不同的范围内,等距离的增长带来的效应差距很大,比如momentum的 β \beta β,取值范围为0.9~ 0.999。0.9005和0.9差别不大,大概都是取前10天求取平均,而0.9995和0.999就天差地别了,一个是取前2000天,一个是取1000天。所以针对这种超参数,我们采取取log再等概率取值的做法。比如 α \alpha α在0.0001~ 1,就可以转换为log,也就是-4~0。
Hyperparameters tuning in practice: Pandas vs. Caviar

在实际操作中,如果我们的运算资源不够,不能同时训练多个模型,那么我们采用下图左边,Pandas模式,对于一个需要运行一两周的一个模型,我们每天进行参数调节,来使得尽快收敛,而如果我们运算资源足够,那么我们会选择下图右边的模式,同时运行多个模型。
这里写图片描述

Batch Normalization

接下来讲述BN算法,BN能够提高深度神经网络选择超参数的鲁棒性,也就是能够让超参数在很大的范围内都能取得很好的结果,同时还能更好的训练非常深的神经网络。那么什么是BN呢,如下图
这里写图片描述
对于每一层的z,我们进行上述操作就是所谓的BN,仔细一看很熟悉很像是均值归一化,确实如此,这也就是normalization的由来,联想我们对输入进行均值归一化,可以加快我们的收敛,那么同样的我们对每一层的z进行BN,这样就能更快的训练我们下一层的W和b,但是这同时也带来了两个需要学习的参数 γ \gamma γ β \beta β,这两个不是超参数,而是需要学习的参数,它们通过学习来反应z的分布情况,如果 γ = σ 2 + ϵ \gamma = \sqrt{\sigma^2+\epsilon} γ=σ2+ϵ β = μ \beta=\mu β=μ,那么 Z ~ \widetilde Z Z 就等于被均值归一化。经过BN,我们往下输入的参数不再是 Z Z Z 而是 Z ~ \widetilde Z Z
运用BN的流程如下
这里写图片描述

Why does Batch Norm work?

第一个BN work的原因是scale我们的Z,让后面的训练更容易。
第二个原因是让后面的权重更加robust,在神经网络前面权重变化的情况下。这里引入一个"Covariate shift"的概念,即当我们的经验无法适应新样本,新环境时就会发生"Covariate shift"。对于神经网络来说,后面的权重很容易受到前面权重的影响,因为前面权重的不断变化就会带来后面权重的不断变化,那么BN算法呢就减缓了隐藏层权重分布变化的程度。经过BN之后,尽管每一层的Z还是在不断变化,但是它们的均值和方差基本保持不变,这就使得后面的数据更加稳定,数据分布更加稳定,这就减少前面层与后面层的耦合,使得每一层不过多受前面层的影响,自己学习,这将最终加快整个网络训练。
运用BN还有附带的效果,也就是regularization,如下图
这里写图片描述
当然这种正则化的效果不是很显著,而且跟mini-batch size有关,mini-batch size越大,效果越弱,因为这样带来的noise越小。当然BN可以和dropout同时使用,加强正则化的效果。
最后强调一点,BN不是正则化的手段,BN的本意不在于此,泛化效果只是顺带的。

Batch Norm at test time

由于我们训练运用了BN,那么同样的测试的时候也必须用BN才行,但是这就带来一个问题,训练的时候,我们有mini-batch,我们可以求均值,求方差,但是测试的时候,我们是一个样本一个样本输入的,这样我们就没有所谓均值和方差了。为了解决这个问题,我们再次需要用到exponentially weight average,对于每一个mini-batch的均值和方差应用EMA,将最终的结果保存应用到测试的时候。
这里写图片描述

Multi-class classification

在机器学习笔记中,我们提到过多分类的问题,在神经网络中,多分类的问题表现在我们输出 y ^ \hat y y^ 不再是一个数,而是一个多维的列向量,有多少类就有多少维。对于最后我们不再使用sigmoid函数,而是使用softmax函数,如下
这里写图片描述
因为激活函数的变化,损失函数也发生变化变为
L ( a L , y ) = − ∑ i = 1 m y i log ⁡ a L L(a^L, y) = - \sum^m_{i=1}y_i \log a^L L(aL,y)=i=1myilogaL
最后我们来推导一下 d J d z L \frac{dJ}{dz^L} dzLdJ,即程序中我们需要的 d Z L dZ^L dZL

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值