#頭條創作挑戰賽#
先來認識下真正的神經元。
圖1:典型神經元的結構(來自維基百科“樹突”詞條)
神經元大緻可以分為樹突、突觸、細胞體和軸突。樹突為神經元的輸入通道,其功能是将其他神經元的動作電位傳遞至細胞體。其他神經元的動作電位借由位于樹突分支上的多個突觸傳遞至樹突上。神經細胞可以視為有兩種狀态的機器,激活時為“是”,不激活時為“否”。神經細胞的狀态取決于從其他神經細胞接收到的信号量,以及突觸的性質(抑制或加強)。當信号量超過某個阈值時,細胞體就會被激活,産生電脈沖。電脈沖沿着軸突并通過突觸傳遞到其它神經元。(内容來自維基百科“感知機”詞條,稍作整理)
我們的視覺系統非常複雜。大緻來講,當光線投射到視網膜後,視覺膜上的光感受細胞的突觸直接與雙極細胞相連,雙極細胞突觸則與最外層的節細胞相連,節細胞将動作電位傳遞到大腦。我們的視網膜有大約1億3千萬個光感受細胞接收光信号,然後通過大約120萬個節細胞軸突将信息從視網膜傳遞到大腦。(内容來自維基百科“視覺系統”詞條)
視覺系統使我們有了視知覺能力,将外部世界的二維投射重構為三維世界。
人類的視覺系統可以毫不費力的識别出下面圖片中的數字(當然還有文字)。但如果讓計算機來識别,就會明顯感覺到視覺識别的困難。
圖2:街道地址(來源于維基百科“Handwriting recognition”詞條)
我們不能簡單地把“數字2像一隻水面上的天鵝,數字7像一把鋤頭”這樣的規則教給計算機。因此,我們需要把手寫識别的問題表述成計算機可以理解的方式。
圖3:水面上的天鵝像極了數字2
假設我們有5x5像素的圖片來顯示每個數字,例如數字2表示如下:
@@@@@
. . . . @
@@@@@
@. . . .
@@@@@
由于我們的神經網絡是以數字組成向量作為輸入的,所以我們将每個圖片轉換成長度為25的向量,其元素的值是1(“這個像素位于該圖像中”)或0(“這個像素不在該圖像中”)
例如,數字2可以表示為:
two_digit=[1,1,1,1,1
0,0,0,0,1
1,1,1,1,1
1,0,0,0,0
1,1,1,1,1]
我們希望神經網絡最終的輸出是一個具體的數字,因此我們需要10個不同的輸出結果。例如,對于數字2,正确的輸出結果将是:
[0,0,1,0,0,0,0,0,0,0]
圖4:使用python列表解析式建立一個代表0-9不同數字的列表
其中targets[2]就是輸出結果數字2。
那麼,神經網絡是如何把信息的輸入轉換成我們想要的輸出的呢?
感知器(Perceptron)感知器是一種二元分類器,它是神經網絡的基石。感知器是對神經細胞的模拟,如權量(突觸)、偏置(阈值)及激活函數(細胞體)。
輸入以向量的形式表示x=(x_0, x_1, x_2),你可以把它們理解為不同的特征維度,其中的x_0是偏置單元(bias unit),相當于線性回歸中的常數項。在經過“神經元”(激活函數)的計算後,感知器會輸出一個大于0或小于0的數。箭頭上的數字代表每個特征的權量(weights),相當于線性回歸模型的參數,是收集信息的神經突觸。
例如,上圖列出了每個特征的權量,于是我們有這樣的模型:
hθ(x)=-3 2*x_1 2*x_2
當x_1和x_2同時為1時,輸出為1,而不同時都将得到負數。這實際上就是邏輯與或稱為與門。
我們的感知器将根據輸出大于或小于0來對輸入進行分類:
這是一個單層的感知器。通過修改權量,我們也可以建立或門(weights=[2,2], bias=-1)、非門(weights=[-2],bias=1,隻有一個輸入端)。但是,無論如何,你都無法通過一個單層的感知器來建立“異或門”(XOR),即兩個輸入相同時輸出1,否則輸出0。這種情況下,我們就需要更複雜的神經網絡了,即多層神經網絡,也被稱為前饋神經網絡(feedforward neural network)。
前饋神經網絡前饋神經網絡是多個感知器的組合,這些感知器以不同的方式産生連接,并由不同的激活函數控制激活。
圖6:前饋神經網絡示意圖 我們來認識下前饋神經網絡:
在“感知器”中我們談到,單層感知器雖然可以建立與門、或門、非門等,但無法建立更為複雜的異或門(XOR),即兩個輸入相同時輸出1,否則輸出0。
為了更為直觀地理解這個問題,我們可以看下圖:
圖7:雙輸入感知器的決策空間
模型有兩個輸入(input1和input2),我們可以線性地區分或門的兩類情況:即同時為0時在左下角,其它情況在右上角;與門的情況也可以線性地區分,即輸出同時為1時在右上角,其它情況在左下角。但異或門呢?這種情況是無法作出線性區分的,也就是說,單層感知器無法實現異或門。
多層感知器嗎?
先來分析輸入和輸出的情況。最左邊兩列列出了輸入的4種情況。異或門的輸出是最右邊一列的情況,即兩個輸入相同時輸出1,否則為0。我們在輸入層和輸出層之間加入兩個單元的隐藏層,那麼,它給輸出層的輸入應該是什麼呢?答案如下圖。你可以發現,對于隐藏層的a_1單元(上标2代表這是第2層)來說,它實際上是且門(都為1時才輸出1);對a_2單元來說,它的邏輯是(not x_1) and (not x_2),即同時為0時才輸出1。而從隐藏層到輸出層,是邏輯或。前饋神經網絡可以實現異或門!
圖8:異或門輸入輸出下推導隐藏層
于是我們建立如下的神經網絡,但是其輸出并非我們想要。為什麼?
圖9:線性激活函數下的前饋神經網絡
這是因為上面感知器的激活函數是線性函數。這種情況下,神經網絡的輸出也隻是輸入的某種線性函數,隻不過是通過網絡的形式來進行加權。線性函數的線性組合仍然是線性函數。也就是說,即便是多層的感知器,激活函數為線性時也無法實現輸入00和輸入11時的輸出比輸入01和10時大,即非線性。
如果激活函數是線性函數,前饋神經網絡将不會比單層感知器強大多少,不管它有多少層。
我們需要logistic函數的幫助。大部分神經網絡會使用非線性激活函數,比如logistic函數(也被稱為Sigmoid函數,這是就其形狀而言的)。此外,由于訓練神經網絡要使用微積分,而要使用微積分,就得使用光滑函數(在反向傳播時我們會詳細講解)。logistic函數也滿足這一要求。
在logistic函數的作用下,線性函數的輸出值将被轉化到0到1之間。從下圖右上角的logistc曲線可以看到,輸入值越大,輸出越接近1,輸入為4時輸出為0.99;輸入值越小,輸出越接近0,輸入值為-4時,輸出為0.01。
下圖是單層感知器的激活函數為logitic函數時與門的示例。
圖10:激活函數為logitic函數時的與門單層感知器
綜上,我們可以通過前饋神經網絡和logistic函數解決異或門的問題:
圖11:非線性神經網絡實現異或門
反向傳播(backpropagation):訓練神經網絡反向傳播是使用數據來訓練神經網絡的算法,它是神經網絡的梯度下降算法。
假設我們有一個訓練集,其中含有輸入向量和相應的目标輸出向量。同時,假定我們的網絡已經擁有一組權量(相當于我們知道每個神經元的激活函數),那麼接下來,我們就需要使用以下算法來調整這些權量。
1、利用初始權量,在輸入向量上運行前向傳播,從而得到所有網絡所有神經元的輸出。
2、這樣,每個輸出層神經元都會得到一個誤差,即輸出值與實際值之差。
3、計算作為神經元權量的函數的誤差的梯度,然後根據誤差降低最快的方向調整權量。
4、将這些輸出誤差反向傳播給隐藏層以便計算相應誤差。
5、計算這些誤差的梯度,并利用同樣的方式調整隐藏層的權量。
不斷叠代,直到網絡收斂。
要理解上述過程,梯度下降算法是關鍵。
圖12:單個參數的損失函數示例
在梯度下降算法中,我們需要損失函數(即上面提到的作為神經元權量的函數的誤差)。損失函數衡量了模型的誤差,即神經網絡的輸出值與實際值之間的差異,它的參數是模型的參數,即連接的權量。當損失函數達到全局最低時,得到最優的權權量。在訓練階段,權量不斷被更新,慢慢接近全局最低值。例如,權量是0.6時,它就需要向0.4變化,這樣才能接近全局最低值。
上圖描述的是隻有一個參數的情況,即模型的誤差取決于一個參數。然而,神經網絡的誤差取決于每一個權量,它的損失函數也會複雜得多。 J(θ)=−1m[∑i=1m∑k=1Kyk(i)loghθ(x(i))k (1−yk(i))log(1−hθ(x(i))k)] λ2m∑l=1L−1∑i=1sl∑j=1sl 1(θj(l))2J\left( \theta \right)=-\frac{1}{m}\left[ \sum_{i=1}^{m}{\sum_{k=1}^{K}{y_{k}^{\left( i \right)}\log h_{\theta }\left( x^{\left( i \right)} \right)_{k} \left( 1-y_{k}^{\left( i \right)} \right)\log \left( 1-h_{\theta }\left( x^{\left( i \right)} \right)_{k} \right)}} \right] \frac{\lambda }{2m}\sum_{l=1}^{L-1}{\sum_{i=1}^{s_{l}}{\sum_{j=1}^{s_{l 1}}{\left( \theta _{j}^{\left( l \right)} \right)^{2}}}}
其中,i代表第幾層,k代表第i層的第幾個單元。可見,損失函數把整個神經網絡的誤差都加和了。後面的第二部分是正則化項,暫時不用理睬,不影響後面的理解。
有人可能會問,為什麼神經網絡的損失函數是上面的形式?這個問題等價于為什麼logistic函數采用上面的形式?
在回歸模型中,損失函數是平方誤差函數(最小二乘法):
J(θ)=1m∑i=1m12(hθ(x(i))−y(i))2J\left( \theta \right)=\frac{1}{m}\sum_{i=1}^{m}{\frac{1}{2}\left( h_{\theta }\left( x^{\left( i \right)} \right)-y^{\left( i \right)} \right)^{2}}
損失函數衡量了模型的輸出與實際值之間的誤差:
Cost(hθ(x),y)=12(hθ(x)−y)2\mbox{C}ost\left( h_{\theta }\left( x \right),\; y \right)=\frac{1}{2}\left( h_{\theta }\left( x \right)-y \right)^{2}
但對logistic函數而言,平方誤差函數是一個非凸函數,利用梯度下降算法,它将無法保證找到損失函數的全局最優解。
圖13:非凸函數
對logistic函數,我們需要其他的損失函數:
圖14:
圖15:
如果y=1,而h(x)=1的話,則cost=0,即圖14曲線上(1,0)的位置;如果h(x)=0,則cost函數輸出值趨向于無窮大,這意味着當我們認為某種情況不會發生,例如用戶不會成為付費用戶,而事實上是可能的時,這種損失是不可估量的。同理,如果y=0,而h(x)=0的話,則cost=0,即圖15曲線上(0,0)的位置;如果h(x)=1,則cost趨向于無窮大。
可以把兩種情況寫在一個表達式中:
Cost(hθ(x),y)=−ylog(hθ(x))−(1−y)log(1−hθ(x))\mbox{C}ost\left( h_{\theta }\left( x \right),\; y \right)=-y\log \left( h_{\theta }\left( x \right) \right)-\left( 1-y \right)\log \left( 1-h_{\theta }\left( x \right) \right)
也即:
J(θ)=−1m[∑i=1my(i)loghθ(x(i)) (1−y(i))log(1−hθ(x(i)))]J\left( \theta \right)=-\frac{1}{m}\left[ \sum_{i=1}^{m}{y^{\left( i \right)}\log h_{\theta }\left( x^{\left( i \right)} \right) \left( 1-y^{\left( i \right)} \right)\log \left( 1-h_{\theta }\left( x^{\left( i \right)} \right) \right)} \right]
神經網絡衡量整個網絡的誤差,所以在形式上看起來會複雜些,但實質是一樣的。
那麼,接下來我們要如何更新權量才能使得損失函數接近全局最低值呢?
在神經網絡中,我們使用反向傳播算法來更新神經元之間連接的權量。反向傳播的意思是指,我們從輸出層開始計算,計算輸出層與實際值的誤差,然後返回到前面的隐藏層計算其誤差,以此類推,不斷叠代,直到網絡收斂。
在完成第一步的前向傳播後,我們會得到神經網絡的輸出值,利用損失函數可以計算出輸出值與實際值之間的誤差。損失函數的偏導數可以告訴我們參數往哪個方向更新可以得到更小的損失函數值。導數的幾何意義為曲線的斜率,例如,對于圖12簡單的損失函數而言,參數在0.5時斜率為正,參數值需要減少才能得到更小的損失函數值;而如果參數值為0.1,斜率為負,參數值需要增加才能得到更小的損失函數值。導數可以告訴我們全局最低的方向!
為了得到最小的J(θ),我們需要不斷更新參數θ,即神經網絡連接的權量。每次更新的變化值由下面的公式決定:
Δθ=−α∂∂θijlJ(θ)\Delta \theta =-\alpha \frac{\partial }{\partial \theta _{ij}^{l}}J\left( \theta \right)
其中, ∂∂θijlJ(θ)\frac{\partial }{\partial \theta _{ij}^{l}}J\left( \theta \right)為損失函數的偏導數,前面為負是因為斜率為正時,我們需要減少參數的值才能“下山”,而斜率為負時,我們需要增加參數的值才能“下山”, 代表學習速率,代表下山的步子有多大,如果步子太小,要走很遠才能走到山底,如果步子太大,容易越過谷底,導緻無法收斂;J(θ)為神經元輸出的誤差。
從隐藏層到輸出層的兩個神經元之間的權量一旦更新,就可以更新隐藏層神經元的輸出,從而得到隐藏層神經元新的誤差值(更新後的輸出值和之前前向傳播時得到的輸出值),進而根據上述公式更新隐藏層和上一層兩個神經元之間的權量。依此類推,直到更新完整個神經網絡的權量。
利用損失函數繼續更新整個網絡的權量,直到神經網絡輸出值的誤差達到最小。
所有神經元之間的權量确定後,神經網絡就完成訓練了。
綜上,讓機器人看到2絕非易事。
#今日頭條小助手##神經網絡#
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!