譯文 | 與TensorFlow的第一次接觸第二篇:線性回歸

邀請關注微信公眾號:人工智慧LeadAI(ID:atleadai)

歡迎訪問我們的官方主頁:www.leadai.org

正文共3655個字,20張圖,預計閱讀時間:10分鐘。

本章中,將會利用TensorFlow實現一個簡單的模型:線性回歸。通過本示例,我會分析一些代碼基礎及說明如何在學習過程中調用各種重要組件,比如cost function或梯度下降演算法。

變數間關係的模型

線性回歸是用來度量變數間關係的統計技術。有意思的是該演算法的實現並不複雜,但可以適用於很多情形。正是因為這些原因,我非常樂意以線性回歸作為開始學習TensorFlow的開始。

請記住,不管在兩個變數(簡單回歸)或多個變數(多元回歸)情形下,線性回歸都是對一個依賴變數,多個獨立變數xi,一個隨機值b間的關係建模。

在本小節中,會創建一個簡單的例子來說明TensorFlow如何假設我們的數據模型符合一個簡單的線性回歸y = W * x + b,為達到這個目的,首先通過簡單的python代碼在二維空間中生成一系列的點,然後通過TensorFlow尋找最佳擬合這些點的直線。

首先要做的就是導入NumPy庫,通過該庫生成一些點,代碼如下:

通過該代碼,我們可以看到,我們生成了一些點並服從y = 0.1 * x + 0.3,因為增加了一些正態分布的偏差,所以這些點並不是完全符合這條直線,這樣我們就生成了一個很有意思的例子。

本例子中,這些點經過顯示後如下圖所示,

讀者可通過如下代碼來生成該分布圖(需要導入matplotlib庫的一些函數,通過pip來安裝matplotlib),

這些點將會是我們用來訓練模型的數據集。

cost function 與梯度下降演算法

下一步就是訓練我們的學習演算法,使其能從輸入數據x_data計算得到輸出值y。我們已經提前知道這是一個線性回歸模型,所以我們用兩個參數W與b來描述模型。

我們的目標是通過TensorFlow代碼找到最佳的參數W與b,使的輸入數據x_data,生成輸出數據y_data,本例中將會一條直線y_data=W*x_data+b。讀者知道W會接近0.1,b接近0.3,但是TensorFlow並不知道,它需要自己來計算得到該值。

標準的解決類似問題的方法是迭代數據集中的每一個值並修改參數W與b來每次獲得更精確的結果。為確保隨著迭代結果在逐漸變好,我們定義一個cost function(也被叫作「error function」)用來度量結果有多好(多壞)。

這個函數接收W與b的參數對並返回一個差值,該值代表了這條直線擬合數據的程度。在例子中,我們使用一個方差來表示cost function。通過平均方差,我們得到了演算法每次迭代中生成的預估值與真實值間距離的平均「錯誤」。

稍後,將會介紹cost function的更多細節與替代者,但在這個例子中,平均方差會幫助我們一步步往最好的方向發展。

現在是時候開始用TensorFlow編程實現上面分析地所有細節了。首先先創建三個變數,

通過調用Variable方法定義一個變數,該變數會保存在TensorFlow內部圖數據結構中。稍後我們會詳細分析方法中的參數,我認為現在我們還是繼續實現模型比較重要。

利用已經定義的變數,通過實際點與函數y= W * x + b計算得到的點之間的距離,我們可以實現cost function。隨後,計算它的平方,求和後得平均值。在TensorFlow中,此cost function可表示為:

loss = tf.reduce_mean(tf.square(y - y_data)),

通過代碼可以看到,此表達式計算了y_data與根據輸入x_data計算得到的點y間距離的平方的平均值。

此時,讀者可能已經知道擬合這些點最好的直線是有最小差值的那一條。因此,如果我們最小化error function,我們將會從數據中得到最好的模型。

這裡先不介紹優化函數的詳細細節,我們使用眾所周知的梯度下降優化演算法來最小化函數。在理論層面來說,梯度下降演算法是給定一個參數集的函數,從參數集的初始值開始,向著函數最小化的參數值方向逐步迭代。通過朝著函數梯度負方向迭代前進來達到最小化。對距離求平方可以很方便地保證該值為正值同時使error function可微來計算梯度。

梯度下降演算法以參數集的初始值開始(我們例子中是W與b),然後演算法在迭代過程中逐步修改這些參數值,演算法結束後,變數的值使得cost function獲得最小值。

在TensorFlow中使用該演算法,只需要執行下面兩行代碼:

optimizer = tf.train.GradientDescentOptimizer(0.5)ntrain = optimizer.minimize(loss)n

到現在為止,TensorFlow已經有足夠的信息在內部數據結構中創建相關數據,結構中也實現了一個為cost function定義的梯度下降演算法優化器,該優化器可能會在後面訓練過程中被調用。稍後我們會討論函數的參數—學習速率(我們例子中為0.5)。

運行演算法

如我們之前所學習到的,在代碼中調用的TensorFlow庫只是添加信息到內部圖中,TensorFlow還沒有運行該演算法。正如前一章節中的例子一樣,我們需要創建一個session,以train為參數調用run方法。因為我們已經定義了具體變數,我們必須提前初始化這些變數,命令代碼如下:

現在我們可以開始迭代處理過程,演算法會幫助我們找到W與b的值,該值使我們定義的模型能最好的擬合這些點。訓練過程直到在數據集上達到了指定精度後才會停止。在這個具體例子中,我們假設只需要8次迭代就足夠了,代碼如下:

這段代碼的運行結果中W與b的值會接近我們之前就知道的值。在這的機器上,列印的結果如下:

如果我們用下面代碼以圖的方式顯示結果:

我們在圖中可以看到8次迭代後得到的直線,參數W=0.0854與b=0.299.

為了簡單我們只執行了8次迭代,如果多迭代幾次,得到的參數值會更接近真實值。可通過下面命令來列印W與b的值:

print(step, sess.run(W), sess.run(b))n

在我的電腦中,顯示的結果如下:

可以發現演算法以初始值W=-0.0484與b=0.2972開始,然後演算法逐步迭代參數值來最小化cost function。

同樣可以用如下代碼察看cost function逐漸減小的過程:

print(step,sess.run(loss))n

在我機器上,顯示的結果是:

建議讀者把每次迭代後的圖列印出來,這樣我們可以觀察演算法每次調整參數值的過程,在本例子中,8次迭代過程的快照如下所示:

從圖中可以讀者可以發現,演算法在每次迭代過程中都對數據擬合的越來越好。那麼,梯度下降演算法是如何逐漸逼近參數的值來使的cost function最小化呢?

因為我們的錯誤函數由兩個參數(W和b)構成,可將其視為二維平面。該平面中的每一個點代表一條線。每個點上函數的高度是這條線的錯誤值。該平面上,一些線包含的錯誤值要比其它的小。當TensorFlow開始執行梯度下降查找後,它會從平面上某一點(例子中的點是W= -0.04841119與b= 0.29720169)開始,沿著最小差值的方向前進。

為在錯誤函數上運行梯度下降演算法,TensorFlow計算它的梯度。梯度就像一個指南針,指引我們朝著最小的方向前進。為了計算梯度,TensorFlow會對錯誤函數求導,在我們的例子中就是,演算法需要對W和b計算部分導數,以在每次迭代中為前進指明方向。

之前提到的學習速率,控制著每次迭代中TensorFlow前進的步長。如果該參數設置過大,可能會越過最小值。相反,如果該參數過小,需要大量迭代才能到達最小值。所以,使用恰當的學習速率非常重要。有一些不同的技術來選取學習速率,但這已經超出了本書討論的範圍。一個確保梯度下降演算法很好工作的方法是確保每次迭代中錯誤都在減小。

為了幫助讀者測試運行本章中的代碼,讀者可以從Github上下載regression.py文件,下面是該方件中的全部代碼:

本章中,我們通過一個基本的線性回歸演算法來學習了TensorFlow庫兩個基本組件的使用:cost function與梯度下降演算法。下一章節中我們會詳細分析TensorFlow中基礎數據結構的細節。

PS : 下一章分析聚類演算法,因工作比較忙,盡全力保持翻譯與更新吧~~謝謝喜歡本文的同學~~

原文鏈接:jianshu.com/p/b26167e94

查閱更為簡潔方便的分類文章以及最新的課程、產品信息,請移步至全新呈現的www.leadai.org

關注人工智慧LeadAI公眾號,查看更多專業文章

weixin.qq.com/r/ZDnC2j- (二維碼自動識別)

大家都在看

LSTM模型在問答系統中的應用

基於TensorFlow的神經網路解決用戶流失概覽問題

最全常見演算法工程師面試題目整理(一)

最全常見演算法工程師面試題目整理(二)

TensorFlow從1到2 | 第三章 深度學習革命的開端:卷積神經網路

裝飾器 | Python高級編程

今天不如來複習下Python基礎

推薦閱讀:

[R]線性回歸
機器學習筆記9 —— 過擬合和正則化
10分鐘快速入門PyTorch (1)
【預測演算法】01. 線性回歸原理及R語言實現

TAG:TensorFlow | 线性回归 |