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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

bp 神经网络 优点 不足_深度学习之BP神经网络--Stata和R同步实现(附Stata数据和代码)

發布時間:2024/7/5 pytorch 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bp 神经网络 优点 不足_深度学习之BP神经网络--Stata和R同步实现(附Stata数据和代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
說明:本文原發于“計量經濟圈”公眾號,在此僅展示Stata的部分。R部分請移步至本人主頁的“R語言與機器學習--經濟學視角”專欄,或點擊下方鏈接卡跳轉。盲區行者:深度學習之BP神經網絡--Stata和R同步實現(附R數據和代碼)?zhuanlan.zhihu.com


原公眾號推文標題:深度學習之BP神經網絡-Stata和R同步實現(附數據和代碼)


神經網絡(Neural Network,或Artificial Neural Network,簡稱NN或ANN)是Deep Learning深度學習(DL屬于ML,ML屬于AI)算法的代表。和SVM支持向量機類似,神經網絡屬于典型的black box黑箱方法。從更廣泛的角度來看,神經網絡可以實現幾乎所有的學習算法——既可以應用于有監督學習的分類和回歸,也可以用于無監督學習的聚類等。

神經網絡的分類有多種,從演進的角度來看,大概包括早期的單層神經網絡(也叫感知器,Perceptron)和前饋神經網絡(Feedforward Neural Network,FNN),到BP(Backward Propagation,反向傳播)神經網絡,再到現在更為復雜的卷帙(Convolutional)、循環(Recurrent)、深度信念(Deep Belief)和生成對抗(Generative Adversarial)神經網絡等等。

早期的前饋神經網絡由于過于簡單,應用價值不大。隨后的BP算法的提出,使得神經網絡的性能得到了大幅提升。在此基礎之上演化出來了多種神經網絡算法,大規模應用于Computer Vision計算機視覺、Speech Recognition語音識別和Natural Language Processing自然語言處理,以及在線廣告、網頁搜索和商品推薦等。

總的來看,BP神經網絡是神經網絡的典型代表,是初學者的重點學習對象。此外,Stata中目前能實現神經網絡建模的的只有BP神經網絡brain命令,尚無其它神經網絡算法的引進,故本文在此重點介紹BP神經網絡。

1 神經網絡介紹

1.1 神經網絡原理

BP神經網絡屬于監督學習,由激活函數、網絡結構和優化算法三大部分組成。對于初學者來說,我們也可以把BP神經網絡模型大概當成一個龐雜的復合函數。

BP神經網絡是在前饋FNN神經網絡模型的基礎上改進。下面的視頻截圖(本文中引用的視頻截圖全部來自吳恩達深度學習課程)展示的是單隱藏層的神經網絡,便于我們大概了解FNN的原理。這里所謂前饋,是指向前傳播。信息由輸入變量(inputs,自變量)開始,往前經過中間的各個隱藏層向前傳導,最終到達輸出節點(outputs,因變量)。

上圖中以房價預測為例。假設我們先知道房子的size面積、bedroom臥室的數量、zipcode郵編和當地的wealth人均收入,打算基于這4個自變量來預測房價price。這里自變量中的size和bedroom的數量,可能會通過購買者的family size來影響房價;郵編zipcode可能通過該社區的walkability便利性來影響房價;zipcode還可能和wealth一起,通過當地的school quality影響房價。這個推導過程和計量經濟學中的中介變量、結構化方程SEM和RCT中的因果鏈推導原理有類似之處。

在完成前饋(正向)傳播之后,信息再由輸出節點反向傳播。在介紹正向和反向傳播具體原理之前,我們先簡單了解下常見的三種激活函數。

1.2 三種常見的激活函數

Activation Function激活函數用于“在神經網絡模型中加入非線性因素,以解決線性模型所不能解決的問題”。激活函數也用于反向傳遞中的參數修正,所以通常要求是可微的。激活函數的形式可以由用戶自行定義,而常見的主要是以下三個。

(1)ReLU修正線性單元

ReLU,全稱是Rectified Linear Unit,是最基礎的一種激活函數。相對于后面兩種激活函數,ReLU最大的優點是斜率的穩定性。不管x的取值多大,在梯度下降法中的下降斜率都保持一個較大的值,而不像Sigmoid或Tanh函數一樣可能趨近于零而導致梯度算法下降較小,最終算法學習的速度會變得很慢。 ReLU的缺點也較明顯,即當自變量取值小于0的時候其函數斜率恒等于0。因此,ReLU在自變量小于0的區域的斜率被改進成為了某個較小的常數,比如0.01。這種改進后的激活函數被稱為Leaky ReLU,泄露ReLU。ReLU的函數圖像大致如下(來源于百度百科):

ReLU和Leaky ReLU通常用于卷積神經網絡和循環神經網絡等。

(2)Sigmoid函數

機器學習的Sigmoid函數,又被稱為Logit函數,或Logistics函數,在計量中常用于結果變量是0-1等分類變量的建模。其函數形式如下:

y= 1/(1- e^(-x) )

接下來我們用Stata畫出該函數的圖形,讓大家有個直觀的了解。

. clear . set obs 1000000 . gen x = runiform(-20, 20) . gen y = 1/(1+exp(-x)) . line y x, sort xline(-5) xline(0) xline(5) xlabel(-20(5)20) *在x=-5/0/5初加了3條豎線

3)Tanh雙曲正切函數

Tanh函數形式如下:

y = sinhx/coshx=((e^x-e^(-x))/((e^x+e^(-x))

Tanh函數可以看成是Sigmoid函數的改進,通常只要能用Sigmoid函數的地方,Tanh函數的表現都會更優。當然,由于Sigmoid的0-1的結果可能,讓它在0-1分類的算法中無可替代。在具體操作中,涉及0-1分類的神經網絡通常在輸出層使用Sigmoid函數,其它層使用Tanh或其它激活函數。 在此也用Stata畫出Tanh函數的圖像(代碼省略)如下。

1.3正向傳播和反向傳播

先簡要說明涉及到的函數和數學符號:數學標記符號中大寫表示向量,如x表示某個具體的自變量,而X表示自變量矩陣;Z=WX+b,這里W指weight權重矩陣,b表示bias偏誤向量;σ()或g()表示激活函數,σ(Z)=A(A表示activation,輸出層的A=Yhat),信息正是通過Z=WX+b和σ(Z)=A逐層向后傳播;L(A, Y)中的L表示loss,為成本(基于損失函數)函數,確定Y和Yhat之間的誤差。

接下來分正向傳播和反向傳播再具體介紹BP神經網絡的模型算法。

(1)正向傳播

Forward Propagation,也叫正向傳播。如下面兩個圖所示,神經網絡的正向傳播就是樣本信息向后傳遞的過程。由于Z是樣本特征X的函數,A是Z的函數,相當于A是X的復合函數。同時,各隱藏層擁有本層的Z和A函數,隱藏層之間通過A(可以看成是某層的預測值)進行信息傳遞(當成下一層的X)。從信號(原始數據)傳遞的角度來看,正向傳播將輸入信號通過隱藏層后,作用于輸出節點,經過非線性變換轉化

正向傳遞中的數學算法的通用表達如下:


下圖展示了更具體的前向傳遞向量化算法實現過程。

(2)后向傳播

Backward Propagation,反向傳播。一次正向傳播加一次反向傳播,就是一次完整的iteration迭代。經過一次正向傳播后,若實際輸出與真實結果差距較大,則啟動誤差的反向傳播。

如下圖所示,后向傳播根據前向傳播計算出來的A(激活值,A=g(Z))、真實值Y和暫存的Z(Z=Wx+b),用求導的方式求出每一層參數的梯度,以調整模型參數值,進而降低成本函數的誤差(梯度下降法)。和前向傳播的復合函數構造過程對應,后向傳播的實現包括了復合函數從外到內的鏈式求(偏)導過程。

通俗來說,反向傳播是將輸出誤差反向逐層傳遞,算出所有層的誤差估計,即將輸出誤差攤分給各層所有單元,并在各層算出誤差信號后對各單元的參數進行調節(誤差以某種形式在各網絡層進行表示)。調整正向傳播中輸入層和隱藏層、隱藏層和輸出層對應的參數,即可推動誤差隨梯度方向下降。經過重復的學習,確定和最小誤差所對應的參數后,學習停止。  

小結:正向傳播求損失,反向傳播傳誤差,基于誤差值進行參數更新;反復迭代求出最優模型。

神經網絡算法的數學推導有一定的學習門檻,對于初學者來說需要一定投入才能弄懂。吳恩達在他的深度學習系列課程中提到,神經網絡的反向傳遞的數學推斷幾乎是是機器學習中最復雜的,需要用到矩陣的運算、矩陣的求導和鏈式求導法則等數學知識。

1.4 參數和超參數

神經網絡模型的參數主要包括W權重矩陣和b偏誤向量,前文已提到過。除了參數,神經網絡模型還包括多個超參數。超參數是決定參數大小的參數,主要包括:

  • Learning Rate α 學習率α。如下圖所示,學習率可以看成是權重w下降部分(成本函數J對w的導數)的系數,其取值介于0和1之間。一個好的學習率,可以讓成本函數下降更快,收斂在更低的水平。不過也要注意,成本函數的下降速度過快也可能帶來問題。若學習率取得過大,算法雖然收斂更快,但更容易陷入局部最優;反之若取值較小,算法的收斂速度較慢,但可以一步步逼近全局最優。

  • Training Factor訓練因子。在Stata的brain命令中叫“eta”(默認值是0.25),用來指定學習率的上限和下限。
  • 隱藏層層數,the number of hidden layer。
  • Size,某個隱藏層神經元的個數。

2 神經網絡的實現

2.1 神經網絡與Stata實現

目前Stata 16中用于神經網絡建模的是非官方命令“brain”,由Thorsten Doherr于2018年通過SSC和Github發布。該命令基于Stata的Mata矩陣編程語言,建立backward propagation向后傳播型的multi-layer多層神經網絡。Backwark propagation簡稱BP,故該算法也被稱為BP神經網絡。BP神經網絡最早在1986年由Rumelhart和McCelland發表在Nature上的論文《Learning Representations by Back-propagating Errors》提出。

Doherr對brain命令的簡介:“brain”為實現反向傳播神經網絡算法而設計,簡潔易上手。訓練后的神經網絡模型可以通過.brn文件保存或調用。具體模型結果以公開且可訪問的矩陣的形式展示,方便老版本Stata的讀取。brain命令還附帶很多函數,以便于pseudo-marginal effects偽邊際效應的分析;但它的主要功能還是在于預測,即傾向得分計算或者分類。和其它機器學習算法類似,邊際效應的計算,是因果推斷中討論自變量對因變量影響程度的關鍵。

2.2 Stata神經網絡建模

第一步,數據準備。同樣使用的是prestige數據,但隨機切割后一般會有些許差別。

clear . set seed 1898 . use "D:Rprestige.train.dta", clear. sum prestige . dis r(min) //14.8 . dis (r(max)-r(min)) //72.399997 . replace prestige=(prestige-r(min))/(r(max)-r(min)) //prestige歸一化 . sum prestige. sum education . dis r(min) //6.3800001 . dis r(max)-r(min) //9.5900002 . replace education=(education-r(min))/(r(max)-r(min)) //education歸一化 . sum education. sum income . dis r(min) //918 . dis r(max)-r(min) //24961 . replace income = (income-r(min)) / (r(max) - r(min)) //income歸一化 . sum income

第二步,建立BP神經網絡模型。

. clear *定義BP神經網絡模型 . brain define, input(prestige education) output(income) hidden(10 10) Defined matrices:input[4,2]output[4,1]neuron[1,23]layer[1,4]brain[1,151] *輸入變量是自變量prestige和education,輸出變量是income *hidden(10 10)表示共2個隱藏層,每個各10個神經節點。和R部分一致. brain train, iter(200) eta(0.25) nosort *iter表示迭代的次數,在此設置200次 *eta為訓練因子,默認取值為0.25,表示學習率的初始值均勻分布于[-0.25, 0.25] *nosort表示在訓練前不對數據進行排序. brain save "D:RBPNNm1.brn" //保存訓練好的BP神經網絡,方便后面調用進行預測

第三步,查看已經建立好的BP神經網絡模型。

. matrix layer //查看各層神經節點數量layer[1,4]in hid1 hid2 outneurons 2 10 10 1 */. matrix list input //查看輸入變量 input[4,2]prestige educationmin 0 0norm 1 1value 0 0 signal 0 0 */. matrix list output //查看輸出變量incomemin 0norm 1value 0 signal 0 . matrix list neuron //查看神經節點 neuron[1,23]in1 in2 h1n1 h1n2 h1n3 h1n4 h1n5 h1n6 h1n7 h1n8 h1n9 h1n10 h2n1 signal 0 0 0 0 0 0 0 0 0 0 0 0 0h2n2 h2n3 h2n4 h2n5 h2n6 h2n7 h2n8 h2n9 h2n10 out1 signal 0 0 0 0 0 0 0 0 0 0 . matrix list brain //查看各節點的連接權重 *只展示部分結果 brain[1,151]h1n1w1 h1n1w2 h1n1b h1n2w1 h1n2w2 h1n2b h1n3w1 weight .41241582 -.4473998 .1887836 1.0385614 .4644028 -.32226553 .71407534h1n3w2 h1n3b h1n4w1 h1n4w2 h1n4b h1n5w1 h1n5w2 weight .85327234 -.18876532 -.52128979 -.39156865 -.2958014 .88854821 .79453232

第四步,查看神經網絡模型中自變量的偽邊際效應

.brain margin //查看邊際效應incomeprestige 0.074326136 education 0.056956779 /*結果的解讀:(1)職業聲望每增加一單位(從0變到1),收入增加0.0743個單位(約合1855.25美元);(2)受教育程度每增加一單位,收入增加0.0570個單位(約合1421.6982美元)。*//* incomeprestige 14600.733767469education -5672.844525771 */ // 未歸一化的結果。education系數居然是負的!這顯然和常識不符。讓我們通過畫圖檢查下數據. twoway (line income education, sort) (lfit income education) *從畫圖結果可以看出,隨著受教育程度的增加,收入整體是上升的

第五步,準備測試數據。

*數據準備 . clear . set seed 1898 . use "D:Rprestige.test.dta", clear . sum prestige . dis r(min) //23.200001 . dis (r(max)-r(min)) //59.100002 . replace prestige = (prestige-r(min)) / (r(max) - r(min)) //prestige歸一化處理 . sum prestige. sum education /*Variable | Obs Mean Std. Dev. Min Max -------------+---------------------------------------------------------education | 28 10.67536 2.965029 6.6 15.94 */. dis r(min) //6.5999999 . dis r(max)-r(min) //9.3399997 . replace education = (education-r(min)) / (r(max) - r(min)) //education歸一化處理 . sum education. sum income . dis r(min) //611 . dis r(max)-r(min) //18652 . replace income = (income-r(min)) / (r(max) - r(min)) //income歸一化處理 . sum income*導入之前訓練好的神經網絡 . brain load "D:RBPNNm1.brn" Loaded matrices:input[4,2]output[4,1]neuron[1,23]layer[1,4]brain[1,151] . brain think income_hat //基于預測數據進行預測,生成income_hat變量*還原income和income_hat . sum income income_hat . replace income = income*18652 + 611 . replace income_hat = income_hat*18652 + 611 . sum income income_hat /*Variable | Obs Mean Std. Dev. Min Max -------------+---------------------------------------------------------income | 28 6668.821 3984.65 611 19263income_hat | 28 5018.372 1651.003 3066.421 8184.359 */

第六步,評價Stata BP神經網絡模型預測的表現。

. gen income_se = (income_hat - income)^2 . sum income_se . scalar income_se_mean = r(mean) . dis sqrt(income_se_mean) //RMSE = 3400.3261

4.3 Stata OLS建模對比

. set seed 1898 . use "D:Rprestige.train.dta", clear . reg income prestige education //RMSE=3054.5. use "D:Rprestige.test.dta", clear . predict income_hat . gen income_se = (income_hat - income)^2 . sum income_se . scalar income_se_mean = r(mean) . dis sqrt(income_se_mean) //RMSE = 2855.9972

3 小結

和其它一些機器學習模型一樣,尋找好的神經網絡模型的過程依靠的往往是經驗法則,需要經過反復的參數和超參數的調整和比較。最優超參數的選擇,還可能隨著應用領域、數據更新和硬件技術的升級而改變。當然,短期內的模型優化方法主要還是Cross Validation交叉驗證,用現有數據重復地檢驗模型的性能表現。 本案例中展示的是一個較為簡單的BP神經網絡,主要目的是介紹相關的建模過程。在掌握了基本的建模過程后,大家可以嘗試從以下幾個方面建立更復雜的模型:

  • 引入更多自變量和觀測值。本文附帶有一個名為“house_1.05m.csv”的真實房價數據擁有13個變量和約105萬個觀測值,可供大家進一步練習。
  • 引入因子型(分類)變量。在引入連續變量的時候需要去量綱化(0-1或者標準化),而引入因子型變量的時候處理過程稍微更復雜,需要將分類變量轉換為一系列的啞變量后納入回歸模型。該轉換可以通過RSNNS包的decodeClassLabels函數實現。
  • 將隱藏層參數設置為更多的層數及更多的神經元數(可能需要換一臺性能更好的電腦)。在此順便向大家展示下prestige回歸案例中c(50, 50, 50, 50)的神經網絡長什么樣。

prestige回歸案例中c(50, 50, 50, 50)的神經網絡視覺化(基于R語言)

Ref

1. 陳強,《高級計量經濟學》,第二版。

2. 薛震,孫玉林,《R語言統計分析與機器學習》,第一版。

3. Scott V. Burger,《基于R語言的機器學習》,第一版。

4. Robert I. Kabacoff,《R in Action》,第一版。

5. Rumelhart, D., Hinton, G. & Williams, R. Learning representations by back-propagating errors. Nature 323, 533–536 (1986). https://doi.org/10.1038/323533a0.

6. Thorsten Doherr, 2018. "BRAIN: Stata module to provide neural network," Statistical Software Components S458566, Boston College Department of Economics.

7. Thorsten Doherr, codes of Stata command “brain”, https://github.com/ThorstenDoherr/brain.

8. James McCaffrey, 2015, How To Use Resilient Back Propagation To Train Neural Networks, https://visualstudiomagazine.com/articles/2015/03/01/resilient-back-propagation.asp.

9. Riedmiller M. (1994) Rprop - Description and Implementation Details. Technical Report. University of Karlsruhe.

10. Stata中“brain”命令的幫助文件。

11. 吳恩達的深度學習系列課程,在Coursera、網易云課堂和B站均可公開訪問。

12. R中mlp()、nnet()和neuralnet()等函數的幫助文件。

-------全文結束-------------------------------------------------------------------------------

總結

以上是生活随笔為你收集整理的bp 神经网络 优点 不足_深度学习之BP神经网络--Stata和R同步实现(附Stata数据和代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

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