深度學(xué)習(xí)簡(jiǎn)介和感知機(jī)原理與實(shí)現(xiàn)

image

1

機(jī)器學(xué)習(xí)與深度學(xué)習(xí)

要是說到深度學(xué)習(xí),恐怕不得不先提一下機(jī)器學(xué)習(xí),解釋好二者之間的關(guān)系。相信大家心中應(yīng)該有自己對(duì)于機(jī)器學(xué)習(xí)概念的理解。小編這里就一句話簡(jiǎn)單概括一下:機(jī)器學(xué)習(xí)就是從歷史數(shù)據(jù)中探索和訓(xùn)練出數(shù)據(jù)的普遍規(guī)律,將其歸納為相應(yīng)的數(shù)學(xué)模型,并對(duì)未知的數(shù)據(jù)進(jìn)行預(yù)測(cè)的過程。至于在這個(gè)過程中我們碰到的各種各樣的問題,比如數(shù)據(jù)質(zhì)量、模型評(píng)價(jià)標(biāo)準(zhǔn)、訓(xùn)練優(yōu)化方法、過擬合等一系列關(guān)乎機(jī)器學(xué)習(xí)模型生死的問題,小編就不展開來說了,自己去補(bǔ)機(jī)器學(xué)習(xí)知識(shí)哈。

在機(jī)器學(xué)習(xí)中,我們有很多很多已經(jīng)相當(dāng)成熟了的模型和算法。(這里厘一下模型和算法的概念,小編認(rèn)為,通常我們所說的像SVM之類的所謂機(jī)器學(xué)習(xí)十大算法其實(shí)不應(yīng)該稱之為算法,更應(yīng)該稱其為模型,機(jī)器學(xué)習(xí)的算法應(yīng)該是在給定模型和訓(xùn)練策略的情況下采取的優(yōu)化算法,比如梯度下降、牛頓法之類。當(dāng)然,一般情況下將模型和算法混合稱呼也不礙事,畢竟模型中本身就包含著計(jì)算規(guī)則的意思。)在這很多種機(jī)器學(xué)習(xí)模型中,有一種很厲害的模型,那就是人工神經(jīng)網(wǎng)絡(luò)。這種模型從早期的感知機(jī)發(fā)展而來,對(duì)任何函數(shù)都有較好的擬合性,但自上個(gè)世紀(jì)90年代一直到2012年深度學(xué)習(xí)集中爆發(fā)前夕,神經(jīng)網(wǎng)絡(luò)受制于計(jì)算資源的限制和較差的可解釋性,一直處于發(fā)展的低谷階段。之后大數(shù)據(jù)興起,計(jì)算資源也迅速跟上,加之2012年ImageNet競(jìng)賽冠軍采用的AlexNet卷積神經(jīng)網(wǎng)絡(luò)一舉將圖片預(yù)測(cè)的 top5 錯(cuò)誤率降至16.4%,震驚了當(dāng)時(shí)的學(xué)界和業(yè)界。從此之后,原本處于研究邊緣狀態(tài)的神經(jīng)網(wǎng)絡(luò)又迅速熱了起來,深度學(xué)習(xí)也逐漸占據(jù)了計(jì)算機(jī)視覺的主導(dǎo)地位。

扯了這么多,無非就是想讓大家知道,以神經(jīng)網(wǎng)絡(luò)為核心的深度學(xué)習(xí)理論是機(jī)器學(xué)習(xí)的一個(gè)領(lǐng)域分支,所以深度學(xué)習(xí)其本質(zhì)上也必須是遵循一些機(jī)器學(xué)習(xí)的基本要義和法則的。傳統(tǒng)的機(jī)器學(xué)習(xí)中,我們需要訓(xùn)練的是結(jié)構(gòu)化的數(shù)值數(shù)據(jù),比如說預(yù)測(cè)銷售量、預(yù)測(cè)某人是否按時(shí)還款等等。但在深度學(xué)習(xí)中,我們的訓(xùn)練輸入就不大是常規(guī)的數(shù)據(jù)了,它可能是一張圖像、一段語言、一段對(duì)話語料或是一段視頻。深度學(xué)習(xí)要做的就是我丟一張貓的圖片到神經(jīng)網(wǎng)絡(luò)里,它的輸出是貓或者cat這樣的標(biāo)簽,丟進(jìn)去一段語音,它輸出的是你好這樣的文本。所以機(jī)器學(xué)習(xí)/深度學(xué)習(xí)的核心任務(wù)就是找(訓(xùn)練)一個(gè)模型,它能夠?qū)⑽覀兊妮斎朕D(zhuǎn)化為正確的輸出。

image

(圖片來自臺(tái)灣大學(xué)李宏毅教授的deep learning tutorial ppt)

2

感知機(jī)與神經(jīng)網(wǎng)絡(luò)

就像上面那幅圖展示的一樣,深度學(xué)習(xí)看起來就像是一個(gè)黑箱子,給定輸入之后就出來預(yù)測(cè)結(jié)果,中間的細(xì)節(jié)很難搞清楚。在實(shí)際生產(chǎn)環(huán)境下,調(diào)用像 tensorflow 這樣優(yōu)秀的深度學(xué)習(xí)計(jì)算框架能夠幫助我們快速搭建起一個(gè)深度學(xué)習(xí)項(xiàng)目,但在學(xué)習(xí)深度學(xué)習(xí)的過程中,小編并不建議大家一開始就上手各種深度學(xué)習(xí)框架,希望大家能和小編一道,在把基本的原理搞明白之后利用 python 或者 R 自己手動(dòng)去編寫模型和實(shí)現(xiàn)算法細(xì)節(jié)。

所以,為了學(xué)習(xí)各種結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò),我們需要從頭開始。感知機(jī)作為神經(jīng)網(wǎng)絡(luò)和支持向量機(jī)的理論基礎(chǔ),相信任何有機(jī)器學(xué)習(xí)基礎(chǔ)的同學(xué)都清楚其模型細(xì)節(jié)。簡(jiǎn)單而言,感知機(jī)就是一個(gè)旨在建立一個(gè)線性超平面對(duì)線性可分的數(shù)據(jù)集進(jìn)行分類的線性模型。其基本結(jié)構(gòu)如下所示:

image

上圖從左到右為感知機(jī)模型的計(jì)算執(zhí)行方向,模型接受了X1、X2、X3三個(gè)輸入,將輸入與權(quán)值參數(shù)W進(jìn)行加權(quán)求和并經(jīng)過 sigmoid 函數(shù)進(jìn)行激活,將激活結(jié)果作為 y 進(jìn)行輸出。這便是感知機(jī)執(zhí)行前向計(jì)算的基本過程。這樣就行了嗎?當(dāng)然不行。按照李航老師的統(tǒng)計(jì)學(xué)習(xí)三要素來打分,剛剛我們只解釋了模型,對(duì)策略和算法并未解釋。當(dāng)我們執(zhí)行完前向計(jì)算得到輸出之后,模型需要根據(jù)你的輸出和實(shí)際的輸出按照損失函數(shù)計(jì)算當(dāng)前損失,計(jì)算損失函數(shù)關(guān)于權(quán)值和偏置的梯度,然后根據(jù)梯度下降法更新權(quán)值和偏置。經(jīng)過不斷的迭代調(diào)整權(quán)值和偏置使得損失最小,這便是完整的單層感知機(jī)的訓(xùn)練過程。

image

輸入為圖像的感知機(jī)計(jì)算過程(圖片來自吳恩達(dá)老師deeplearningai作業(yè)截圖)

上述的單層感知機(jī)包含兩層神經(jīng)元,即輸入與輸出神經(jīng)元,可以非常容易的實(shí)現(xiàn)邏輯與、或和非等線性可分情形,但終歸而言,這樣的一層感知機(jī)的學(xué)習(xí)能力是非常有限的,對(duì)于像異或這樣的非線性情形,單層感知機(jī)就搞不定了。其學(xué)習(xí)過程會(huì)呈現(xiàn)一定程度的振蕩,權(quán)值參數(shù) w 難以穩(wěn)定下來,最終不能求得合適的解。

image

單層感知機(jī)難以解決異或問題(截圖于周志華老師的《機(jī)器學(xué)習(xí)》)

對(duì)于非線性可分的情況,在感知機(jī)基礎(chǔ)上一般有了兩個(gè)解決方向,一個(gè)就是著名的支持向量機(jī)模型,旨在通過核函數(shù)映射來處理非線性的情況,這里我們不多談,讀者朋友們可以去回顧復(fù)習(xí)機(jī)器學(xué)習(xí)中有關(guān)的內(nèi)容,而另一種就是神經(jīng)網(wǎng)絡(luò)模型。這里的神經(jīng)網(wǎng)絡(luò)模型也叫多層感知機(jī)(MLP: Muti-Layer Perception),與單層的感知機(jī)在結(jié)構(gòu)上的區(qū)別主要在于 MLP 多了若干隱藏層,這使得神經(jīng)網(wǎng)絡(luò)對(duì)非線性的情況擬合能力大大增強(qiáng)。

一個(gè)單隱層的人工神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)如下圖所示:

image

可以看到相較于兩層神經(jīng)元的單層感知機(jī),多層感知機(jī)中間多了一個(gè)隱藏層,稱為隱藏層的含義在于神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程中我們只能觀察到輸入和輸出層的數(shù)據(jù),對(duì)于中間的隱藏層我們是看不見的,因而在深度神經(jīng)網(wǎng)絡(luò)(DNN)中,對(duì)于中間看不見又難以進(jìn)行解釋的隱藏層又有個(gè)黑箱子的稱呼。

含隱藏層的神經(jīng)網(wǎng)絡(luò)是如何訓(xùn)練的呢?跟感知機(jī)一樣,神經(jīng)網(wǎng)絡(luò)的訓(xùn)練依然是包含前向計(jì)算和反向傳播兩個(gè)主要過程。當(dāng)然,單層感知機(jī)沒有反向傳播的概念,通常是直接建立損失函數(shù)對(duì)權(quán)值和偏置參數(shù)的梯度優(yōu)化。前向計(jì)算過程這里不再細(xì)述,就是權(quán)值偏置與輸入的線性加權(quán)和激活操作,在隱藏層上有個(gè)嵌套的過程。這里我們重點(diǎn)講一下反向傳播算法(Error BackPropagation,因而也叫誤差逆?zhèn)鞑ィ?,作為神?jīng)網(wǎng)絡(luò)的訓(xùn)練算法,反向傳播算法可謂是目前最成功的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)算法了。我們通常說的 BP 神經(jīng)網(wǎng)絡(luò)也就是指應(yīng)用反向傳播算法進(jìn)行訓(xùn)練的神經(jīng)網(wǎng)絡(luò)模型。

那反向傳播算法究竟是怎樣個(gè)工作機(jī)制呢?前方高能,需要大家自己補(bǔ)習(xí)微積分知識(shí)。因?yàn)樾【帉?shí)在是沒有不借助公式把反向傳播講清楚的能力。假設(shè)以一個(gè)兩層(即單隱層)網(wǎng)絡(luò)為例,也就是上圖中的網(wǎng)絡(luò)結(jié)構(gòu),小編帶大家詳細(xì)推導(dǎo)一下反向傳播的基本過程。

我們假設(shè)輸入層為 X ,輸入層與隱藏層之間的權(quán)值和偏置分別為 W1 和 b1,線性加權(quán)計(jì)算結(jié)果為 Z1 = W1X + b1,采用 sigmoid 激活函數(shù),隱藏層是激活輸出為 a1 = σ(Z1)。而隱藏層到輸出層的權(quán)值和偏置分別為 W2 和 b2,線性加權(quán)計(jì)算結(jié)果為 Z2 = W2a1+ b2,激活輸出為 a2 = σ(Z2)。所以這個(gè)兩層網(wǎng)絡(luò)的前向計(jì)算過程為 X-Z1-a1-Z2-a2。

所以反向傳播的直觀理解就是將上述前向計(jì)算過程反過來,但必須是梯度計(jì)算的方向反過來,假設(shè)我們這里采用交叉熵?fù)p失函數(shù):

image

反向傳播是基于梯度下降策略的,主要是以目標(biāo)參數(shù)的負(fù)梯度方向?qū)?shù)進(jìn)行更新,所以基于損失函數(shù)對(duì)前向計(jì)算過程中各個(gè)變量進(jìn)行梯度計(jì)算就是非常必要的了。將前向計(jì)算過程反過來,那基于損失函數(shù)的梯度計(jì)算順序就是 da2-dZ2-dW2-db2-da1-dZ1-dW1-db1。一大堆微分符號(hào)!聰明如你應(yīng)該可以看到我們馬上要進(jìn)行一波鏈?zhǔn)角髮?dǎo)操作。我們從輸出 a2 開始進(jìn)行反向推導(dǎo)。輸出層激活輸出為 a2,那首先計(jì)算損失函數(shù)L(y, a) 關(guān)于 a2 的微分 da2,影響輸出 a2 的是誰呢?由前向傳播可知 a2 是由 Z2 經(jīng)激活函數(shù)激活計(jì)算而來的,所以計(jì)算損失函數(shù)關(guān)于 Z2 的導(dǎo)數(shù) dZ2 必須經(jīng)由 a2 進(jìn)行復(fù)合函數(shù)求導(dǎo),即微積分上常說的鏈?zhǔn)角髮?dǎo)法則。然后繼續(xù)往前推,影響 Z2 的又是哪些變量呢?由前向計(jì)算 Z2 = W2*a1+ b2 可知影響 Z2 的有 W2、a1 和 b2,繼續(xù)按照鏈?zhǔn)角髮?dǎo)法則進(jìn)行求導(dǎo)即可。最終以交叉熵?fù)p失函數(shù)為代表的兩層神經(jīng)網(wǎng)絡(luò)的反向傳播向量化求導(dǎo)計(jì)算公式如下所示:

image

在有了梯度計(jì)算結(jié)果之后,我們便可根據(jù)權(quán)值更新公式對(duì)權(quán)值和偏置參數(shù)進(jìn)行更新了,具體計(jì)算公式如下,其中 η 為學(xué)習(xí)率,是個(gè)超參數(shù),需要我們?cè)谟?xùn)練時(shí)手動(dòng)指定,當(dāng)然也可以對(duì)其進(jìn)行調(diào)參取得最優(yōu)超參數(shù)。

image

以上便是 BP 神經(jīng)網(wǎng)絡(luò)模型和算法的基本工作流程,簡(jiǎn)單而言就是前向計(jì)算得到輸出,反向傳播調(diào)整參數(shù),最后以得到損失最小時(shí)的參數(shù)為最優(yōu)學(xué)習(xí)參數(shù)。神經(jīng)網(wǎng)絡(luò)的基本總結(jié)流程如下圖所示:

image

訓(xùn)練一個(gè) BP 神經(jīng)網(wǎng)絡(luò)并非難事,我們有足夠優(yōu)秀的深度學(xué)習(xí)計(jì)算框架通過幾行代碼就可以搭建起一個(gè)全連接網(wǎng)絡(luò)。但是為了學(xué)習(xí)和掌握神經(jīng)網(wǎng)絡(luò)的基本思維范式和鍛煉實(shí)際的編碼能力,希望大家能夠利用 python 或者 R 在不調(diào)用任何算法包的情況下根據(jù)算法原理手動(dòng)實(shí)現(xiàn)一遍神經(jīng)網(wǎng)絡(luò)模型。最后以一個(gè)神經(jīng)網(wǎng)絡(luò)可視化的動(dòng)圖給大家動(dòng)態(tài)的展示一下神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程:

image

動(dòng)圖依據(jù) https://playground.tensorflow.org/制作而成

【參考資料】

李航 統(tǒng)計(jì)學(xué)習(xí)方法

周志華 機(jī)器學(xué)習(xí)

https://www.deeplearning.ai/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容