AI:如何訓(xùn)練機器學(xué)習(xí)的模型
1.Training: 如何訓(xùn)練模型
一句話理解機器學(xué)習(xí)一般訓(xùn)練過程 :通過有標簽樣本來調(diào)整(學(xué)習(xí))并確定所有權(quán)重Weights和偏差Bias的理想值。
訓(xùn)練的目標:最小化損失函數(shù)
(損失函數(shù)下面馬上會介紹)
機器學(xué)習(xí)算法在訓(xùn)練過程中,做的就是:檢查多個樣本并嘗試找出可最大限度地減少損失的模型;目標就是將損失(Loss)最小化

上圖就是一般模型訓(xùn)練的一般過程(試錯過程),其中
- 模型: 將一個或多個特征作為輸入,然后返回一個預(yù)測 (y') 作為輸出。為了進行簡化,不妨考慮一種采用一個特征并返回一個預(yù)測的模型,如下公式(其中b為 bias,w為weight)

- 計算損失:通過損失函數(shù),計算該次參數(shù)(bias、weight)下的loss。
- 計算參數(shù)更新:檢測損失函數(shù)的值,并為參數(shù)如bias、weight生成新值,以降低損失為最小。
例如:使用梯度下降法,因為通過計算整個數(shù)據(jù)集中w每個可能值的損失函數(shù)來找到收斂點這種方法效率太低。所以通過梯度能找到損失更小的方向,并迭代。
舉個TensorFlow代碼栗子,對應(yīng)上面公式在代碼中定義該線性模型:
y_output = tf.multiply(w,x) + b
假設(shè)該模型應(yīng)用于房價預(yù)測,那么y_output為預(yù)測的房價,x為輸入的房子特征值(如房子位置、面積、樓層等)
2. Loss Function:損失和損失函數(shù)
損失是一個數(shù)值 表示對于單個樣本而言模型預(yù)測的準確程度。
如果模型的預(yù)測完全準確,則損失為零,否則損失會較大。
訓(xùn)練模型的目標是從所有樣本中找到一組平均損失“較小”的權(quán)重和偏差。
損失函數(shù)的目標:準確找到預(yù)測值和真實值的差距

如圖 紅色箭頭表示損失,藍線表示預(yù)測。明顯左側(cè)模型的損失較大;右側(cè)模型的損失較小
要確定loss,模型必須定義損失函數(shù) loss function。例如,線性回歸模型通常將均方誤差用作損失函數(shù),而邏輯回歸模型則使用對數(shù)損失函數(shù)。
正確的損失函數(shù),可以起到讓預(yù)測值一直逼近真實值的效果,當預(yù)測值和真實值相等時,loss值最小。
舉個TensorFlow代碼栗子,在代碼中定義一個損失loss_price 表示房價預(yù)測時的loss,使用最小二乘法作為損失函數(shù):
loss_price = tr.reduce_sum(tf.pow(y_real - y_output), 2)
這里,y_real是代表真實值,y_output代表模型輸出值(既上文公式的y' ),因為有的時候這倆差值會是負數(shù),所以會對誤差開平方,具體可以搜索下最小二乘法公式
3. Gradient Descent:梯度下降法
理解梯度下降就好比在山頂以最快速度下山:
好比道士下山,如何在一座山頂上,找到最短的路徑下山,并且確定最短路徑的方向
原理上就是凸形問題求最優(yōu)解,因為只有一個最低點;即只存在一個斜率正好為 0 的位置。這個最小值就是損失函數(shù)收斂之處。

通過計算整個數(shù)據(jù)集中 每個可能值的損失函數(shù)來找到收斂點這種方法效率太低。我們來研究一種更好的機制,這種機制在機器學(xué)習(xí)領(lǐng)域非常熱門,稱為梯度下降法。
梯度下降法的目標:尋找梯度下降最快的那個方向
梯度下降法的第一個階段是為 選擇一個起始值(起點)。起點并不重要;因此很多算法就直接將 設(shè)為 0 或隨機選擇一個值。下圖顯示的是我們選擇了一個稍大于 0 的起點:

然后,梯度下降法算法會計算損失曲線在起點處的梯度。簡而言之,梯度是偏導(dǎo)數(shù)的矢量;它可以讓您了解哪個方向距離目標“更近”或“更遠”。請注意,損失相對于單個權(quán)重的梯度(如圖 所示)就等于導(dǎo)數(shù)。
請注意,梯度是一個矢量,因此具有以下兩個特征:
- 方向
- 大小
梯度始終指向損失函數(shù)中增長最為迅猛的方向。梯度下降法算法會沿著負梯度的方向走一步,以便盡快降低損失
為了確定損失函數(shù)曲線上的下一個點,梯度下降法算法會將梯度大小的一部分與起點相加

然后,梯度下降法會重復(fù)此過程,逐漸接近最低點。(找到了方向)
- 隨機梯度下降法SGD:解決數(shù)據(jù)過大,既一個Batch過大問題,每次迭代只是用一個樣本(Batch為1),隨機表示各個batch的一個樣本都是隨機選擇。
4. Learning Rate:學(xué)習(xí)速率
好比上面下山問題中,每次下山的步長。
因為梯度矢量具有方向和大小,梯度下降法算法用梯度乘以一個稱為學(xué)習(xí)速率(有時也稱為步長)的標量,以確定下一個點的位置。這是超參數(shù),用來調(diào)整AI算法速率
例如,如果梯度大小為 2.5,學(xué)習(xí)速率為 0.01,則梯度下降法算法會選擇距離前一個點 0.025 的位置作為下一個點。
超參數(shù)是編程人員在機器學(xué)習(xí)算法中用于調(diào)整的旋鈕。大多數(shù)機器學(xué)習(xí)編程人員會花費相當多的時間來調(diào)整學(xué)習(xí)速率。如果您選擇的學(xué)習(xí)速率過小,就會花費太長的學(xué)習(xí)時間:

繼續(xù)上面的栗子,實現(xiàn)梯度下降代碼為:
train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss_price)
這里設(shè)置梯度下降學(xué)習(xí)率為0.025, GradientDescentOptimizer()就是使用的隨機梯度下降算法, 而loss_price是由上面的損失函數(shù)獲得的loss
至此有了模型、損失函數(shù)以及梯度下降函數(shù),就可以進行模型訓(xùn)練階段了:
Session = tf.Session()
Session.run(init)
for _ in range(1000):
Session.run(train_step, feed_dict={x:x_data, y:y_data})
這里可以通過for設(shè)置固定的training 次數(shù),也可以設(shè)置條件為損失函數(shù)的值低于設(shè)定值,
x_data y_data則為訓(xùn)練所用真實數(shù)據(jù),x y 是輸入輸出的placeholder(代碼詳情參見TensorFlow API文檔)
5. 擴展:BP神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程
BP(BackPropagation)網(wǎng)絡(luò)的訓(xùn)練,是反向傳播算法的過程,是由數(shù)據(jù)信息的正向傳播和誤差Error的反向傳播兩個過程組成。
反向傳播算法是神經(jīng)網(wǎng)絡(luò)算法的核心,其數(shù)學(xué)原理是:鏈式求導(dǎo)法則
- 正向傳播過程:
輸入層通過接收輸入數(shù)據(jù),傳遞給中間層(各隱藏層)神經(jīng)元,每一個神經(jīng)元進行數(shù)據(jù)處理變換,然后通過最后一個隱藏層傳遞到輸出層對外輸出。
- 反向傳播過程:
正向傳播后通過真實值和輸出值得到誤差Error,當Error大于設(shè)定值,既實際輸出與期望輸出差別過大時,進入誤差反向傳播階段:
Error通過輸出層,按照誤差梯度下降的方式,如上面提到的隨機梯度下降法SGD,反向修正各層參數(shù)(如Weights),向隱藏層、輸入層逐層反轉(zhuǎn)。
通過不斷的正向、反向傳播,直到輸出的誤差減少到預(yù)定值,或到達最大訓(xùn)練次數(shù)。

到此這篇關(guān)于AI:如何訓(xùn)練機器學(xué)習(xí)的模型的文章就介紹到這了,相信對你有所幫助,更多相關(guān)機器學(xué)習(xí)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
Python minidom模塊用法示例【DOM寫入和解析XML】
這篇文章主要介紹了Python minidom模塊用法,結(jié)合實例形式分析了Python DOM創(chuàng)建、寫入和解析XML文件相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
python使用range函數(shù)計算一組數(shù)和的方法
這篇文章主要介紹了python使用range函數(shù)計算一組數(shù)和的方法,涉及Python中range函數(shù)的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-05-05
實例分析python3實現(xiàn)并發(fā)訪問水平切分表
在本文中小編給大家整理了關(guān)于python3實現(xiàn)并發(fā)訪問水平切分表的相關(guān)知識點以及實例代碼,有興趣的朋友們參考下。2018-09-09

