人工神經元和Delta規則
感知機
神經系統給生命帶來了智能。不管是低級的條件反射,還是高級的邏輯推理,都是神經系統中一個個神經元共同完成的。每個神經元都是一個單獨的細胞,他們通過「突觸」互相連接。每個神經元有若干個樹突,樹突可以接受信號。這些信號進行疊加,當疊加的刺激突破一個閾值,神經元就會被激活放電,也就是產生了「神經衝動」,電信號沿著神經元的軸突傳導出去。軸突可以很長,因此,神經元可能是生物體內直徑最大的細胞。
人工智慧研究者很早就開始試圖模擬神經元的行為,希望由此構造出人工的智能。感知機(Perceptron)模型是廣泛採用的一種簡化的神經元模型。這個模型具有神經元最為基本的一些特徵,它有多個輸入(樹突),它對輸入進行線性疊加,然後當疊加和突破某個閾值的時候產生一個輸出(軸突)。
圖示是一個簡單的感知機模型,有三個輸入。假設一個一般的感知機有個輸入,每個輸入記作。在對輸入進行疊加的時候,給每個輸入賦一個權值。疊加和,我們把突破閾值激活這一行為表達為一個階梯函數:
通常,這個閾值稱作偏置(bias),相當於把階躍在0的階梯函數挪了個位置。有時候,模型會忽略這個偏置,這時候我們可以假設有一維輸入是個恆定的非零值,偏置就隱含在了那一維對應的權值里。總之,這些有點不同的模型其實是等效的。
激活函數
前面那個階梯函數就是神經元的激活函數。激活函數有很多不同的形式,階梯函數是最簡單的一種。為什麼要一個激活函數呢?一方面是因為生物神經元確實有類似的行為,另一方面是為了給模型一點非線性的因素。
生物神經元有一個特性,它要麼產生衝動,要麼不產生衝動,沒有中間狀態。因此,人工神經元要模擬類似的行為。而且,如果僅僅做線性疊加,當我們把很多神經元組合在一起時會發現,將線性模型疊加在一起,無論疊加多少,總是相當於一個線性模型,對於計算能力的提升沒有任何貢獻。因此,我們需要激活函數引入一點非線性的因素,這樣當多個神經元疊加的時候,就產生了比單個神經元更為強大的表達能力。於是,我們可以構造神經網路。
上面的激活函數有個問題,它不可導。為了計算和推導的便利,我們引入了一些可導的函數作為激活函數,這一類函數都叫做Sigmoid函數,其中最著名的是Logistic函數:
這個函數的導數也很特別,或者說非常容易計算:Delta規則
人工神經元的作用是對於輸入向量產生一個輸出。為了讓神經元能夠給出我們期望的輸出,需要訓練它,或者說讓它學習到一個模型。訓練的樣本是一系列已知的和,我們用表示期待得到的正確輸出。我們用下面的函數描述實際輸出和期待的正確輸出之間的誤差:
這個函數定義成這樣是為了後面計算方便,比如定義成也毫無問題,只不過算起來麻煩一些。
學習的過程就是減小這個誤差,而且最好我們能使這個誤差達到最小值。神經元通過迭代的方式求得最小值,每次根據當前的狀況做出一點修正,逐漸找到目標函數的最小值。這跟生物神經元逐漸生長的策略是相似的。我們採用梯度下降法:想像要找到山谷的最低點,應該朝著下坡路走,當然前提是這是一個向盆地一樣的山谷,沒有太多複雜的起伏,不然我們可能陷在一個不太深的小山谷里,誤以為真的到達了最低處。幸好對於單個神經元,這種複雜的情況是沒有的,也就是說誤差最小化這個優化問題的目標函數是個凸函數。
為了使最小化,每一次對參數的修正應該是。這裡,是個因子,表示學習速度的快慢,通常叫做學習率。下面算一下偏導數:由於激活函數的倒數總是非負值,不影響權值修正的方向,因此有時候可以忽略掉它:
這就是神經元的基本學習規則之一,Delta規則。簡單說,就是權值的修正量等於誤差乘以輸入。
至此,我們就得到了一個可以將輸入向量對應的輸出的簡單模型。我們可以把它作為一個二分分類器。
推薦閱讀:
※智能醫療相關論文筆記/調研
※推薦系統為什麼要分測試集和訓練集?
※深度學習一行一行敲vae-npvc網路-tensorflow版(vae.py)
※「社交網路分析」是門怎樣的學科?