全国服务热线: 加QQ996934
最新公告:
seo培训学习,企业站seo实战培训,培训seo教学课程——实战为主,理论为辅,诚信不变,力保双赢...
SEO培训service
SEO联系Contact us
地址:
中国CHINA
邮箱:
996934@qq.com
电话:
加QQ996934
传真:
加QQ996934
培训seo教学   当前位置:首页 > SEO资讯 > 培训seo教学
关于深度学习优化器 optimizer 的选择,你需要了解这些发布时间:2019-10-06

  在很多机器学习和深度学习的应用中,我们发现用的最多的优化器是 Adam,为什么呢?在 keras 中也有 SGD,RMSprop,培训seo教学课程Adagrad,Adadelta,Adam 等,详情:我们可以发现除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢?在 Sebastian Ruder 的这篇论文中给出了常用优化器的比较,今天来学习一下:由于这种方法是在一次更新中,seo培训学习就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型 params_grad evaluate_gradient(loss_function, data, params) params params learning_rate * params_grad 我们会事先定义一个迭代次数 epoch,首先计算梯度向量 params_grad,然后沿着梯度的方向更新参数 params,learning rate 决定了我们每一步迈多大。 Batch gradient descent 对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余, params_grad evaluate_gradient(loss_function, example, params) params params learning_rate * params_grad 但是 SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。 BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。 for batch in get_batches(data, batch_size 50): params_grad evaluate_gradient(loss_function, batch, params) params params learning_rate * params_grad 不过 Mini batch gradient descent 不能保证很好的收敛性: 1. learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点) 2. 此外,这种方法是对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。 3. 另外,对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error 是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。鞍点就是:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。例如下图这个二维图形,像个马鞍:在x 轴方向往上曲,在y 轴方向往下曲,鞍点就是(0,0) SGD 在 ravines 的情况下容易被困住, ravines 就是曲面的一个方向比另一个方向更陡,这时 SGD 会发生震荡而迟迟不能接近极小值:当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。这种情况相当于小球从山上滚下来时是在盲目地沿着坡滚,如果它能具备一些先知,例如快要上坡时,就知道需要减速了的话,适应性会更好。用 θ−γv_t−1 来近似当做参数下一步会变成的值,培训seo教学课程则在计算梯度时,不是在当前位置,而是未来的位置上蓝色是 Momentum 的过程,会先计算当前的梯度,然后在更新后的累积梯度后会有一个大的跳跃。而 NAG 会先在前一步的累积梯度上(brown vector)有一个大的跳跃,然后衡量一下梯度做一下修正(red vector),这种预期的更新可以避免我们走的太快。目前为止,我们可以做到,在更新梯度时顺应 loss function 的梯度来调整速度,并且对 SGD 进行加速。这个算法就可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性,例如识别 Youtube 视频里面的猫,训练 GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。其中 G_t 是个对角矩阵, (i,i) 元素就是 t 时刻参数 θ_i 的梯度平方和。此外,还将学习率 η 换成了 RMS[Δθ],这样的话,我们甚至都不需要提前设定学习率了: RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的,除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值:如果 mt 和 vt 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,由图可知自适应学习率方法即 Adagrad, Adadelta, RMSprop, Adam 在这种情景下会更合适而且收敛性更好。如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。 Adam 就是在 RMSprop 的基础上加了 bias correction 和 momentum,很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。SEO实战-SEO站外实战课程(实战才是硬道理)