网络参数的优化方法总结

这里我们用\theta = (w,b)去做代替

 0. 标准的梯度下降(GD)

        就是每一次的权值更新都需要将全部的训练集输入到网络,然后求全部的误差,然后再取平均得到最终的loss(样本的总数是M)然后就执行BP了,收敛方向肯定标准啦,但是速度非常慢        

        cost fuction若为凸函数,能够保证收敛到全局最优值;若为非凸函数,能够收敛到局部最优值

\hat{\theta} = \theta + \eta*\frac{1}{M}\bigtriangledown_{\theta} L(f(x_i;\theta),y_i)

1. 随机梯度下降(SGD)

        本质还是梯度下降,更新权值的时候我们只有单个样本的误差去作为做更新,所以只要这个样本是一个噪声/离群值,就会对当前这次权重和偏置的更新造成比较严重的影响。但是因为只选择了一个样本去做更新,虽然收敛方向有点不统一,但是收敛速度还是很快的。

\hat{\theta} = \theta + \eta*\bigtriangledown_{\theta} L(f(x_i;\theta),y_i)

2. 批处理梯度下降(BGD)

        ​​​​​​​不知道是不是中文名哈

        综合了0和1的情况。我们将数据划分为多个batch,就是多个组吧,然后一组一组地送进去,假如一组有m个,更新权值的时候就:

\hat{\theta} = \theta + \eta*\frac{1}{m}\bigtriangledown_{\theta} L(f(x_i;\theta),y_i)

        上面说的三种梯度下降,都有一个问题就是学习率不好做选择的问题,太小的学习率会导致收敛缓慢,而学习速度太块会造成较大波动,妨碍收敛。

        所以有人就用卡阈值的方法去实现“动态”调整学习率,预先定义一个迭代次数m,每执行完m次训练便减小学习率,或者当cost function的值低于一个阈值时减小学习率。但是我觉得这个方法不太可行,假如换一批数据,当前设定好的阈值就失效了。

3. Momentum

        每次迭代计算的梯度含有比较大的噪音. 而Momentum方法可以比较好的缓解这个问题,尤其是在面对小而连续的梯度但是含有很多噪声的时候,可以很好的加速学习.

        它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。观察历史梯度(前一次的梯度t−1) ,若当前梯度的方向与历史梯度一致(表明当前样本不太可能为异常点),则会增强这个方向的梯度,若当前梯度与历史梯方向不一致,则梯度会衰减。
 

v_t = \gamma *v_{t-1} + \eta*\bigtriangledown _{\theta}J(\theta)

\theta_t = \theta_{t-1} - v_t

        第一个公式就是,我保留了上一代的动量值,然后计算当前代的动量值,与当前代的梯度值进行加法操作。其中\gamma是动量衰减的因子,\eta是学习率

4. Nesterov Momentum(Nesterov Accelerated Gradient)

        就是在momentum的基础上改进了计算动量的方法

        之前的momentum是计算当前点的动量,然后计算当前点的梯度,两个方向做一个累加形成下一个点的梯度方向

v_t = \gamma *v_{t-1} + \eta*\bigtriangledown _{\theta}J(\theta-\gamma*v_{t-1})
\theta = \theta - v_t

        具体步骤是这样子的,首先拿上一次的动量值来让他走一步,也就是 下图的蓝色方向,然后和当前的梯度做一下差,下右图的黑色箭头,这么一个操作构成这个位置看做是当前优化的一个”展望”位置,然后再计算当前这个状态应有的动量,再去更新梯度值

5. AdaGrad

        Adagrad算法能够在训练中自动的对learning rate进行调整,独立地适应模型的每个参数。

        一直较大偏导的参数相应有一个较小的学习率,初始学习率会下降的较快;而一直小偏导的参数则对应一个较大的学习率,初始学习率会下降的较慢:

\theta_{t+1,i} = \theta_{t,i} - \frac{\eta}{\sqrt{R}+\varepsilon }*g_{t,i}

        g_{t,i}​​​​​​​ 就是当前第t轮的第i个参数的梯度,然后R就是累积平方梯度:R = R + g_{t,i},不断重复计算,从而实现一开始,这个学习率的分母比较小,所以学习率比较大

        但是!到了后面,分母越来越大,学习率就越小。从理论上很符合理想模型的,但是实战当中,确实分母会变得无敌大,从而导致学习率非常低,使得模型原地不动了

        AdaGrad 旨在应用于凸问题时快速收敛。当应用于非凸函数训练神经网络时,学习轨迹可能穿过了很多不同的结构,最终到达一个局部是凸碗的区域。AdaGrad 根据平方梯度的整个历史收缩学习率,可能使得学习率在达到这样的凸结构前就变得太小了。

6. RMSProp

        其实就是对AdaGrad的改良,为了解决Adagrad 学习率过早且过度衰减问题的:

 ​

\theta_{t+1,i} = \theta_{t,i} - \frac{\eta}{\sqrt{E[g^2]_t}+\varepsilon }*g_{t,i}

        其中,E[g^2]_t不像Ada那样,全部都一块累加到一起,这样会导致分母越来越大,这次改用了改变梯度积累为指数加权的移动平均

E[g^2]_t = E[g^2]_{t-1}*0.9 + E[g^2]_{t}*0.1

        RMSProp建议的初始值: 全局学习率 ϵ = 1 e − 3 ,对应上面的learning_rate参数。 衰减速率 ρ = 0.9 

7. Adaptive Moment Estimatio(Adam)

        先预先设定好几个默认值:​​​​​\alpha = 0.001\beta_1 =0.9\beta_2 = 0.999\eta = 10^{-8}

        还有一个变量t,从0开始      

        这个是算法是集合了上面动量(历史梯度的指数衰减方向)以及RMSProp的优点,随意表现效果会非常好,很多训练听说都用到了它。

        这个算法的步骤如下:

        第一次嘛,先计算当前的梯度

        然后就是t+1

        再然后就更新梯度的一阶矩,即过往梯度与当前梯度的平均。

        然后再计算梯度的二阶矩, 即过往梯度平方与当前梯度平方的平均

        然后计算\bigtriangleup \theta值,接着就是更新\theta

         

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值