近幾年,有幾個被媒體大肆報道的事件,如下表所示。
如上所示,深度學習作為人工智能的一種具有代表性的實現方法,取得了很大的成功。那么,深度學習究竟是什么技術呢?深度學習里的“學習”是怎么做到的呢?本文我們就來解答一下這個疑問,不過在此之前,我們需要先了解一下神經網絡,因為深度學習是以神經網絡為出發點的。
神經網絡的靈感來源
談到神經網絡的想法,我們需要從生物學上的神經元(neuron)開始說起。從生物學扎實的研究成果中,我們可以得到以下關于構成大腦的神經元知識。
人的大腦是由多個神經元互相連接形成網絡而構成的。也就是說,一個神經元從其他神經元接收信號,也向其他神經元發出信號。大腦就是根據這個網絡上的信號的流動來處理各種各樣的信息的。
神經元示意圖
神經元主要由細胞體、軸突、樹突等構成。樹突是從其他神經元接收信號的突起。軸突是向其他神經元發送信號的突起。由樹突接收的電信號在細胞體中進行處理之后,通過作為輸出裝置的軸突,被輸送到其他神經元。另外,神經元是借助突觸結合而形成網絡的。
讓我們來更詳細地看一下神經元傳遞信息的結構。如上圖所示,神經元是由細胞體、樹突、軸突三個主要部分構成的。其他神經元的信號(輸入信號)通過樹突傳遞到細胞體(也就是神經元本體)中,細胞體把從其他多個神經元傳遞進來的輸入信號進行合并加工,然后再通過軸突前端的突觸傳遞給別的神經元。
那么,神經元究竟是怎樣對輸入信號進行合并加工的呢?讓我們來看看它的構造。
假設一個神經元從其他多個神經元接收了輸入信號,這時如果所接收的信號之和比較小,沒有超過這個神經元固有的邊界值(稱為閾值),這個神經元的細胞體就會忽略接收到的信號,不做任何反應。
注:對于生命來說,神經元忽略微小的輸入信號,這是十分重要的。反之,如果神經元對于任何微小的信號都變得興奮,神經系統就將“情緒不穩定”。
不過,如果輸入信號之和超過神經元固有的邊界值(也就是閾值),細胞體就會做出反應,向與軸突連接的其他神經元傳遞信號,這稱為點火。
那么,點火時神經元的輸出信號是什么樣的呢?有趣的是,信號的大小是固定的。即便從鄰近的神經元接收到很大的刺激,或者軸突連接著其他多個神經元,這個神經元也只輸出固定大小的信號。點火的輸出信號是由0 或1 表示的數字信息。
將神經元的工作在數學上抽象化,并以其為單位人工地形成網絡,這樣的人工網絡就是神經網絡。將構成大腦的神經元的集合體抽象為數學模型,這就是神經網絡的出發點。
對于用神經網絡實現的人工智能,人們只需要簡單地提供數據即可。神經網絡接收數據后,就會從網絡的關系中自己學習并理解。如此看來,神經網絡似乎有一些不可思議的邏輯。然而,從數學上來說,其原理十分容易。下面我們就一點點闡述它的原理。
神經網絡中的數學
一、神經元工作的數學表示
讓我們先整理一下已經考察過的神經元點火的結構。
(i) 來自其他多個神經元的信號之和成為神經元的輸入。
(ii) 如果這個信號之和超過神經元固有的閾值,則點火。
(iii) 神經元的輸出信號可以用數字信號0 和1 來表示。即使有多個輸出端,其值也是同一個。
下面讓我們用數學方式表示神經元點火的結構。
首先,我們用數學式表示輸入信號。由于輸入信號是來自相鄰神經元的輸出信號,所以根據(iii),輸入信號也可以用“有”“無”兩種信息表示。因此,用變量x 表示輸入信號時,如下所示。
注:與視細胞直接連接的神經元等個別神經元并不一定如此,因為視細胞的輸入是模擬信號。
接下來,我們用數學式表示輸出信號。根據(iii),輸出信號可以用表示點火與否的“有”“無”兩種信息來表示。因此,用變量y 表示輸出信號時,如下所示。
最后,我們用數學方式來表示點火的判定條件。
從(i) 和(ii) 可知,神經元點火與否是根據來自其他神經元的輸入信號的和來判定的,但這個求和的方式應該不是簡單的求和。例如在網球比賽中,對于來自視覺神經的信號和來自聽覺神經的信號,大腦是通過改變權重來處理的。因此,神經元的輸入信號應該是考慮了權重的信號之和。
用數學語言來表示的話,例如,來自相鄰神經元1、2、3 的輸入信號分別為x1、x2、x3,則神經元的輸入信號之和可以如下表示。
式中的w1、w2、w3 是輸入信號x1、x2、x3 對應的權重(weight)。
根據(ii),神經元在信號之和超過閾值時點火,不超過閾值時不點火。于是,利用式(1),點火條件可以如下表示。
這里,θ 是該神經元固有的閾值。
例1
來自兩個神經元1、2 的輸入信號分別為變量x1、x2,權重為w1、w2,神經元的閾值為θ。當w1 = 5,w2 = 3,θ = 4 時,考察信號之和w1x1+ w2x2 的值與表示點火與否的輸出信號y 的值。
二、點火條件的圖形表示
下面我們將表示點火條件的式(2) 圖形化。以神經元的輸入信號之和為橫軸,神經元的輸出信號y 為縱軸,將式(2) 用圖形表示出來。如下圖所示,當信號之和小于θ 時,y 取值0,反之y 取值1。
如果用函數式來表示這個圖形,就需要用到下面這個單位階躍函數。
單位階躍函數又稱單位布階函數,目前有三種定義,它們共同之處是自變量取值大于0時,函數值為1;自變量取值小于0時,函數值為0,不同之處是,自變量為0時函數值各不相同。
單位階躍函數的圖形如下所示。
利用單位階躍函數u(z),式(2) 可以用一個式子表示如下。
通過下表可以確認式(3) 和式(2) 是一樣的。
此外,該表中的z(式(3) 的階躍函數的參數)的表達式
這稱為該神經元的加權輸入。
三、將神經元的工作一般化
上面為了接近神經元的形象,我們將神經元表示為了下圖的樣子。
然而,為了畫出網絡,我們需要畫很多的神經元,在這種情況下上面那樣的圖就不合適了。因此,我們使用如下所示的簡化圖,這樣很容易就能畫出大量的神經元。
為了與生物學的神經元區分開來,我們把經過這樣簡化、抽象化的神經元稱為神經單元(unit)。
將神經元的示意圖抽象化之后,對于輸出信號,我們也對其進行一般化。
上面我們提到,根據點火與否,生物學上的神經元的輸出y 分別取值1 和0(下圖)。
然而,如果除去“生物”這個條件,這個“0 和1 的限制”也應該是可以解除的。這時表示點火與否的下式(前邊式(3))就需要修正。
這里,u 是單位階躍函數。我們將該式一般化,如下所示。
這里的函數a 是建模者定義的函數,我們稱為激活函數(activation function)。x1、x2、x3 是模型允許的任意數值,y 是函數a 能取到的任意數值。這個式(2) 就是今后所講的神經網絡的出發點。
注:雖然式(2) 只考慮了3 個輸入,但這是很容易推廣的。另外,式(1) 使用的單位階躍函數u(z) 在數學上也是激活函數的一種。
請注意,式(2) 的輸出y 的取值并不限于0 和1,對此并沒有簡單的解釋。一定要用生物學來比喻的話,可以考慮神經單元的“興奮度”“反應度”“活性度”。
我們來總結一下神經元和神經單元的不同點,如下表所示。
將神經元點火的式(1) 一般化為神經單元的激活函數式(2),要確認這樣做是否有效,就要看實際做出的模型能否很好地解釋現實的數據。實際上,式(2) 表示的模型在很多模式識別問題中取得了很好的效果。
四、神經單元的激活函數
Sigmoid 函數
神經單元激活函數的代表性例子是Sigmoid 函數σ(z),其定義如下所示。
關于這個函數,我們以后可以繼續深入學習。這里,我們先來看看它的圖形,Sigmoid 函數σ(z) 的輸出值是大于0 小于1 的任意值。此外,該函數連續、光滑,也就是說可導。這兩種性質使得Sigmoid 函數很容易處理。
右圖是激活函數的代表性例子Sigmoid 函數σ(z) 的圖形。除了原點附近的部分,其余部分與單位階躍函數(左圖)相似。Sigmoid 函數具有處處可導的性質,很容易處理。
單位階躍函數的輸出值為1 或0,表示點火與否。然而,Sigmoid 函數的輸出值大于0 小于1,這就有點難以解釋了。如果用生物學術語來解釋的話,如上文中的表格所示,可以認為輸出值表示神經單元的興奮度等。輸出值接近1 表示興奮度高,接近0 則表示興奮度低。
偏置
再來看一下激活函數的式(2)。
這里的θ 稱為閾值,在生物學上是表現神經元特性的值。從直觀上講,θ表示神經元的感受能力,如果θ 值較大,則神經元不容易興奮(感覺遲鈍),而如果值較小,則神經元容易興奮(敏感)。
然而,式(2) 中只有θ 帶有負號,這看起來不漂亮。數學不喜歡不漂亮的東西。另外,負號具有容易導致計算錯誤的缺點,因此,我們將- θ 替換為b。
經過這樣處理,式子變漂亮了,也不容易發生計算錯誤。這個b 稱為偏置(bias)。
我們將式(4) 作為標準使用。另外,此時的加權輸入z如下所示。
式(4) 和式(5) 是今后所講的神經網絡的出發點,非常重要。
另外,生物上的權重w1、w2、w3 和閾值θ( = - b)都不是負數,因為負數在自然現象中實際上是不會出現的。然而,在將神經元一般化的神經單元中,是允許出現負數的。
練習題
下圖是一個神經單元。如圖所示,輸入x1 的對應權重是2,輸入x2的對應權重是3,偏置是- 1。根據下表給出的輸入,求出加權輸入z 和輸出y。注意這里的激活函數是Sigmoid函數。
請自行填寫之后看下面答案。
解:結果如下表所示(式(3) 中的e 取e = 2.7 進行計算)。
備注
改寫式(5)。
我們將式(5) 像下面這樣整理一下。
這里增加了一個虛擬的輸入,可以理解為以常數1 作為輸入值(下圖)。于是,加權輸入z 可以看作下面兩個向量的內積。
( w1,w2,w3,b)(x1,x2,x3,1)
計算機擅長內積的計算,因此按照這種解釋,計算就變容易了。
神經網絡作為本文的主題,它究竟是什么樣的呢?下面讓我們來看一下其概要。
五、神經網絡
上面我們考察了神經單元,它是神經元的模型化。那么,既然大腦是由神經元構成的網絡,如果我們模仿著創建神經單元的網絡,是不是也能產生某種“智能”呢?這自然是讓人期待的。眾所周知,人們的期待沒有被辜負,由神經單元組成的網絡在人工智能領域碩果累累。
在進入神經網絡的話題之前,我們先來回顧一下上面考察過的神經單元的功能。
將這樣的神經單元連接為網絡狀,就形成了神經網絡。它的連接方法多種多樣,本文將主要考察作為基礎的階層型神經網絡。
神經網絡各層的職責
階層型神經網絡如下圖所示,按照層(layer)劃分神經單元,通過這些神經單元處理信號,并從輸出層得到結果,如下圖所示。
構成這個網絡的各層稱為輸入層、隱藏層、輸出層,其中隱藏層也被稱為中間層。
各層分別執行特定的信號處理操作。
輸入層負責讀取給予神經網絡的信息。屬于這個層的神經單元沒有輸入箭頭,它們是簡單的神經單元,只是將從數據得到的值原樣輸出。
隱藏層的神經單元執行前面所復習過的處理操作(1) 和(2)。在神經網絡中,這是實際處理信息的部分。
輸出層與隱藏層一樣執行信息處理操作(1) 和(2),并顯示神經網絡計算出的結果,也就是整個神經網絡的輸出。
人工智能中著名的深度學習,顧名思義,就是疊加了很多層的神經網絡。疊加層有各種各樣的方法,其中著名的是卷積神經網絡。
了解卷積神經網絡可以閱讀《卷積神經網絡的Python實現》這本書。關于神經網絡的詳細介紹,請看《這是我看過,最好懂的神經網絡》這篇文章。
從數學角度看神經網絡的學習
我們了解了神經網絡識別輸入圖像的機制,。具體來說,就是根據神經單元中的權重關系來判斷。那么,這個權重的大小是如何確定的呢?神經網絡中比較重要的一點就是利用網絡自學習算法來確定權重大小。
神經網絡的參數確定方法分為有監督學習和無監督學習。本文只提到了監督學習,有監督學習是指,為了確定神經網絡的權重和偏置,事先給予數據,這些數據稱為學習數據。神經網絡根據給定的學習數據確定權重和偏置,稱為學習。
注:學習數據也稱為訓練數據。
那么,神經網絡是怎樣學習的呢?其實思路極其簡單:計算神經網絡得出的預測值與正解的誤差,確定使得誤差總和達到最小的權重和偏置。這在數學上稱為模型的最優化(下圖)。
關于預測值與正解的誤差總和,有各種各樣的定義。本文采用的是最古典的定義:針對全部學習數據,計算預測值與正解的誤差的平方(稱為平方誤差),然后再相加。這個誤差的總和稱為代價函數(cost function),用符號CT 表示(T 是Total 的首字母)。
利用平方誤差確定參數的方法在數學上稱為最小二乘法,它在統計學中是回歸分析的常規手段。
最優化是指確定使得誤差總和最小的參數的方法。