TensorFlow2.0之五种神经网络参数优化器

一、参数优化器简介

待优化参数w,损失函数loss,学习率Ir,每次迭代一个batch,t表示当前batch迭代的总次数:
1,计算时刻损失函数关于当前参数的梯度 gt=loss(wt)g_{t} = \frac{\partial loss}{\partial (w_{t})}
2,计算t时刻一阶动量mtm_{t},和二阶动量VtV_{t}
3,计算时刻下降梯度: ηt=lrmV\eta _{t}=lr * \frac{m}{\sqrt{V}}
4,计算t+1时刻参数: wt+1=wtηt=wtlrmVw_{t+1}=w_{t}-\eta_{t}=w_{t}-lr * \frac{m}{\sqrt{V}}
一阶动量:与梯度相关的函数
二阶动量:与梯度平方相关的函数
客观来说,需优化的参数仅为输入的权重w和偏置b,不需要优化输入的特征值和超参数,并且优化器之间的差异也是因一阶动量和二阶动量赋值不同而不同。下面来分别详细介绍SGD、SGDM、Adagrad、Rmsprop、Adam五种参数优化器。

二、五种参数优化器

2.1 SGD(不含momentum的梯度下降算法)

mt=gtm_{t} = g_{t}Vt=1V_{t} = 1
ηt=lrmtVt=lrgt\eta _{t}=lr * \frac{m_{t}}{\sqrt{V_{t}}} = lr * g_{t}
wt+1=wtηt=wtlrmtVt=wtlrgtw_{t+1}=w_{t}-\eta_{t}=w_{t}-lr * \frac{m_{t}}{\sqrt{V_{t}}} = w_{t} - lr * g_{t}

2.2 SGDM(含momentum的梯度下降算法,在SGD基础上增加一阶动量)

mt=βmt1+(1β)gtm_{t} = \beta m_{t-1} + (1-\beta)g_{t}Vt=1V_{t} = 1
ηt=lrmtVt=lrmt=lr[βmt1+(1β)gt]\eta _{t}=lr * \frac{m_{t}}{\sqrt{V_{t}}} = lr * m_{t} = lr *[ \beta m_{t-1} + (1-\beta)g_{t}]
wt+1=wtηt=wtlrmtVt=wtlr[βmt1+(1β)gt]w_{t+1}=w_{t}-\eta_{t}=w_{t}-lr * \frac{m_{t}}{\sqrt{V_{t}}} = w_{t} - lr *[ \beta m_{t-1} + (1-\beta)g_{t}]

注:β=0.9\beta = 0.9

2.3 Adagrad(在SGD基础上增加二阶动量)

mt=gtm_{t} = g_{t}Vt=t=1tgt2V_{t} = \sum_{t=1}^{t} g_{t}^{2}
ηt=lrmtVt=lrgtt=1tgt2\eta _{t}=lr * \frac{m_{t}}{\sqrt{V_{t}}} = lr * \frac{g_{t}}{\sqrt{\sum_{t=1}^{t} g_{t}^{2}}}
wt+1=wtηt=wtlrmtVt=wtlrgtt=1tgt2w_{t+1}=w_{t}-\eta_{t}=w_{t}-lr * \frac{m_{t}}{\sqrt{V_{t}}} = w_{t} - lr * \frac{g_{t}}{\sqrt{\sum_{t=1}^{t} g_{t}^{2}}}

2.4 RMSProp(在SGD基础上增加二阶动量)

mt=gtm_{t} = g_{t}Vt=βVt1+(1β)gt2V_{t} = \beta V_{t-1}+(1-\beta) g_{t}^{2}
ηt=lrmtVt=lrgtβVt1+(1β)gt2\eta _{t}=lr * \frac{m_{t}}{\sqrt{V_{t}}} = lr * \frac{g_{t}}{\sqrt{ \beta V_{t-1}+(1-\beta) g_{t}^{2}}}
wt+1=wtηt=wtlrmtVt=wtlrgtβVt1+(1β)gt2w_{t+1}=w_{t}-\eta_{t}=w_{t}-lr * \frac{m_{t}}{\sqrt{V_{t}}} = w_{t} - lr * \frac{g_{t}}{\sqrt{ \beta V_{t-1}+(1-\beta) g_{t}^{2}}}

注:β=0.9\beta = 0.9

2.5 Adam(同时结合SGDM一阶动量和RMSProp二阶动量)

mt=β1mt1+(1β1)gtm_{t} = \beta_{1} m_{t-1} + (1 - \beta_{1})g_{t}Vt=β2Vt1+(1β2)gt2V_{t} = \beta_{2} V_{t-1}+(1-\beta_{2}) g_{t}^{2}
mtm_{t}vtv_{t}分别进行修正动量的偏差,改为:
mt^=mt1β1t\hat{m_{t}} = \frac{m_{t}}{1-\beta_{1}^{t}}
Vt^=vt1β2t\hat{V_{t}} = \frac{v_{t}}{1-\beta_{2}^{t}}
ηt=lrmt^Vt^\eta _{t}=lr * \frac{\hat{m_{t}} }{\sqrt{\hat{V_{t}}}}
wt+1=wtηt=wtlrmt^Vt^w_{t+1}=w_{t}-\eta_{t}=w_{t}-lr * \frac{\hat{m_{t}} }{\sqrt{\hat{V_{t}}}}

注:β1=0.9\beta1 = 0.9β2=0.999\beta2=0.999

总结

1.当lr=0.1 epoch=500 batch=32

loss变化趋势:
TensorFlow2.0之五种神经网络参数优化器
acc精确度变化趋势:
TensorFlow2.0之五种神经网络参数优化器
训练消耗时间:
TensorFlow2.0之五种神经网络参数优化器

从对比图中不难看出,损失函数loss衰减趋势图,Adam优化器衰减速度更快,且精确度在epoch=100后表现较为稳定,但是训练时间比前四个都要长,但为了得到较稳定的精确度,往往会以时间换准确度。

将参数改动,变为lr=0.01 epoch=100 batch=32

loss变化趋势:
TensorFlow2.0之五种神经网络参数优化器
准确度变化趋势:
TensorFlow2.0之五种神经网络参数优化器
训练耗时:
TensorFlow2.0之五种神经网络参数优化器

和之前的类似,就损失函数衰减的速度和结果准确率而言,还是Adam优化器比较占优势,但是由于调整了学习率lr和迭代的次数epoch,在时间上大大减少,均在2~4秒之间。

综上所述表明,找到适合的优化模型学习率大小迭代次数对模型的优化至关重要。