日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

深入理解BP神经网络的细节

發布時間:2023/11/28 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解BP神经网络的细节 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

神經網絡之BP算法


文章目錄

  • 神經網絡之BP算法
  • 前言
  • 一、BP算法的流程
  • 二、搭建神經網絡
  • 總結


前言

??BP神經網絡是Back Propagation的簡寫,它是最簡單的前饋神經網絡之一通常用于初學者對于深度學習的入門。何為深度學習呢?簡單來說就是隱藏層超過兩層的神經網絡。本文將會采用最常用的優化方法以及最細致的過程來復現BP神經網絡的搭建。


一、BP算法的流程

??首先簡單介紹一下BP神經網絡之前的典型模型MP模型。MP神經元是由兩個人名組成命名的模型。最早以前的神經網絡涉及n個輸入以及兩種計算,一種是輸入到激活的線性求和計算另外一種是求和結果的非線性激活運算在運算完成之后會給出一個結果,其中不管是線性求和也好還是激活函數也好它們之間用到的參數往往是固定的,但在MP神經元模型提出以后引入了Hebb學習率,認為權重是可以變化的可學習的。后來,1957年Rosenblatt提出了感知器,實現了簡單的圖像識別,但這個之前提出的神經元其實并無二異。
??再后來明斯基證明了感知機無法解決簡單的異或分類。也許兩層神經網絡可以解決但局限于當時的計算力,所以他認為沒有研究神經網絡的必要至此ANN迎來了它的第一個冬天…
??兩層神經網絡在理論上可以逼近任意的非線性函數。一般機器學習有兩大類統計學習&智能學習其中統計學習是首先假定形狀然后學習參數,假如我們需要學習一個一次函數,算法在運算完成之后只需要返回a,b兩個參數即可,而智能學習試圖一次性將參數和函數全部學出來。智能學習很難直接用先驗經驗,所以它的學習可能會嘗試一切的函數以致于它的訓練速度很慢,且很難找到全局最優解,但這并不妨礙它在語音識別以及圖像處理上擁有強大的應用潛力。在1990年中期,由于SVM的閃亮登場加之神經網絡調參不方便,ANN進入了第二個寒冬。
??盡管眾多大神都被SVM深深吸引了,但還是有那么幾個“頑固分子”依然再堅守神經網絡,在這其中就有BP算法的創始人辛頓,它的BP算法就是第二次神經網絡熱潮中的一員,而他本人的研究成果更是帶動了第三波神經網絡熱潮。


BP算法的步驟十分簡潔:

  • 給定一組樣本{(x,y)},初始化權重參數,i = 1
  • 對第i個樣本數據:
    • 正向傳播:計算隱藏層變量并輸出結果
    • 反向傳播:計算損失函數對每個權重參數的偏導數值
    • 梯度下降:更新每個權重參數
    • i=i+1

二、搭建神經網絡

假設搭建的神經網絡如下:

<圖片來源于:https://www.ulearning.cn/course/14591>
??以上是一個簡單的單隱藏層的全鏈接的神經網絡,其中輸入有兩項為x1,x2隱藏層也有兩項分別為h1,h2,僅在輸入時設置一項偏置項。激活函數使用sigmoid,假設訓練的數據輸入為0.1,0.2輸出為0.5,權重都為在[0,1]間的隨機值且不一樣。假定權重隨機ω(1)=[0.5,0.1; 0.6,0.2; 0.7,0.3] (3x2的矩陣),ω(2)=[0.4,0.8] (其中ω(1)表示第一層的權重,ω(2)表示第二層的權重)那么就可以很快的算出h1=sigmoid(0.1×0.5+0.2×0.6+1×0.7)≈0.7047,同理h2=sigmoid(0.1×0.1+0.2×0.2+1×0.3)≈0.5855,預測結果y=sigmoid(h1×0.4+h2×0.8)≈0.6794,則第一次得到的均方誤差為L(ω)=0.5×(Y-y)^2≈0.0161 (Y=0.5)。
??接下來就需要反向傳播了。反向傳播采用梯度下降法來更新各個參數,這需要求出均方誤差L對各個ω的偏導數:
?L(ω)?ω1=?L?y?y?ω1=?(Y?y)y(1?y)h1\frac{\partial L(\omega)}{\partial\omega_1}=\frac{\partial L}{\partial y}\frac{\partial y}{\partial{ω_1}}=-(Y-y)y(1-y)h_1 ?ω1??L(ω)?=?y?L??ω1??y?=?(Y?y)y(1?y)h1?
?L(ω)?ω2=?L?y?y?ω2=?(Y?y)y(1?y)h2\frac{\partial L(\omega)}{\partial\omega_2}=\frac{\partial L}{\partial y}\frac{\partial y}{\partial{ω_2}}=-(Y-y)y(1-y)h_2 ?ω2??L(ω)?=?y?L??ω2??y?=?(Y?y)y(1?y)h2?
?L(ω)?ω32=?L?y?y?h2?h2?b=?(Y?y)y(1?y)ω2h2(1?h2)?1\frac{\partial L(\omega)}{\partial\omega_{32}}=\frac{\partial L}{\partial y}\frac{\partial y}{\partial{h_2}}\frac{\partial h_2}{\partial b}=-(Y-y)y(1-y)ω_2h_2(1-h_2)·1 ?ω32??L(ω)?=?y?L??h2??y??b?h2??=?(Y?y)y(1?y)ω2?h2?(1?h2?)?1
?L(ω)?ω31=?L?y?y?h1?h1?b=?(Y?y)y(1?y)ω1h1(1?h1)?1\frac{\partial L(\omega)}{\partial\omega_{31}}=\frac{\partial L}{\partial y}\frac{\partial y}{\partial{h_1}}\frac{\partial h_1}{\partial b}=-(Y-y)y(1-y)ω_1h_1(1-h_1)·1 ?ω31??L(ω)?=?y?L??h1??y??b?h1??=?(Y?y)y(1?y)ω1?h1?(1?h1?)?1
?L(ω)?ω22=?L?y?y?h2?h2?x2=?(Y?y)y(1?y)ω2h2(1?h2)?x2\frac{\partial L(\omega)}{\partial\omega_{22}}=\frac{\partial L}{\partial y}\frac{\partial y}{\partial{h_2}}\frac{\partial h_2}{\partial x_2}=-(Y-y)y(1-y)ω_2h_2(1-h_2)·x_2 ?ω22??L(ω)?=?y?L??h2??y??x2??h2??=?(Y?y)y(1?y)ω2?h2?(1?h2?)?x2?
?L(ω)?ω21=?L?y?y?h1?h1?x2=?(Y?y)y(1?y)ω1h1(1?h1)?x2\frac{\partial L(\omega)}{\partial\omega_{21}}=\frac{\partial L}{\partial y}\frac{\partial y}{\partial{h_1}}\frac{\partial h_1}{\partial x_2}=-(Y-y)y(1-y)ω_1h_1(1-h_1)·x_2 ?ω21??L(ω)?=?y?L??h1??y??x2??h1??=?(Y?y)y(1?y)ω1?h1?(1?h1?)?x2?
?L(ω)?ω12=?L?y?y?h2?h2?x1=?(Y?y)y(1?y)ω2h2(1?h2)?x1\frac{\partial L(\omega)}{\partial\omega_{12}}=\frac{\partial L}{\partial y}\frac{\partial y}{\partial{h_2}}\frac{\partial h_2}{\partial x_1}=-(Y-y)y(1-y)ω_2h_2(1-h_2)·x_1 ?ω12??L(ω)?=?y?L??h2??y??x1??h2??=?(Y?y)y(1?y)ω2?h2?(1?h2?)?x1?
?L(ω)?ω11=?L?y?y?h1?h1?x1=?(Y?y)y(1?y)ω1h1(1?h1)?x1\frac{\partial L(\omega)}{\partial\omega_{11}}=\frac{\partial L}{\partial y}\frac{\partial y}{\partial{h_1}}\frac{\partial h_1}{\partial x_1}=-(Y-y)y(1-y)ω_1h_1(1-h_1)·x_1 ?ω11??L(ω)?=?y?L??h1??y??x1??h1??=?(Y?y)y(1?y)ω1?h1?(1?h1?)?x1?
注:
y=sigmoid(x)=11+e?x,y′=e?x(1+e?x)2=y(1?y)y=sigmoid(x)=\frac{1}{1+e^{-x}},y'=\frac{e^{-x}}{(1+e^{-x})^2}=y(1-y) y=sigmoid(x)=1+e?x1?y=(1+e?x)2e?x?=y(1?y)
??計算出各個導數之后,便可以利用梯度下降的方法得到更新后的參數(ω)
ωnew=ωold?λ??L?ωoldω_{new}=ω_{old}-\lambda·\frac{\partial L}{\partial ω_{old}} ωnew?=ωold??λ??ωold??L?
在這里取λ為1,以第二層的ω1為例:
ω1=ω1?λ??L?ω1=0.4?1?[?(Y?y)y(1?y)h1]=0.4?1?[?(0.5?0.6794)?0.6784?(1?0.6794)?0.7047]≈0.3725ω_1=ω_1-\lambda·\frac{\partial L}{\partial ω_1}=0.4-1·[-(Y-y)y(1-y)h_1]=0.4-1·[-(0.5-0.6794)·0.6784·(1-0.6794)·0.7047]≈0.3725 ω1?=ω1??λ??ω1??L?=0.4?1?[?(Y?y)y(1?y)h1?]=0.4?1?[?(0.5?0.6794)?0.6784?(1?0.6794)?0.7047]0.3725
更新完所有的ω之后,便又進入了正向傳播更新所有的h以及輸出,如此反復直到達到一定的精度或者完成相應的迭代輪數算法結束!
代碼如下:

import numpy as np
from matplotlib import pyplot as plt
Lambda=1  #梯度步長
X=np.mat([0.1,0.2,1])  #輸入參數
Y=0.5  #輸出參數
W1=np.mat([[0.5,0.1],[0.6,0.2],[0.7,0.3]]) #第一層權重
W2=np.mat([0.4,0.8]).T   #第二層權重
Loss=[] #存放每次反饋的誤差
n=50 #訓練輪數def sigmoid(m):return 1.0/(1+np.exp(-m))for i in range(n):h=sigmoid(np.dot(X,W1)) #求隱藏層y=sigmoid(np.dot(sigmoid(h),W2)) #求預測值prefix=-(Y-y)*y*(1-y)  #求導的統一前綴:-(Y-y)y(1-y)partial_W2=np.multiply(prefix,h) #第二層梯度W2=W2-np.multiply(Lambda,partial_W2.T)  #更新第二層權重partial_W12=np.multiply(prefix,np.multiply(W2[1],h[0,1]*(1-h[0,1]))) #第一層關于h2的梯度W1[:,1]=W1[:,1]-np.multiply(Lambda,np.multiply(partial_W12,X.T)) #更新第一層關于h2的權重partial_W11=np.multiply(prefix,np.multiply(W2[0],h[0,0]*(1-h[0,0]))) #第一層關于h1的梯度W1[:,0]=W1[:,0]-np.multiply(Lambda,np.multiply(partial_W11,X.T))#更新第一層關于h1的權重loss=0.5*(Y-y[0,0])**2print("均方誤差:{:.4f}".format(loss))Loss.append(loss)
plt.plot(Loss)
plt.show()


總結

??一般神經網絡分為兩大類:卷積神經網絡和循環神經網絡,這兩種神經網絡模型分別在圖像識別和自然語言處理上有著十分重要的意義。BP神經網絡作為入門的模型適合新手理解神經網絡的運算流程,盡管當下我們對于神經網絡的理解還停留在黑箱上。
??本文采用的優化模型是最簡單也是最繁瑣的求導算梯度的優化,對于小規模的模型而言還可以用筆來算上一算如果遇到大規模的數據和龐大復雜的模型,那么采用一定的框架就成了必然的選擇,在以后的文章中作者將會努力學習Google的Tensorflow框架進一步探索深度學習的奧妙!

總結

以上是生活随笔為你收集整理的深入理解BP神经网络的细节的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。