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)