個人原文:www.hijerry.cn/p/53364.htm…html
感知機(perceptron)於1957年由Rosenblatt提出,是一種二分類線性模型。感知機以樣本特徵向量做爲輸入,輸出爲預測類別,取正、負兩類。感知機最終學習到的是將輸入空間(特徵空間)劃分爲正、負兩類的分離超平面,屬於判別模型。爲此,使用誤分類做爲損失函數,利用梯度降低優化該函數,可求得感知機模型。感知機是神經網絡與支持向量機的基礎。git
第 個樣本的預測值
,其中
稱爲激活函數,
,損失爲
。單層感知機的目的就是習得合適的
與
,使得全部樣本的損失之和
最小。github
若是咱們令 即感知機的輸入。那麼當
時,
;當
時,
。由於
是
線性組合,因此最終獲得的是一個超平面
,超平面將輸入樣本分爲了
和
-1兩類。算法
當輸入 是二維向量時,用紅點表示
的數據,黑點表示
的數據,最終習得的是一條直線,將兩個數據分離開,以下圖所示。bash
由於單層感知機最終習得是超平面,因此只能用於解決線性可分問題。對於下面這樣的數據,單層感知機無能爲力。網絡
多層感知機也叫MLP,能夠看作是一個有向圖。MLP由多層節點組成,每一層全鏈接到下一層,除輸入節點外,每一個節點都是一個帶有非線性激活函數的神經元(unit)。多層感知機可用於解決線性不可分問題。機器學習
由於神經網絡的和多層感知器是一個意思,因此下面直接對單層前饋神經網絡進行詳細說明。函數
下圖是一個輸入層節點數爲3,隱藏層節點數爲2,輸出層節點數爲2的前饋神經網絡,該網絡可用於解決二分類問題。學習
單層前饋神經網絡本質上是一個多層感知機,有如下幾個特色:優化
權重
鏈接。單層
。前饋
。咱們拿出隱藏層的一個神經元(unit)放大來看:
神經元的任務就是接受輸入,產生輸出
。
z
表示神經元的輸入,a
是神經元的輸出。
輸入怎麼得來?就是上一層的神經元輸出與權重
的乘積之和再加上偏置
。
輸出怎麼得來?把輸入值帶入激活函數
獲得。
寫成數學表達式就是:
是激活函數,常見的有sigmoid、tanh、ReLU。
Sigmoid的表達式爲 ,定義域爲
,值域爲
在 處,函數值爲
,其函數圖像以下:
sigmoid函數有許多優美的性質,如:
是 的複合函數,
又名
天然常數
1階導函數
爲 。即函數在某一點的導數可由函數在這一點的函數值求得
曲線光滑,定義域內到處可導,且能夠無限次求導
能夠把任意輸入壓縮到 範圍內
在反向傳播算法(BP算法)中,性質二、3起到了極大的做用,性質4起到了防溢出的做用。
現考慮一個樣本 ,其中
是輸入數據,
是實際值。咱們如今來手動計算
預測值
。預測值
的計算過程是從輸入層開始
從左往右計算
的,因此這個過程也叫做前向傳播。
下圖表示,爲了獲得 ,有哪些神經元被激活了。
爲了方便表述,用 表示第
層的第
個神經元與第
層的第
個神經元相連的權重,用
表示第
層第
個神經元的偏置值。
注意。輸入層沒有激活函數,因此:
若是咱們把 做爲類別爲
的機率,將
做爲類別爲1的機率,則樣本
的預測值能夠寫成
,因此爲了讓
,選用
做爲輸出層的激活函數。
令 ,
咱們令 ,
,那麼
,同理設
神經網絡能夠明確的用數學語言表達,它的函數表達式,能夠明確的寫出來
複製代碼
若是真的將這個數學表達式寫出來,那麼這個數學函數 是一個包含
個參數的函數,函數輸入
可獲得預測值
,這個表達式會很是長。
咱們如今來優化網絡中這10個權重參數和4個偏置參數。
定義輸出層的節點 的偏差,可用的損失函數有:
使用梯度降低算法來優化損失函數,則須要求出損失函數對全部參數的導數
,這個過程在計算上是從輸出層開始從右往左計算
的,由於與計算預測值 的過程恰巧相反,因此也叫做反向傳播。
以計算權重 的偏導數爲例,根據鏈式法則不可貴到:
∵ ,又
,
∴ (注:這是二分類問題特有的交叉熵表示方式)
∴
又
且
故原偏導數可寫成:
更通用化的表達,如何計算 ?依葫蘆畫瓢得:
令 表示輸出層節點
的偏差值
則上式可寫成:
如何理解?用 表示爲隱藏層節點的位置,
表示爲輸出層節點的位置,那麼權重
的導數爲
該權重前一層第i個節點的激活值與後一層第j個節點的偏差值的乘積
。
下圖是反向傳播的示意圖,損失函數產生的偏差順着紅線一直往左邊傳,每通過一條紅線就求一次導數,直到要求的權重也覆蓋在紅線爲止。下圖有三條紅線,也就是損失函數 對
的導數須要用三個偏導數乘積造成的鏈式求導才能獲得,且最後一個偏導數值爲
。
如何計算 呢?繼續使用鏈式法則 + 依葫蘆畫瓢可得:
令 爲
的
偏差值
,那麼上式能夠寫成:
觀察能夠發現:
如何理解?若是用 表示輸入層節點位置,
表示隱藏層節點位置,那麼權重
的導數爲
該權重前一層第i個節點的激活值與後一層第j個節點的偏差值的乘積
。每一個節點的偏差值 等於 鏈接權重 與 權重另外一端所連節點的偏差值 的乘積之和 與 本節點激活值的導數 的乘積
。
詳細的推導過程讀者能夠本身琢磨一下,這裏有個關鍵點須要注意:
如何求 的導數?根據以前的邏輯推導便可:
如何求 的導數?鏈條太長,這裏直接給出答案:
與權重導數不一樣的地方就是,在求導過程當中的最後一項 。
若是加入偏置單元,也能夠理解爲偏置單元 的值爲1,以下圖所示:
正則化(regularation)是防止機器學習過擬合的一種手段。一種常見的手段是經過將權重的平方之和加入到損失函數來實現。那麼損失函數變爲:
全部權重、偏置之和稱爲 正則項
, 是
正則項係數
,也叫 懲罰係數
。
加入正則化項後, 的導數要多算一個平方項的導數,以
爲例
咱們假設輸入值 、 實際值
都是列向量。
觀察 、
的表達式,進而發現能夠用矩陣形式書寫爲:
不失通常性,設第 層的前向傳播:
,其中
、
、
均爲列向量,
爲矩陣
激活值 ,因此激活值也是列向量。
損失函數向量化爲:
表示把矩陣
的全部元素之和
*
表示求哈達馬積
,即兩個矩陣對應位置的元素的乘積所造成的一個新矩陣
輸出層偏差值向量化:
隱藏層偏差向量化:
參數 導數向量化:
不失通常性,有:
上述全部過程都是假設只有一個樣本。
當參與計算的樣本數量大於1時:
你不用寫一個for循環來計算上述值,使用矩陣乘法會更爲方便,這裏留給讀者思考。
github:github.com/JerryCheese…
ann.py
是面向過程版本實現,且隱藏層數只能爲1。
NN.py
是面向對象版本實現,支持多層隱藏層。