文章目錄
- 前言
- 一、神經網路能夠做什么
- 二、簡單神經網路結構介紹
- 三、反向傳播(梯度下降法)
- 總結
前言
作為剛入坑機器學習的一名小白,寫這篇文章的初衷是想作為自己的一個學習筆記,防止知識遺忘,同時也希望能夠跟大家一起交流,共同進步
人工神經網路是近幾年人工智能、機器學習領域的熱門方向,它是根據人腦神經建立的一種模型,在各種工業領域解決了大量的實際問題,具有廣泛的應用前景,本文主要介紹如何構建一個較完整的簡單神經網路,包括前向傳播、反向傳播(梯度下降)等內容
一、神經網路能夠做什么
神經網路本質上是一種演算法,這種演算法能夠將m個輸入x1,x2,x3…xn映射成n個輸出y1,y2,y3…yn,類比到人類的大腦,大腦可以接受各種資訊,再對各種資訊進行處理后輸出合適的資訊,但神經網路無法使用人類的思維方式,很難立刻輸出我們想要的結果,于是,神經網路每輸出一個值,我們就把它與期望的值相比較,用一個誤差函式來表示它們之間的差值,再通過反向傳播一次次修改演算法模型,這個程序稱為訓練,一個完善的神經網路模型需要大量的訓練,
就拿神經網路應用中入門的Mnist手寫識別資料集來介紹吧
簡單來說,Mnist是一個包含數萬張手寫圖片的資料集,類似如下的圖片:

我們要做的,是經過對程式進行訓練后,輸入一張類似的圖片,程式就能立刻識別出該圖片所代表的數字,
怎么做到的呢?我們知道,一張圖片是由許多個像素組成的,每個像素都有一個值來代表該位置,而代表著同一個數字的圖片在相同位置的像素是相似的,我們輸入大量類似的圖片代表訓練集,利用神經網路演算法對程式進行訓練,機器就能夠自己“學會”每個數字圖片的“特征”,最終達到識別的效果,
二、簡單神經網路結構介紹

上圖是最簡單的一種神經網路,甚至并不能稱為神經網路,它只有一個神經元,包含兩層,x1,x2稱為輸入層,y1,y2稱為輸出層,簡單來說,我們輸入2個資料x1和x2,對x1和x2進行處理,給它們各乘一個獨立的權重W,然后再加上一個相同的偏置單元b,得
a1=w1x1+b,
a2=w2x2+b,
然后,我們需要對a1,a2利用一種函式F進行運算,這個F函式稱為激活函式,常用的一種激活函式為sigmoid函式:

于是有
y1=sigmoid(a1)
y2=sigmoid(a2)
經過計算得到的結果y1,y2,我們稱為輸出層,y1,y2就是估計值,
這樣,我們就完成了一次最簡單的神經網路演算法,這樣的一次計算程序我們稱為前向傳播,
實際應用中簡單神經網路往往是三層的,包含輸入層、隱藏層和輸出層,
事實上,不論多少層的神經網路,它的前向傳播都是相同的,即上一層輸出經過新的w,b處理后變為下一層的輸入,
需要注意的是,每層神經元的每個輸入x的權重w都是獨立的不相同的,但每個神經元只有一個相同的b
實際應用中的神經網路結構要復雜得多,比如常用的Mnist手寫識別模型,要用到3層神經網路結構,它的輸入層的每組資料有784個數值,假設它的第二層(隱藏層)有40個神經元,那么它的第一層運算就會有784*40個w和40個b,
下面,我們就利用這個方法去找Mnist對線吧
然而,這樣得到的y1,y2往往并不是我們期望的結果,要最終得到想要的數值,怎么做呢?
三、反向傳播(梯度下降法)
反向傳播是簡單神經網路演算法的精華,也是比較難以理解的一部分內容,
完成一次訓練后,為了使y偏向正確的數值,我們需要跟據y與正確值之間的差距來不斷修正每層神經元所有w和b的值,這樣的程序,我們稱為反向傳播,每經過一次訓練,我們就更新一次w和b,使整個神經網路逐漸接近正確的模型,因此,一個完善的神經網路模型往往需要大量的訓練
一個三層神經網路結構如下:

(這里三層的n是不同的數值)
那么,反向傳播是如何實作的呢?這里我們介紹梯度下降的方法,首先,我們引入損失函式:

L表示估計值和真實值之間的距離,我們要找的就是使L最小的那個點

根據梯度的定義,我們知道函式f(x)沿它的導數f’(x)<0的方向不斷下降,于是,我們對損失函式L不斷地求其關于各個w和b的偏導數,再乘上一個較小的學習率以防止其下降得過快而越過了最小值,用w,b與其相減來更新w,b,但是,L本身是關于y和y_true的一個函式,不含有w與b,因此這里我們需要利用鏈式求導來得到w與b,下面,我們來推導反向傳播的公式
假設有一個這樣的三層神經網路

設:
x:輸入層
h:隱藏層
y:輸出層
h_in=w1x+b1
h=sigmoid(h_in)
y_in=w2h+b2
y=sigmoid(y_in)
L:損失函式
η:學習率(設為0.1)
有:
新w2=w2-η* ?L/?w2
新 b2=b2-η* ?L/?b2
新w1=w1-η* ?L/?w1
新b1=b1-η* ?L/?b1
而
?L/?w2=?L/?y * ?y/?y_in * ?y_in/?w2
?L/?b2=?L/?y * ?y/?y_in * ?y_in/?b2
?L/?w1=?L/?y * ?y/?y * ?y_in/?y_in * ?h/?h_in * ?h_in/?w1
?L/?b1=?L/?y * ?y/?y * ?y_in/?y_in * ?h/?h_in * ?h_in/?b
下面來分別計算每個式子的值
L=1/2*(y-y_true)^2
?L/?y=y-y_true
?y/?y_in=y(1-y) (這里利用了sigmoid求導公式,即s’(x)=s(x)*(1-s(x))
?y_in/?w2=h
可得
?L/?w2=(y-y_true)*(y(1-y))h
因此更新后的的w2=w2-0.1 * (y-y_true)(y(1-y))*h
類似地,我們能夠求出每一個更新后的值,
當網路中所有w和b全部完成更新,一次反向傳播就完成了,一次完整的訓練應當包含正向傳播和反向傳播的內容,當然,實際編程的程序中還會有各種各樣的問題,在以后的博客中我會貼上代碼展示,
總結
這就是構建一個簡單神經網路的程序,它的核心思想就是通過反復的訓練最終得到理想的w和b的值,而η則需要人為地調整達到最優,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229073.html
標籤:AI
