尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
本文來自 雪花新聞,本文標題:深度學習 | 第1講:深度學習簡介和感知機原理與做到 ,轉載請保留本聲明!
if (window.location.host != ‘www.xuehua.us’){window.location.href=’https://www.xuehua.us/2018/08/06/%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0-%e7%ac%ac1%e8%ae%b2%ef%bc%9a%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0%e7%ae%80%e4%bb%8b%e5%92%8c%e6%84%9f%e7%9f%a5%e6%9c%ba%e5%8e%9f%e7%90%86%e4%b8%8e%e5%ae%9e’;}
大家好!從本期開始,狗熊會公眾號將陸續推出深度學習系列的推文,旨在幫助大家了解和學習當下火熱的深度學習技術的基本原理、實踐項目、一些優秀的開源深度學習框架以及工業生產環境下的深度學習項目是如何打通數據和價值之間關係的。
而對於閱讀深度學習系列文章的廣大數據愛好者而言,小編希望大家能有一些機器學習基礎,而且小編不會去刻意用很多通俗的語言去描述數學和計算機科學相關的術語和概念,當然小編也會盡力把主要的知識點說的夠敞亮,希望大家理解。那麼閒話少說,我們正式開啟深度學習的學習之旅~
1
機器學習與深度學習
要是說到深度學習,恐怕不得不先提一下機器學習,解釋好二者之間的關係。相信大家心中應該有自己對於機器學習概念的理解。小編這里就一句話簡單概括一下:機器學習就是從歷史數據中探索和訓練出數據的普遍規律,將其歸納為相應的數學模型,並對未知的數據進行預測的過程。至於在這個過程中我們碰到的各種各樣的問題,比如數據質量、模型評價標準、訓練優化方法、過擬合等一系列關乎機器學習模型生死的問題,小編就不展開來說了,自己去補機器學習知識哈。
在機器學習中,我們有很多很多已經相當成熟了的模型和算法。(這里厘一下模型和算法的概念,小編認為,通常我們所說的像SVM之類的所謂機器學習十大算法其實不應該稱之為算法,更應該稱其為模型,機器學習的算法應該是在給定模型和訓練策略的情況下採取的優化算法,比如梯度下降、牛頓法之類。當然,一般情況下將模型和算法混合稱呼也不礙事,畢竟模型中本身就包含著計算規則的意思。)在這很多種機器學習模型中,有一種很厲害的模型,那就是人工神經網路。這種模型從早期的感知機發展而來,對任何函數都有較好的擬合性,但自上個世紀90年代一直到2012年深度學習集中爆發前夕,神經網路受制於計算資源的限制和較差的可解釋性,一直處於發展的低谷階段。之後大數據興起,計算資源也迅速跟上,加之2012年ImageNet競賽冠軍採用的AlexNet卷積神經網路一舉將圖片預測的 top5 錯誤率降至16.4%,震驚了當時的學界和業界。從此之後,原本處於研究邊緣狀態的神經網路又迅速熱了起來,深度學習也逐漸占據了計算機視覺的主導地位。
扯了這麼多,無非就是想讓大家知道,以神經網路為核心的深度學習理論是機器學習的一個領域分支,所以深度學習其本質上也必須是遵循一些機器學習的基本要義和法則的。傳統的機器學習中,我們需要訓練的是結構化的數值數據,比如說預測銷售量、預測某人是否按時還款等等。但在深度學習中,我們的訓練輸入就不大是常規的數據了,它可能是一張圖像、一段語言、一段對話語料或是一段視頻。深度學習要做的就是我丟一張貓的圖片到神經網路里,它的輸出是貓或者cat這樣的標籤,丟進去一段語音,它輸出的是你好這樣的文本。所以機器學習/深度學習的核心任務就是找(訓練)一個模型,它能夠將我們的輸入轉化為正確的輸出。
(圖片來自台灣大學李宏毅教授的deep learning tutorial ppt)
2
感知機與神經網路
就像上面那幅圖展示的一樣,深度學習看起來就像是一個黑箱子,給定輸入之後就出來預測結果,中間的細節很難搞清楚。在實際生產環境下,調用像 tensorflow 這樣優秀的深度學習計算框架能夠幫助我們快速搭建起一個深度學習項目,但在學習深度學習的過程中,小編並不建議大家一開始就上手各種深度學習框架,希望大家能和小編一道,在把基本的原理搞明白之後利用 python 或者 R 自己手動去編寫模型和做到算法細節。
所以,為了學習各種結構的神經網路,我們需要從頭開始。感知機作為神經網路和支持向量機的理論基礎,相信任何有機器學習基礎的同學都清楚其模型細節。簡單而言,感知機就是一個旨在建立一個線性超平面對線性可分的數據集進行分類的線性模型。其基本結構如下所示:
上圖從左到右為感知機模型的計算執行方向,模型接受了X1、X2、X3三個輸入,將輸入與權值參數W進行加權求和並經過 sigmoid 函數進行激活,將激活結果作為 y 進行輸出。這便是感知機執行前向計算的基本過程。這樣就行了嗎?當然不行。按照李航老師的統計學習三要素來打分,剛剛我們只解釋了模型,對策略和算法並未解釋。當我們執行完前向計算得到輸出之後,模型需要根據你的輸出和實際的輸出按照損失函數計算當前損失,計算損失函數關於權值和偏置的梯度,然後根據梯度下降法更新權值和偏置。經過不斷的迭代調整權值和偏置使得損失最小,這便是完整的單層感知機的訓練過程。
輸入為圖像的感知機計算過程(圖片來自吳恩達老師deeplearningai作業截圖)
上述的單層感知機包含兩層神經元,即輸入與輸出神經元,可以非常容易的做到邏輯與、或和非等線性可分情形,但終歸而言,這樣的一層感知機的學習能力是非常有限的,對於像異或這樣的非線性情形,單層感知機就搞不定了。其學習過程會呈現一定程度的振蕩,權值參數 w 難以穩定下來,最終不能求得合適的解。
單層感知機難以解決異或問題(截圖於周志華老師的《機器學習》)
對於非線性可分的情況,在感知機基礎上一般有了兩個解決方向,一個就是著名的支持向量機模型,旨在通過核函數映射來處理非線性的情況,這里我們不多談,讀者朋友們可以去回顧復習機器學習中有關的內容,而另一種就是神經網路模型。這里的神經網路模型也叫多層感知機(MLP: Muti-Layer Perception),與單層的感知機在結構上的區別主要在於 MLP 多了若干隱藏層,這使得神經網路對非線性的情況擬合能力大大增強。
一個單隱層的人工神經網路的結構如下圖所示:
可以看到相較於兩層神經元的單層感知機,多層感知機中間多了一個隱藏層,稱為隱藏層的含義在於神經網路的訓練過程中我們只能觀察到輸入和輸出層的數據,對於中間的隱藏層我們是看不見的,因而在深度神經網路(DNN)中,對於中間看不見又難以進行解釋的隱藏層又有個黑箱子的稱呼。
含隱藏層的神經網路是如何訓練的呢?跟感知機一樣,神經網路的訓練依然是包含前向計算和反向傳播兩個主要過程。當然,單層感知機沒有反向傳播的概念,通常是直接建立損失函數對權值和偏置參數的梯度優化。前向計算過程這里不再細述,就是權值偏置與輸入的線性加權和激活操作,在隱藏層上有個嵌套的過程。這里我們重點講一下反向傳播算法(Error BackPropagation,因而也叫誤差逆傳播),作為神經網路的訓練算法,反向傳播算法可謂是目前最成功的神經網路學習算法了。我們通常說的 BP 神經網路也就是指應用反向傳播算法進行訓練的神經網路模型。
那反向傳播算法究竟是怎樣個工作機制呢?前方高能,需要大家自己補習微積分知識。因為小編實在是沒有不借助公式把反向傳播講清楚的能力。假設以一個兩層(即單隱層)網路為例,也就是上圖中的網路結構,小編帶大家詳細推導一下反向傳播的基本過程。
我們假設輸入層為 X ,輸入層與隱藏層之間的權值和偏置分別為 W1 和 b1,線性加權計算結果為 Z1 = W1*X + b1,採用 sigmoid 激活函數,隱藏層是激活輸出為 a1 = σ(Z1)。而隱藏層到輸出層的權值和偏置分別為 W2 和 b2,線性加權計算結果為 Z2 = W2*a1+ b2,激活輸出為 a2 = σ(Z2)。所以這個兩層網路的前向計算過程為 X-Z1-a1-Z2-a2。
所以反向傳播的直觀理解就是將上述前向計算過程反過來,但必須是梯度計算的方向反過來,假設我們這里採用交叉熵損失函數:
反向傳播是基於梯度下降策略的,主要是以目標參數的負梯度方向對參數進行更新,所以基於損失函數對前向計算過程中各個變量進行梯度計算就是非常必要的了。將前向計算過程反過來,那基於損失函數的梯度計算順序就是 da2-dZ2-dW2-db2-da1-dZ1-dW1-db1。一大堆微分符號!聰明如你應該可以看到我們馬上要進行一波鏈式求導操作。我們從輸出 a2 開始進行反向推導。輸出層激活輸出為 a2,那首先計算損失函數L(y, a) 關於 a2 的微分 da2,影響輸出 a2 的是誰呢?由前向傳播可知 a2 是由 Z2 經激活函數激活計算而來的,所以計算損失函數關於 Z2 的導數dZ2 必須經由 a2 進行復合函數求導,即微積分上常說的鏈式求導法則。然後繼續往前推,影響 Z2 的又是哪些變量呢?由前向計算 Z2 = W2*a1+ b2 可知影響 Z2 的有 W2、a1 和 b2,繼續按照鏈式求導法則進行求導即可。最終以交叉熵損失函數為代表的兩層神經網路的反向傳播向量化求導計算公式如下所示:
在有了梯度計算結果之後,我們便可根據權值更新公式對權值和偏置參數進行更新了,具體計算公式如下,其中 η 為學習率,是個超參數,需要我們在訓練時手動指定,當然也可以對其進行調參取得最優超參數。
以上便是 BP 神經網路模型和算法的基本工作流程,簡單而言就是前向計算得到輸出,反向傳播調整參數,最後以得到損失最小時的參數為最優學習參數。神經網路的基本總結流程如下圖所示:
訓練一個 BP 神經網路並非難事,我們有足夠優秀的深度學習計算框架通過幾行代碼就可以搭建起一個全連接網路。但是為了學習和掌握神經網路的基本思維范式和鍛煉實際的編碼能力,希望大家能夠利用 python 或者 R 在不調用任何算法包的情況下根據算法原理手動做到一遍神經網路模型。最後以一個神經網路可視化的動圖給大家動態的展示一下神經網路的訓練過程:
動圖依據 https://playground.tensorflow.org/製作而成
第一講的內容到這里就結束了,在深度學習第一講中,我們了解了深度學習和機器學習的基本關係和發展歷程,對神經網路的理論基礎有了更深層次的學習和掌握。咱們下期見!
【參考資料】
李航 統計學習方法
周志華 機器學習
https://www.deeplearning.ai/
作者簡介
魯偉,狗熊會人才計劃一期學員。目前在杭州某軟件公司從事數據分析和深度學習相關的研究工作,研究方向為貝葉斯統計、計算機視覺和遷移學習。
視頻only!