目录

一、优化时遇到的问题以及解决方法

二、批梯度下降算法和随机梯度下降算法的区别

三、常见的梯度下降优化算法

1、SGD随机梯度优化算法

2.SGD+Momentum动量

3.NAG(既然我知道下一步到那,为何不用下一步梯度提前优化)

4.Adagrad

5.RMSProp

6.Adam

一、优化时遇到的问题以及解决方法

1.梯度消失梯度爆炸

2.得到局部最优解

解决方法:

1.优化初始化参数策略

2.使用mini—batch梯度下降优化

3.优化梯度下降算法

4.学习率随训练衰减

二、批梯度下降算法和随机梯度下降算法的区别

批梯度优化:每次处理整个训练集的样本,然后再进行一次梯度下降

优点:总是向着全局误差最小的方向优化

缺点:如果样本集过大,每次优化时间会很长。

随机梯度优化:每次只对一个样本进行梯度下降。

优点:训练速度快

缺点:噪声比较多,需要选择较小的学习率。同时永远不会收敛,只会在最小值附近波动

所以取其精华去其糟粕,我们经常用mini_batch梯度下降优化

三、常见的梯度下降优化算法

1、SGD随机梯度优化算法

while True:
    weight_grad=evaluate_gradient(loss_function,data,weights)
    weights+=(-step_size)*weight_grad

2.SGD+Momentum动量

vx=0 #初始动量
while True:
    dx=compute_gradient(x)
    vx=rho*vx+dx   #这里的rho一般取0.9或0.99是对上一步动量的保留
    x-=learning_rate*vx

使用动量梯度下降,通过累加过去的梯度值来减小抵达最小值路径上的波动,加速了收敛。

3.NAG(既然我知道下一步到那,为何不用下一步梯度提前优化)

while True:
    dx=compute_gradient(x)
    old_v=v
    next_v=rho*old_v-learning_rate*dx
    x+=-rho*old_v+(1+rho)*new_v

4.Adagrad(自适应学习率调整)

grad_squared=0
while True:
    dx=compoute_gradient(x)
    grad_squared+=dx*dx
    x-=learning_rate*dx/(np.sqrt(grad_squared)+1e-7)#对大的梯度进行惩罚,对小的梯度加速

随着grad_squared越来越大,x几乎不更新

5.RMSProp

grad_squared=0
while True:
    dx=compute_gradient(x)
    grad_squared=decay_rate*grad_squared+(1-decay_rate)*dx*dx #decay_rate一般取0.9
    x-=learning_rate*dx/(np.sqrt(grad_squred)+1e-7)

解决了Adagrad学习速率衰减过快的问题,decay_rate取0.9,grad_squared更加平稳,减少了梯度爆炸的问题。

6.Adam

first_moment=0
second_moment=0
while True:
    dx=compute_gradient(x)
    first_moment=beta1*first_moment+(1-beta1)*dx
    second_momentom=beta2*second_moment+(1-beta2)*dx*dx
    x-=learning_rate*first_moment/(np.sqrt(second_moment)+1e-7)

结合了动量法和自适应学习率调整,有惯量可以跳出局部最优,同时对大梯度进行惩罚,小梯度进行加速,根据每个参数不同的梯度对其学习率进行动态的调整,使模型更快收敛

四、adam与adamw的区别

adamw相当于adam + weight decay,效果与adam + L2正则化相同,但是计算效率更高,因为L2正则化是添加在损失函数后面的,而weight decay直接在梯度更新时影响权重的更新方向。

更多推荐