從 0 開始機器學習 - 深入淺出神經網絡基礎

今天跟大家分享下我學習神經網絡的一些個人總結,希望能通過這篇博客幫助新手直接搞懂神經網絡!

一、神經網絡解決什麼問題?

之前跟大家分享過多項式迴歸預測房價和邏輯迴歸分類數據的例子,在這兩個問題中我們假設問題的輸入特徵很少:

  • 預測房價的輸入特徵:臥室數量、房屋面積、房屋樓層
  • 邏輯迴歸分類數據的輸入特徵:2 類數據,即 2 分類問題

在預測房價的例子中,我們的假設函數有 3 個輸入特徵:

hθ(x)=θ0x0+θ1x1+θ2x2+θ3x3 h_\theta(x) = \theta_0x_0 + \theta_1x_1 + \theta_2x_2 +\theta_3x_3

可是在實際的機器學習應用中,要解決的問題通常有很多很多特徵(比如圖像有上百萬個像素點作爲輸入特徵),這時假設函數就變爲非常複雜的非線性函數:

hθ(x)=θ0x0+θ1x1+θ2x2+θ3x1x2+θ4x1x3+...θnx1xn+... h_\theta(x) = \theta_0x_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_1x_2 + \theta_4x_1x_3 + ... \theta_nx_1x_n + ...

這種類型的非線性假設函數組合的特徵會非常多,以至於用普通的線性迴歸和邏輯迴歸算法計算會很慢,效率低下,所以爲了解決複雜的非線性問題,科學家們設計出了神經網絡。

神經網絡的作用就是在在保證計算效率的前提下解決複雜的、有非常多輸入特徵的非線性問題,這包括分類問題和迴歸問題。

比如預測一個圖像中動物的類別是貓還是狗,對於人來說很容易,可是要讓機器像人一樣識別貓狗可不容易,而神經網絡就具備這種識別能力,是不是很神奇呢?

下面就來正式學習神經網絡的基礎,登龍帶你由淺入深一步一步推導,非常容易,千萬不要被網絡結構圖嚇到哈 = =!

二、神經元模型

2.1 大腦中的神經元

在學習神經網絡之前,先來看看單個神經元是如何工作的。

在生物課上,我們知道人類的大腦中含有處理信息的神經網絡,而神經網絡又是由非常多單個神經元連接而成,每個神經元可以看做是一個單獨的處理單元,單個神經元結構圖如下:

那麼既然是處理單元,肯定有輸入和輸出,所以科學家們給神經元結構做了如下定義:

  • 樹突(數據輸入):每個神經元通過樹突來接收一個或多個其他神經元的軸突輸出
  • 軸突(數據輸出):每個神經元的軸突能輸出信息,來作爲另一個神經元的樹突輸入

在神經元之間數據的傳遞是通過微弱的電流,術語叫「動作電位」來傳遞的,這裏就不展開解釋了。

關於單個神經元瞭解這些足夠了,接着來看下機器學習中的神經元是怎樣定義的。

2.2 人工神經元模型(感知器)

科學家們通過模擬人腦中的神經元結構,設計出了能在計算機中表示的單個人工神經元,結構如下:

我來解釋下這個結構:

  • x1...x3x_1 ... x_3 :神經元的輸入,類似人腦神經元的樹突
  • x0=1x_0 = 1:人爲加上的偏置單元,值是常數,以後會介紹它的作用
  • w0...w3w_0 ... w_3:偏置單元和輸入單元的權重值,可以理解爲人腦神經元之間「動作電位」傳遞對當前神經元的影響大小
  • sumsum:對輸入值和權重做加權求和,可以理解爲人腦神經元對所有的樹突傳來的信息做加權處理
  • g(x)g(x):激活函數,用來確定該神經元的輸出,相當於人腦神經元的細胞核來決定產生什麼信息輸出到軸突上

可以看出人工設計的神經元基本就是模仿了人腦神經元的結構,只不過多了一個偏置單元 x0x_0,爲了簡化表示,我們通常把 sumsumg(x)g(x) 這兩步放在一起處理,邏輯不變,只是改變了結構圖,方便畫圖表示:

結構定義好了之後,就要用程序來把這個神經元寫出來,如果把這些變量和權重挨個定義一遍再做運算,那會非常麻煩,因爲你的輸入參數可能會非常多,導致運算速度也會降低。

所以科學家們把上面的神經元用向量表示出來,方便計算機運算:

  • ww 定義爲行向量:w=[w1 w2 w3]w = [w_1 \ w_2 \ w_3]
  • xx 定義爲列向量:x=[x1 x2 x3]Tx = [x_1 \ x_2 \ x_3]^T

這樣 wxw * x 就可以等價於加權求和了:

注意這裏沒有把偏置單元 x0=1x_0 = 1 加上,因爲它不作爲輸入特徵,我們單獨加上 x0w0=1w0x_0w_0 = 1 * w_0,這樣就跟單獨計算等價了:

wx+1w0=x0w0+x1w1+x2w2+x3w3 wx + 1 * w_0 = x_0w_0 + x_1w_1 + x_2w_2 + x_3w_3

然後再作爲激活函數 gg 的輸入,得到輸出 zz

z=g(wx+1w0) z = g(wx + 1 * w_0)

這樣就用向量表示了單個神經元的計算,是不是很容易呀,要時刻注意 x0=1x_0 = 1 哦!

三、兩層神經網絡

3.1 大腦中的兩層神經網絡

這是大腦中 2 個神經元的連接圖:

可以看到:

  • 上面神經元的軸突(輸出)連接到下面神經元的樹突(輸入)
  • 一個神經元可以有多個樹突接收不同輸入
  • 一個神經元也可以有多個軸突產生輸出

根據這個生物連接,科學家設計出了經典的 2 層神經網絡。

3.2 兩層人工神經網絡

這是 2 層神經網絡從下到上的結構:

還有一種從左到右的結構:

我更習慣用從左到右的結構:

  • 輸入層:最左邊的一層,相當於多個樹突
  • 中間層(隱藏層):產生更高級的特徵,傳遞到下一層
  • 輸出層:最右邊的一層相當於軸突,實際上可以有多個輸出
  • 偏置單元:除了最後的輸出層,前面的每一層都加一個偏置單元(x0x_0a0(2)a_0^{(2)}

同樣我們也需要用向量化公式計算這個網絡的輸出,不過因爲這個網絡變量較多,所以我們先來定義以下符號的表示:

  • ai(j)a_i^{(j)}:代表第 jj 層的第 ii 個激活單元,比如 a2(2)a_2^{(2)} 爲第二層第二個激活單元
  • W(j)W^{(j)}:表示第 jj 層傳遞到下一層即 j+1j + 1 層的權重矩陣,行數爲 j+1j + 1 層激活單元(不包含偏置)數量,列數爲第 jj 層激活單元(包含偏置)數量,比如 W(1)W^{(1)} 大小爲 3(a1(2)>a3(2)a_1^{(2)} -> a_3^{(2)}) X 4(x0>x3x_0 -> x_3
  • Wij(j)W_{ij}^{(j)}:權重矩陣的單個元素,比如 W10(1)W_{10}^{(1)} 表示第 1 層到第二層的權重矩陣中第一個元素,這個矩陣後面會帶着大家寫出來

符號定好之後,就可以按照單個神經元的加權求和的方法寫出中間層每個單元的計算公式,我們直接在中間層的節點上寫出當前神經元的輸出 ai(2)a_i^{(2)},注意 a0(2)a_0^{(2)} 是偏置單元,不連接上一層的輸出:

a1(2)=g(W10(1)x0+W11(1)x1+W12(1)x2+W13(1)x3) a_1^{(2)} = g(W_{10}^{(1)}x_0 + W_{11}^{(1)}x_1 + W_{12}^{(1)}x_2 + W_{13}^{(1)}x_3)

a2(2)=g(W20(1)x0+W21(1)x1+W22(1)x2+W23(1)x3) a_2^{(2)} = g(W_{20}^{(1)}x_0 + W_{21}^{(1)}x_1 + W_{22}^{(1)}x_2 + W_{23}^{(1)}x_3)

a3(2)=g(W30(1)x0+W31(1)x1+W32(1)x2+W33(1)x3) a_3^{(2)} = g(W_{30}^{(1)}x_0 + W_{31}^{(1)}x_1 + W_{32}^{(1)}x_2 + W_{33}^{(1)}x_3)

我們來用向量把上面的公式組合起來方便算法計算:

通過向量化表示,最後用一個向量公式就可以計算所有中間節點的輸出:

a(2)=g(W(1)x) a^{(2)} = g(W^{(1)}x)

這個公式可以解釋兩層之間的數據傳遞:

  • xx:表示上一層所有神經元的輸出(軸突)作爲當前層的輸入(樹突)
  • W(1)W^{(1)}:表示上一層連接到當前層的權重矩陣(類似細胞核要傳遞的信息)
  • a(2)a^{(2)}:表示當前層所有神經元的輸出(類似軸突)

可以看到第二層的每個神經元的值都與第一層所有神經元輸出有關。相應地輸出層計算公式也類似,要注意輸出層只有一個節點哦,所以 W(2)W^{(2)} 是 1 X 3 大小:

hθ(x)=g(W10(2)a0(2)+W11(2)a1(2)+W12(2)a2(2)+W13(2)a3(2)) h_\theta(x) = g(W_{10}^{(2)}a_0^{(2)} + W_{11}^{(2)}a_1^{(2)} + W_{12}^{(2)}a_2^{(2)} + W_{13}^{(2)}a_3^{(2)})

建議你也手動計算下:

把權重標在網絡上幫助你更好的理解:

明白了的童鞋釦個 6,以上的過程建議自己在草稿紙上推導一遍,加深理解。

四、多層神經網絡 - 深度學習

你肯定聽過深度學習這 4 個字,自從阿爾法狗之後突然火熱起來,其實深度學習本質上就是很多層的神經網絡,通過增加網絡層數來增加網絡的表示能力,以此完成很多類似人腦的功能,比如圖像領域的目標檢測,語義分割等。

以下是一個目標檢測的深度網絡,本質上還是神經網絡,多層神經網絡每層的節點數設計原則如下:

  • 輸入層節點數:固定爲輸入特徵數量
  • 中間的每個隱藏層節點數:根據經驗確定
  • 輸出層節點數:根據問題的輸出確定

其他的原理就不詳細介紹了,以後會學習的:

五、神經網絡如何處理多分類問題?

前面的 2 層神經網絡的輸出層只有一個節點,所以只能輸出 2 分類問題(0 代表 貓,1 代表狗)

其實神經網絡也可以處理多分類問題,只需要在網絡的輸出層增加節點即可,就像大腦神經元也可以有多個軸突輸出一樣。

輸出層有多個節點的網絡結構如下:

其中每個節點都可以代表一種類型,比如:貓、狗、老虎、獅子,這樣就實現了多分類功能,是不是很巧妙,簡直完美。

六、如何理解神經網絡?

5.1 轉換高級特徵

如果我們把 2 層神經網絡的輸入層去掉,如下圖:

會發現網絡的輸出就是邏輯迴歸的計算方法:

hθ(x)=g(W10(2)a0(2)+W11(2)a1(2)+W12(2)a2(2)+W13(2)a3(2)) h_\theta(x) = g(W_{10}^{(2)}a_0^{(2)} + W_{11}^{(2)}a_1^{(2)} + W_{12}^{(2)}a_2^{(2)} + W_{13}^{(2)}a_3^{(2)})

只不過把邏輯迴歸的輸入由輸入特徵 xix_i 換爲中間層的 aia_i,這些 aia_i 可以理解爲比輸入特徵 xix_i 更加高級的特徵。

如果後面還有網絡層那麼輸出的就是更加高級的特徵,這樣層層遞進,最後網絡對這些高級的特徵進行分類處理,輸出最後的結構,典型的應用就是圖像的目標檢測。

5.2 神經網絡的本質

通過上面的學習我們已經知道了神經網絡的結構和單個神經元的計算方法,可是你有沒有疑惑?

我們到底在計算什麼東西,這些節點的值有沒有實際的意義呢?

爲什麼這個神經網絡可以模擬我們的大腦?

這裏我談下我的理解,多層神經網絡的本質就是用來擬合非常複雜的函數,函數複雜到可以有成千上萬個 xx

上面的 2 層神經網絡就可以無限逼近任意的連續函數,因爲我們設計人工神經網絡是爲了模擬人腦,可是計算機只能做數學運算。

因此我們要把人腦神經元的思考過程轉化爲計算機算法中的函數,這個轉換的函數可能簡單可能複雜,要根據實際的問題類型。

對於複雜的問題,比如識別圖像中的小貓小狗,這個轉換的函數就難以用表達式描述,而我們的神經網絡是受到人腦生物神經元的啓發設計的,它的結構就可以從理論上模擬任意連續的複雜函數,以解決複雜的機器學習問題。

別看上面的神經網絡很多節點,其實這些節點並不重要,重要的是連接每層節點的權重 WW

我們訓練神經網絡的過程就是調整這些連接權重,把這些權重調層最優,最後的網絡輸出效果就會好(識別貓狗的正確率高)。

記住:訓練神經網絡或者深度網絡就是訓練節點之間的連接權值!

這次就分享這些,大家下期再見()!

本文原創首發於微信公號「登龍」,分享機器學習、算法編程、Python、機器人技術等原創文章,掃碼關注回覆「1024」你懂的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章