系列之1-神經網絡的基本工做原理

Copyright © Microsoft Corporation. All rights reserved.
適用於License版權許可
更多微軟人工智能學習資源,請見微軟人工智能教育與學習共建社區git

看過不少博客、文章,東一榔頭西一棒子的,總以爲沒有一個系列的文章把問題從頭至尾說清楚,找東西很困難。有的博客、文章的質量還不算很理想,似是而非,或者重點不明確,或者直接把別人的博客抄襲過來......種種不靠譜,讓小白們學習起來很困難,增長了學習曲線的陡峭程度。固然也有不少博主很是很是負責任,文章質量很高,只是連續度不夠,正看得過癮的時候,沒有後續章節了。github

從本文開始,咱們試圖用一系列博客,講解現代神經網絡的基本知識,使你們可以從真正的「零」開始,對神經網絡、深度學習有基本的瞭解,並能動手實踐。這是本系列的第一篇,咱們先從神經網絡的基本工做原理開始講解。算法

神經元細胞的數學計算模型

神經網絡由基本的神經元組成,下圖就是一個神經元的數學/計算模型,便於咱們用程序來實現。網絡

輸入

(x1,x2,x3) 是外界輸入信號,通常是一個訓練數據樣本的多個屬性,好比,咱們要識別手寫數字0~9,那麼在手寫圖片樣本中,x1可能表明了筆畫是直的仍是有彎曲,x2可能表明筆畫所佔面積的寬度,x3可能表明筆畫上下兩部分的複雜度。框架

(W1,W2,W3) 是每一個輸入信號的權重值,以上面的 (x1,x2,x3) 的例子來講,x1的權重多是0.5,x2的權重多是0.2,x3的權重多是0.3。固然權重值相加以後能夠不是1。函數

還有個b是幹嘛的?通常的書或者博客上會告訴你那是由於\(y=wx+b\),b是偏移值,使得直線可以沿Y軸上下移動。這是用結果來解釋緣由,並不是b存在的真實緣由。從生物學上解釋,在腦神經細胞中,必定是輸入信號的電平/電流大於某個臨界值時,神經元細胞纔會處於興奮狀態,這個b實際就是那個臨界值。亦即當:學習

\[w1*x1 + w2*x2 + w3*x3 >= t\]測試

時,該神經元細胞纔會興奮。咱們把t挪到等式左側來,變成\((-t)\),而後把它寫成b,變成了:優化

\[w1*x1 + w2*x2 + w3*x3 + b >= 0\]人工智能

因而b誕生了!

求和計算

\[Z = w1*x1 + w2*x2 + w3*x3 + b = \sum_{i=1}^m(w_i*x_i) + b\]

在上面的例子中m=3。咱們把\(w_i*x_i\)變成矩陣運算的話,就變成了:

\[Z = W*X + b\]

激活函數

求和以後,神經細胞已經處於興奮狀態了,已經決定要向下一個神經元傳遞信號了,可是要傳遞多強烈的信號,要由激活函數來肯定:

\[A=\sigma{(Z)}\]

若是激活函數是一個階躍信號的話,那受不了啊,你會以爲腦子裏老是一跳一跳的,像繼電器開合同樣咔咔亂響,因此通常激活函數都是有一個漸變的過程,也就是說是個曲線。

激活函數的更多描述在後續的博客中。

至此,一個神經元的工做過程就在電光火石般的一瞬間結束了。

神經網絡的基本訓練過程

單層神經網絡模型

這是一個單層的神經網絡,有m個輸入 (這裏m=3),有n個輸出 (這裏n=2)。在單個神經元裏,b是個值。可是在神經網絡中,咱們把b的值永遠設置爲1,而用b到每一個神經元的權值來表示實際的偏移值,亦即(b1,b2),這樣便於矩陣運算。也有些做者把b寫成x0,實際上是同一個意思,只不過x0用於等於1。

  • (x1,x2,x3)是一個樣本數據的三個特徵值
  • (w11,w12,w13)是(x1,x2,x3)到n1的權重
  • (w21,w22,w23)是(x1,x2,x3)到n2的權重
  • b1是n1的偏移
  • b2是n2的偏移

從這裏你們能夠意識到,同一個特徵x1,對於n一、n2來講,權重是不相同的,由於n一、n2是兩個神經元,它們完成不一樣的任務(特徵識別)。這就如同老師講一樣的課,不一樣的學生有不一樣的理解。

而對於n1來講,x1,x2,x3輸入的權重也是不相同的,由於它要對不一樣特徵有選擇地接納。這就如同一個學生上三門課,可是側重點不一樣,第一門課花50%的精力,第二門課30%,第三門課20%。

訓練流程

從真正的「零」開始學習神經網絡時,我沒有看到過一個流程圖來說述訓練過程,大神們寫書或者博客時都忽略了這一點,我在這裏給你們畫一個簡單的流程圖:

損失函數和反向傳播的更多內容在後續的博客中。

前提條件

  1. 首先是咱們已經有了訓練數據,不然連目標都沒有,訓練個啥?
  2. 咱們已經根據數據的規模、領域,創建了神經網絡的基本結構,好比有幾層,每一層有幾個神經元
  3. 定義好損失函數來合理地計算偏差

步驟

假設咱們有如下訓練數據樣本:

Id x1 x2 x3 Y
1 0.5 1.4 2.7 3
2 0.4 1.3 2.5 5
3 0.1 1.5 2.3 9
4 0.5 1.7 2.9 1

其中,x1,x2,x3是每個樣本數據的三個特徵值,Y是樣本的真實結果值,

  1. 隨機初始化權重矩陣,能夠根據高斯分佈或者正態分佈等來初始化。這一步能夠叫作「蒙」,但不是瞎蒙。
  2. 拿一個或一批數據做爲輸入,帶入權重矩陣中計算,再經過激活函數傳入下一層,最終獲得預測值。在本例中,咱們先用Id-1的數據輸入到矩陣中,獲得一個A值,假設A=5
  3. 拿到Id-1樣本的真實值Y=3
  4. 計算損失,假設用均方差函數 \(Loss = (A-Y)^2=(5-3)^2=4\)
  5. 根據一些神奇的數學公式(反向微分),把Loss=4這個值用大喇叭喊話,告訴在前面計算的步驟中,影響A=5這個值的每個權重矩陣,而後對這些權重矩陣中的值作一個微小的修改(固然是向着好的方向修改,這一點能夠用數學家的名譽來保證)
  6. 用Id-2樣本做爲輸入再次訓練(goto 2)
  7. 這樣不斷地迭代下去,直到如下一個或幾個條件知足就中止訓練:損失函數值很是小;迭代了指定的次數;計算機累吐血了......

訓練完成後,咱們會把這個神經網絡中的結構和權重矩陣的值導出來,造成一個計算圖(就是矩陣運算加上激活函數)模型,而後嵌入到任何能夠識別/調用這個模型的應用程序中,根據輸入的值進行運算,輸出預測值。

神經網絡中的矩陣運算

下面這個圖就是一個兩層的神經網絡,包含隱藏層和輸出層:

其中,w1-m,n(應該寫做\(w^1_{1,1},w^1_{1,2},w^1_{1,3}\),上面的角標1表示第1層,可是visio裏不支持這種格式)表示第一層神經網絡的權重矩陣,w2-m,n(應該寫做\(w^2_{1,1},w^2_{1,2},w^2_{1,3}\))表示第二層神經網絡的權重矩陣。

\[Z^1_1 = w^1_{1,1}x_1+w^1_{1,2}x_2+w^1_{1,784}x_{784}+b_1^1\\ ......\\ Z^1_{10} = w^1_{10,1}x_1+w^1_{10,2}x_2+w^1_{10,784}x_{784}+b_{10}^{1}\]

變成矩陣運算:

\[ Z_1^1=\begin{pmatrix}w^1_{1,1}&w^1_{1,2}&...&w^1_{1,784}\end{pmatrix} \begin{pmatrix}x_1\\x_2\\...\\x_{784}\end{pmatrix} +b^1_1\\ .....\\ Z_{10}^1= \begin{pmatrix}w^1_{10,1}&w^1_{10,2}&...&w^1_{10,784}\end{pmatrix} \begin{pmatrix}x_1\\x_2\\...\\x_{784}\end{pmatrix} +b^1_{10} \]

再變成大矩陣:

\[Z_1 = \begin{pmatrix} w^1_{1,1}&w^1_{1,2}&...&w^1_{1,784} \\ w^1_{2,1}&w^1_{2,2}&...&w^1_{2,784}\\ ......\\ w^1_{10,1}&w^1_{10,2}&...&w^1_{10,784} \end{pmatrix} \begin{pmatrix}x_1\\x_2\\...\\x_{784}\end{pmatrix} +\begin{pmatrix}b^1_1\\b^1_2\\...\\ b^1_{10} \end{pmatrix}\]

最後變成矩陣符號:

\[Z_1 = W_1X + B_1\]

而後是激活函數運算:

\[A_1=\sigma{(Z_1)}\]

同理可得:

\[Z_2 = W_2A_1 + B_2\]
\[A_2=\sigma{(Z_2)}\]

神經網絡爲何能廣泛適用

單層的神經網絡可以模擬一條二維平面上的直線,從而能夠完成線性分割任務。而理論證實,兩層神經網絡能夠無限逼近任意連續函數。

好比下面這張圖,二維平面中有兩類點,紅色的和藍色的,用一條直線確定不能把二者分開了。

咱們使用一個兩層的神經網絡能夠獲得一個很是近似的結果,使得分類偏差在滿意的範圍以內。而這個真實的連續函數的原型是:

\[y=0.4x^2 + 0.3xsin(15x) + 0.01cos(50x)-0.3\]

哦,my god(我靠)! 這麼複雜的函數,一個兩層的神經網絡是如何作到的呢?其實從輸入層到隱藏層的矩陣計算,就是對輸入數據進行了空間變換,使其能夠被線性可分,而後輸出層畫出了一個分界線。而訓練的過程,就是肯定那個空間變換矩陣的過程。所以,多層神經網絡的本質就是對複雜函數的擬合。咱們能夠在後面的試驗中來學習如何擬合上述的複雜函數的。

爲何須要激活函數

爲何咱們不能在沒有激活輸入信號的狀況下完成神經網絡的學習呢?

若是咱們不運用激活函數的話,則輸出信號將僅僅是一個簡單的線性函數。線性函數一個一級多項式。現現在,線性方程是很容易解決的,可是它們的複雜性有限,而且從數據中學習複雜函數映射的能力更小。一個沒有激活函數的神經網絡將只不過是一個線性迴歸模型(Linear regression Model)罷了,它功率有限,而且大多數狀況下執行得並很差。咱們但願咱們的神經網絡不只僅能夠學習和計算線性函數,並且還要比這複雜得多。一樣是由於沒有激活函數,咱們的神經網絡將沒法學習和模擬其餘複雜類型的數據,例如圖像、視頻、音頻、語音等。這就是爲何咱們要使用人工神經網絡技術,諸如深度學習(Deep learning),來理解一些複雜的事情,一些相互之間具備不少隱藏層的非線性問題,而這也能夠幫助咱們瞭解複雜的數據。

那麼爲何咱們須要非線性函數?

非線性函數是那些一級以上的函數,並且當繪製非線性函數時它們具備曲率。如今咱們須要一個能夠學習和表示幾乎任何東西的神經網絡模型,以及能夠將輸入映射到輸出的任意複雜函數。神經網絡被認爲是通用函數近似器(Universal Function Approximators)。這意味着他們能夠計算和學習任何函數。幾乎咱們能夠想到的任何過程均可以表示爲神經網絡中的函數計算。
而這一切都歸結於這一點,咱們須要應用激活函數f(x),以便使網絡更增強大,增長它的能力,使它能夠學習複雜的事物,複雜的表單數據,以及表示輸入輸出之間非線性的複雜的任意函數映射。所以,使用非線性激活函數,咱們便可以從輸入輸出之間生成非線性映射。
激活函數的另外一個重要特徵是:它應該是能夠區分的。咱們須要這樣作,以便在網絡中向後推動以計算相對於權重的偏差(丟失)梯度時執行反向優化策略,而後相應地使用梯度降低或任何其餘優化技術優化權重以減小偏差。

深度神經網絡與深度學習

兩層的神經網絡雖然強大,但可能只能完成二維空間上的一些曲線擬合的事情。若是對於圖片、語音、文字序列這些複雜的事情,就須要更復雜的網絡來理解和處理。第一個方式是增長每一層中神經元的數量,但這是線性的,不夠有效。另一個方式是增長層的數量,每一層都處理不一樣的事情。

淺神經網絡雖然具有了反向傳播機制,可是仍存在問題:

  1. 梯度愈來愈疏,從後向前,偏差校訂信號愈來愈微弱
  2. 隨機初始化會致使訓練過程收斂到局部最小值
  3. 須要數據帶標籤(人工label好的數據),可是大部分數據沒標籤

Deep Learning的訓練過程簡介

  1. 使用自下上升非監督學習(就是從底層開始,一層一層的往頂層訓練):

    採用無標籤數據(有標籤數據也可)分層訓練各層參數,這一步能夠看做是一個無監督訓練過程,是和傳統神經網絡區別最大的部分(這個過程能夠看做是feature learning過程)。
    具體的,先用無標定數據訓練第一層,訓練時先學習第一層的參數(這一層能夠看做是獲得一個使得輸出和輸入差異最小的三層神經網絡的隱層),因爲模型capacity的限制以及稀疏性約束,使得獲得的模型可以學習到數據自己的結構,從而獲得比輸入更具備表示能力的特徵;在學習獲得第n-1層後,將n-1層的輸出做爲第n層的輸入,訓練第n層,由此分別獲得各層的參數;

  2. 自頂向下的監督學習(就是經過帶標籤的數據去訓練,偏差自頂向下傳輸,對網絡進行微調):

    基於第一步獲得的各層參數進一步fine-tune整個多層模型的參數,這一步是一個有監督訓練過程;第一步相似神經網絡的隨機初始化初值過程,因爲DL的第一步不是隨機初始化,而是經過學習輸入數據的結構獲得的,於是這個初值更接近全局最優,從而可以取得更好的效果;因此deep learning效果好很大程度上歸功於第一步的feature learning過程。

點擊這裏提交問題與建議
聯繫咱們: msraeduhub@microsoft.com
學習了這麼多,還沒過癮怎麼辦?歡迎加入「微軟 AI 應用開發實戰交流羣」,跟你們一塊兒暢談AI,答疑解惑。掃描下方二維碼,回覆「申請入羣」,即刻邀請你入羣。

相關文章
相關標籤/搜索