0

【DL-CV】更高级的参数更新(一)

【DL-CV】正则化,Dropout<前篇---后篇>【DL-CV】浅谈GoogLeNet(咕咕net)

Adagrad

全名 Adaptive gradient algorithm ,翻译过来就是“适应梯度算法”,该算法能根据梯度中偏导数的大小给不同的偏导数以不同的学习率,偏导数大(小)的给个小(大)的学习率,以此来减少参数更新时的摆动。

其核心是引入一个参数对历次的梯度的平方进行累加,在更新阶段,基础学习率将除以这个参数的开方。这样大梯度会因为积累大而分得小的学习率,小梯度因为积累小而分得较大的学习率
$$s_{t+1} = s_{t}+\nabla_x L(x_t)^2$$
$$x_{t+1}=x_t-{\alpha\over \sqrt {s_{t+1}}+\epsilon}\nabla_x L(x_t)$$
其中$\epsilon$是一个很小的数,为了防止除法时分母出现零,一般设为1e-4到1e-8之间。下面是代码实现
clipboard.png


缺点:梯度平方的累计值在训练过程中不断增大,作为分母被除了以后学习率衰减过快,更新变慢

RMSprop

RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法,目的是为了解决 Adagrad 学习率急剧下降的问题。其在对梯度平方进行累加时会进行衰减处理(其实是指数加权平均),解决学习率急降的问题的同时又保留了 Adagrad 调节学习率的优点
$$s_{t+1} = \beta s_t +(1-\beta)\nabla_x L(x_t)^2$$
$$x_{t+1}= x_t-{\alpha\over \sqrt {s_{y+1}+}\epsilon}$$
$\gamma$ 通常为0.9/0.99
clipboard.png


以上两种方法解决了SGD的问题2️⃣

Adam

两种动量方法通过引入“速度”解决了问题1️⃣;Adagrad 和 RMSprop 通过引入“梯度平方”解决了问题2️⃣,各有千秋。为何不把两者结合起来然后一次满足两个愿望呢?这么一想,Adam就出来了。

Adam 相当于 RMSprop + Momentum,他除了像 RMSprop 一样存储了过去梯度平方的指数衰减平均值 ,也像 momentum 一样保持了过去梯度的指数衰减平均值:
$$v_{t+1} = \beta_1v_t + (1-\beta_1)\nabla_x L(x_t)$$
$$s_{t+1} = \beta_2s_t + (1-\beta_2)\nabla_x L(x_t)^2$$
如果 v 和 s 被初始化为 0 向量,那它们就会向 0 偏置,所以还需要偏差校正来抵消这些偏差:
$$\hat v_{t+1} = {v_{t+1}\over 1-\beta_1^{t+1}}$$
$$\hat s_{t+1} = {s_{t+1}\over 1-\beta_2^{t+1}}$$
最后的更新就是:
$$x_{t+1}=x_t-{\alpha \hat v_{t+1}\over\sqrt{\hat s_{t+1}}+\epsilon}$$
推荐值$\beta_1=0.9$,$\beta_2=0.99$,$\alpha=10^{-3}/5·10^{-4}$代码实现:
clipboard.png


Adam真的是一个非常棒的算法,实践表明,Adam 比其他适应性学习方法效果要好,几乎成为标配默认的算法啦。所以长篇大论了这么久之后的结论是——推荐首选Adam

你可能感兴趣的

载入中...