【深度学习】——优化器

神经网络参数优化器

  神经网络的训练过程是通过迭代更新超参数来最小化损失函数的过程,最终目标是找到使损失函数最小,最能准确预测的超参数组合。而在更新迭代超参数时就需要用到不同的优化器,本文简要介绍几种常用的优化器。

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,即:


在这里插入图片描述
  每一时刻的一阶动量都是由上一时刻一阶动量决定,第一时刻一阶动量由第0时刻一阶动量决定,第0时刻动量为0。β是超参数,经验值0.9。即:

在这里插入图片描述
因此将其带入下降梯度计算式中可得:

在这里插入图片描述

因此参数更新公式为:

在这里插入图片描述

#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))

猜你喜欢

转载自blog.csdn.net/m0_46568930/article/details/111826364
今日推荐