8 神经网络参数优化器

优化器就是引导神经网络更新参数的工具。 

待优化参数w,损失参数loss,学习率lr,每次迭代一个batch,t表示当前batch迭代的总次数:

1.计算t时刻损失函数关于当前参数的梯度:

g_{t}=\bigtriangledown loss=\frac{\partial loss}{\partial (w_{t})}

2.计算t时刻一阶动量m_{t}和二阶动量V_{t}

一阶动量m_{t}:与梯度相关的函数,二阶动量V_{t}:与梯度平方相关的函数。

3.计算t时刻下降梯度:

\eta _{t}=\frac{lr\cdot m_{t}}{\sqrt{V_{t}}}

4.计算t+1时刻参数:

w_{t+1}=w_{t}-\eta _{t}=w_{t}-\frac{lr\cdot m_{t}}{\sqrt{V_{t}}}

不同的优化器实质上只是定义了不同的一阶动量和二阶动量公式。

1.随机梯度下降SGD(无momentum)最常用

m_{t}=g_{t}, V _{t}=1,\eta \left ( t \right )=lr\cdot g_{t},

w_{t+1}=w_{t}-lr*\frac{\partial loss}{\partial w_{t}}

# 实现梯度更新 w1 = w1 - lr * w1_grad    b = b - lr * b_grad
        w1.assign_sub(lr * grads[0])  # 参数w1自更新
        b1.assign_sub(lr * grads[1])  # 参数b自更新

2.SGDM(含momentum)在SGD上增加一阶动量

m_{t}=\beta\cdot m_{t-1}+\left ( 1-\beta \right )g_{t}, V _{t}=1,

\eta _{t}=lr\cdot (\beta\cdot m_{t-1}+\left ( 1-\beta \right )g_{t})

w_{t+1}=w_{t}-lr\cdot (\beta\cdot m_{t-1}+\left ( 1-\beta \right )g_{t})

\beta是一个接近于1的数,一般取0.9。

        m_w, m_b = 0, 0
        beta = 0.9

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

3.Adagrad ,在SGD上增加二阶动量

m_{t}=g_{t}, V _{t}=\sum_{\tau =1}^{t}g_{\tau }^{2},

\eta _{t}=\frac{lr\cdot g_{t}}{\sum_{\tau =1}^{t}g_{\tau }^{2}}

w_{t+1}=w_{t}-\frac{lr\cdot g_{t}}{\sum_{\tau =1}^{t}g_{\tau }^{2}}

        v_w, v_b = 0, 0



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

4.RMSProp ,SGD基础上增加二阶动量

m_{t}=g_{t}, V _{t}=\beta\cdot V_{t-1}+\left ( 1-\beta \right )g_{t}^{2},

\eta _{t}=\frac{lr\cdot g_{t}}{\sqrt{\beta\cdot V_{t-1}+\left ( 1-\beta \right )g_{t}^{2}}}

w_{t+1}=w_{t}-\frac{lr\cdot g_{t}}{\sqrt{\beta\cdot V_{t-1}+\left ( 1-\beta \right )g_{t}^{2}}}

v_w, v_b = 0, 0
beta = 0.9

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

5.Adam ,同时结合SGDM一阶动量和RMSProp 的二阶动量

m_{t}=\beta_{1}\cdot m_{t-1}+\left ( 1-\beta_{1} \right )g_{t},    修正一阶动量的偏差:\hat{m_{t}}=\frac{m_{t}}{1-\beta _{1}^{t}}

V _{t}=\beta_{2}\cdot V_{t-1}+\left ( 1-\beta_{2} \right )g_{t}^{2},

修正二阶动量的偏差:\hat{V_{t}}=\frac{V_{t}}{1-\beta _{2}^{t}}

把修正后的动量带入参数更新,实现参数自更新:

\eta _{t}=\frac{lr\cdot \hat{m_{t}}}{\sqrt{\hat{V_{t}}}},W_{t+1}=W_{t}-\eta _{t}


m_w, m_b = 0, 0
v_w, v_b = 0, 0
beta1, beta2 = 0.9, 0.999
delta_w, delta_b = 0, 0
global_step = 0


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值