神經網絡中的神經元

神經元數學模型

人工神經網絡是一個用戶大量簡單處理單元經廣泛鏈接而成的人工網絡, 是對人腦的神經網絡的抽象和模擬. 我們知道, 人腦的神經系統的基本的單位是神經元, 所以建立人工神經網絡的首先要做的是對神經元的抽象, 建立神經元的數學模型.
早在1943年, 神經元的數學模型被提出, 之後又陸陸續續提出了上百種神經元模型, 下面是一種常用的神經元模型:
神經元模型
在這張圖中, 我們可以看到這個神經元有三個輸入, 一個輸出, 這很像我們正常的神經元的樹突和軸突:
神經元在我們正常的`神經元細胞中, 信息從樹突輸入, 經過細胞體處理後從軸突輸出. 我們可以看到, 在神經元模型中有一個線性環節和一個非線性環節, 這就是信息處理的部分, 也就是模擬了細胞體的功能.
線性環節,就是將輸入的數 x 1 . . . x n x_1...x_n 乘以他們對應的權數 w 1 . . . w n w_1...w_n 再相加 a = w 1 x 1 + . . . + w n x n + b a=w_1x_1+...+w_nx_n+b , 得到我們線性環節的輸出 a a , 非線性環節, 就是將我們再線性環節輸出的數 a a 放到我們準備好的非線性函數 y = y ( x ) y=y(x) 中, 得到這個神經元的最終輸出值 y y .
爲什麼需要非線性函數呢? 因爲如果我們不加入非線性函數的話, 得到的只是輸入線性的結合, 那麼無論神經網絡有多複雜, 我們能把他合併爲一個線性計算, 而加入了非線性環節, 我們的神經元就能獲得更多的可能.
那麼怎麼選擇非線性部分的函數呢? 首先我們可以想到生物的神經元具有兩種常規的工作狀態: 興奮與抑制, 這讓我們很容易想到0和1, 我們用0來模擬抑制, 用1來模擬興奮, 那麼我們就會想到用階躍函數來作爲神經元的非線性部分
f ( x ) = { 1 x 0 0 x < 0 f(x)=\begin{cases} 1 & x\geq0 \\ 0 & x<0 \\ \end{cases}
階躍函數
這樣我們就解決了非線性部分的函數了
那麼, 神經元怎麼訓練呢?
首先明確一點, 神經元的訓練就是調節 w 1 w_1 w n w_n 和b的值, 是神經元的計算結果越來越趨近於我們所期待的輸出值
我們將 y y 定義爲神經元計算出來的值, y s y_s 爲理想的輸出值, 那麼誤差函數爲 e = ( y s y ) 2 e=(y_s-y)^2 , 那我們怎麼知道該怎麼調整 w w b b 的值呢? 其實我們可以是我們的誤差函數 e e w w b b 求導, 然後往導數小的地方調整就可以了, 那麼問題來了, 階躍函數的導數不連續啊, 這樣不方便計算啊. 所以, 我們得還一個非線性函數了.

非線性函數和梯度下降

實際上, 常用的非線性函數有很多, 在這裏我們選擇的函數叫做 s i g n m o i d signmoid 函數.
s ( x ) = 1 / ( 1 + e x ) s(x)=1/(1+e^{-x})
這個函數有一個好處, 就是可以用它本身來表示他的導數:
d s ( x ) / d x = s ( x ) ( 1 s ( x ) ds(x)/dx = s(x)(1-s(x)
這又進一步簡化了我們的計算. 那麼, 接下來我們就推導我們的訓練公式吧:
首先我們可以輕易地得到:
d e / d w = d ( y s y ) 2 de/dw=d(y_s-y)^2
通過鏈式法則得出:
d e / d w = ( d e / d y ) ( d y / d w ) de/dw=(de/dy)(dy/dw)
e = ( y y s ) 2 e=(y-y_s)^2 帶入得:
d e / d w = 2 ( y s y ) ( d y / d w ) de/dw=-2(y_s-y)(dy/dw)
同樣的我們可以由鏈式法則得出:
d y / d w = ( d y / d a ) / ( d a / d w ) dy/dw=(dy/da)/(da/dw)
前面我們可知:
d y ( a ) / d a = s ( a ) ( 1 s ( a ) ) dy(a)/da = s(a)(1-s(a))
所以:
d e / d w = 2 ( y s y ) s ( a ) ( 1 s ( a ) ) de/dw=-2(y_s-y)s(a)(1-s(a))
其中 a = w 1 x 1 + . . . + w n x n + b a=w_1x_1+...+w_nx_n+b , 爲了方便我們減少幾個變量: a = w x + b a=wx+b , 那麼可得:
d e / d w = 2 ( y s y ) s ( w x + b ) ( 1 s ( w x + b ) ) x de/dw=-2(y_s-y)s(wx+b)(1-s(wx+b))x
這樣我們的公式就求出來了, 之後只要用 w n e w = w o l d α d e / d w w_{new}=w_{old}-α*de/dw 就可以了, 其中 α α 是學習率, 爲0到1之間的值, 用來調節 w w 變化的強度, 保證不會越過我們所需要的最佳值.
這種方法被稱爲梯度下降梯度下降在這個函數中, 橫座標爲 w w , 縱座標爲誤差, 當誤差最小時, 關於 w w 的導數爲0, 當導數大於0時, w w 的爲過大, 我們需要減小 w w 的值, 而當導數小於0時, w w 的爲過小, 我們需要增大 w w 的值, 所以我們調節w的值時只要減去求出來的導數就可以了.