1. 程式人生 > 實用技巧 >由巨集觀到細節談談BP神經網路搭建

由巨集觀到細節談談BP神經網路搭建

文章目錄

序言

自從最近十幾年深度學習開始迅速發展以來,越來越普及的應用於我們的生活,在一次競賽中接觸了一些深度學習的東西以後,對神經網路有了一些興趣。
我一開始覺得神經網路很難,內心有畏懼感,總覺得入門很難,但是慢慢的接觸下來,覺得其實也沒有想象的那麼難,網路上面流傳的一些講BP神經網路的帖子都會講到一些很深奧但是卻無關緊要的東西,本文旨在抓住BP神經網路搭建的主要矛盾,忽略一些搭建的次要矛盾,來實現從整體上把握BP神經網路的思想。

另外筆者斷斷續續的學了機器學習幾個月了,想想還是階段性的總結一下,疏漏之處希望評論區大神進行批評指正,只有在批評中才可以不斷的提高自己。

引言

首先要先引入神經網路的概念。

人工神經網路: 是一種應用類似於大腦神經突觸聯接的結構進行資訊處理的數學模型。在工程與學術界也常直接簡稱為“神經網路”或類神經網路。

英文名字叫做Neural Network,有時候也簡稱NN比如卷積神經網路(Convolutional Neural Networks)就叫做CNN。

是不是感覺很晦澀難懂?

對!
我也感覺特別的難理解。數學上的定義雖然保證的嚴謹性,但是對我這樣的小白來說真的真的不友好。那我重新組織一下語言。

人工神經網路: 指計算機模仿大腦神經網路,採用一系列函式的對映與傳遞的關係,創造的一個能完成設計者的目的的黑箱模型。

說了半天也不如圖形象,不說了,上圖:
BP神經網路模型這就是一個BP神經網路模型(箭頭表示正向傳播),x是特徵,一般實際應用中有多個特徵輸入,但是為了方便敘述,我這裡先採用一個輸入x,迴歸方式採用logistic迴歸
(logistic迴歸沒聽過沒關係,我後面會講到,目前只需要知道logistic迴歸用於二元分類任務就行)。

模型解讀

首先介紹一下圖片,圖片中有一個輸入X,7個神經元,組成了三層神經網路,輸出了預測值y hat。

因為採用logistic迴歸,所以我們以二元分類任務為例,二元分類任務簡單來說,就是判斷一張圖片中有沒有目標A。

我們的神經網路要實現的目標:

如果神經網路預測有A,
則 y hat ≈ 1;
如果神經網路預測沒有A,
則 y hat ≈ 0;

也可以理解y hat 就是神經網路對圖片中有A的概率的評估。單純從功能來看,是不是很神奇,似乎神經網路實現的像人一樣的判斷,但其實就是對圖片特徵的一種函式對映。
在這裡插入圖片描述就是這麼一回事,我們就是要完成一個目標:
訓練出一個合適的F(),使得F()對含有A的x輸出1,對不含有A的x輸出0。
換句話說,算了,還是上圖吧。

原點表示訓練集中有A的,三角形點表示訓練集中無A的,實線表示神經網路的劃分曲線。
劃分
首先需要說明一下,logistic迴歸使用的函式(sigmoid函式)使得對於任意輸入X只會輸出0和1區間的y hat,假設k=|y hat - 0.5|為神經網路判斷影象是否有A的確定度,越接近0.5說明神經網路越不確定自己的判斷,圖中的分界線就越粗。
現在我們可以知道訓練要完成的目標了:

1.訓練出一個合適的函式,使得F()產生的分界線能夠儘可能的對輸入做出正確的判斷。
2.通過一定的方法,使得F()產生的分界線儘可能的細,即神經網路的確定度儘可能的大。

完成這個目標,就可以實現的神經網路的對影象有無A的判斷。

具體實現

現在我們實現我們得想辦法實現訓練要到達的目標。
先說下我們接下來會講到的關鍵字:

logistic迴歸(sigmoid函式)
梯度下降演算法(正向傳播,反向傳播) PS:順便簡單講講梯度消失和非凸函式的問題
歸一化

正式開始我們的搭建BP神經網路之旅

(為了方便敘述,我先暫時不考慮正則化,以後會寫關於正則化的詳細講解)

1. 設定神經元基本結構

我們先假設每個神經元都是線性函式,即y=wx+b的形式,y是神經元的輸出,x是神經元的輸入,w和b是我們需要訓練得到的引數。但是我們會發現一個問題,如果每一個神經元都是線性函式組成,那麼整個神經網路不過是若干個線性函式的推進,難以實現擬合任意資料的目標, 直白的說,就是不能形成任意的上圖的分割線,會導致神經網路的識別正確率維持在一個較低的水平。

那這怎麼辦呢?
我們必須引入非線性函式,就是所謂的啟用函式

也就是說,我們的神經元必須長這樣。
在這裡插入圖片描述
接受x1作為輸入,然後經過線性處理形成z,在經過g()函式進行啟用,形成並輸出x2,x2再作為下一個神經元的輸入。

那這個g()怎麼選擇呢?幸好,在我們前面有很多偉人幫我們解決了很多的困難,在很多次試驗後,前人發現,sigmoid函式是一種很好的啟用函式。
那提到了這麼多次sigmoid函式,他到底長什麼樣呢?
在這裡插入圖片描述

就是這樣的一個函式,為什麼這個函式啟用效果比較好呢?

單純看函式式子也基本上很難解釋,但是影象就簡單明瞭了。
在這裡插入圖片描述
發現什麼了嗎?
對!函式的輸出全部分佈在(0,1)這個區間,剛好和我們要求的y hat吻合了。這不正是我們需要的函式嗎?

好,那我們現在就完成了神經元函式的基本結構設定,現在的問題是每個神經元的w,b怎麼設定的問題了。

2.正向傳播

前面我們已經完成了神經元的基本設定,現在就是求每個神經元的w和b的問題。
w和b如何得到呢?訓練得到。
具體思路是我們先給每個神經元隨機初始化一個w和b,然後通過訓練不斷的調整w和b,最終嘗試找到一個最優的w和b,來實現神經網路的效能的提高。

正向傳播,就是給神經網路我們收集的資料,讓資料經過若干層神經網路後,產生預測值y hat。

y hat可能和我們的真實值y很接近,也可能和我們的真實值y相差很遠。
為了方便定量表示損失值,我們引入損失函式的概念。
δ=-)這個式子也有另一個名字,叫做二進位制交叉熵。

當y hat = y =1時,δ=0;
當y hat = 1,y = 0 時,δ=∞;

因為資料集一般不止一個,所以我們再引入成本函式的概念:

對m個數據的損失函式取均值,可以得到成本函式。

得到成本函式以後,說明我們的一遍正向傳播已經完成,現在,開始我們的反向傳播,調整w和b。

說明一下,成本函式既用於評估訓練的結果,也用於神經網路的反向傳播。

3.反向傳播

在經歷正向傳播以後,我們得到了y hat。
正向傳播是x的主場,反向傳播則是y hat的主場。
由於函式導數的傳遞性,即
在這裡插入圖片描述在有了上面這些理論支援以後,現在開始我們的梯度下降
(由於篇幅限制,梯度我就不解釋了,不清楚的同學可以去翻翻高數書的下冊,裡面有很詳細的解釋。)

更加上述的原理進行反向求導,可以求得
d( z ) = y hat - y
d( w ) = x * d(z)
d( b ) = d(z)

然後更新w和b

w = w - α * d(w)
b = b - α * d(d)

其中α為學習率,目的是設定神經網路在每一次梯度下降時對於樣本的學習情況,這個引數也是需要在多次訓練中除錯來找到最優的。太大的學習率可能導致對某個錯誤判斷樣本的過度學習(這主要產生在訓練前期),引起梯度難以以較好的情況下降;太小的學習率則可能導致訓練後發現神經網路基本上沒學到東西。 這都是訓練網路是要考慮的東西。

為什麼這樣更新w和d可行呢?
在這裡插入圖片描述

之前提到,神經網路是一個函式,現在我們固定住x(之前我們是以x為自變數),現在我們把w和b看做自變數,為了得到較好的訓練結果,即成本函式儘可能的接近於0,我們需要找成本函式的最低點。梯度下降可以幫助我們找到最低點(具體論證可以參考高數下)。
但是我們的運氣總不是那麼好,一般神經網路構造的函式都不是單純的凸函式,在不合適的學習率下,可能會導致我們的函式在一定次數的梯度下降後進入了一個區域性最優解,然後就涼涼,訓練的結果會非常差。這就引起了人們對於非凸優化問題的探討,有興趣的同學可以去網上查查,其實關於非凸優化的方法還有挺有意思的。

4.迭代訓練

然後不斷的重複步驟三和步驟四,就完成了BP神經網路的訓練過程。
看到這裡,相信小夥伴們應該都明白了為什麼這個網路叫BP神經網路了吧,沒錯,就是反向傳播神經網路(Back Propagation Neural Network),是一種前饋神經網路。

這裡最後在引入一下梯度消失問題:
在這裡插入圖片描述

可以看到,由於是從後往前導數傳遞的反饋,在神經網路層數過深時,輸入的x產生改變後,經過前面一系列神經網路的處理,傳遞到最後幾層神經網路時,可能和前一次訓練傳遞到這裡時的資料差異特別小, 由於神經網路是靠特徵進行訓練,極小的差異帶來的是深層神經網路難以區分每個輸入x的特徵,所有的輸入連起來幾乎是一條平滑曲線,導致梯度下降訓練效果幾乎沒有,這就是梯度消失問題。 一樣,現在的很多研究者都有對付梯度消失的辦法,比如殘差連線等等的,也特別有意思,有興趣的小夥伴也可以去看看這些論文。

總結

整個BP網路其實就一句話:
正向傳播,反向更新

花了一天時間寫了這個文章,現在就基本上簡單的把BP神經網路講了一下,因為筆者也是一個大二的學生,接觸這些東西的時間也還比較短,有紕漏之處在所難免,如果有錯,希望各位大神在評論區罵的輕一點(手動滑稽)

不過我內心堅強(裝的),不管再怎麼罵,我過段時間還是會把如何正則化的部落格發出來的,這段時間準備物理考試要緊。