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

TensorFlow从0到1系列回顾

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。再一次体会:训练是一门艺术

上一篇 6 解锁梯度下降算法
下一篇 8 万能函数的形态:人工神经网络


共享协议:署名-非商业性使用-禁止演绎(CC BY-NC-ND 3.0 CN)
转载请注明:作者黑猿大叔(简书)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容