电竞比分网-中国电竞赛事及体育赛事平台

分享

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

 LZS2851 2016-08-04

投稿:Intelligent Software Development

團隊介紹:團隊成員來自一線互聯(lián)網(wǎng)公司,工作在架構(gòu)設(shè)計與優(yōu)化、工程方法研究與實踐的最前線,曾參與搜索、互聯(lián)網(wǎng)廣告、共有云/私有云等大型產(chǎn)品的設(shè)計、開發(fā)和技術(shù)優(yōu)化工作。目前主要專注在機器學(xué)習(xí)、微服務(wù)架構(gòu)設(shè)計、虛擬化/容器化、持續(xù)交付/DevOps等領(lǐng)域,希望通過先進技術(shù)和工程方法最大化提升軟件和服務(wù)的競爭力。

無論即將到來的是大數(shù)據(jù)時代還是人工智能時代,亦或是傳統(tǒng)行業(yè)使用人工智能在云上處理大數(shù)據(jù)的時代,作為一個有理想有追求的程序員,不懂深度學(xué)習(xí)(Deep Learning)這個超熱的技術(shù),會不會感覺馬上就out了?現(xiàn)在救命稻草來了,《零基礎(chǔ)入門深度學(xué)習(xí)》系列文章旨在幫助愛編程的你從零基礎(chǔ)達到入門級水平。

零基礎(chǔ)意味著你不需要太多的數(shù)學(xué)知識,只要會寫程序就行了,沒錯,這是專門為程序員寫的文章。雖然文中會有很多公式你也許看不懂,但同時也會有更多的代碼,程序員的你一定能看懂的(我周圍是一群狂熱的Clean Code程序員,所以我寫的代碼也不會很差)。

1深度學(xué)習(xí)是啥

在人工智能領(lǐng)域,有一個方法叫機器學(xué)習(xí)。在機器學(xué)習(xí)這個方法里,有一類算法叫神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)如下圖所示:

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

上圖中每個圓圈都是一個神經(jīng)元,每條線表示神經(jīng)元之間的連接。我們可以看到,上面的神經(jīng)元被分成了多層,層與層之間的神經(jīng)元有連接,而層內(nèi)之間的神經(jīng)元沒有連接。最左邊的層叫做輸入層,這層負責(zé)接收輸入數(shù)據(jù);最右邊的層叫輸出層,我們可以從這層獲取神經(jīng)網(wǎng)絡(luò)輸出數(shù)據(jù)。輸入層和輸出層之間的層叫做隱藏層。

隱藏層比較多(大于2)的神經(jīng)網(wǎng)絡(luò)叫做深度神經(jīng)網(wǎng)絡(luò)。而深度學(xué)習(xí),就是使用深層架構(gòu)(比如,深度神經(jīng)網(wǎng)絡(luò))的機器學(xué)習(xí)方法。

那么深層網(wǎng)絡(luò)和淺層網(wǎng)絡(luò)相比有什么優(yōu)勢呢?簡單來說深層網(wǎng)絡(luò)能夠表達力更強。事實上,一個僅有一個隱藏層的神經(jīng)網(wǎng)絡(luò)就能擬合任何一個函數(shù),但是它需要很多很多的神經(jīng)元。而深層網(wǎng)絡(luò)用少得多的神經(jīng)元就能擬合同樣的函數(shù)。也就是為了擬合一個函數(shù),要么使用一個淺而寬的網(wǎng)絡(luò),要么使用一個深而窄的網(wǎng)絡(luò)。而后者往往更節(jié)約資源。

深層網(wǎng)絡(luò)也有劣勢,就是它不太容易訓(xùn)練。簡單的說,你需要大量的數(shù)據(jù),很多的技巧才能訓(xùn)練好一個深層網(wǎng)絡(luò)。這是個手藝活。

2感知器

看到這里,如果你還是一頭霧水,那也是很正常的。為了理解神經(jīng)網(wǎng)絡(luò),我們應(yīng)該先理解神經(jīng)網(wǎng)絡(luò)的組成單元——神經(jīng)元。神經(jīng)元也叫做感知器。感知器算法在上個世紀50-70年代很流行,也成功解決了很多問題。并且,感知器算法也是非常簡單的。

  • 感知器的定義

下圖是一個感知器:

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

可以看到,一個感知器有如下組成部分:

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

如果看完上面的公式一下子就暈了,不要緊,我們用一個簡單的例子來幫助理解。

例子:用感知器實現(xiàn)and函數(shù)

我們設(shè)計一個感知器,讓它來實現(xiàn)and運算。程序員都知道,and是一個二元函數(shù)(帶有兩個參數(shù)和),下面是它的真值表:

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

為了計算方便,我們用0表示false,用1表示true。這沒什么難理解的,對于C語言程序員來說,這是天經(jīng)地義的。

我們令,而激活函數(shù)就是前面寫出來的階躍函數(shù),這時,感知器就相當(dāng)于and函數(shù)。不明白?我們驗算一下:

輸入上面真值表的第一行,即,那么根據(jù)公式(1),計算輸出:

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

也就是當(dāng)X1X2都為0的時候,為0,這就是真值表的第一行。讀者可以自行驗證上述真值表的第二、三、四行。

例子:用感知器實現(xiàn)or函數(shù)

同樣,我們也可以用感知器來實現(xiàn)or運算。僅僅需要把偏置項的值設(shè)置為-0.3就可以了。我們驗算一下,下面是or運算的真值表:

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

我們來驗算第二行,這時的輸入是,帶入公式(1):

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

也就是當(dāng)時X1=0,X2=為1,即or真值表第二行。讀者可以自行驗證其它行。

  • 感知器還能做什么

事實上,感知器不僅僅能實現(xiàn)簡單的布爾運算。它可以擬合任何的線性函數(shù),任何線性分類或線性回歸問題都可以用感知器來解決。前面的布爾運算可以看作是二分類問題,即給定一個輸入,輸出0(屬于分類0)或1(屬于分類1)。如下面所示,and運算是一個線性分類問題,即可以用一條直線把分類0(false,紅叉表示)和分類1(true,綠點表示)分開。

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

然而,感知器卻不能實現(xiàn)異或運算,如下圖所示,異或運算不是線性的,你無法用一條直線把分類0和分類1分開。

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

  • 感知器的訓(xùn)練

現(xiàn)在,你可能困惑前面的權(quán)重項和偏置項的值是如何獲得的呢?這就要用到感知器訓(xùn)練算法:將權(quán)重項和偏置項初始化為0,然后,利用下面的感知器規(guī)則迭代的修改和,直到訓(xùn)練完成。

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

其中:

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

Wi是與輸入Xi對應(yīng)的權(quán)重項,b是偏置項。事實上,可以把看作是值永遠為1的輸入Xb所對應(yīng)的權(quán)重。是訓(xùn)練樣本的實際值,一般稱之為label。而是感知器的輸出值,它是根據(jù)公式(1)計算得出。是一個稱為學(xué)習(xí)速率的常數(shù),其作用是控制每一步調(diào)整權(quán)的幅度。

每次從訓(xùn)練數(shù)據(jù)中取出一個樣本的輸入向量,使用感知器計算其輸出,再根據(jù)上面的規(guī)則來調(diào)整權(quán)重。每處理一個樣本就調(diào)整一次權(quán)重。經(jīng)過多輪迭代后(即全部的訓(xùn)練數(shù)據(jù)被反復(fù)處理多輪),就可以訓(xùn)練出感知器的權(quán)重,使之實現(xiàn)目標(biāo)函數(shù)。

  • 編程實戰(zhàn):實現(xiàn)感知器

對于程序員來說,沒有什么比親自動手實現(xiàn)學(xué)得更快了,而且,很多時候一行代碼抵得上千言萬語。接下來我們就將實現(xiàn)一個感知器。

下面是一些說明:

  • 使用python語言。python在機器學(xué)習(xí)領(lǐng)域用的很廣泛,而且,寫python程序真的很輕松。

  • 面向?qū)ο缶幊獭C嫦驅(qū)ο笫翘貏e好的管理復(fù)雜度的工具,應(yīng)對復(fù)雜問題時,用面向?qū)ο笤O(shè)計方法很容易將復(fù)雜問題拆解為多個簡單問題,從而解救我們的大腦。

  • 沒有使用numpy。numpy實現(xiàn)了很多基礎(chǔ)算法,對于實現(xiàn)機器學(xué)習(xí)算法來說是個必備的工具。但為了降低讀者理解的難度,下面的代碼只用到了基本的python(省去您去學(xué)習(xí)numpy的時間)。

下面是感知器類的實現(xiàn),非常簡單。去掉注釋只有27行,而且還包括為了美觀(每行不超過60個字符)而增加的很多換行。

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

接下來,我們利用這個感知器類去實現(xiàn)and函數(shù)。

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

將上述程序保存為perceptron.py文件,通過命令行執(zhí)行這個程序,其運行結(jié)果為:

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

神奇吧!感知器竟然完全實現(xiàn)了and函數(shù)。讀者可以嘗試一下利用感知器實現(xiàn)其它函數(shù)。

從上面部分我們已經(jīng)學(xué)會了編寫一個簡單的感知器,并用它來實現(xiàn)一個線性分類器。大家應(yīng)該還記得用來訓(xùn)練感知器的『感知器規(guī)則』把。然而,我們并沒有關(guān)心這個規(guī)則是怎么得到的。下面部門將通過介紹另外一種『感知器』,也就是『線性單元』,來說明關(guān)于機器學(xué)習(xí)一些基本的概念,比如模型、目標(biāo)函數(shù)、優(yōu)化算法等等。這些概念對于所有的機器學(xué)習(xí)算法來說都是通用的,掌握了這些概念,就掌握了機器學(xué)習(xí)的基本套路。

3線性單元是啥

感知器有一個問題,當(dāng)面對的數(shù)據(jù)集不是線性可分的時候,『感知器規(guī)則』可能無法收斂,這意味著我們永遠也無法完成一個感知器的訓(xùn)練。為了解決這個問題,我們使用一個可導(dǎo)的線性函數(shù)來替代感知器的階躍函數(shù),這種感知器就叫做線性單元。線性單元在面對線性不可分的數(shù)據(jù)集時,會收斂到一個最佳的近似上。

為了簡單起見,我們可以設(shè)置線性單元的激活函數(shù)f為

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

這樣的線性單元如下圖所示

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

對比此前我們講過的感知器

這樣替換了激活函數(shù)f之后,線性單元將返回一個實數(shù)值而不是0,1分類。因此線性單元用來解決回歸問題而不是分類問題。

  • 線性單元的模型

當(dāng)我們說模型時,我們實際上在談?wù)摳鶕?jù)輸入x預(yù)測輸出y的算法。比如,x可以是一個人的工作年限,y可以是他的月薪,我們可以用某種算法來根據(jù)一個人的工作年限來預(yù)測他的收入。比如:

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

函數(shù)h(x)叫做假設(shè),而w、b是它的參數(shù)。我們假設(shè)參數(shù)w=100,參數(shù)y=500,如果一個人的工作年限是5年的話,我們的模型會預(yù)測他的月薪為

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

你也許會說,這個模型太不靠譜了。是這樣的,因為我們考慮的因素太少了,僅僅包含了工作年限。如果考慮更多的因素,比如所處的行業(yè)、公司、職級等等,可能預(yù)測就會靠譜的多。我們把工作年限、行業(yè)、公司、職級這些信息,稱之為特征。對于一個工作了5年,在IT行業(yè),百度工作,職級T6這樣的人,我們可以用這樣的一個特征向量來表示它:x = (5, IT, 百度, T6)。

既然輸入x變成了一個具備四個特征的向量,相對應(yīng)的,僅僅一個參數(shù)就不夠用了,我們應(yīng)該使用4個參數(shù)W1,W2,W3,W4,每個特征對應(yīng)一個。這樣,我們的模型就變成

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

其中,X 1對應(yīng)工作年限,X2對應(yīng)行業(yè),X3對應(yīng)公司,X4對應(yīng)職級。

為了書寫和計算方便,我們可以令W0等于b,同時令W0對應(yīng)于特征X0。由于X0其實并不存在,我們可以令它的值永遠為1。也就是說

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

這樣上面的式子就可以寫成

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

我們還可以把上式寫成向量的形式

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

長成這種樣子模型就叫做線性模型,因為輸出就是輸入特征的線性組合。

4監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)

接下來,我們需要關(guān)心的是這個模型如何訓(xùn)練,也就是參數(shù)取什么值最合適。

機器學(xué)習(xí)有一類學(xué)習(xí)方法叫做監(jiān)督學(xué)習(xí),它是說為了訓(xùn)練一個模型,我們要提供這樣一堆訓(xùn)練樣本:每個訓(xùn)練樣本即包括輸入特征X,也包括對應(yīng)的輸出(也叫做標(biāo)記,label)。也就是說,我們要找到很多人,我們既知道他們的特征(工作年限,行業(yè)...),也知道他們的收入。我們用這樣的樣本去訓(xùn)練模型,讓模型既看到我們提出的每個問題(輸入特征X),也看到對應(yīng)問題的答案(標(biāo)記Y)。當(dāng)模型看到足夠多的樣本之后,它就能總結(jié)出其中的一些規(guī)律。然后,就可以預(yù)測那些它沒看過的輸入所對應(yīng)的答案了。

另外一類學(xué)習(xí)方法叫做無監(jiān)督學(xué)習(xí),這種方法的訓(xùn)練樣本中只有而沒有。模型可以總結(jié)出特征的一些規(guī)律,但是無法知道其對應(yīng)的答案。

很多時候,既有X又有Y的訓(xùn)練樣本是很少的,大部分樣本都只有。比如在語音到文本(STT)的識別任務(wù)中,X是語音,Y是這段語音對應(yīng)的文本。我們很容易獲取大量的語音錄音,然而把語音一段一段切分好并標(biāo)注上對應(yīng)文字則是非常費力氣的事情。這種情況下,為了彌補帶標(biāo)注樣本的不足,我們可以用無監(jiān)督學(xué)習(xí)方法先做一些聚類,讓模型總結(jié)出哪些音節(jié)是相似的,然后再用少量的帶標(biāo)注的訓(xùn)練樣本,告訴模型其中一些音節(jié)對應(yīng)的文字。這樣模型就可以把相似的音節(jié)都對應(yīng)到相應(yīng)文字上,完成模型的訓(xùn)練。

  • 線性單元的目標(biāo)函數(shù)

現(xiàn)在,讓我們只考慮監(jiān)督學(xué)習(xí)。

在監(jiān)督學(xué)習(xí)下,對于一個樣本,我們知道它的特征x,以及標(biāo)記y。同時,我們還可以根據(jù)模型h(x)計算得到輸出y的平均值。注意這里面我們用y表示訓(xùn)練樣本里面的標(biāo)記,也就是實際值;用帶上劃線的表示模型計算的出來的預(yù)測值。我們當(dāng)然希望模型計算出來的y的平均值和y越接近約好。

數(shù)學(xué)上有很多方法來表示的和的接近程度,比如我們可以用和的差的平方的來表示它們的接近程度

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

我們把叫做單個樣本的誤差。至于為什么前面要乘1/2,是為了后面計算方便。

訓(xùn)練數(shù)據(jù)中會有很多樣本,比如N個,我們可以用訓(xùn)練數(shù)據(jù)中所有樣本的誤差的,來表示模型的誤差E,也就是

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

上式的e(1)表示第一個樣本的誤差,e(2)表示第二個樣本的誤差......。

我們還可以把上面的式子寫成和式的形式。使用和式,不光書寫起來簡單,逼格也跟著暴漲,一舉兩得。所以一定要寫成下面這樣

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

其中

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

(式2)中,X(i)表示第i個訓(xùn)練樣本的特征,Y(i)表示第個樣本的標(biāo)記,我們也可以用元組(X(i),Y(i))表示第訓(xùn)練樣本。Y(i)平均值的則是模型對第i個樣本的預(yù)測值。

我們當(dāng)然希望對于一個訓(xùn)練數(shù)據(jù)集來說,誤差最小越好,也就是(式2)的值越小越好。對于特定的訓(xùn)練數(shù)據(jù)集來說,(X(i),Y(i))的值都是已知的,所以(式2)其實是參數(shù)W的函數(shù)。

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

由此可見,模型的訓(xùn)練,實際上就是求取到合適的w,使(式2)取得最小值。這在數(shù)學(xué)上稱作優(yōu)化問題,而E(w)就是我們優(yōu)化的目標(biāo),稱之為目標(biāo)函數(shù)

5梯度下降優(yōu)化算法

大學(xué)時我們學(xué)過怎樣求函數(shù)的極值。函數(shù)y=f(x)的極值點,就是它的導(dǎo)數(shù)f’(x)=0的那個點。因此我們可以通過解方程f’(x)=0,求得函數(shù)的極值點(x0,y0)。

不過對于計算機來說,它可不會解方程。但是它可以憑借強大的計算能力,一步一步的去把函數(shù)的極值點『試』出來。如下圖所示:

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

首先,我們隨便選擇一個點開始,比如上圖的點。接下來,每次迭代修改x的為x1,x2,x3,經(jīng)過數(shù)次迭代后最終達到函數(shù)最小值點。

你可能要問了,為啥每次修改的值,都能往函數(shù)最小值那個方向前進呢?這里的奧秘在于,我們每次都是向函數(shù)y=f(x)的梯度的相反方向來修改。什么是梯度呢?翻開大學(xué)高數(shù)課的課本,我們會發(fā)現(xiàn)梯度是一個向量,它指向函數(shù)值上升最快的方向。顯然,梯度的反方向當(dāng)然就是函數(shù)值下降最快的方向了。我們每次沿著梯度相反方向去修改的值,當(dāng)然就能走到函數(shù)的最小值附近。之所以是最小值附近而不是最小值那個點,是因為我們每次移動的步長不會那么恰到好處,有可能最后一次迭代走遠了越過了最小值那個點。步長的選擇是門手藝,如果選擇小了,那么就會迭代很多輪才能走到最小值附近;如果選擇大了,那可能就會越過最小值很遠,收斂不到一個好的點上。

按照上面的討論,我們就可以寫出梯度下降算法的公式

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

其中,是梯度算子,▽f(x)就是指f(x)的梯度。n是步長,也稱作學(xué)習(xí)速率

對于上一節(jié)列出的目標(biāo)函數(shù)(式2)

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

梯度下降算法可以寫成

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

聰明的你應(yīng)該能想到,如果要求目標(biāo)函數(shù)的最大值,那么我們就應(yīng)該用梯度上升算法,它的參數(shù)修改規(guī)則是

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

下面,請先做幾次深呼吸,讓你的大腦補充足夠的新鮮的氧氣,我們要來求取▽E(w),然后帶入上式,就能得到線性單元的參數(shù)修改規(guī)則。

關(guān)于▽E(w)的推導(dǎo)過程,我單獨把它們放到一節(jié)中。您既可以選擇慢慢看,也可以選擇無視。在這里,您只需要知道,經(jīng)過一大串推導(dǎo),目標(biāo)函數(shù)E(w)的梯度是

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

因此,線性單元的參數(shù)修改規(guī)則最后是這個樣子

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

有了上面這個式子,我們就可以根據(jù)它來寫出訓(xùn)練線性單元的代碼了。

需要說明的是,如果樣本有N個特征,則上式中的x,w都是N+1維向量(因為我們加上了一個恒為1的虛擬特征,參考前面的內(nèi)容),而y是標(biāo)量。用高逼格的數(shù)學(xué)符號表示,就是

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

為了讓您看明白說的是啥,我吐血寫下下面這個解釋(寫這種公式可累可累了)。因為是N+1維列向量,所以(式3)可以寫成

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

如果您還是沒看明白,建議您也吐血再看一下大學(xué)時學(xué)過的《線性代數(shù)》吧。

  • ▽E(w)的推導(dǎo)

這一節(jié)你盡可以跳過它,并不太會影響到全文的理解。當(dāng)然如果你非要弄明白每個細節(jié),那恭喜你騷年,機器學(xué)習(xí)的未來一定是屬于你的。

首先,我們先做一個簡單的前戲。我們知道函數(shù)的梯度的定義就是它相對于各個變量的偏導(dǎo)數(shù),所以我們寫下下面的式子

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

可接下來怎么辦呢?我們知道和的導(dǎo)數(shù)等于導(dǎo)數(shù)的和,所以我們可以先把求和符號里面的導(dǎo)數(shù)求出來,然后再把它們加在一起就行了,也就是

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

現(xiàn)在我們可以不管高大上的了,先專心把里面的導(dǎo)數(shù)求出來。

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

我們知道,y是與w無關(guān)的常數(shù),而y的均值=wTx,下面我們根據(jù)鏈?zhǔn)角髮?dǎo)法則來求導(dǎo)(上大學(xué)時好像叫復(fù)合函數(shù)求導(dǎo)法則)

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

我們分別計算上式等號右邊的兩個偏導(dǎo)數(shù)

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

代入,我們求得里面的偏導(dǎo)數(shù)是

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

最后代入,求得

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

至此,大功告成。

  • 隨機梯度下降算法(Stochastic Gradient Descent, SGD)

如果我們根據(jù)(式3)來訓(xùn)練模型,那么我們每次更新的迭代,要遍歷訓(xùn)練數(shù)據(jù)中所有的樣本進行計算,我們稱這種算法叫做批梯度下降(Batch Gradient Descent)。如果我們的樣本非常大,比如數(shù)百萬到數(shù)億,那么計算量異常巨大。因此,實用的算法是SGD算法。在SGD算法中,每次更新w的迭代,只計算一個樣本。這樣對于一個具有數(shù)百萬樣本的訓(xùn)練數(shù)據(jù),完成一次遍歷就會對w更新數(shù)百萬次,效率大大提升。由于樣本的噪音和隨機性,每次更新并不一定按照減少E的方向。然而,雖然存在一定隨機性,大量的更新總體上沿著減少E的方向前進的,因此最后也能收斂到最小值附近。下圖展示了SGD和BGD的區(qū)別

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

如上圖,橢圓表示的是函數(shù)值的等高線,橢圓中心是函數(shù)的最小值點。紅色是BGD的逼近曲線,而紫色是SGD的逼近曲線。我們可以看到BGD是一直向著最低點前進的,而SGD明顯躁動了許多,但總體上仍然是向最低點逼近的。

最后需要說明的是,SGD不僅僅效率高,而且隨機性有時候反而是好事。今天的目標(biāo)函數(shù)是一個『凸函數(shù)』,沿著梯度反方向就能找到全局唯一的最小值。然而對于非凸函數(shù)來說,存在許多局部最小值。隨機性有助于我們逃離某些很糟糕的局部最小值,從而獲得一個更好的模型。

  • 實現(xiàn)線性單元

接下來,讓我們擼一把代碼。

因為我們已經(jīng)寫了感知器的代碼,因此我們先比較一下感知器模型和線性單元模型,看看哪些代碼能夠復(fù)用。

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

比較的結(jié)果令人震驚,原來除了激活函數(shù)f不同之外,兩者的模型和訓(xùn)練規(guī)則是一樣的(在上表中,線性單元的優(yōu)化算法是SGD算法)。那么,我們只需要把感知器的激活函數(shù)進行替換即可。對于一個養(yǎng)成良好習(xí)慣的程序員來說,重復(fù)代碼是不可忍受的。大家應(yīng)該把代碼保存在一個代碼庫中(比如git)。

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

通過繼承Perceptron,我們僅用幾行代碼就實現(xiàn)了線性單元。這再次證明了面向?qū)ο缶幊谭妒降膹姶蟆?/p>

接下來,我們用簡單的數(shù)據(jù)進行一下測試。

零基礎(chǔ)入門深度學(xué)習(xí):感應(yīng)器、線性單元和梯度下降

程序運行結(jié)果如下圖

擬合的直線如下圖

6小結(jié)

事實上,一個機器學(xué)習(xí)算法其實只有兩部分:

  • 模型:從輸入特征預(yù)測輸入的那個函數(shù)

  • 目標(biāo)函數(shù):目標(biāo)函數(shù)取最小(最大)值時所對應(yīng)的參數(shù)值,就是模型的參數(shù)的最優(yōu)值。很多時候我們只能獲得目標(biāo)函數(shù)的局部最小(最大)值,因此也只能得到模型參數(shù)的局部最優(yōu)值。

因此,如果你想最簡潔的介紹一個算法,列出這兩個函數(shù)就行了。

接下來,你會用優(yōu)化算法去求取目標(biāo)函數(shù)的最小(最大)值。[隨機]梯度{下降|上升}算法就是一個優(yōu)化算法。針對同一個目標(biāo)函數(shù),不同的優(yōu)化算法會推導(dǎo)出不同的訓(xùn)練規(guī)則。我們后面還會講其它的優(yōu)化算法。

其實在機器學(xué)習(xí)中,算法往往并不是關(guān)鍵,真正的關(guān)鍵之處在于選取特征。選取特征需要我們?nèi)祟悓栴}的深刻理解,經(jīng)驗、以及思考。而神經(jīng)網(wǎng)絡(luò)算法的一個優(yōu)勢,就在于它能夠自動學(xué)習(xí)到應(yīng)該提取什么特征,從而使算法不再那么依賴人類,而這也是神經(jīng)網(wǎng)絡(luò)之所以吸引人的一個方面。

現(xiàn)在,經(jīng)過漫長的燒腦,你已經(jīng)具備了學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的必備知識。下一篇文章,我們將介紹本系列文章的主角:神經(jīng)網(wǎng)絡(luò),以及用來訓(xùn)練神經(jīng)網(wǎng)絡(luò)的大名鼎鼎的算法:反向傳播算法。

精選專題(點擊藍色標(biāo)題可閱讀全文)

近期活動:

Gdevops全球敏捷運維峰會廣州站

峰會官網(wǎng):www.gdevops.com

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多