第一篇 神經(jīng)網(wǎng)絡是如何實現(xiàn)的(三)
清華大學計算機系 馬少平
第三節(jié):神經(jīng)網(wǎng)絡是如何訓練的
小明聽艾博士介紹說,一個神經(jīng)網(wǎng)絡用不同的數(shù)據(jù)做訓練,就可以識別不同的東西,感到很神奇,十分好奇地對艾博士說:艾博士,請您說說神經(jīng)網(wǎng)絡究竟是怎么訓練的吧?
艾博士十分欣賞小明的好奇心,說道:好的,下面我們就開始介紹神經(jīng)網(wǎng)絡究竟是如何進行訓練的。小明,你先說說,你是如何認識動物的?
小明回答說:小時候,每當看到一個小動物時,媽媽就會告訴我這是什么動物,見得多了,慢慢地就認識這些小動物了。難道神經(jīng)網(wǎng)絡也是這么認識動物的嗎?
艾博士說:是的,神經(jīng)網(wǎng)絡也是通過一個個樣本認識動物的。人很聰明,見到一次貓,下次可能就認識這是貓了,但是神經(jīng)網(wǎng)絡有點笨,需要給他大量的樣本才可能訓練好。比如我們要建一個可以識別貓和狗兩種動物的神經(jīng)網(wǎng)絡,首先需要收集大量的貓和狗的照片,不同品種、不同大小、不同姿勢的照片都要收集,并標注好哪些照片是貓,哪些照片是狗,就像媽媽告訴你哪個是貓哪個是狗一樣。這是訓練一個神經(jīng)網(wǎng)絡的第一步,數(shù)據(jù)越多越好。其實我們人類有時候也會這么做,所謂的“熟讀唐詩三百首、不會作詩也會吟”,說的就是這個道理,所謂的見多識廣。
準備好數(shù)據(jù)之后,下一步就要進行訓練了。所謂訓練,就是調整神經(jīng)網(wǎng)絡的權重,使得當輸入一個貓的照片時,貓對應的輸出接近于1,狗對應的輸出接近于0,而當輸入一個狗的照片時,狗對應的輸出接近于1,貓對應的輸出接近于0。
小明:如何做到這一點呢?
艾博士接著對小明說:我們先來舉個例子。小明,你每天是不是要洗澡?洗澡時,你是怎么調節(jié)熱水器的溫度的?
小明不解地看著艾博士,心想我在問神經(jīng)網(wǎng)絡是怎么訓練的,怎么說起洗澡了?不知道艾博士這葫蘆里賣的什么藥。但既然艾博士問到了,只好回答說:這個很容易啊,熱水器上有兩個旋鈕閥門,一個調節(jié)熱水,一個調節(jié)冷水,如果感覺水熱了,就調大冷水,如果感覺水冷了,就調大熱水。
艾博士又問道:感覺水熱時也可以調小熱水,感覺水冷是也可以調小冷水,對不對?
小明一想也確實這樣,回答道:是的,有不同的調整方法,究竟調整哪個可能還需要看水量的大小。比如感覺水熱了,但是水量也很大,這時就可以調節(jié)熱水變小,如果水量不夠大,則可以調節(jié)冷水變大??傊鶕?jù)水溫和水量兩個因素進行調節(jié)。
艾博士見小明終于說到點子上了,在肯定了他的說法之后又說:其實還有個調節(jié)大小的問題,如果感覺水溫與自己的理想溫度差別比較大,就一次把閥門多調節(jié)一些,如果差別不大就少調節(jié)一些,經(jīng)過多次調整之后,就可以得到比較理想的水溫和水量了。
圖1.9 熱水器調節(jié)示意圖
圖1.10 熱水器可以表達為一個神經(jīng)網(wǎng)絡
艾博士對小明說:我們可以把熱水器抽象成圖1.10,你看看這是不是就是一個神經(jīng)網(wǎng)絡?
小明用手拍著自己的小腦瓜說:我終于明白了,這確實就是一個神經(jīng)網(wǎng)絡。兩個輸入是熱水和冷水,冷熱水的兩個閥門大小相當于權重,冷熱水匯合的地方就相當于加權求和,最后從蓮蓬頭出來的水相當于兩個輸出,一個是水溫,一個是水量。
那么調整冷熱水閥門的大小是不是就相當于訓練呢?小明歪著小腦瓜又問道。
艾博士回答說:正是這樣的。調整水閥門的時候可以向大調也可以向小調,這是調整的方向,也可以一次調整的多一些,也可以調整的小一些,這是調整量的大小,還有就是調整哪個閥門,或者兩個閥門都調整,但是大小和方向可能是不同的。
小明感慨到:沒想到,我們每天洗澡時調整洗澡水這么簡單的事情還有這么多的學問。那么這個思想如何用到訓練神經(jīng)網(wǎng)絡上呢?
艾博士說:小明,在回答如何訓練神經(jīng)網(wǎng)絡之前,我們先說說如何評價一個神經(jīng)網(wǎng)絡是否訓練好了,這與訓練神經(jīng)網(wǎng)絡是緊密相關的。在前面熱水器的例子中,什么情況下你會認為熱水器調節(jié)好了?
小明回答說:如果我覺得水溫和水量跟我希望的差不多,就認為調節(jié)好了。
艾博士說:沒錯。但是對于計算機來說,什么叫差不多呢?需要有個衡量標準。比如我們用
其中E是閥門大小的函數(shù),通過適當調節(jié)冷、熱水閥門的大小,就可以使得E取得比較小的值,當E比較小時,就認為熱水器調節(jié)好了。這里的“閥門”就相當于神經(jīng)網(wǎng)絡的權值w。
對于一個神經(jīng)網(wǎng)絡來說,我們假定有M個輸出,對于一個輸入樣本d,用
這是對于某一個樣本d的輸出誤差平方和,如果是對于所有的樣本呢?只要把所有樣本的輸出誤差平方和累加到一起即可,我們用E(w)表示:
這里的N表示樣本的總數(shù)。我們通常稱E(w)為損失函數(shù),當然還有其他形式的損失函數(shù),誤差平方和只是其中的一個。這里的w是一個由神經(jīng)網(wǎng)絡的所有權重組成的向量。神經(jīng)網(wǎng)絡的訓練問題,就是求得合適的權值,使得損失函數(shù)最小。
小明看著公式困惑地問到:艾博士,一個神經(jīng)網(wǎng)絡有那么多的權值,這可怎么求解啊?
艾博士回答說:這確實是一個復雜的最優(yōu)化問題。我們先從一個簡單的例子說起,假定函數(shù)f(θ)如圖1.11所示 ,該函數(shù)只有一個變量θ,我們想求它的最小值,怎么計算呢?
圖1.11 最小值求解示意圖
基本想法是,開始我們隨機地取一個
假設當前值為
如何計算
小明你看圖1.11,在圖的兩邊距離最小值比較遠的地方比較陡峭,而靠近最小值處則比較平緩,所以在沒有其他信息的情況下,有理由認為,越是陡峭的地方距離最小值就越遠,此處對
小明請你說說,如何度量曲線某處的陡峭程度呢?
小明很快地回答到:艾博士,我們學過函數(shù)的導數(shù),在某一點的導數(shù)就是曲線在該點切線的斜率,斜率的大小直接反應了該處的陡峭程度。是不是可以用導數(shù)值作為曲線在某點陡峭程度的度量呢?
艾博士說:小明真是一個善于思考的好孩子!導數(shù)確實反應了曲線在某點的陡峭程度。接下來的問題就是如何確定θ的修改方向,也就是θ是加大還是減小。
艾博士指著圖1.11問小明:在最小值兩邊的導數(shù)有什么特點呢?
小明想了想學過的高等數(shù)學知識,回答道:就像前面說過的,在某一點的導數(shù)就是曲線在該點切線的斜率,我們看圖1.11的左半部分,曲線的切線是從左上到右下的,其斜率也就是導數(shù)值是小于0的負數(shù),而在圖1.11的右半部分,曲線的切線是從左下到右上的,其斜率也就是導數(shù)值是大于0的正數(shù)。
艾博士接著小明的話說:左邊的導數(shù)值是負的,這時θ值應該加大,右邊的導數(shù)值是正的,這時θ值應該減小,這樣才能使得θ值向中間靠近,逐步接近f(θ)取值最小的地方。所以,θ的修改方向剛好與導數(shù)值的正負號相反。因此,我們可以這樣修改θi值:
其中
小明聽著艾博士的講解,興奮的說:這樣求最小值的問題就解決了吧?
艾博士回答說:還有一個問題,如果導數(shù)值比較大可能會使得修改量過大,錯過了最佳值,出現(xiàn)如圖1.12所示的“震蕩”,降低了求解效率。
圖1.12 當步長過大時可能會產生震蕩
小明摸了摸自己的頭問道:那可怎么辦呢?
艾博士說:一種簡單的處理辦法是對修改量乘以一個叫做步長的常量η,這是一個小于1的正數(shù),讓修改量人為地變小。也就是:
步長η需要選取一個合適的值,往往根據(jù)經(jīng)驗和實驗決定。也有一些自動選擇步長,甚至變步長的方法,我們今天先不講了,如果有興趣可以閱讀相關材料。
小明問艾博士:神經(jīng)網(wǎng)絡也是這樣訓練的嗎?
艾博士說:基本原理是一樣的。小明你還記得訓練神經(jīng)網(wǎng)絡我們要優(yōu)化的目標嗎?
小明回答說:記得啊,就是求誤差平方和的最小值,也就是前面講過的損失函數(shù)E(w)的最小值。
艾博士說:我們可以用同樣的方法求解E(w)的最小值,所不同的是E(w)是一個多變量函數(shù),所有的權重都是變量,都要求解,每個權重的修改方式與前面講的θ的修改方式是一樣的,只是導數(shù)要用偏導數(shù)代替。如果用wi表示某個權重的話,則采用下式對權重
其中
所以對所有w的修改,可以用梯度表示為:
這里的
小明看著梯度符號問艾博士:艾博士,這里的梯度物理含義是什么呢?
艾博士回答說:如同只有一個變量時的導數(shù)表示函數(shù)曲線在某個點處的陡峭程度一樣,梯度反應的是多維空間中一個曲面在某點的陡峭程度。就如同我們下山時,每次都選擇我們當前站的位置最陡峭的方向一樣。所以這種求解函數(shù)最小值的方法又稱作梯度下降算法。
小明又問道:艾博士,這樣看來,要訓練神經(jīng)網(wǎng)絡,主要問題就是如何計算梯度了?
艾博士回答說:確實是這樣的。對于神經(jīng)網(wǎng)絡來說,由于包含很多在不同層的神經(jīng)元,計算梯度還是有些復雜的。在計算時,也分三種情況,一種是這里所說的標準梯度下降方法。在計算梯度時要用到所有的訓練樣本,一般來說訓練樣本量是很大的,每更新一次權重都要計算所有樣本的輸出,計算量會比較大。另一種極端的方法是,對每個樣本都計算一次梯度,然后更新一次權重,這種方法稱為隨機梯度下降。由于每個樣本都調整一次w的值,所以計算速度會比較快,一般情況下可以比較快地得到一個還不錯的結果。在使用這個方法時,要求訓練樣本要隨機排列,比如訓練一個識別貓和狗的神經(jīng)網(wǎng)絡,不能前面都用貓訓練,后面都用狗訓練,而是貓和狗隨機交錯地使用,這樣才可能得到一個比較好的結果。這也是隨機梯度下降算法這一名稱的由來。
小明:這倒是一個比較好的方法,但是這樣一次只用一個樣本是否會存在問題呢?
艾博士:確實存在問題。隨機梯度下降方法在訓練的開始階段可能下降的比較快,但在后期,尤其是接近最小值時,可能效果并不好,畢竟梯度是由一個樣本計算得到的,并不能代表所有樣本的梯度方向。另外就是可能有個別不好的樣本,甚至標注錯了的樣本,會對結果產生比較大的影響。
說到這里艾博士又問小明:小明,我們說了兩種情況,一種是一次用上全部樣本,一種是一次只用一個樣本,你想想是否可以有折中的辦法呢?
小明歪著小腦瓜回答說:折中的辦法么……,既不是用全部,也不是用一個,那就是一次用一部分了?
艾博士高興地看著小明說:是的,介于上述兩種方法之間的一種方法是每次用一小部分樣本計算梯度,修改權重w的值。這種方法稱作小批量梯度下降算法,是目前用的最多的方法。
小明說:知道了這三種方法,但是還是不知道梯度如何計算啊?
艾博士說:小明你別著急,我們馬上就講梯度的計算方法。其實以上三種方法只是計算時用的樣本量有所不同,梯度的計算方法是差不多的,為了簡單起見,我們以隨機梯度下降算法為例說明,很容易推廣到梯度下降算法或者小批量梯度下降算法。
下面我們以隨機梯度下降算法為例給出具體的算法描述,想了解如何得到這個算法的話,請參考有關材料。
利用隨機梯度下降算法訓練神經(jīng)網(wǎng)絡,就是求下式的最小值:
其中d為給定的樣本,M是輸出層神經(jīng)元的個數(shù),
為了敘述方便,對于神經(jīng)網(wǎng)絡中的任意一個神經(jīng)元j,我們約定如下符號:神經(jīng)元j的第i個輸入為
算法 隨機梯度下降算法:
1、神經(jīng)網(wǎng)絡的所有權值賦值一個比較小的隨機值如[-0.05, 0.05]
2、在滿足結束條件前:
3、 對于每個訓練樣本
4、 把樣本輸入神經(jīng)網(wǎng)絡,從輸入層到輸出層,計算每個神經(jīng)元的輸出
5、 對于輸出層神經(jīng)元k,計算誤差項:
6、對于隱含層神經(jīng)元h,計算誤差項:
7、更新每個權值:
其中算法第二行的結束條件,可以設定為所有樣本中最大的
小明指著算法第6行問艾博士:這里公式中的“
艾博士解釋說:h是隱含層的神經(jīng)元,它的輸出會連接到它的下一層神經(jīng)元中,“后續(xù)(h)”指的是所有的以h的輸出作為輸入的神經(jīng)元,對于全連接神經(jīng)網(wǎng)絡來說,就是h所在層的下一層的所有神經(jīng)元。
第6行公式中:
就是用h的每個后續(xù)神經(jīng)元的誤差項
小明弄清楚了這些符號的意義后又問艾博士:艾博士,這個算法看起來像是從輸出層開始,先計算輸出層每個神經(jīng)元的
圖1.14 BP算法計算過程示意圖
艾博士說:小明分析的非常正確。當給定一個訓練樣本后,先是利用當前的權重從輸入向輸出方向計算每個神經(jīng)元的輸出值,然后再從輸出層開始反向計算每個神經(jīng)元的δ值,從而對每個神經(jīng)元的權重進行更新。如圖1.14所示。正是由于采用這樣一種反向一層層向前推進的計算過程,所以它有個名稱叫“反向傳播算法”,簡稱BP(Backpropagation Algorithm)算法。該算法也是神經(jīng)網(wǎng)絡訓練的基本算法,不只是可以訓練全連接神經(jīng)網(wǎng)絡,到目前為止的任何神經(jīng)網(wǎng)絡都是采用這個算法,只是根據(jù)神經(jīng)網(wǎng)絡的結構不同,具體計算上有所差別。
艾博士又強調說:前面介紹的隨機梯度算法中的具體計算方法,是在損失函數(shù)采用誤差平方和,并且激活函數(shù)采用sigmoid函數(shù)這種特殊情況下推導出來的,如果用其他的損失函數(shù),或者用其他的激活函數(shù),其具體的計算方法都會有所改變,這一點一定要注意。
聽到這里,小明問道:我已經(jīng)知道有多種不同的激活函數(shù),但是還有其他的損失函數(shù)嗎?
艾博士回答說:還有一種常用的損失函數(shù)叫交叉熵損失函數(shù),其表達式如下:
這是對于一個樣本d的損失函數(shù),如果是對于所有的樣本,則為:
其中
小明看著公式不明白地問到:交叉熵損失函數(shù)有什么具體的物理含義嗎?
艾博士反問小明:你還記得我們前面以貓、狗識別舉例時,神經(jīng)網(wǎng)絡的希望輸出是什么樣子嗎?
小明想了想回答道:一個輸出代表貓,一個輸出代表狗。當輸入為貓時,代表貓的輸出希望為1,另一個希望為0,而當輸入為狗時,則是代表狗的輸出希望為1,另一個希望為0。
艾博士說:對。這里的希望輸出1或者0,可以認為就是概率值。
小明問到:我們如何在神經(jīng)網(wǎng)絡輸出層獲得一個概率呢?
艾博士:如果在輸出層獲得概率值,需要滿足概率的兩個主要屬性,一個是取值在0和1之間,另一個是所有輸出累加和為1。為此需要用到一個名為softmax的激活函數(shù)。該激活函數(shù)與我們介紹過的只作用于一個神經(jīng)元的激活函數(shù)不同,softmax作用在輸出層的所有神經(jīng)元上。
設
很容易驗證這樣的輸出值可以滿足概率的兩個屬性。這樣我們就可以將神經(jīng)網(wǎng)絡的輸出當作概率使用了,后面我們會看到這種用法非常普遍。
艾博士繼續(xù)講解說:我們再回到你問的交叉熵損失函數(shù)的物理意義這個問題上來。從概率的角度來說,我們就是希望與輸入對應的輸出概率比較大,而其他輸出概率比較小。對于一個分類問題,當輸入樣本給定時,M個希望輸出中只有一個為1,其他均為0,所以這時的交叉熵中求和部分實際上只有一項不為0,其他項均為0,所以:
我們求
小明:原來是這個含義啊,我明白了。那么誤差平方和損失函數(shù)和交叉熵損失函數(shù)各有什么用處呢?
艾博士:小明你這個問題問的非常好。從上面的分析看,交叉熵損失函數(shù)更適合于分類問題,直接優(yōu)化輸出的概率值。而誤差平方和損失函數(shù)比較適合于預測問題。
小明不明白什么是預測問題,馬上問道:艾博士,什么是預測問題呢?
艾博士舉例說:如果輸出是預測某個具有具體大小的數(shù)值,就是預測問題。比如說,我們根據(jù)今天的天氣情況,預測明天的最高氣溫,就屬于預測問題,因為我們預測的是氣溫的具體數(shù)值。
經(jīng)過艾博士的認真講解,小明終于明白了什么是神經(jīng)網(wǎng)絡,以及神經(jīng)網(wǎng)絡的訓練方法,跟艾博士道別后,帶著滿滿的收獲回家了。
小明讀書筆記
神經(jīng)網(wǎng)絡通過優(yōu)化損失函數(shù)最小進行訓練,損失函數(shù)有誤差的平方和、交叉熵等損失函數(shù)。不同的損失函數(shù)應用于不同的應用場景,誤差的平方和損失函數(shù)一般用于求解預測問題,交叉熵損失函數(shù)一般用于求解分類問題。
BP算法是神經(jīng)網(wǎng)絡常用的優(yōu)化方法,來源于梯度下降算法。其特點是給出了一種反向傳播計算誤差的方法,從輸出層開始,一層一層地計算誤差,以便實現(xiàn)對權重的更新。
一次只使用一個樣本的BP算法稱為隨機梯度下降算法,而一次使用若干個樣本的BP算法稱為批量梯度下降算法。批量梯度下降算法是更常用的神經(jīng)網(wǎng)絡優(yōu)化算法。
BP算法是一個迭代過程,反復使用訓練集中的樣本對神經(jīng)網(wǎng)絡進行訓練。訓練集中的全部樣本被使用一次稱為一個輪次,一般需要多個輪次才能完成神經(jīng)網(wǎng)絡的訓練。
聯(lián)系客服