反向傳播演算法(BP演算法)

2021-09-01 11:59:32 字數 4315 閱讀 6396

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,機器學習。高數複習。高人點撥,卜老師的點播。高人指路,汪老師曾說,多看網上的部落格,可能說的不對,但可以幫你理解和開拓思路。網上的許多部落格。最終也是看完這篇部落格 最終解決了自己的的問題。首先計算智慧型導論的推...