1. 程式人生 > >人工智慧入門2.線性迴歸-理解TensorFlow中wb引數的含義

人工智慧入門2.線性迴歸-理解TensorFlow中wb引數的含義

剛開始入門的時候,我們經常遇到單層神經網路模型如下

b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 1], -1.0, 1.0))
y = tf.matmul(W, x) + b

我們如何去理解它。
輸入資料x 可以理解,輸出資料y也是可以理解的。
如何去理解w 和b的含義。今天我們來深度的解刨一下。

一、從簡單訓練簡單理解

x_data = np.float32(np.random.rand(1, 100)) # 隨機輸入
y_data = np.dot([0.100], x_data)
+ 0.300 b = tf.Variable(tf.zeros([1])) W = tf.Variable(tf.random_uniform([1, 1], -1.0, 1.0)) y = tf.matmul(W, x_data) + b loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss) init = tf.global_variables_initializer() sess = tf.
Session() sess.run(init) for step in range(0, 201): sess.run(train) if step % 20 == 0: print(step) print(sess.run(W)) print(sess.run(b))

如上圖和程式碼。

如果我們我一條簡單的離散資料,y_data = np.dot([0.100], x_data) + 0.300
我離散了這個資料在一條直線的左右兩邊。當然這個還不是真正的rand,我們只是舉例。

我們通過最小均方差的梯度訓練,最後我們能得到一條最合理的直線,y = wx + b 使得這些資料離我們訓練出來的舉例最小化。
這個就是最小均方差的概念


最後我們訓練的結果(如下)也是非常的接近我們離散之前的函式。0.1 和 0.3.

[[0.09999951]]
[0.30000028]

ok,這就是說訓練得到了好的結果。那麼,這個訓練的結果是如何來的。
當然是通過每一次的迭代的次數,使得w 和 b 更接近0.1 和0.3
那麼每一次迭代是瞎猜的嗎?也是可以的,你只要瞎猜然後,發現離自己的目標遠了就返回來。
但是科學是嚴謹的,這裡通過梯度下降法,得到合理的w 和 b的更新。接下來,講述梯度下降法的原理。需要一點數學基礎。

二、梯度下降法

1、梯度下降原理

簡單的來說應該說是梯度下降的迭代原理,

這邊三個變數,a(k+1) 和 a(k) 和 pT(k) 。
a(k+1) 是 a(k)的下一個係數,pT(K)是迭代變數。
梯度下降原理講的是你的係數a 怎麼最快達到極值,就是最大值最小值。

假設是上面一個曲線,沒有規則的曲線,你要通過最快的辦法,到達頂點,你只能靠瞎猜,指定一個迭代變數pT(k)為 -1
然後一直迭代,很快你就會發現最小的點大概在 (0,0)左右。
但是這個瞎猜的一個pT(K)不接近科學,接下來我們用數學模型的方式去表達這個迭代變數應該怎麼去定義。

2、迭代係數的更新原理

a、均方差的定義

F 表示均方誤差:

d表示我的理想,y表示你猜測出來的也就你迭代預測的結果。
這個公式意思就是兩個做平方差這個就是均方差的定義
很F明顯表示的是兩個軌跡之間每一次迭代迭代的差距,對吧。你也可以看成是兩個 函式的差距,那麼我們的任務就是要讓這兩個差距最小----這個是我們的歷史使命。

b、什麼做才會最快到達最小值

我們已經知道,如果d = y的話那就完全一樣了,我們怎麼做才能使F這個函式儘量快的達到最小呢F = 0 也就是 d = y 。
我們來看這個函式

一個函式什麼時候下降的最快,我們看到這也是一個關於w的二元一次函式。
科學家告訴你導數的負方向下降迭代最快。
我們對F函式求導數 得到

c、w係數更新的概述

我們根據梯度下降原理我們知道w序數的更新應該是這樣的 w(n+1)= w(n) + pT(n)
而我們通過期望函式d 和 實際函式 y做均方誤差最小化得到我們的這個T(n) 應該是等於 -2(d-y)x
另外p是迭代引數步長,在程式碼中我們採用固定步長 0.5:optimizer = tf.train.GradientDescentOptimizer(0.5)
其實這個迭代步長可以不固定,可以通過迭代進行更新,一般的現在使用函式下降,但是更加科學的是通過數學推導,提出一個動態步長迭代模型。

三、根據程式碼總結

我們總結一下一個單神經網路wb的模型是怎麼工作的

x_data = np.float32(np.random.rand(1, 100))
y_data = np.dot([0.100], x_data) + 0.300

b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 1], -1.0, 1.0))
y = tf.matmul(W, x_data) + b

如程式碼,
首先它又一個 期望 y_data 和 我們預測的y 還有W 引數和 b引數

loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

然後我們規定我們的損失函式loss 是一個均方差,當然你也可以定義交叉熵或者其他的損失函式,關於交叉熵的理解《1.交叉熵 - loss函式在Tensorflow中的定義》
然後在模型裡面GradientDescentOptimizer 是用這個梯度下降演算法 對w引數和b引數進行迭代更新
引數的更新和推導我們前面已經瞭解了(推導還沒有驗證)

for step in range(0, 201):
    sess.run(train)

最後我們通過迭代,完成訓練的模型。
相關文章《1.交叉熵 - loss函式在Tensorflow中的定義》
歡迎大家批評指正