訓(xùn)練機(jī)器要有正確的方向
所謂訓(xùn)練機(jī)器,也稱擬合的過程,也就是確定模型內(nèi)部參數(shù)的過程。具體到線性模型,也就是確定y’=wx+b 函數(shù)中的w和b。
對(duì)于線性回歸來說,針對(duì)損失函數(shù)的梯度下降(gradient descent )方法可以使猜測沿著正確的方向前進(jìn),因此總能找到比起上一次猜測時(shí)誤差更小的w和b組合。
梯度下降可以說是整個(gè)機(jī)器學(xué)習(xí)的精髓,堪稱機(jī)器學(xué)習(xí)之魂。在我們身邊發(fā)生的種種機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的奇跡,歸根結(jié)底都是拜梯度下降所賜。
凸函數(shù)確保有最小損失點(diǎn)
只是前進(jìn)的方向?qū)α?,這還不夠,還有另外一個(gè)關(guān)鍵點(diǎn)是凸函數(shù),能夠找到全局最低點(diǎn),就是你要知道什么時(shí)候停下來最合適。
回憶一下均方誤差函數(shù):
函數(shù)方程式中的x,y都可以視為常量,則L就只隨著w和b 而變,而函數(shù)是連續(xù)的平滑曲線,每一個(gè)微小的w和b的改變都會(huì)帶來微小的L的改變,而且這個(gè)函數(shù)很顯然是個(gè)二次函數(shù)(w和b被平方)。為了簡化描述,方便繪圖,先忽略參數(shù)b。對(duì)于給定的數(shù)據(jù)集來說,平均損失L和w的對(duì)應(yīng)關(guān)系如下圖所示。
我們將這個(gè)函數(shù)圖像稱為損失曲線,這是一個(gè)凸函數(shù)。凸函數(shù)的圖像會(huì)流暢、連續(xù)地形成相對(duì)于y軸的全局最低點(diǎn),也就是說存在著全局最小損失點(diǎn)。這也是此處選擇MSE作為線性回歸的損失函數(shù)的原因。
梯度下降的實(shí)現(xiàn)
梯度下降的過程就是在程序中一點(diǎn)點(diǎn)變化參數(shù)w和b,使L也就是損失值,逐漸趨近最低點(diǎn)(也稱為機(jī)器學(xué)習(xí)中的最優(yōu)解)。這個(gè)過程經(jīng)常用“下山”來比喻:想象你站在一座山的山腰上,正在尋找一條下山的路,這時(shí)你環(huán)望四周,找到一個(gè)最低點(diǎn)并向那個(gè)方向邁出一步;接著再環(huán)望四周朝最低點(diǎn)方向再邁出一步……一步接一步,走到最低點(diǎn)。
這里用圖來詳細(xì)解釋比較清楚,為了簡化說明,還是暫時(shí)只考慮權(quán)重w和損失L之間的關(guān)系、 給w隨機(jī)分配一個(gè)初始值(如5)的時(shí)候,損失曲線上對(duì)應(yīng)的點(diǎn)就是下圖中有小猴子的地方。
此時(shí)w等于5,下一步要進(jìn)行新的猜測了,w應(yīng)該往哪個(gè)方向移動(dòng),才能得到更小的損失L?也就是說,w應(yīng)該是增大(5.01)還是減小(4.99),L才能更快地趨近最小損失點(diǎn)(五角星)?
秘密武器正是導(dǎo)數(shù)。導(dǎo)數(shù)描述了函數(shù)在某點(diǎn)附近的變化率(L正在隨著w增大而增大還是減小),而這正是進(jìn)一步猜測更好的權(quán)重時(shí)所需要的全部內(nèi)容。
程序中用梯度下降法通過求導(dǎo)來計(jì)算損失曲線在起點(diǎn)處的梯度。此時(shí),梯度就是損失曲線導(dǎo)數(shù)的矢量,它可以讓我們了解哪個(gè)方向距離目標(biāo)“更近”或“更遠(yuǎn)”。
- 如果求導(dǎo)后梯度為正值,則說明L正在隨著w增大而增大,應(yīng)該減小w,以得到更小的損失。
- 如果求導(dǎo)后梯度為負(fù)值,則說明L正在隨著w增大而減小,應(yīng)該增大w,以得到更小的損失。
此處在單個(gè)權(quán)重參數(shù)的情況下,損失相對(duì)于權(quán)重的梯度就稱為導(dǎo)數(shù);若考慮偏置,或存在多1個(gè)權(quán)重參數(shù)時(shí),損失相對(duì)于單個(gè)權(quán)重的梯度就稱為偏導(dǎo)數(shù)。
因此,通過對(duì)損失曲線進(jìn)行求導(dǎo)之后,就得到了梯度。梯度具有以下兩個(gè)特征。
- 方向(也就是梯度的正負(fù))。
- 大小(也就是切線傾斜的幅度)。
這兩個(gè)重要的特征,尤其是方向特征確保了梯度始終指向損失函數(shù)中增長最為迅猛的方向。梯度下降法會(huì)沿著負(fù)梯度的方向走一步,以降低損失。
通過梯度下降法,如果初始估計(jì)的w值落在最優(yōu)值左邊,那么梯度下降會(huì)將w增大,以趨近最低值;如果初始估計(jì)的w值落在最優(yōu)值右邊,那么梯度下降會(huì)將w減小,以趨近最低值。這個(gè)逐漸趨近于最優(yōu)值的過程也叫作損失函數(shù)的收斂。
此處的N是數(shù)據(jù)集的數(shù)目。符號(hào)Σ代表對(duì)所有訓(xùn)練數(shù)據(jù)集中的特征和標(biāo)簽進(jìn)行處理并求和,這是已經(jīng)推導(dǎo)出來的求梯度的具體步驟。如果不熟悉導(dǎo)數(shù)(也就是對(duì)損失函數(shù)的微分)的演算也沒有什么影響。因?yàn)樘荻鹊挠?jì)算過程都已經(jīng)封裝在各種機(jī)器學(xué)習(xí)框架中,并不用我們自己寫代碼實(shí)現(xiàn)。
而且即使要通過Python來實(shí)現(xiàn)梯度下降公式,代碼同樣是非常的簡潔:
y_hat weight*x + bias這是向量化運(yùn)算實(shí)現(xiàn)的假設(shè)函數(shù)
loss =y_hat-y#這是中間過程,求得的是假設(shè)函數(shù)預(yù)測的y'和真正的y值之間的差值
derivative_wight - X.T.dot(loss)/len(X)#對(duì)權(quán)重求導(dǎo),len(X)就是樣本總數(shù)
derivative_bias - sum(loss)*1/len (X)對(duì)偏置求導(dǎo),len(X)就是樣本總數(shù)
簡單地解釋一下這段代碼。
- weight*X 是求出X數(shù)據(jù)集中的全部數(shù)據(jù)的y’值,就是w·x(i)的實(shí)現(xiàn),是對(duì)數(shù)組的整體操作,不用通過循環(huán)去分別操作每一個(gè)數(shù)據(jù)。
- 對(duì)weight 求導(dǎo)的過程中,使用了上一課中介紹過的多項(xiàng)式點(diǎn)積規(guī)則一-兩個(gè)相同維度的向量對(duì)應(yīng)元素先相乘,后相加。這其中的兩個(gè)向量是X和loss,也就是y(i)-( w·x(i))·x(i)的實(shí)現(xiàn)。
- 對(duì)偏置b求導(dǎo)并不需要與特征X相乘,因?yàn)槠门c權(quán)重不同,它與特征并不相關(guān)。另外還有一種思路,是把偏置看作W,那么就需要給X特征矩陣添加一行數(shù)字1,形成x0,與偏置相乘,同時(shí)確保偏置值不變——我們會(huì)在多變量線性回歸的代碼中試一下這個(gè)技巧。
學(xué)習(xí)速率也很重要
下一個(gè)問題是應(yīng)該以多快的速度下山。這在機(jī)器學(xué)習(xí)中被稱為學(xué)習(xí)速率(learing rate)的確定。學(xué)習(xí)速率也記作a,讀作alpha。
學(xué)習(xí)速率乘以損失曲線求導(dǎo)之后的微分值,就是一次梯度變化的步長(step size )。它控制著當(dāng)前梯度下降的節(jié)奏,或快或慢,w將在每一次迭代過程中被更新、優(yōu)化。
引入學(xué)習(xí)速率之后,用數(shù)學(xué)語言描述參數(shù)w隨梯度更新的公式如下:
Python 代碼實(shí)現(xiàn)如下:
weight = weight - alpha*derivative_wight#結(jié)合學(xué)習(xí)速率alpha更新權(quán)重
bias = bias - alpha*derivative_bias #結(jié)合學(xué)習(xí)速率alpha更新偏置
大多數(shù)機(jī)器學(xué)習(xí)從業(yè)者真正花費(fèi)相當(dāng)?shù)臅r(shí)間來調(diào)試的,是像學(xué)習(xí)速率、迭代次數(shù)這樣的參數(shù),我們稱這類位于模型外部的人工可調(diào)節(jié)的參數(shù)為超參數(shù)。而權(quán)重w、偏置b,當(dāng)然都是模型內(nèi)部參數(shù),由梯度下降負(fù)責(zé)優(yōu)化,不需要人工調(diào)整。
如果所選擇的學(xué)習(xí)速率過小,機(jī)器就會(huì)花費(fèi)很長的學(xué)習(xí)時(shí)間,需要迭代很多次才能到達(dá)損失函數(shù)的最底點(diǎn),如下面左圖所示。相反,如果學(xué)習(xí)速率過大,導(dǎo)致L的變化過大,越過了損失曲線的最低點(diǎn),則下一個(gè)點(diǎn)將永遠(yuǎn)在U形曲線的底部隨意彈跳,損失可能越來越大。
在機(jī)器學(xué)習(xí)實(shí)戰(zhàn)中,這種損失不僅不會(huì)隨著迭代次數(shù)減小,反而會(huì)越來越大的情況時(shí)有發(fā)生。
最佳學(xué)習(xí)速率(如圖所示)與具體問題相關(guān)。因?yàn)樵诓煌瑔栴}中,損失函數(shù)的平坦程度不同。如果我們知道損失函數(shù)的梯度較小,則可以放心地試著采用更大的學(xué)習(xí)速率,以補(bǔ)償較小的梯度并獲得更大的步長。
尋找最佳學(xué)習(xí)速率很考驗(yàn)經(jīng)驗(yàn)和感覺。一個(gè)常見的策略是,在機(jī)器學(xué)習(xí)剛剛開始的時(shí)候,學(xué)習(xí)速率可以設(shè)置得大一些,快速幾步達(dá)到靠近最佳權(quán)重的位置,當(dāng)逐漸地接近最佳權(quán)重時(shí),可以減小學(xué)習(xí)速率,防止一下子越過最優(yōu)值。
學(xué)習(xí)機(jī)器學(xué)習(xí)的參考資料:
(1)書籍
利用Python進(jìn)行數(shù)據(jù)分析
西瓜書
百面機(jī)器學(xué)習(xí)
機(jī)器學(xué)習(xí)實(shí)戰(zhàn)
阿里云天池大賽賽題解析(機(jī)器學(xué)習(xí)篇)
白話機(jī)器學(xué)習(xí)中的數(shù)學(xué)
零基礎(chǔ)學(xué)機(jī)器學(xué)習(xí)
圖解機(jī)器學(xué)習(xí)算法
…文章來源:http://www.zghlxwxcb.cn/news/detail-810706.html
(2)機(jī)構(gòu)
光環(huán)大數(shù)據(jù)
開課吧
極客時(shí)間
七月在線
深度之眼
貪心學(xué)院
拉勾教育
博學(xué)谷
…文章來源地址http://www.zghlxwxcb.cn/news/detail-810706.html
到了這里,關(guān)于機(jī)器學(xué)習(xí)_通過梯度下降找到最佳參數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!