上一篇 6 解鎖梯度下降算法解釋清楚了學(xué)習(xí)率(learning rate)滤港。本篇基于對(duì)梯度下降算法和學(xué)習(xí)率的理解灾前,去填下之前在線性回歸中發(fā)現(xiàn)的一個(gè)坑。
在5 TF輕松搞定線性回歸中提到珠月,只要把TF官方Get Started中線性回歸例子中的訓(xùn)練數(shù)據(jù)換一下渔工,就會(huì)出現(xiàn)越訓(xùn)練“損失”越大,直到模型參數(shù)都stackoverflow的情況桥温。然而更換訓(xùn)練數(shù)據(jù)是我們學(xué)習(xí)代碼的過程中再普通不過的行為引矩,從stackoverflow.com上也能搜到很多人做了類似的嘗試而遇到了這個(gè)問題。到底為什么這么經(jīng)不住折騰侵浸?馬上攤開看旺韭。
更換訓(xùn)練數(shù)據(jù)如下:
- 參數(shù)初始值a=-1,b=50掏觉;
- 訓(xùn)練數(shù)據(jù)x_train = [22, 25]区端;
- 訓(xùn)練數(shù)據(jù)y_train = [18, 15]。
先亮個(gè)底:給出的訓(xùn)練數(shù)據(jù)只有兩組但足夠了澳腹,兩點(diǎn)成一線织盼,要擬合的直線心算下就能得出是y=-x+40杨何,a是-1,b是40沥邻。
運(yùn)行使用新數(shù)據(jù)的代碼:
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))
為了方便觀察危虱,讓程序訓(xùn)練了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
參數(shù)越練損失越大的趨勢(shì)果然重現(xiàn)了唐全。
現(xiàn)在我們已經(jīng)掌握了梯度下降大法埃跷,就來看看每次訓(xùn)練的結(jié)果到底是怎么產(chǎn)生的。
手工計(jì)算了兩次迭代邮利,和程序輸出一致弥雹。
圖中顯示,訓(xùn)練樣本(已紅色標(biāo)出)的值對(duì)梯度值的貢獻(xiàn)很大延届,而此時(shí)沿用之前的學(xué)習(xí)率η=0.01就顯得不夠小了剪勿。訓(xùn)練樣本既然不可調(diào),那么顯然只能調(diào)小學(xué)習(xí)率了方庭。隨之而來的副作用就是會(huì)導(dǎo)致學(xué)習(xí)緩慢厕吉,所以還得增加訓(xùn)練的次數(shù)。這就是之前的例子中最終調(diào)整為η=0.0028二鳄,epoch=70000的原因了赴涵。
如此看來媒怯,這的確不是TF的bug订讼。再一次體會(huì):訓(xùn)練是一門藝術(shù)。
上一篇 6 解鎖梯度下降算法
下一篇 8 萬(wàn)能函數(shù)的形態(tài):人工神經(jīng)網(wǎng)絡(luò)
共享協(xié)議:署名-非商業(yè)性使用-禁止演繹(CC BY-NC-ND 3.0 CN)
轉(zhuǎn)載請(qǐng)注明:作者黑猿大叔(簡(jiǎn)書)