上一篇 5 TF輕松搞定線性回歸,我們知道了模型參數(shù)訓(xùn)練的方向是由梯度下降算法指導(dǎo)的,并使用TF的封裝tf.train.GradientDescentOptimizer(0.01)(學(xué)習(xí)率為0.01)完成了機(jī)器自學(xué)習(xí)的過程。本篇開啟梯度下降算法的黑盒一探究竟,并解鎖幾個(gè)TF API常用參數(shù)的真正含義:
- learning rate;
- steps;
- epoch;
- mini batch。

一般函數(shù)的最小值問題
4 第一個(gè)機(jī)器學(xué)習(xí)問題引入了損失函數(shù)的定義,即待訓(xùn)模型參數(shù)為自變量,計(jì)算模型輸出與預(yù)期(label)的均方誤差(MSE)。如下所示。

所獲得的這個(gè)新函數(shù)C(a,b)的最小值處的(a, b)值,就是我們所尋找的理想模型參數(shù)。就這樣,一個(gè)回歸問題變成了更加具體的求函數(shù)極值的問題。
更進(jìn)一步,本節(jié)將之前損失函數(shù)自變量a和b一般化表示為v1,v2,把求解損失函數(shù)的最小化問題,轉(zhuǎn)換為更一般的函數(shù)C(v1,v2)最小化問題,C(v1,v2)具有任意的函數(shù)形式。如果找到一般的函數(shù)最小值求解方法,那么具有特殊形式的損失函數(shù)最小值求解自不在話下。
對(duì)于C是一個(gè)或者少數(shù)幾個(gè)變量的函數(shù),可以通過函數(shù)極值點(diǎn)處的導(dǎo)數(shù)特性來獲得多元方程組,直接求解極值點(diǎn)。但是我們準(zhǔn)備放棄這種嘗試,因?yàn)閷?duì)于一個(gè)真實(shí)世界的機(jī)器學(xué)習(xí)問題,其模型的復(fù)雜程度通常會(huì)遠(yuǎn)遠(yuǎn)的高于線性模型,參數(shù)的個(gè)數(shù)也遠(yuǎn)不止兩個(gè),損失函數(shù)的形式會(huì)變成:C(v1, v2 ... vn),如果n數(shù)以億計(jì),用微積分的方法簡(jiǎn)直就是噩夢(mèng)。
雪山速降的啟發(fā)
把函數(shù)曲面的某個(gè)局部,想象成前面圖中的雪山,如果想速降(以最快的速度下山),那么直覺上的最佳路徑就是沿著雪山最陡峭的方向下山。
再打個(gè)比方,考慮有兩個(gè)自變量的二次函數(shù)C(v1, v2),在三維視圖中,它是一個(gè)曲面。假設(shè)有個(gè)小球靠自身重力滾落到曲面的底部,可以想象其路徑也是沿著最陡峭的方向的。

如果我們不能直接看出函數(shù)的最小值,或者通過直接求解的方式得到函數(shù)最小值,那么利用雪山速降、小球滾落的啟發(fā),總是沿著最陡峭的下降方向移動(dòng),就會(huì)最快到達(dá)最小值點(diǎn)。
那么,“最陡峭”方向在數(shù)學(xué)上該怎么表達(dá)呢?
梯度的定義
微積分告訴我們,當(dāng)把v1, v2, ... , vn各個(gè)自變量移動(dòng)一個(gè)很小的值,C將有如下變化:
梯度定義有:
v的變化量為?v ≡ (?v1, ?v2, ..., ?vn)T,則C的變化量可重寫為梯度向量▽C與v的變化向量?v的點(diǎn)乘:

梯度下降算法
直覺上,如果v朝某個(gè)方向上移動(dòng),導(dǎo)致C的增量是個(gè)負(fù)數(shù),那么可以肯定C在“下降”。
開下腦洞,直接令?v = -η▽C,其中η是一個(gè)正數(shù),代入公式B-C-F-3有:
?C ≈ -η▽C·▽C = -η‖▽C‖2 ≤ 0,此時(shí)?C一定小于等于0,C在下降。
幸運(yùn)的是,數(shù)學(xué)上可以證明對(duì)于一個(gè)非常小的步長(zhǎng)?v,令?v = -η▽C可以使C的減小最大化。
總結(jié)起來就是:
- -η▽C正是我們期望的?v——移動(dòng)方向是▽C的反方向,移動(dòng)的幅度是η‖▽C‖;
- v移動(dòng)?v所造成的C的?C,是-η‖▽C‖2;
上面這個(gè)η就叫做學(xué)習(xí)率learning rate。
回頭再來看“最陡峭的一小步”的數(shù)學(xué)解釋,那就是沿著梯度的反方向上走一小步。只要一小步一小步朝著正確的方向移動(dòng),遲早可以走到C(v1, v2, ..., vn)的最小值處。“梯度下降”,名副其實(shí)。
梯度下降的具體操作方法如下:
- 隨機(jī)選取自變量的初始位置v(以后會(huì)專門討論初始化的技巧);
- v → v' = v - η▽Cv(v移動(dòng)到v',▽Cv是v處的梯度,η保持不變);
- v' → v'' = v' - η▽Cv'(v'移動(dòng)到v'',▽Cv'是v'處的梯度,η保持不變);
- ...
v移動(dòng)的次數(shù),即訓(xùn)練的步數(shù)steps。
v是各個(gè)自變量(v1, v2, ..., vn)的向量表示,那具體到每個(gè)自變量該如何移動(dòng)呢?以v1,v2為例:

隨機(jī)梯度下降算法
到此,梯度下降算法解決了如何尋求一般函數(shù)C(v1, v2, ..., vn)的最小值問題,再應(yīng)用到機(jī)器學(xué)習(xí)之前,先別急,還差一小步。

回到損失函數(shù),再仔細(xì)看看其形式,發(fā)現(xiàn)它有個(gè)特別之處,即函數(shù)表達(dá)式與訓(xùn)練樣本的數(shù)量密切相關(guān),它是多個(gè)樣本方差的累加,最后再求均值。一個(gè)樣本集的樣本數(shù)動(dòng)輒成千上萬,為了“梯度下降”一小步中要用到的▽C,這么多樣本都要參與計(jì)算嗎?
并不需要,實(shí)踐中有巧妙的方法:

首先,損失函數(shù)的梯度▽C,實(shí)踐中一般是通過樣本集中單個(gè)樣本梯度值▽Cx的均值得到。如果你對(duì)這個(gè)公式持懷疑態(tài)度,這不奇怪,一個(gè)簡(jiǎn)單的消除疑慮的做法就是用之前的線性模型和損失函數(shù),用兩個(gè)樣本值分別計(jì)算一下等式兩邊,看是否相等即可。
對(duì)于樣本集成千上萬個(gè)樣本,對(duì)每個(gè)樣本x都求其▽Cx,計(jì)算量似乎更大了。先別急,往下看。可以用一個(gè)小批量樣本,通過其中每個(gè)樣本▽Cx的均值,來近似為▽C:

這就是實(shí)踐中采用的方法,被稱為隨機(jī)梯度下降法。那個(gè)小批量樣本就是一個(gè)mini batch。
把全部樣本集分成一批批的小樣本集,每全部遍歷使用過1次,就稱為1次epoch。
據(jù)此,每個(gè)自變量更新的公式如下:

共享協(xié)議:署名-非商業(yè)性使用-禁止演繹(CC BY-NC-ND 3.0 CN)
轉(zhuǎn)載請(qǐng)注明:作者黑猿大叔(簡(jiǎn)書)