畅游人工智能之海--Keras教程之优化器(三).md

畅游人工智能之海--Keras教程之优化器(三)

各位读者朋友大家好,上周我们已经学习了一部分Keras的优化器,这周我们将完成优化器剩余部分的学习。

今天我们将学习几种自适应学习率优化算法。自适应学习率优化算法针对于机器学习模型的学习率,传统的优化算法要么将学习率设置为常数要么根据训练次数调节学习率,极大忽视了学习率其他变化的可能性。然而,学习率对模型的性能有着显著的影响,因此需要采取一些策略来想办法更新学习率,从而提高训练速度。

Adam类

1
2
3
4
5
6
7
8
9
10
11
12
13
tf.keras.optimizers.Adam(
learning_rate=0.001, #学习率。默认为0.001
beta_1=0.9, #浮点数或常量浮点张量,或不带参数并返回要使用的实际值的可调用函数。一阶矩估计的指数衰减率。大于0小于1,默认为0.9
beta_2=0.999, #浮点数或常量浮点张量,或不带参数并返回要使用的实际值的可调用函数。二阶矩估计的指数衰减率。大于0小于1,默认为0.999
epsilon=1e-07, #数值稳定性的一个小常数。默认为1e-7
amsgrad=False, #布尔值。是否应用该算法的AMSGrad变量。默认为False
name="Adam", #应用梯度时创建的操作的可选名称前缀。默认为“Adam”
**kwargs #关键字参数。允许是“clipnorm”或“clipvalue”之一clipnorm“(float)按范数剪裁梯度;“clipvalue”(float)按值剪裁梯度
)
'''
epsilon的默认值1e-7通常可能不是一个好的默认值。例如,当在ImageNet上训练初始网络时,当前的最佳选择是1.0或0.1。
此算法的稀疏实现(当梯度为indexedSlices对象时使用,通常是因为tf.gather或者前向过程中的嵌入查找)确实会对可变切片应用momentum,即使它们没有在前向过程中使用(意味着它们的梯度等于零)。momentum衰减(beta_1)也适用于整个momentum累加器。这意味着稀疏行为等同于稠密行为(与某些momentum实现不同,后者忽略momentum,除非实际使用可变切片)。
'''

实现Adam算法的优化器。

Adam优化是一种基于随机估计的一阶和二阶矩的随机梯度下降方法。该方法计算效率高,内存需求少,不影响梯度的对角线重缩放,并且非常适合数据/参数较大的问题。

Adam中动量直接并入了梯度一阶矩(指数加权)的估计。相比于缺少修正因子导致二阶矩估计可能在训练初期具有很高偏置的RMSProp,Adam包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩估计。

Adam算法策略可以表示为:

捕获3

其中,mt和vt分别为一阶动量项和二阶动量项。β1,β2为动力值大小通常分别取0.9和0.999;mt,vt分别为各自的修正值。Wt表示t时刻即第t迭代模型的参数,gt=ΔJ(Wt)表示t次迭代代价函数关于W的梯度大小;ϵ是一个取值很小的数(一般为1e-8)为了避免分母为0。

例子:

1
2
3
4
5
6
7
>>> opt = tf.keras.optimizers.Adam(learning_rate=0.1)
>>> var1 = tf.Variable(10.0)
>>> loss = lambda: (var1 ** 2)/2.0 # d(loss)/d(var1) == var1
>>> step_count = opt.minimize(loss, [var1]).numpy()
>>> # The first step is `-learning_rate*sign(grad)`
>>> var1.numpy()
9.9

Adagrad类

1
2
3
4
5
6
7
tf.keras.optimizers.Adagrad(
learning_rate=0.001, #学习率。默认为0.001
initial_accumulator_value=0.1, #浮点值。accumulator起始值必须非负
epsilon=1e-07, #数值稳定性的一个小常数。默认为1e-7
name="Adadelta", #应用梯度时创建的操作的可选名称前缀。默认为“Adadelta”
**kwargs #关键字参数。允许是“clipnorm”或“clipvalue”之一clipnorm“(float)按范数剪裁梯度;“clipvalue”(float)按值剪裁梯度
)

实现Adagrad算法的优化器。

AdaGrad算法,独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平均值总和的平方根。具有代价函数最大梯度的参数相应地有个快速下降的学习率,而具有小梯度的参数在学习率上有相对较小的下降。

AdaGrad算法优化策略一般可以表示为:

捕获

假定一个多分类问题,i表示第i个分类,t表示第t迭代同时也表示分类ii累计出现的次数。η0表示初始的学习率取值一般为0.01,ϵ是一个取值很小的数(一般为1e-8)为了避免分母为0。Wt表示t时刻即第t迭代模型的参数,gt,i=ΔJ(Wt,i)表示t时刻,指定分类i,代价函数J(⋅)关于W的梯度。

从表达式可以看出,对出现比较多的类别数据,Adagrad给予越来越小的学习率,而对于比较少的类别数据,会给予较大的学习率。因此Adagrad适用于数据稀疏或者分布不平衡的数据集。

Adagrad 的主要优势在于不需要人为的调节学习率,它可以自动调节;缺点在于,随着迭代次数增多,学习率会越来越小,最终会趋近于0。

Adadelta类

1
2
3
4
5
6
7
tf.keras.optimizers.Adadelta(
learning_rate=0.001, #学习率。默认为0.001
rho=0.95, #一个张量或浮点数。衰减率
epsilon=1e-07, #数值稳定性的一个小常数。默认为1e-7
name="Adadelta", #应用梯度时创建的操作的可选名称前缀。默认为“Adadelta”
**kwargs #关键字参数。允许是“clipnorm”或“clipvalue”之一clipnorm“(float)按范数剪裁梯度;“clipvalue”(float)按值剪裁梯度
)

实现Adadelta算法的优化器。

Adadelta优化是一种随机梯度下降方法,它基于每个维度的自适应学习率来解决两个缺点:

  • 整个训练期间学习率的持续下降
  • 需要手动选择的整体学习率

Adadelta是Adagrad的更强大的扩展,它基于梯度更新的移动窗口来调整学习率,而不是累积所有过去的梯度。这样,即使已完成许多更新,Adadelta仍可继续学习。在此版本中,它可以像大多数其他Keras优化器一样设置初始学习率。

AdaGrad算法和RMSProp算法都需要指定全局学习率,Adadelta算法结合两种算法每次参数的更新步长。它的算法策略可以表示为:

捕获1

其中Wt为第t次迭代的模型参数,gt=ΔJ(Wt)为代价函数关于W的梯度。E[g2]t表示前t次的梯度平方的均值。捕获2表示前t−1次模型参数每次的更新步长累加求根。

Adadelta优势在于在模型训练的初期和中期,Adadelta表现很好,加速效果不错,训练速度快。缺点在模型训练的后期,模型会反复地在局部最小值附近抖动。

优化器对于神经网络来说非常重要,不同的优化方式有不同的效果,应该针对样本进行选择,以实现更好的优化效果,希望大家在学习之余也多多查阅相关资料,更加牢固地掌握这一知识。谢谢大家的阅读。