《深度学习入门》第六章读书笔记-与学习相关的技巧

6.1 参数的更新/Optimizer

SGD

上一章中提到的随机梯度下降法SGD,其实是一种参数更新的最优化方法;也就是说,在代码中我们常常通过以下方式使用SGD:

optimizer = SGD()
for i in range(10000):
	...
	x_batch, t_batch = get_mini_batch(...)
	grads = network.gradient(x_batch,t_batch)
	params = network.params
	optimizer.update(params,grads)
	...

实际上,SGD相比于其他的optimizer来说只能算是弟中之弟,原因在于它的收敛速度太慢,而且容易卡在局部最优化的位置。

书中介绍了三种更好的最优化方法:动量Momentum,AdaGrad,Adam。

Momentum

Momentum添加了一个变量 v v v,对应物理上的速度。有了这个变量,权重在更新时将会按照一定比例保持之前的更新速度(或者说梯度下降的程度),从而能够越过局部最优。

AdaGrad

AdaGrad则关注对学习率的调整。因为学习率对权重是否能更新到最好至关重要:学习率如果过大,则无法企及损失函数的最小值;学习率如果过小,则更新过慢,使得训练时间增长。

AdaGrad使用了一种称为学习率衰减的方法:随着学习的进行,使学习率逐渐减少。这种一开始多学,然后逐渐少学的方法,在神经网络的学习中经常被使用。这就像打高尔夫球时,前几杆大力挥杆,之后使挥杆力度逐渐衰减,在接近球洞时挥杆力度变得非常小,以找到最合适的参数值。而AdaGrad中的Ada指的也是Adaptive,即“适当的”的意思。

Adam

Adam直观的讲,就是融合了Momentum和AdaGrad的方法。有需要请参考论文,平常我们在调用的时候就是一行代码的事。

6.2 权重的初始值

根据激活函数的不同,适合选择不同的权重初始值。例如,当激活函数选为sigmoid函数或tanh函数时,一般使用Xavier初始值;当激活函数选为ReLU函数时,一般使用He初始值。使用合适的初始值以后,激活函数输出的值的分布将更加均匀,从而更好地推进学习。

6.3 Batch Normalization

批归一化(Batch Normalization),是2015年提出的方法。它具有以下优点:

  • 可以使学习快速进行(增大学习率)
  • 不过度依赖初始值
  • 抑制过拟合

Batch Norm的思路是调整各层的激活值(激活函数的输出值)的分布,使其具有适当的广度。因此,Batch Norm一般作为单独的一个层,插入在Affine层和ReLU层之间。

具体来说,就是对输入的数据进行均值为0、方差为1的均一化,然后再做缩放和平移的变换。

6.4 正则化

6.4.2 权值衰减与L2正则化

在深度学习中,增加网络深度通常可以提高模型的表示能力,从而在某些任务上提高识别准确率。然而,当网络变得非常深时,一些问题可能会出现,导致模型性能的下降。导致这种情况的原因包括梯度消失/梯度爆炸,或者过拟合。

权值衰减是一种常用的抑制过拟合的方法。这其中,常用的方法就是给损失函数加上权重的L2范数。

在pytorch中,在torch.optim中集成了很多优化器,如SGD,Adadelta,Adam,Adagrad,RMSprop等,这些优化器自带的一个参数weight_decay,用于指定权值衰减率,相当于L2正则化中的λ参数。注意torch.optim集成的优化器只有L2正则化方法。
参考:https://blog.csdn.net/guyuealian/article/details/88426648

6.4.3 Dropout

Dropout是一种在学习过程中随机删除神经元的方法。

在pytorch中,一般直接通过这样的方法进行定义:self**.**dropout **=** nn**.**Dropout(0.6)

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值