最近學習神經網路,自己參照源**把誤差逆傳播重新寫了一遍,其實挺簡單的,關鍵是要把逆傳播的幾個過程搞清楚以及每一步是為了得到什麼,然後知道numpy的矩陣運算操作,廢話不多說,直接上**:
# 反向傳播演算法
defbackpro
(weights, bs, x, y, nums)
:"""
逆傳播計算引數的梯度
:param weights: 權重矩陣列表,每一層乙個權重矩陣,直到最後一層,整個網路構成乙個矩陣集合
:param bs: 偏置向量列表,每一層乙個偏置列向量
:param x: 輸入
:param y: 期望輸出
:param nums: 網路層數
:return:
"""# 構造兩個空的梯度列表,形狀跟每一層權重矩陣和列向量形狀相同
nabla_weight =
[np.zeros(z.shape)
for z in weights]
# 每一層權重的梯度矩陣跟權重矩陣的形狀相同
nabla_b =
[np.zeros(b.shape)
for b in bs]
# 同理,每一層偏置的梯度列向量跟偏置列向量的形狀相同
# 定義帶權輸入列表,儲存每一層的帶權輸入列向量
zs =
# 定義啟用值列表,儲存啟用值
activation = x
activations =
[x]# 第一步,前向傳播,計算帶權輸入和啟用值
for w, b in
zip(weights, bs)
:# 計算當前層的帶權輸入z
z = np.dot(w, activation)
+ b # 計算當前層的啟用值
activation = f(z)
# 第二步,計算輸出層的誤差
delta = g(activations[-1
])* h(zs[-1
])nabla_b[-1
]= delta # 輸出層的偏置梯度即為其誤差
nabla_weight[-1
]= np.dot(delta, activations[-2
].transpose())
# 第三步,誤差逆傳播,計算倒數第二層到第二層的誤差
for l in
range(2
, nums)
:# 逆傳播公式,-l+1層的誤差得到-l層的誤差
delta = np.dot(weights[
-l+1
].transpose(
), delta)
* h(zs[
-l])
nabla_b[
-l]= delta
nabla_weight[
-l]= np.dot(delta, activations[
-l-1
].transpose())
return nabla_weight, nabla_b
# 定義乙個啟用函式
deff
(z):
return z
# 定義乙個啟用函式的導函式
defh
(z):
return z
# 定義乙個代價函式的導函式
defg
(a):
return a
注意:其中的啟用函式及其導數,以及代價函式都沒有具體的形式,自己可以根據具體情況把這是哪個函式進行修改 機器學習 誤差逆傳播演算法 反向傳播演算法
誤差逆傳播演算法 error backpropagation,bp 是神經網路中常用的傳播演算法。bp演算法不僅可以應用於多層前饋神經網路,還可以應用於其他型別的神經網路,如訓練遞迴神經網路。通常所說的 bp網路 一般是指用bp演算法訓練的多層前饋神經網路。給定訓練集 d left y x y x ...
神經網路 誤差逆傳播演算法推導 BP演算法
誤差逆傳播演算法是迄今最成功的神經網路學習演算法,現實任務中使用神經網路時,大多使用bp演算法進行訓練。給定訓練集 d x i in r d,y i in r l 即輸入示例由 d 個屬性描述,輸出 l 個結果。如圖所示,是乙個典型的單隱層前饋網路,它擁有 d 個輸入神經元 l 個輸出神經元 q 個...
BP誤差反向傳播演算法
bp演算法通過將輸出誤差反向傳播,將誤差分配到每個權值上,利用梯度更新對所有引數進行調整以達到輸出累計誤差最小 來自andrew ng的machine learning課程 為了簡化概念,先不加上偏置單元 符號介紹 zl i 第 l 層第 i節點的誤差zl i 第 l 層第i節點的輸入值al i 第...