专栏首页TensorFlow从0到NTensorFlow从0到1 - 7 - TensorFlow线性回归的参数溢出之坑

TensorFlow从0到1 - 7 - TensorFlow线性回归的参数溢出之坑

stackoverflow

上一篇 6 解锁梯度下降算法解释清楚了学习率(learning rate)。本篇基于对梯度下降算法和学习率的理解,去填下之前在线性回归中发现的一个坑。

在5 TF轻松搞定线性回归中提到,只要把TF官方Get Started中线性回归例子中的训练数据换一下,就会出现越训练“损失”越大,直到模型参数都stackoverflow的情况。然而更换训练数据是我们学习代码的过程中再普通不过的行为,从stackoverflow.com上也能搜到很多人做了类似的尝试而遇到了这个问题。到底为什么这么经不住折腾?马上摊开看。

更换训练数据如下:

  • 参数初始值a=-1,b=50;
  • 训练数据x_train = [22, 25];
  • 训练数据y_train = [18, 15]。

先亮个底:给出的训练数据只有两组但足够了,两点成一线,要拟合的直线心算下就能得出是y=-x+40,a是-1,b是40。

运行使用新数据的代码:

import tensorflow as tf

# model parameters
a = tf.Variable([-1.], tf.float32)
b = tf.Variable([50.], tf.float32)

# model input and output
x = tf.placeholder(tf.float32)
linear_model = a * x + b
y = tf.placeholder(tf.float32)

# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) / 4   # sum of the squares

# training data
x_train = [22, 25]
y_train = [18, 15]

# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for i in range(10):
    sess.run(train, {x: x_train, y: y_train})
    curr_a, curr_b, curr_loss = sess.run([a, b, loss], {x: x_train, y: y_train})
    print("a: %s b: %s loss: %s" % (curr_a, curr_b, curr_loss))

# evaluate training accuracy
curr_a, curr_b, curr_loss = sess.run([a, b, loss], {x: x_train, y: y_train})
print("a: %s b: %s loss: %s" % (curr_a, curr_b, curr_loss))

为了方便观察,让程序训练了10次,输出是:

a: [-3.3499999] b: [ 49.90000153] loss: 1033.39
a: [ 7.35424948] b: [ 50.35325241] loss: 21436.4
a: [-41.40307999] b: [ 48.28647232] loss: 444752.0
a: [ 180.68467712] b: [ 57.69832993] loss: 9.22756e+06
a: [-830.91589355] b: [ 14.8254509] loss: 1.9145e+08
a: [ 3776.88330078] b: [ 210.10742188] loss: 3.97214e+09
a: [-17211.45703125] b: [-679.39624023] loss: 8.24126e+10
a: [ 78389.59375] b: [ 3372.25512695] loss: 1.70987e+12
a: [-357069.3125] b: [-15082.85644531] loss: 3.54758e+13
a: [ 1626428.5] b: [ 68979.421875] loss: 7.36039e+14
a: [ 1626428.5] b: [ 68979.421875] loss: 7.36039e+14

参数越练损失越大的趋势果然重现了。

现在我们已经掌握了梯度下降大法,就来看看每次训练的结果到底是怎么产生的。



手工计算了两次迭代,和程序输出一致。

图中显示,训练样本(已红色标出)的值对梯度值的贡献很大,而此时沿用之前的学习率η=0.01就显得不够小了。训练样本既然不可调,那么显然只能调小学习率了。随之而来的副作用就是会导致学习缓慢,所以还得增加训练的次数。这就是之前的例子中最终调整为η=0.0028,epoch=70000的原因了。

如此看来,这的确不是TF的bug。再一次体会:训练是一门艺术

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • TensorFlow从0到1 - 12 - TensorFlow构建3层NN玩转MNIST

    上一篇 11 74行Python实现手写体数字识别展示了74行Python代码完成MNIST手写体数字识别,识别率轻松达到95%。这算不上一个好成绩,不过我并...

    黑猿大叔
  • TensorFlow从0到1 - 5 - TensorFlow轻松搞定线性回归

    上一篇 第一个机器学习问题 其实是一个线性回归问题(Linear Regression),呈现了用数据来训练模型的具体方式。本篇从平行世界返回,利用Tenso...

    黑猿大叔
  • TensorFlow从0到1 - 16 - L2正则化对抗“过拟合”

    前面的14 交叉熵损失函数——防止学习缓慢和15 重新思考神经网络初始化从学习缓慢问题入手,尝试改进神经网络的学习。本篇讨论过拟合问题,并引入与之相对的L2正...

    黑猿大叔
  • 【AI初识境】深度学习中常用的损失函数有哪些?

    这是专栏《AI初识境》的第11篇文章。所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法。

    用户1508658
  • 深度学习中常用的损失函数loss有哪些?

    这是专栏《AI初识境》的第11篇文章。所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法。

    小草AI
  • 论文阅读|How Does Batch Normalizetion Help Optimization

    Batch Normalization在2015年被谷歌提出,因为能够加速训练及减少学习率的敏感度而被广泛使用。

    AI部落联盟
  • 论文阅读|How Does Batch Normalizetion Help Optimization

    Batch Normalization在2015年被谷歌提出,因为能够加速训练及减少学习率的敏感度而被广泛使用。

    zenRRan
  • Tensorflow入门教程(二十二)——分割模型中的损失函数

    在之前的篇章中我分享过2D和3D分割模型的例子,里面有不同的分割网络Unet,VNet等。今天我就从损失函数这个方向给大家分享一下在分割模型中常用的一些函数。

    用户7498388
  • 深度学习如何调参?

    对于深度学习本人也是半路出家. 现在的工作内容主要就是使用CNN做CV任务. 干调参这种活也有两年时间了. 我的回答可能更多的还是侧重工业应用, 技术上只限制在...

    智能算法
  • 深度学习如何调参?

    智能算法

扫码关注云+社区

领取腾讯云代金券