bp演算法(即反向傳播演算法),適合於多層神經元網路的一種學習演算法,它建立在梯度下降法的基礎上。bp網路的輸入輸出關係實質上是一種對映關係:乙個n輸入m輸出的bp神經網路所完成的功能是從n維歐氏空間向m維歐氏空間中一有限域的連續對映,這一對映具有高度非線性。它的資訊處理能力**於簡單非線性函式的多次復合,因此具有很強的函式復現能力。這是bp演算法得以應用的基礎。
反向傳播演算法主要由兩個環節(激勵傳播、權重更新)反覆迴圈迭代,直到網路的對輸入的響應達到預定的目標範圍為止。
由乙個資料算出得分值這個過程叫做前向傳播,由乙個得分值算出loss值,再有loss值往回傳,什麼樣的w該更新,什麼樣的w該更新多大的值這個過程叫做反向傳播。在反向傳播的過程中最重要的是更新權重引數w。
下面我們用乙個例項來說明:
如下圖所示:
上圖表示有三個樣本點下x,y,z
1.對x和y進行求和操作
2.將x和y求出的和和z求乘積
f(x,y,z)=(x+y)*z
例如我們分別給x,y,z賦值為-2,5,-4那麼我們得出的f=-12
那麼我們好比f就等於損失值為-12
得出損失值後我們要求x,y,z分別對f做出了多大的貢獻
我們指定乙個q=x+y對第乙個節點進行操作
此時f=q*z
如果我們求z對f做了多少影響,只需對z進行求偏導值為3,意思就是如果z增大1倍,那麼f值就會增大3倍
如果我們求q對f做了多少影響,只需對q進行求偏導值為-4,意思就是如果q增大1倍,那麼f值就會減少4倍
如圖所示:
如果我們求x對f做了多大的貢獻,那麼我們先要求x對q做了多大的貢獻,求對x求偏導如圖所示:
q對f做的貢獻為-4,所以x對f的貢獻為1*(-4)為-4,這個過程稱作為鏈式法則
我們的梯度要根據鏈式法則一層一層的往下傳。這樣我們就能更新我們的權重引數。
上面這個例子形象的講解了反向傳播的過程和如何實現權重的更新。
下面用**實現:
import numpy as np
# "pd" 偏導
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoidderivationx(y):
return y * (1 - y)
if __name__ == "__main__":
#初始化
bias = [0.35, 0.60]
weight = [0.15, 0.2, 0.25, 0.3, 0.4, 0.45, 0.5, 0.55]
output_layer_weights = [0.4, 0.45, 0.5, 0.55]
i1 = 0.05
i2 = 0.10
target1 = 0.01
target2 = 0.99
alpha = 0.5 #學習速率
numiter = 90000 #迭代次數
for i in range(numiter):
#正向傳播
neth1 = i1*weight[1-1] + i2*weight[2-1] + bias[0]
neth2 = i1*weight[3-1] + i2*weight[4-1] + bias[0]
outh1 = sigmoid(neth1)
outh2 = sigmoid(neth2)
neto1 = outh1*weight[5-1] + outh2*weight[6-1] + bias[1]
neto2 = outh2*weight[7-1] + outh2*weight[8-1] + bias[1]
outo1 = sigmoid(neto1)
outo2 = sigmoid(neto2)
print(str(i) + ", target1 : " + str(target1-outo1) + ", target2 : " + str(target2-outo2))
if i == numiter-1:
print("lastst result : " + str(outo1) + " " + str(outo2))
#反向傳播
#計算w5-w8(輸出層權重)的誤差
pdeouto1 = - (target1 - outo1)
pdouto1neto1 = sigmoidderivationx(outo1)
pdneto1w5 = outh1
pdew5 = pdeouto1 * pdouto1neto1 * pdneto1w5
pdneto1w6 = outh2
pdew6 = pdeouto1 * pdouto1neto1 * pdneto1w6
pdeouto2 = - (target2 - outo2)
pdouto2neto2 = sigmoidderivationx(outo2)
pdneto1w7 = outh1
pdew7 = pdeouto2 * pdouto2neto2 * pdneto1w7
pdneto1w8 = outh2
pdew8 = pdeouto2 * pdouto2neto2 * pdneto1w8
# 計算w1-w4(輸出層權重)的誤差
pdeouto1 = - (target1 - outo1) #之前算過
pdeouto2 = - (target2 - outo2) #之前算過
pdouto1neto1 = sigmoidderivationx(outo1) #之前算過
pdouto2neto2 = sigmoidderivationx(outo2) #之前算過
pdneto1outh1 = weight[5-1]
pdneto1outh2 = weight[7-1]
pdeneth1 = pdeouto1 * pdouto1neto1 * pdneto1outh1 + pdeouto2 * pdouto2neto2 * pdneto1outh2
pdouth1neth1 = sigmoidderivationx(outh1)
pdneth1w1 = i1
pdneth1w2 = i2
pdew1 = pdeneth1 * pdouth1neth1 * pdneth1w1
pdew2 = pdeneth1 * pdouth1neth1 * pdneth1w2
pdneto1outh2 = weight[6-1]
pdneto2outh2 = weight[8-1]
pdouth2neth2 = sigmoidderivationx(outh2)
pdneth1w3 = i1
pdneth1w4 = i2
pdeneth2 = pdeouto1 * pdouto1neto1 * pdneto1outh2 + pdeouto2 * pdouto2neto2 * pdneto2outh2
pdew3 = pdeneth2 * pdouth2neth2 * pdneth1w3
pdew4 = pdeneth2 * pdouth2neth2 * pdneth1w4
#權重更新
weight[1-1] = weight[1-1] - alpha * pdew1
weight[2-1] = weight[2-1] - alpha * pdew2
weight[3-1] = weight[3-1] - alpha * pdew3
weight[4-1] = weight[4-1] - alpha * pdew4
weight[5-1] = weight[5-1] - alpha * pdew5
weight[6-1] = weight[6-1] - alpha * pdew6
weight[7-1] = weight[7-1] - alpha * pdew7
weight[8-1] = weight[8-1] - alpha * pdew8
# print(weight[1-1])
# print(weight[2-1])
# print(weight[3-1])
# print(weight[4-1])
# print(weight[5-1])
# print(weight[6-1])
# print(weight[7-1])
# print(weight[8-1])
bp演算法python實現參 BP反向傳播演算法
本來想把自己報告的ppt寫成部落格,後來公式打起來太麻煩了,不想再敲第二遍了。寫一篇深入淺出,並茂的部落格好難。可以看斯坦福cs231n的課程,因為我發現很多人的部落格的圖和公式直接是截的那邊的圖。bp反向傳播演算法明白了之後其實是比較簡單,現在想想一開始阻礙自己明白的就是向量化的那種表達形式。組會...
BP誤差反向傳播演算法
bp演算法通過將輸出誤差反向傳播,將誤差分配到每個權值上,利用梯度更新對所有引數進行調整以達到輸出累計誤差最小 來自andrew ng的machine learning課程 為了簡化概念,先不加上偏置單元 符號介紹 zl i 第 l 層第 i節點的誤差zl i 第 l 層第i節點的輸入值al i 第...
bp反向傳播
今天關於bp的探索思考告一段落了。計算智慧型導論。西瓜書。tom m.mitchell,機器學習。高數複習。高人點撥,卜老師的點播。高人指路,汪老師曾說,多看網上的部落格,可能說的不對,但可以幫你理解和開拓思路。網上的許多部落格。最終也是看完這篇部落格 最終解決了自己的的問題。首先計算智慧型導論的推...