您的位置:首页 > 其它

常见优化算法 (tensorflow对应参数)

2017-12-13 10:42 351 查看


转载出处:http://www.2cto.com/kf/201612/572613.html


常见算法


SGD

?


Momentum

Momentum可以使SGD不至于陷入局部鞍点震荡,同时起到一定加速作用。

Momentum最开始有可能会偏离较远(overshooting the target),但是通常会慢慢矫正回来。
?


Nesterov momentum

基本思路是每次不在x位置求dx,而是在x+mu*v处更新dx,然后在用动量公式进行计算

相当于每次先到动量的位置,然后求梯度更新

vt=μvt?1?ε▽f(θt?1+μvt?1)

θt=θt?1+vt

计算▽f(θt?1+μvt?1)不太方便,做如下变量替换:?t?1=θt?1+μvt?1 ,并带回上述公式可以得到

vt=μvt?1+ε▽f(?t?1)

?t?1=?t?1?μvt?1+(1+μ)vt
?


AdaGrad

使用每个变量的历史梯度值累加作为更新的分母,起到平衡不同变量梯度数值差异过大的问题
?


RMSProp

在AdaGrad基础上加入了decay factor,防止历史梯度求和过大
?


ADAM

初始版本:类似于加入动量的RMSProp
?

真实的更新算法如下:
?

mb和vb起到最开始的时候warm up作用,t很大之后(1-beta1**t) =1


Second Order optimization methods

second-order taylor expansion:

J(θ)≈J(θ0)+(θ?theta0)T+12(θ?θ0)TH(θ?θ0)

θ?=θ0?H?1▽θJ(θ0)
Quasi_newton methods (BFGS) with approximate inverse Hessian matrix L-BFGS (limited memory BFGS)
Does not form/store the full inverse Hessian.
Usually works very well in full batch, deterministic mode


实际经验

ADAM通常会取得比较好的结果,同时收敛非常快相比SGD L-BFGS适用于全batch做优化的情况 有时候可以多种优化方法同时使用,比如使用SGD进行warm up,然后ADAM 对于比较奇怪的需求,deepbit两个loss的收敛需要进行控制的情况,比较慢的SGD比较适用


tensorflow 不同优化算法对应的参数


SGD

optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.learning_rate)


Momentum

optimizer = tf.train.MomentumOptimizer(lr, 0.9)


AdaGrad

optimizer = tf.train.AdagradientOptimizer(learning_rate=self.learning_rate)


RMSProp

optimizer = tf.train.RMSPropOptimizer(0.001, 0.9)


ADAM

optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate, epsilon=1e-08)

部分局部参数需要查找tensorflow官方文档

直接进行优化

train_op = optimizer.minimize(loss)
获得提取进行截断等处理

gradients, v = zip(*optimizer.compute_gradients(loss))

gradients, _ = tf.clip_by_global_norm(gradients, self.max_gradient_norm)

train_op = optimizer.apply_gradients(zip(gradients, v), global_step=self.global_step)

转载出处:http://www.2cto.com/kf/201612/572613.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: