我們希望並期望我們的網絡能夠從他們的錯誤中學習的很快,首先看一個小例子。
我們將訓練這個神經元做一些非常簡單的事情:把輸入的1轉換成輸出的0。當然,如果我們不是用學習算法,可以很容易地計算出一個適當的權重w和偏差b。但是我們為了說明一些問題,就使用梯度下降法來學習權重和偏差,這對於后面的學習很有啟發性。讓我們來看看神經元是如何學習的。
我們將訓練這個神經元做一些非常簡單的事情:把輸入的1轉換成輸出的0。當然,如果我們不是用學習算法,可以很容易地計算出一個適當的權重w和偏差b。但是我們為了說明一些問題,就使用梯度下降法來學習權重和偏差,這對於后面的學習很有啟發性。讓我們來看看神經元是如何學習的。
首先我們設置開始學習的一些初始值,初始權重w為0.6,b為0.9,學習率(步長)為0.15,這些值的選擇並沒有什么特殊之處。當輸入值為1時,神經元的初始輸出是0.82,這個值和我們期望的0之間有很大差距,所以在我們的神經元接近期望的輸出之前,需要相當多的學習。因此我們利用梯度更新權重和偏差。最終獲得下面的結果,300次的epoch之后,輸出為0.09。雖然不是我們期望的0,但是已經算是一個不錯的結果了。
再一次實驗,這次將權重和偏差設置為2.0,再次運行結果發現,經過300次epoch之后,輸出為0.2,這個結果和0之間差距還是比較大的。同樣是300次epoch,但是結果卻差距很大。而且看下圖,前面大約150次epoch,cost的下降是非常非常的慢,也就是學習速度很慢。那么這是什么原因導致的呢?
經過初步查看,可以簡單了解到,當期望輸出和真實值之間差距比較遠時訓練速度要比差距近時快。
1、為什么w=0.6,b=0.9時,學習速度很快,而w=2.0,b=2.0時,學習速度就很慢,那么導致速度慢的原因到底是啥?
我們一步一步分析:
首先,神經元的學習是通過偏導數改變權值和偏差,改變的速度由和決定。因此,所謂的學習慢也就是偏導數比較小。那么我們來計算一下這里的偏導數。
這里的損失函數為二次損失函數(quadratic cost function),如公式(54)。
a為期望的輸出,為了更方便的表示,讓a = σ(z),z=ωx=b,用鏈式法則求出權重和偏移量的偏導數,如下:
故:
這兒x=1,y=0帶入可簡化為后面的式子。這樣,我們把關注點放在σ'(z)上面。σ(z)是激活函數,該激活函數為sigmoid函數,圖像如下:
從上面這幅圖片可以看出,當神經元的輸出接近1時,函數的波形非常的平緩,σ'(z)很小,根據公式(55)和公式(56)得知很小就意味着∂C/∂ω很小,也就是偏導數很小。梯度下降的就慢,自然會導致學習很慢。更重要的是這種情況不僅僅發生在上面的簡單的例子中,實際應用中也經常遇到。
那如何避免學習速度慢的情況?Cross-entropy是憑空出來的嗎?
通過前面的分析我們知道由於σ'(z)的存在,可能出現學習速度很慢的情況,有研究者就開始思考,既然σ'(z)對速度有影響,那能不能把σ'(z)去掉呢?
思考公式(55)和(56),如果去掉σ'(z),公式變成如下形式:
如果選擇一個代價函數使得該式子成立,那么當神經元的實際輸出a和期望輸出y之間差距越大,偏導數就越大,梯度下降就越快,學習速度也越大。研究者們以一種簡單的方式捕捉到一種直覺,即初始誤差越大,神經元學習的速度就越快,就消除了學習速度下降的問題。
由前面的鏈式法則
σ(z)為sigmod函數,σ'(z) = σ(z)(1-σ'(z)) = a(1-a),上式就變成
注:sigmoid函數求導過程https://www.cnblogs.com/xhslovecx/p/10817889.html
結合公式(71),暫時只考慮一個輸入,j=1。
對(75)求原函數
這是單個訓練示例對代價函數的貢獻。為了得到完整的代價函數,需要對訓練實例進行平均,得到
這里的常數是每個訓練例子中單個常數的平均值。
(77)就是cross-entropy損失函數的基本形式。因此cross-entropy並不是憑空產生的,它是用一種簡單而自然的方式發現的東西。
3、為什么cross-entropy可以作為損失函數?
那么思考,通過上面的方式獲得的方程C,是否真的可以作為損失函數?
公式(77)的兩個屬性使得cross-entropy可以作為損失函數。
其一:它是非負數,C>0;由於y和a均位於0~1之間,因此C的第一項ylna和第二項(1-y)ln(1-a)均為負數,乘上前面的負號,整個式子為非負數。
其二:如果神經元的實際輸出接近所有訓練輸入的期望輸出,則交叉熵將接近於零;如果y=0,
則
,a約等於0時,ln(1-a)約等於ln(1) = 0, C約等於0。同理,當y=1時,C=-lna/n, a約等於1,C約等於0。
因此,cross-entropy可以作為損失函數。
利用cross-entropy作為損失函數實現上面簡單的例子,
正如我們所希望的那樣, 這次神經元學得很快。仔細觀察,會發現Cost曲線的斜率最初比quadraticsun損失函數曲線上的初始平坦區域陡得多。這就是交叉熵給我們帶來的陡度,也就是當神經元出現嚴重錯誤的時候,cross-entropy會以相當快的速度學習。 跟quadraticsun損失w和b為2.0時相比較,cross-entropy簡直太優秀。
Cross-entropy代價函數是否完全可以替代quadratic代價函數,如果為否,則分別適用於什么場合?
當激活函數為sigmoid時,cross-entropy往往是較好的選擇。實際使用過程中,權重和偏差往往是隨機設定的,這樣很有可能帶來學習緩慢的情況。
當輸出層為線性神經元時,采用quadratic損失可能是一個更好的選擇。假設最后一層的神經元都為線性神經元,則sigmoid函數就不被應用了。輸出就變為a=z,而不是a=σ(z)。