优化器Optimizer

目前最流行的5种优化器:Momentum(动量优化)、NAG(Nesterov梯度加速)、AdaGrad、RMSProp、Adam,所有的优化算法都是在原始梯度下降算法的基础上增加惯性和环境感知因素进

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

目前最流行的5种优化器:Momentum(动量优化)、NAG(Nesterov梯度加速)、AdaGrad、RMSProp、Adam,所有的优化算法都是在原始梯度下降算法的基础上增加惯性和环境感知因素进行持续优化

Momentum优化

momentum优化的一个简单思想:考虑物体运动惯性,想象一个保龄球在光滑表面滚下一个平缓的坡度,最开始会很慢,但是会迅速地恢复动力,直到达到最终速度(假设又一定的摩擦力核空气阻力)

momentum优化关注以前的梯度是多少,公式:

\((1)m \leftarrow \beta m + \eta \nabla _\theta J(\theta)\)

\((2)\theta \leftarrow \theta – m\)

超参数\(\beta\)称为动量,其必须设置在0(高摩擦)和1(零摩擦)之间,默认值为0.9

可以很容易地验证当梯度保持一个常量,最终速度(即权重的最大值)就等于梯度乘以学习率乘以\(\frac{1}{1-\beta}\),当\(\beta = 0.9\)时,那么最终速度等于10倍梯度乘以学习率,所有momentum优化最终会比梯度下降快10倍,在不适用批量归一化的深度神经网络中,高层最终常会产生不同尺寸的输入,因此使用momentum优化会很有帮助,同时还会帮助跨过局部最优

由于又动量,优化器可能会超调一点,然后返回,再超调,来回震荡多次后,最后稳定在最小值,这也是系统中要有一些摩擦的原因之一,它可以帮助摆脱震荡,从而加速收敛

optimizer = tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9)

Nesterov梯度加速

公式:

\((1)m \leftarrow \beta m + \eta \nabla _\theta J(\theta + \beta m)\)

\((2)\theta \leftarrow \theta – m\)

与momentum唯一不同的是用\(\theta + \beta m\)来测量梯度,这个小调整有效是因为在通常情况下,动量矢量会指向正确的方向,所以在该方向相对远的地方使用梯度会比在原有地方更准确一些

optimizer = tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9,use_nesterov=True)

AdaGrad

AdaGrad对于简单的二次问题一般表现都不错,但是在训练神经网络时却经常很早就停滞了,学习速率缩小得很多,在到达全局最优前算法就停止了,所以尽管tensorflow又AdagradOptimizer,也不要用它来训练深度神经网络
公式:

\((1)s \leftarrow s + \nabla _\theta J(\theta) \otimes \nabla _\theta J(\theta)\)

\((2)\theta \leftarrow \theta – \eta \nabla _\theta J(\theta) \oslash \sqrt{s+\varepsilon}\)

RMSProp

AdaGrad降速太快而且没有办法收敛到全局最优,RMSProp算法却通过仅积累最近迭代中得梯度(而非从训练开始得梯度)解决这个问题,它通在第一步使用指数衰减开实现
公式:

\((1)s \leftarrow \beta s + (1-\beta)\nabla _\theta J(\theta) \otimes \nabla _\theta J(\theta)\)

\((2)\theta \leftarrow \theta – \eta \nabla _\theta J(\theta) \oslash \sqrt{s+\varepsilon}\)

衰减率\(\eta\)通常为0.9

optimizer = tf.train.RMSPropOptimizer(learning_rate=learning_rate,momentum=0.9,decay=0.9,epsilon=0.9)

除去非常简单得问题,这个优化器得表现几乎全部优于AdaGrad,同时表现也基本都优于Momentum优化和NAG,事实上在Adam优化出现之前,它是众多研究者所推荐得优化算法

Adam优化

Adam代表了自适应力矩估计,集合了Momentum优化和RmsProp的想法,类似Momentum优化,它会跟踪过去梯度的指数衰减平均值,同时也类似RMSProp,它会跟踪过去梯度平方的指数衰减平均值,

Adam算法:

\((1)m \leftarrow \beta_1 m + (1-\beta_i) \nabla _\theta J(\theta)\)

\((2)s \leftarrow \beta_2s +(1-\beta_2)\nabla _\theta J(\theta) \otimes \nabla _\theta J(\theta)\)

\((3)m \leftarrow \frac{m}{1-\beta_1^T}\)

\((4)s \leftarrow \frac{s}{1-\beta_2^T}\)

\((5)\theta \leftarrow \theta – \eta m\oslash \sqrt{s+\varepsilon}\)

注:T表示迭代次数(从1开始)

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)

使用Adam优化器对mnist进行测试

import tensorflow as tf
from tensorflow.contrib.layers import fully_connected,batch_norm
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets('MNIST_data',one_hot=True)

tf.reset_default_graph()
n_input = 784
n_hidden1 = 300
n_hidden2 = 100
n_output = 10

X = tf.placeholder(tf.float32,shape=(None,n_input),name='X')
Y = tf.placeholder(tf.int64,shape=(None,10),name='Y')
#归一化参数
is_training = tf.placeholder(tf.bool,shape=(),name='is_training')
bn_params = {'is_training':is_training,'decay':0.99,'updates_collections':None}

with tf.name_scope('dnn'):
    with tf.contrib.framework.arg_scope([fully_connected],normalizer_fn=batch_norm,normalizer_params=bn_params):
        hidden1 = fully_connected(X,n_hidden1,activation_fn=tf.nn.elu,scope='hidden1')
        hidden2 = fully_connected(hidden1,n_hidden2,activation_fn=tf.nn.elu,scope='hidden2')
        y_prab = fully_connected(hidden2,n_output,activation_fn=tf.nn.softmax,scope='output')
with tf.name_scope('train'):
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=Y,logits=y_prab))
    learning_rate = tf.placeholder(tf.float32,shape=(),name='learning_rate')
    optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss)
with tf.name_scope('accuracy'):
    prab_bool = tf.equal(tf.argmax(y_prab,1),tf.argmax(Y,1))
    accuracy = tf.reduce_mean(tf.cast(prab_bool,tf.float32))
with tf.name_scope('tensorboard_mnist'):
    file_writer = tf.summary.FileWriter('./tensorboard/',tf.get_default_graph())
    accuracy_summary = tf.summary.scalar('accuracy',accuracy)
with tf.name_scope('saver'):
    saver = tf.train.Saver()
with tf.name_scope('collection'):
    tf.add_to_collection('logits',y_prab)
    
epoches = 20
batch_size = 100
n_batches = mnist.train.num_examples // batch_size
rate = 0.1
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(epoches):
        for batch in range(n_batches):
            x_batch,y_batch = mnist.train.next_batch(batch_size)
            sess.run(optimizer,feed_dict={X:x_batch,Y:y_batch,learning_rate:rate,is_training:True})
        result = sess.run([accuracy,accuracy_summary],feed_dict={X:mnist.test.images,Y:mnist.test.labels,
                                                                 learning_rate:rate,is_training:False})
        
        file_writer.add_summary(result[1],epoch)
        print('epoch:{},accuracy:{}'.format(epoch,result[0]))
    saver.save(sess,'./model/model_final.ckpt',global_step=5)
    print('stop')
Extracting MNIST_data\train-images-idx3-ubyte.gz
Extracting MNIST_data\train-labels-idx1-ubyte.gz
Extracting MNIST_data\t10k-images-idx3-ubyte.gz
Extracting MNIST_data\t10k-labels-idx1-ubyte.gz
epoch:0,accuracy:0.945900022983551
epoch:1,accuracy:0.9574999809265137
epoch:2,accuracy:0.9635000228881836
epoch:3,accuracy:0.9693999886512756
epoch:4,accuracy:0.970300018787384
epoch:5,accuracy:0.9704999923706055
epoch:6,accuracy:0.9758999943733215
epoch:7,accuracy:0.9757999777793884
epoch:8,accuracy:0.9768999814987183
epoch:9,accuracy:0.9783999919891357
epoch:10,accuracy:0.9783999919891357
epoch:11,accuracy:0.9642999768257141
epoch:12,accuracy:0.9779999852180481
epoch:13,accuracy:0.9799000024795532
epoch:14,accuracy:0.9760000109672546
epoch:15,accuracy:0.977400004863739
epoch:16,accuracy:0.9819999933242798
epoch:17,accuracy:0.9781000018119812
epoch:18,accuracy:0.9661999940872192
epoch:19,accuracy:0.9779000282287598
stop
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120023.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java虚拟机内存大小_jvm内存分布

    java虚拟机内存大小_jvm内存分布目录一、虚拟机二、虚拟机组成1.栈栈帧2.程序计数器3.方法区对象组成4.本地方法栈5.堆GCGC案例一、虚拟机​同样的java代码在不同平台生成的机器码肯定是不一样的,因为不同的操作系统底层的硬件指令集是不同的。同一个java代码在windows上生成的机器码可能是0101…….,在linux上生成的可能是1100…….

    2022年10月20日
    0
  • todomvc项目_reactive vue

    todomvc项目_reactive vue所有实现代码在文章结尾处分析整个实现过程的步骤:1.显示大标题“todoMVC”在h1中引入{{msg}},在js文件中将msg赋值,从而在html中显示大标签的内容2.当没有数据时,两块模板需要隐藏,用到v-if标签。将两个模板放在一个template标签中,当items.length=0时,则v-if=false,进而两块模板隐藏。3.引入数据。将JS中写好的默认数据引入在html的每一个li标签中。4.将每个事件划分为完成/未完成。该功能用到双向数据绑定,可以在浏览器中vue模

    2022年9月12日
    0
  • 安卓udp发包工具_好装逼牌udp-tcp发包工具

    安卓udp发包工具_好装逼牌udp-tcp发包工具这是好装逼牌udp-tcp发包工具,界面看着好像很牛逼,是不是草包自己实验吧,听说可以穿透安全狗和金盾冰盾之类的防火墙,黑软有风险使用需谨慎,不过玩黑软也有好处,有可能警察叔叔会帮你解决住房问题和吃住问题==!你懂吗?软件特点1.可收发TCP/UDP数据。2.对于TCP,支持服务器和客户端模式。3.支持多连接,可同时对多路网络连接进行操作。4.对于UDP,支持组播方式。5.可显示当前数据传输速度…

    2022年9月5日
    2
  • rider 激活码【2021.10最新】

    (rider 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~23LN…

    2022年3月29日
    68
  • python怎么把字体调大_python修改字体

    python怎么把字体调大_python修改字体Pycharm4.5是一款非常强大的Python代码编辑器,其具备了易于上手、功能强大等特点,深受广大开发人员的青睐,而在使用的过程中,我们常常需要设置字体的大小以及背景颜色等参数,从而能够为用户带来更好的代码编辑效果,而部分刚入手的用户可能还不知到如何进行设置,小编这里为用户带来了Pycharm4.5设置字体大小与背景颜色的操作操作教程,有需要的用户赶紧来了解一下吧,想必能够为用户带来帮助!方法…

    2022年8月26日
    4
  • 推荐系统中传统模型——LightGBM + FFM融合

    推荐系统中传统模型——LightGBM + FFM融合之前比较相关的文章:推荐系统中传统模型——LightGBM+LR融合python-机器学习lightgbm相关实践1深入FFM原理与实践来自美团技术团队的,深入FFM原理与实践FM和FFM模型是最近几年提出的模型,凭借其在数据量比较大并且特征稀疏的情况下,仍然能够得到优秀的性能和效果的特性,屡次在各大公司举办的CTR预估比赛中获得不错的战绩。美团技术团队在搭建DSP的过程中,探索并使用了FM和FFM模型进行CTR和CVR预估,并且取得了不错的效果。经过One-Hot编码之后,大部分

    2022年5月27日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号