TensorFlow学习笔记5.1——神经网络参数更新方法

当通过反向传播来计算解析梯度时,梯度就能够被用来进行参数更新了。一般来说,进行参数更新的方法有许多种,最简单的是沿着负梯度方向逐渐改变参数的的普通方法。又或可以引入动量(Momentum)这一概念…
常见的更新方法有:SGD(随机梯度下降)Momentum(动量)updateAdagradRMSpropAdam

一、SGD(随机梯度下降)
沿着参数的梯度负方向更新参数,即
在这里插入图片描述
这里x表示weights或bias一类的参数,dx指计算的梯度。

二、Momentum update
该方法可以看作是从物理角度上对于最优化问题得到的启发。质点所受的力就是损失函数的负梯度(F=-dx×U,U是高度势能,类比为损失loss的大小),因为F=ma,故得出负梯度与质点的加速度是成正比的。
所以从物理的角度来看:梯度只是影响了速度,而速度再来影响位置。
在这里插入图片描述
这里引入了一个初始化为0的变量v和一个超参数mu。mu看作是动量(一般值设为0.9),其意义相当于摩擦系数,抑制了速度,降低了系统的动能,让速度在迭代过程中逐渐衰减。

三、Nestrevo Momentum update
Nestrevo动量在理论上对于凸函数能够更好地收敛,实际效果比Momentum稍好。
其核心思路是:动量更新中,mu×v会稍微改变参数向量,使得更新方向不同于普通SGD更新,而Nestrevo动量将未来的近似位置x+mu×v看做是“向前看”。也就是说,既然知道动量更新会影响参数向量的位置,干脆不要在原点计算梯度,使用Nestrevo动量,直接在“向前看”的地方计算梯度。
在这里插入图片描述
在这里插入图片描述
直接使用x_ahead位置的梯度,而不是x位置的梯度。

以下三种是逐渐适应学习率的方法
四、Adagrad
在这里插入图片描述
cache的尺寸与梯度矩阵的尺寸相同,跟踪了每个参数的梯度的平方和,对于大的梯度,会使它的有效学习率减小,对于小的梯度,会使它的有效学习率增大,eps是平滑因子,用于放置出现0的情况。
Adagrad的缺点是深度学习中单调的学习率被证明通常过于激进,会导致学习过早停止。

五、RMSprop
一个有效但目前还未公开发布的自适应学习率方法,改进了Adagrad方法,减少它的激进性,具体来说就是适用了一个梯度平方的滑动均匀。
在这里插入图片描述
deacy_rate是一个超参数,改变了Adagrad中的cache变量。因此RMSprop仍然是基于梯度的大小对每个权重的学习率进行修改,与Adagrad不同的是,其更新不会让学习率单调变小。

六、Adam
看起来像RMSprop的动量版本,用平滑板的梯度m而不是原始的梯度向量dx。(默认设置eps=1e-8,beta1=0.9,beta2=0.999)
在这里插入图片描述
使用默认设置的Adam效果比RMSprop要好一些,但是也可以尝试SGD+Nestrevo Momentum方法。完整的Adam方法还包括一个bias矫正机制。

七、莫烦PYTHON的奇妙比喻

在学习莫烦PYTHON的“TensorFlow搭建自己的神经网络”教程中,发现up主能够用巧妙的比喻让人轻松地理解这几种更新方式的不同:

1、SGD(随机梯度下降)
SGD相当于将数据拆分成小批,再分批不断放入神经网络中计算。每次使用批量数据虽然不能反映整体数据的情况,不过却在很大程度上加速了神经网络的训练过程,而且也不会丢失太多准确率。
在这里插入图片描述
2、Momentum update
传统的神经网络更新方法是让权重加上学习率乘校正值(负梯度),这种方法可能会让学习过程曲折无比,就像喝醉的人回家时摇摇晃晃走了很多弯路。
在这里插入图片描述
所以,如果将醉汉从原地上放在一个斜坡上,由于惯性,他向一直向下走,其路径也就不会那么曲折,这就是动量更新。
在这里插入图片描述
3、Adagrad
假设给醉汉一双不好走路的鞋子,使得他摇晃着走路时会发现脚疼(相当于对走曲折路径进行一个惩罚penalize),鞋子变成了走弯路的阻力,逼着醉汉直着走。
这就是Momentum更新,在学习率上调整,使得每个参数的更新都有其与众不同的学习效率。
在这里插入图片描述
4.RMSprop
将下坡和不好走路的鞋子结合起来,有了Momentum的惯性原则加上Adagrad对错误方向的阻力,就能得出RMSprop更新方法。注意这里RMSprop还缺少了动量更新中的部分项,这一部分在Adam方法中补充了。
在这里插入图片描述
5.Adam
在更新参数时将Momentum的下坡属性和Adagrad中的阻力属性结合起来,在更新时同时考虑这两项,使得能够又快又好地达到目标并收敛。
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
神经网络训练完成后,我们可以使用模型对新的输入数据进行预测。以下是使用 TensorFlow 进行简单神经网络训练和测试的示例代码: ```python import tensorflow as tf # 定义输入数据 x = tf.placeholder(tf.float32, [None, input_size]) # 定义模型参数 W = tf.Variable(tf.zeros([input_size, num_classes])) b = tf.Variable(tf.zeros([num_classes])) # 定义模型 y = tf.nn.softmax(tf.matmul(x, W) + b) # 定义损失函数 y_ = tf.placeholder(tf.float32, [None, num_classes]) cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) # 定义优化器 train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy) # 训练模型 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(num_iterations): batch_xs, batch_ys = get_next_batch(train_data, train_labels, batch_size) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) # 测试模型 correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print("Accuracy: ", sess.run(accuracy, feed_dict={x: test_data, y_: test_labels})) ``` 在训练完成后,我们可以使用 `sess.run()` 函数来获取模型的输出。例如,如果我们想要对一个新的数据样本进行预测,我们可以将其传递给 `sess.run()` 函数的 `feed_dict` 参数,并获取模型的输出 `y`。下面是一个简单的示例: ```python # 定义要预测的数据 new_data = [[5.1, 3.5, 1.4, 0.2]] # 获取预测结果 prediction = sess.run(y, feed_dict={x: new_data}) # 打印预测结果 print(prediction) ``` 在上面的代码中,我们将 `new_data` 作为输入数据传递给模型,并使用 `sess.run()` 函数获取模型的输出 `y`。然后,我们打印预测结果即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值