深度學習之 BP 算法

神經網絡的一種求解W的算法,分為信號“正向傳播(FP)”求損失,“反向傳播(BP)”回傳誤差;根據誤差值修改每層的權重,繼續迭代。

BP算法也叫做δ算法。以三層的感知器為例(假定現在隱層和輸出層均存在相同類型的激活函數)

  • 隱層 y?= f(x * v)
  • 輸出層 o = f(f(y) * w)
  • 輸入層誤差:E=\frac{1}{2}(d-O)^{2}=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-O_k)^2
  • 隱層誤差:? ?E=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-f(net_k))^2=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-f(\sum_{j=1}^{m}w_{jk}y_j)))^2
  • 輸入層誤差:E=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-f\left [ \sum_{j=1}^{m}w_{jk}f(net_j)\right ])^2=\frac{1}{2}\sum_{k=1}^{\iota }(d_k-f\left [ \sum_{j=1}^{m}w_{jk}f\left ( \sum_{i=1}^{n}v_{ij}x_i \right )\right ])^2

誤差E有了,那么為了使誤差越來越小,可以采用隨機梯度下降的方式進行ω和υ的求解,即求得ω和υ使得誤差E最小

BP算法的例子

?¨è?é??¥????è?°

  • 初始值:w(0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65),? ?b(0.35,0.65)
  • 輸出值:O=(0.01,0.99)
  • 學習率:η=0.5?
  • 假設隱層和輸出層都使用 sigmoid 激活函數

1、FP過程

先求out

net_{h_1} = w_1 * l_1 + w_2 * l_2 + b_1 * 1 = 0.1 * 5 + 0.15*10+0.35*1=2.35
out_{h_1} = \frac{1}{1+e^{-h_1}} = \frac{1}{1+e^{-2.35}} = 0.912934

同理可以得到:

out_{h_2} =0.979164
out_{h_3} =0.995275

o_1 = w_7 * out_{h_1}+w_9 * out_{h_2}+w_{10} * out_{h_3}+b_2*1

out_{o1} = \frac{1}{1+e^{-o_1}} = \frac{1}{1+e^{-2.1019206}}=0.891090

同理可以得到:

out_{0_2} =0.904330

輸出層誤差表示如下:

E = \frac{1}{2}(d - O)^2 = \frac{1}{2}\sum_{k=1}^l(d_k - O_k)^2
E_{o_1} = \frac{1}{2}(target_{o_1} - out_{o_1})^2

E_{total} = E_{o_1}+E_{o_2}= \frac{1}{2}(0.01 - 0.891090)^2 + \frac{1}{2}(0.99 -0.904330 )^2 = 0.391829

2、BP 過程

輸出層到第二層隱層,以求 w_7??為例:

\frac{\partial E_{total}}{\partial w_7} =\frac{\partial E_{total}}{\partial out_{o_1}}*\frac{\partial out_{o_1}}{\partial o_1}*\frac{\partial o_1}{\partial w_7}

下面我們分別求上式的三個部分,其中第一部分:

E_{o_1} = \frac{1}{2}(target_{o_1} - out_{o_1})^2

E_{total} = E_{o_1}+E_{o_2}=\frac{1}{2}(target_{o_1} - out_{o_1})^2+\frac{1}{2}(target_{o_2} - out_{o_2})^2

\frac{\partial E_{total}}{\partial out_{o_1}} = 2 * \frac{1}{2}(target_{o_1}-out_{o_1}) * (-1) + 0 = -(0.01 - 0.891090) = 0.88109

第二分部因為:

out_{o1} = \frac{1}{1+e^{-o_1}}

\begin{align*} {out_{o_1}}'=\frac{e^{-o_1}}{(1+e^{-o_1})^2}=\frac{1+e^{-o_1}-1}{(1+e^{-o_1})^2}=\frac{1}{1+e^{-o_1}}-\frac{1}{(1+e^{-o_1})^2}=out_{o_1}(1- out_{o_1}) \end{align*}

\frac{\partial out_{o_1}}{\partial o_1} = out_{o_1}(1 - out_{o_1}) = 0.891090(1 - 0.891090) = 0.097049

第三部分,因為:

o_1 = w_7 * out_{h_1}+w_9 * out_{h_2}+w_{10} * out_{h_3}+b_2*1

\frac{\partial o_1}{\partial w_7} = out_{h_1} + 0 + 0+0=0.912934

最終得到:

\frac{\partial E_{total}}{\partial w_7} =0.88109*0.097049*0.912934=0.078064

更新?w_7?的值:

\hat{w_7} = w_7 + \Delta w_7 = w_7 - \eta \frac{\partial E_{total}}{\partial w_7} =0.4 - 0.5 * 0.078064=0.360968

同理可以求出:

\hat{w_8} = 0.453383

\hat{w_9} = 0.458137

\hat{w_{10}} = 0.553629?

\hat{w_{11}} = 0.557448

\hat{w_{12}} = 0.653688

第二層隱層到第一層隱層,以求?w_1?為例:

\frac{\partial E_{total}}{\partial w_1} = \frac{\partial E_{total}}{\partial out_{h_1}}* \frac{\partial out_{h_1}}{\partial h_1}* \frac{\partial h_1}{\partial w_1}

\frac{\partial E_{total}}{\partial w_1}=\Big(\frac{\partial E_{o_1}}{\partial out_{h_1}} + \frac{\partial E_{o_2}}{\partial out_{h_1}}\Big)* \frac{\partial out_{h_1}}{\partial h_1}* \frac{\partial h_1}{\partial w_1}

\frac{\partial E_{o_1}}{\partial out_{h_1}}=\frac{\partial E_{o_1}}{\partial out_{o_1}} * \frac{\partial out_{o_1}}{\partial o_1}*\frac{\partial o_1}{\partial out_{h_1}}

下面我們分別計算,第一部分:

\frac{\partial E_{o_1}}{\partial out_{h_1}}=\frac{\partial E_{o_1}}{\partial out_{o_1}} * \frac{\partial out_{o_1}}{\partial o_1}*\frac{\partial o_1}{\partial out_{h_1}}

其中:

E_{o_1} = \frac{1}{2}(target_{o_1} - out_{o_1})^2

out_{o1} = \frac{1}{1+e^{-o_1}}

o_1 = w_7 * out_{h_1}+w_9 * out_{h_2}+w_{10} * out_{h_3}+b_2*1

\frac{\partial E_{o_1}}{\partial out_{h_1}}=-(target_{o_1} - out_{o_1})*out_{o_1}*(1- out_{o_1})*\hat{w_7}

注意:這里由于是反向傳播,此時要用到之前更新后的?w_7??的值

\begin{align*}\frac{\partial E_{o_1}}{\partial out_{h_1}}=-(0.01 - 0.891090)*0.891090*(1-0.891090)*0.360968=0.030866 \end{align*}

同理計算:

\frac{\partial E_{o_2}}{\partial out_{h_1}} = \frac{\partial E_{o_2}}{\partial out_{o_2}} * \frac{\partial out_{o_2}}{\partial o_2}*\frac{\partial o_2}{\partial out_{h_1}}

\begin{align*} \frac{\partial E_{o_2}}{\partial out_{h_1}} &= -(target_{o_2} -out_{o_2})*out_{o_2}(1-out_{o_2})*w_8 \\ & =-(0.99-0.904330)*0.904330*(1-0.904330)*0.453383\\ &=-0.003360 \end{align*}

接著計算第二部分:

\frac{\partial out_{h_1}}{\partial h_1}=out_{h_1}*(1-out_{h_1}) =0.912934*(1-0.912934)=0.079486

接著計算第三部分:

\frac{\partial h_1}{\partial w_1} = l_1 = 5

最終整合起來:

\frac{\partial E_{total}}{\partial w_1} = (0.030866 + (-0.003360))*0.079486 *5=0.010932

于是更新 w_1

\hat{w_1} = w_1 + \Delta w_1 = w_1 - \eta \frac{\partial E_{total}}{\partial w_1} = 0.1 - 0.5 *0.010932 =0.094534

同理求出:w_2, w_3,w_4,w_5,w_6

以上是第一次迭代,經過多次迭代,最終的誤差會越來越小

上圖可以看出,當迭代1000次時,輸出為 O=(0.022971,0.977675) 和原本的 O=(0.01,0.99) 比較接近了。

python代碼

https://github.com/flepeng/code/blob/master/DL/bp_demo.py

import numpy as np# 初始值
w = [0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65]
# 偏置項b不進行更新
b = [0.35, 0.65]l = [5, 10]# sigmoid函數
def sigmoid(z):return 1.0 / (1 + np.exp(-z))def f1(w, b, l):# 前向傳播,計算結果值h1 = sigmoid(w[0] * l[0] + w[1] * l[1] + b[0])h2 = sigmoid(w[2] * l[0] + w[3] * l[1] + b[0])h3 = sigmoid(w[4] * l[0] + w[5] * l[1] + b[0])o1 = sigmoid(w[6] * h1 + w[8] * h2 + w[10] * h3 + b[1])o2 = sigmoid(w[7] * h1 + w[9] * h2 + w[11] * h3 + b[1])# 后向傳播,更新w# 輸出層到第二層隱層,前兩項# 公式中的第一部分-(0.01 - o1),第二部分o1 * (l - o1)t1 = -(0.01 - o1) * o1 * (l - o1)# 第二層隱層到第一層隱層,前兩項t2 = -(0.99 - o2) * o2 * (l - o2)# t1*第三部分,即輸出層到第二層隱層的參數梯度w[6] = w[6] - 0.5 * (t1 * h1)w[8] = w[8] - 0.5 * (t1 * h2)w[10] = w[10] - 0.5 * (t1 * h3)w[7] = w[7] - 0.5 * (t2 * h1)w[9] = w[9] - 0.5 * (t2 * h2)w[11] = w[11] - 0.5 * (t2 * h3)# (t1 * w[6] + t2 * w[7])對于公式()中的兩項,h1 * (1 - h1)對于第二項,l[0]對應第三項w[0] = w[0] - 0.5 * (t1 * w[6] + t2 * w[7]) * h1 * (1 - h1) * l[0]w[1] = w[1] - 0.5 * (t1 * w[6] + t2 * w[7]) * h1 * (1 - h1) * l[1]w[2] = w[2] - 0.5 * (t1 * w[8] + t2 * w[9]) * h2 * (1 - h2) * l[0]w[3] = w[3] - 0.5 * (t1 * w[6] + t2 * w[9]) * h2 * (1 - h2) * l[1]w[4] = w[4] - 0.5 * (t1 * w[10] + t2 * w[11]) * h3 * (1 - h3) * l[0]w[5] = w[5] - 0.5 * (t1 * w[10] + t2 * w[11]) * h3 * (1 - h3) * l[1]return o1, o2, wfor i in range(1000):r1, r2, w = f1(w, b, l)print("第{}次迭代后,結果值為:({},{}),權重更新為:{}".format(i+1, r1, r2, w))

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454092.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454092.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454092.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python自帶的解釋器叫做_python學習

一、PYTHON中的元素1.基本元素運算符: - * / %等等除法:" / " 表示浮點數除法,返回浮點結果;" // " 表示整數除法,返回不大于結果的一個最大的整數運算順序:先乘除 再加減 括號最優先變量:就是一…

IE打印空白

今天碰到HR經理碰到一個問題,就是windows 7 64位操作系統,但是打印空白,打印出來像白紙一樣!經過查看和總結,確認是:由于保護模式下 %Temp%\Low 文件夾工作不正常引起的!故障打印白紙下面會出現…

Python Matplotlib.plot Update image Questions

1. 最近在測試一款設備,采集了一些設備后需要一幀一幀顯示圖像,經常使用Python,所以選用了Matplotlib進行圖像操作 數據結構: timesatamp polar_distance horizontal_angle refelectivity_intensity,所有數據類型都是 float,儲存在…

深度學習之 RBF神經網絡

RBF神經網絡通常只有三層,即輸入層、中間層和輸出層。其中中間層主要計算輸入x和樣本矢量c(記憶樣本)之間的歐式距離的Radial Basis Function (RBF)的值,輸出層對其做一個線性的組合。 徑向基函數: RBF神經網絡的訓練…

redis 隊列_Redis與Rabbitmq消息隊列的區別

將redis發布訂閱模式用做消息隊列和rabbitmq的區別:可靠性 redis :沒有相應的機制保證消息的可靠消費,如果發布者發布一條消息,而沒有對應的訂閱者的話,這條消息將丟失,不會存在內存中;rabbit…

EasyUI中那些不容易被發現的坑——EasyUI重復請求2次的問題

問題控件:datagrid、combobox、所有能設置url屬性的控件 問題版本:1.4.4、1.4.5(之前的版本沒測) 問題如圖: 重復請求2次,錯誤代碼如圖: 錯誤問題分析:html加載的時候回請求url加載數…

GCC編譯的背后( 預處理和編譯 匯編和鏈接 )

發表于 2010年05月18日 22:01 分類: 編程coding統計: 1評/465閱 2人收藏此文章&#xff0c; 收藏此文章(?)by falcon<zhangjinwgmail.com> 2008-02-22 平時在Linux下寫代碼&#xff0c;直接用"gcc -o out in.c"就把代碼編譯好了&#xff0c;但是這后面到底做了…

ElasticSearch Java API

ElasticSearch-Java Client類型 ElasticSearch-TransportClient環境準備 ElasticSearch-TransportClient連接 ElasticSearch-Document APIs ElasticSearch-搜索-原理 ElasticSearch-搜索-問題 ElasticSearch-搜索-問題解決思路 ElasticSearch-搜索-SearchType-類型一 E…

深度學習之卷積神經網絡(Convolutional Neural Networks, CNN)

前面, 介紹了DNN及其參數求解的方法(深度學習之 BP 算法),我們知道DNN仍然存在很多的問題&#xff0c;其中最主要的就是BP求解可能造成的梯度消失和梯度爆炸.那么,人們又是怎么解決這個問題的呢?本節的卷積神經網絡(Convolutional Neural Networks, CNN)就是一種解決方法. 我們…

Oracle DBA課程系列筆記(16)

第十六章&#xff1a; 用戶管理 1、schema &#xff1a; user.object &#xff0c;用戶認證方式&#xff1a;os 認證&#xff0c;database 認證 2、建立 database認證的用戶&#xff1a; 10:00:48 SQL> create user rose …

python序列是幾維_從一個1維的位數組獲得一個特定的2維的1序列數組[Python] - python...

我正在使用Python&#xff0c;我需要找到執行以下任務的最有效方法。任務&#xff1a;給定零和一的任何一維數組v&#xff0c;用k> 0表示v的所有一維的子序列數。我需要從v獲得一個二維數組w&#xff0c;使得&#xff1a;1)shape(w)(k&#xff0c;len(v))&#xff0c;2)對于…

深度學習之卷積神經網絡(Convolutional Neural Networks, CNN)(二)

前面我們說了CNN的一般層次結構, 每個層的作用及其參數的優缺點等內容.深度學習之卷積神經網絡(Convolutional Neural Networks, CNN)_fenglepeng的博客-CSDN博客 一 CNN參數初始化及參數學習方法 和機器學習很多算法一樣, CNN在進行訓練之前也要進行參數的初始化操作. 我們…

GCC Inline ASM GCC內聯匯編

GCC 支持在C/C代碼中嵌入匯編代碼&#xff0c;這些匯編代碼被稱作GCC Inline ASM——GCC內聯匯編。這是一個非常有用的功能&#xff0c;有利于我們將一些C/C語法無法表達的指令直接潛入C/C代碼中&#xff0c;另外也允許我們直接寫 C/C代碼中使用匯編編寫簡潔高效的代碼。1.基本…

Hadoop1.x版本升級Hadoop2.x

引言 隨著企業數據化和Hadoop的應用越加廣泛&#xff0c;hadoop1.x的框架設計越來越無法滿足人們對需求&#xff0c;Apache一直在對Hadoop1.x進行修改&#xff0c;最后推出了新一代的Hadoop2.x。從業界使用分布式系統的變化趨勢和 hadoop 框架的長遠發展來看&#xff0c;MapRed…

本頁由試用版打印控件lodop6.2.6輸出_Visual Basic 6.0 Sirk 迷你版

Visual Basic 6.0 Sirk 迷你版 VB6 Sirk Mini 2019更新1、支持主流操作系統&#xff0c;避免原版安裝失敗的問題&#xff1a;支持Windows XP、Vista、Win7、Win8、Win10(32位、64位)。2、保留大部分常用功能&#xff0c;避免精簡版過度精簡&#xff1a;包含原版完整控件&#x…

深度學習之卷積神經網絡 LeNet

卷積神經網絡典型CNN LeNet&#xff1a;最早用于數字識別的CNNLeNet5&#xff1a;現在常說的一般就是LeNet5AlexNet&#xff1a;2012ILSVRC冠軍&#xff0c;遠超第二名的CNN&#xff0c;比LeNet更深&#xff0c;用多層小卷積疊加來替換單個的大卷積ZF Net&#xff1a;2013ILSV…

python爬蟲常見反爬措施_爬蟲常見的反爬措施有哪些

爬蟲常見的反爬措施有三種&#xff1a;1、header頭部信息解決方法&#xff1a;加User-Agent值&#xff1a;如果不加header頭&#xff0c;部分網站服務器判斷不到用戶的訪問來源&#xff0c;所以會返回一個404錯誤來告知你是一個爬蟲&#xff0c;拒絕訪問&#xff0c;解決辦法如…

dom4j的讀寫xml文件,讀寫xml字符串

百度了一些博客&#xff0c;大同小異&#xff0c;在選取jar包工具的時候大概看了下&#xff0c;大抵是jdom原始&#xff0c;dom4j優秀。于是做了些練習。 參考&#xff1a;http://www.cnblogs.com/mengdd/archive/2013/06/05/3119927.html 1 package com.test.xml;2 3 import j…

深度學習之數據增強方案和TensorFlow操作

一、數據增強的方法介紹 增加訓練數據&#xff0c; 則能夠提升算法的準確率&#xff0c; 因為這樣可以避免過擬合&#xff0c; 而避免了過擬合你就可以增大你的網絡結構了。 當訓練數據有限的時候&#xff0c; 可以通過一些變換來從已有的訓練數據集中生成一些新的數據&#x…

移動前端頭部標簽(HTML5 head meta)

<!DOCTYPE html> <!-- 使用 HTML5 doctype&#xff0c;不區分大小寫 --> <html lang"zh-cmn-Hans"> <!-- 更加標準的 lang 屬性寫法 http://zhi.hu/XyIa --> <head><!-- 聲明文檔使用的字符編碼 --><meta charsetutf-8>&l…