感知器是乙個二元線性分類器,其目標是找到乙個超平面將訓練樣本進行分隔(分類),其表示為
一般使用的啟用函式不是階躍函式,常用的有sigmoid函式(其導數: σ′
在1個樣本的訓練集上代價函式(最小均方誤差)通常為 c=
12|a
−y|2
訓練過程中步長(學習速率)為α 的
w 和b的新值為 w′
ib′=
wi−α
∇wic
=b−α
∇bc
∂c∂w
i∂c∂
b=∂c
∂z∂z
∂wi=
∂c∂z
∂z∂b
其中 ∂c
∂z∂z
∂wi∂
z∂b=
∂c∂a
∂a∂z
=12∂
∂a|a
−y|2
∂a∂z
=(a−
y)σ(
1−σ)
=∂∂w
i(∑i
=0n−
1wix
i+b)
=xi=
∂∂wi
(∑i=
0n−1
wixi
+b)=
1 最終可得 ∂c
∂wi∂
c∂b=
∂c∂z
∂z∂w
i=∂c
∂a∂a
∂z∂z
∂wi=
(a−y
)σ(z
)(1−
σ(z)
)xi=
∂c∂z
∂z∂b
=∂c∂
a∂a∂
z∂z∂
b=(a
−y)σ
(z)(
1−σ(
z))
最終對有k個訓練樣本的感知機的迭代函式為 w′
ib′=
wi−α
1k∑k
=0k−
1(ak
−yk)
σ(z)
(1−σ
(z))
xi=b
−α1k
∑k=0
k−1(
ak−y
k)σ(
z)(1
−σ(z
))感知器可以看成乙個最簡單的二層神經網路,作為乙個線性分類器它使用的侷限性太大,而多層神經網路可以彌補它的缺點,並且訓練原理與其類似
上圖的三層神經網路多了乙個隱含層,其中隱含層和輸出層均為左下角的神經元,這個神經網路在訓練過程時需要訓練兩層的神經網路,並且隱層的誤差無法直接獲取,而輸出層的誤差則和感知器相同:
同樣在1個樣本的訓練集上代價函式(均方誤差)通常為 c=
12∑i
=0n−
1|aj
i−yj
i|2
也就是輸出層每個神經元的輸出和對應的目標值誤差的平方和。
因為只有輸出層的誤差可以獲取,所以訓練從輸出層開始,對第三層的第乙個來說 ∂c
∂w31
i∂c∂
b31=
∂c∂a
31∂a
31∂z
31∂z
31∂w
31i=
∂c∂a
31∂a
31∂z
31x3
1i=∂
c∂a3
1∂a3
1∂z3
1a21
i=∂c
∂a31
∂a31
∂z31
∂z31
∂b31
=∂c∂
a31∂
a31∂
z31
隱含層的訓練也就是bp神經網路的重點,即誤差的反向傳播過程,因為隱含層的誤差無法直接獲取,所以才從輸出層開始調整引數,然後誤差向出入層開始傳播,一層一層的進行訓練
以訓練隱含層的第乙個神經元為例 ∂c
式子中紅色部分即為輸出層兩個神經元計算過的,藍色部分 z3
1=∑w
31a2
i+b
∂z31
∂a21
=w31
∂z32
∂a21
=w32
weight這些值都是確定的,最後黃色部分也很容易求得。 ∂c
∂w21
i∂c∂
b21=
∂c∂a
31∂a
31∂z
31∂z
31∂a
21∂a
21∂z
21a1
1i+∂
c∂a3
2∂a3
2∂z3
2∂z3
2∂a2
1∂a2
1∂z2
1a11
i=∂c
∂a31
∂a31
∂z31
∂z31
∂a21
∂a21
∂z21
+∂c∂
a32∂
a32∂
z32∂
z32∂
a21∂
a21∂
z21
如果有更多層,則都是在後一層計算完成的基礎上進行更新。
同感知器的k個同理,使用k個樣本的平均誤差進行更新
因為樣本的巨大,所以一次不會使用所有的樣本進行訓練,而是將訓練樣本分為比較小的部分進行分批訓練。
使用三層神經網路識別手寫數字。
語言:c++
資料:mnist
具體實現在我的影象處理庫:zmatrix中的zml中。僅做參 神經網路 感知器訓練演算法
感知器訓練 perceptron rule 物件 單個單元 perceptron unit 用途 處理線性可分的資料集 對下列公式進行有限次的迭代 repeat x,y 目的 設定權值以便獲得與預期相同的資料集 方式 通過不斷地修改權值來實現目的,這裡採用給權值w賦予學習速率的方式,但碰到乙個問題是...
神經網路(單層感知器)
感知器是神經網路中的乙個概念,在1950s由frank rosenblatt第一次引入。單層感知器是最簡單的神經網路。它包含輸入層和輸出層,而輸入層和輸出層是直接相連的。與最早提出的mp模型不同,神經元突觸權值可變,因此可以通過一定規則進行學習。可以快速 可靠地解決線性可分的問題。單層感知器由乙個線...
神經網路 單層感知器
神經網路是非常重要的且用途廣泛,通過模擬人體的處理資訊方式來解決問題,下面就來介紹一下單層感知器。import numpy as np import matplotlib.pyplot as plt 輸入資料 x np.array 1,3,3 1,4,3 1,1,1 1,0,2 標籤y np.arr...