神经网络参数优化器
神经网络的训练过程是通过迭代更新超参数来最小化损失函数的过程,最终目标是找到使损失函数最小,最能准确预测的超参数组合。而在更新迭代超参数时就需要用到不同的优化器,本文简要介绍几种常用的优化器。
1.优化器通用步骤
①计算t时刻损失函数关于当前参数的梯度:

②计算t时刻的一阶动量mt(与梯度相关的函数)和二阶动量Vt(与梯度平方相关的函数)
③计算t时刻下降梯度:

④更新t+1时刻参数:

各个优化器的基本步骤和原理都是这样的,优化器的区别就是一阶动量和二阶动量的设计不同。
2.SGD
SGD优化器是最常用的一种梯度下降法,是没有动量的,其一阶动量直接使用梯度,二阶动量为1,即:

因此将其带入下降梯度计算式中可得:

因此参数更新公式为:

#SGD
w1.assign_sub(lr*grads[0])
b1.assign_sub(lr*grads[1])
这里assign_sub是参数自更新的函数,grads是损失函数关于当前参数的梯度
3.SGDM
SGDM是在SGD的基础上增加了一阶动量,二阶动量仍为1,即:

因此将其带入下降梯度计算式中可得:

因此参数更新公式为:

#SGDM
m_w=beta*m_w+(1-beta)*grads[0]
m_b=beta*m_b+(1-beta)*grads[1]
w1.assign_sub(lr*m_w)
b1.assign_sub(lr*m_b)
4.Adagrad
Adagrad在SGD基础上增加了二阶动量,无一阶动量,即:

因此将其带入下降梯度计算式中可得:


#Adagrad
v_w+=tf.square(grads[0])
v_b+=tf.square(grads[1])
w1.assign_sub(lr*grads[0]/tf.sqrt(v_w))
b1.assign_sub(lr*grads[1]/tf.sqrt(v_b))
因为要求从开始到当前时刻的梯度的平方的累积和作为二阶动量,所以首先计算这个累积值存储到v_w和v_b
5.RMSProp
RMSProp是在SGD基础上增加二阶动量,无一阶动量,即:

因此将其带入下降梯度计算式中可得:

因此参数更新公式为:

#RMSProp
v_w=beta*v_w+(1-beta)*tf.square(grads[0])
v_b=beta*v_b+(1-beta)*tf.square(grads[1])
w1.assign_sub(lr*grads[0]/tf.sqrt(v_w))
b1.assign_sub(lr*grads[1]/tf.sqrt(v_b))
6.Adam
Adam优化器具有较好的鲁棒性,它同时结合了SGDM一阶动量和RMSProp的二阶动量,并在此基础上增加了两个修正项,即:


修正一阶动量的偏差为:




#Adam
m_w=0
m_b=0
v_w=0
v_b=0
beta1=0.9
beta2=0.999
delta_w=0
delta_b=0
global_step=0
m_w=beta1*m_w+(1-beta1)*grads[0]
m_b=beta1*m_b+(1-beta1)*grads[1]
v_w=beta2*v_w+(1-beta2)*tf.square(grads[0])
v_b=beta2*v_b+(1-beta2)*tf.square(grads[1])
m_w_correction=m_w/(1-tf.pow(beta1,int(global_step)))
m_b_correction=m_b/(1-tf.pow(beta1,int(global_step)))
v_w_correction=v_w/(1-tf.pow(beta2,int(global_step)))
v_b_correction=v_b/(1-tf.pow(beta2,int(global_step)))
w1.assign_sub(lr*m_w_correction/tf.sqrt(v_w_correction))
b1.assign_sub(lr*m_b_correction/tf.sqrt(v_b_correction))