機器學習-反向傳播算法

本文試圖探討反向傳播算法,但只關注思想和原理,尋求一個直觀感性的認識。所以,文中所舉的例子、使用的公式都力圖簡單。

簡,就意味著會損失細節、不夠全面。如果對反向傳播算法已經有所涉及,希望全面、深入瞭解的童鞋可以繞道,以免浪費時間。

一、付出與收穫

詩《憫農》中有這麼兩句:

春種一粒粟,秋收萬顆子。

問:如果一個農夫春天種下10粒種子,那麼他秋天能收多少糧食?

因為一顆對一萬顆,所以10顆種子收穫的糧食為:

機器學習-反向傳播算法

顆。

這是通常的做法兒,從機器學習的角度又該怎麼解答呢?

首先建立一個模型。

假設種下x粒種子,可以收穫y顆糧食。付出與收穫成正比,比例因子為ω。於是得出學習模型如下:

機器學習-反向傳播算法

於是,問題就轉化為,用該模型預測當種下:

機器學習-反向傳播算法

顆種子時,可以收穫的糧食數:

機器學習-反向傳播算法

問題的關鍵是確定參數ω。

ω可以通過訓練來確定,也就是所謂的機器學習。但要訓練參數,首先要有訓練數據。

從已知條件“春種一粒粟,秋收萬顆子”中,可以提煉出一組訓練數據:

機器學習-反向傳播算法

有了模型,有了數據,就可以開始訓練了。

問題是訓練什麼?怎麼訓?

訓練的目的是確定未知參數ω,依據是預測和目標趨於一致。

預測值:

機器學習-反向傳播算法

目標值:

機器學習-反向傳播算法

我們把預測值和目標值的偏差:

機器學習-反向傳播算法

定義為損失函數。

訓練的目標就轉化為:

機器學習-反向傳播算法

首先,給ω一個初值:

機器學習-反向傳播算法

偏差為:

機器學習-反向傳播算法

為了使偏差趨於0,該如何調ω呢,調大還是調小?

調整之前,先分析一下,ω參數對損失函數:

機器學習-反向傳播算法

的影響。

對損失函數求導:

機器學習-反向傳播算法

也就是說,ω和損失函數E(ω)的變化趨勢相反。ω增加,E(ω)減小,ω減小,E(ω)也增加。並且增加或減小的量和E'(ω)相關。

可以看出來,導數值的符號反應了損失函數上升的方向,導數值的大小反應了上升得速率。

例如,這裡的-1。符號為負,表示ω往負方向走,損失函數增加。值為1,表示ω走1單位,損失函數也增加1個單位。

如果將導數看成一個矢量,它反映的就是損失函數的上升速度。

由於我們的目標是要損失函數下降,和導數正好相反,所以就可以用負導數的方向作為參數調整的方向,導數值乘以一個係數作為參數調整的大小,公式表示如下:

機器學習-反向傳播算法

由於這裡討論的是一維空間,導數和梯度相等,高於一維的空間用的實際是梯度。

所以這種調參的策略又叫梯度下降法。

有了梯度下降公式,設η=1,有:

機器學習-反向傳播算法

偏差為:

機器學習-反向傳播算法

繼續重複以上過程,直至:

機器學習-反向傳播算法

偏差為:

機器學習-反向傳播算法

得到參數:

機器學習-反向傳播算法

訓練結束。

將訓練得到的參數值:

機器學習-反向傳播算法

帶入模型:

機器學習-反向傳播算法

得到確定的模型:

機器學習-反向傳播算法

將:

機器學習-反向傳播算法

帶入模型,得到預測值:

機器學習-反向傳播算法

問題得解。

二、例子總結

通過上面的例子,對機器學習解決問題的過程算是有一個大致的瞭解。無非就是:

  1. 創建模型;
  2. 學習參數;
  3. 預測結果;

模型的創建要視具體的問題而定,不同的問題可能需要設計不同的模型。對模型的要求是對問題有足夠的描述能力,也就是說能夠反應訓練數據輸入輸出的因果關係。

這就好比學開車,首先要確定你四肢是不是健全,眼睛是不是色盲。目的就是看你是不是具備操作方向盤、油門、離合以及分辨紅綠燈的能力。只有這些能力都具備了,你才能駕馭開車這件事兒。

但是,能力只是前提條件,要想會做,還要學習。對於模型來說,就是調整參數,使訓練數據的輸入和輸出一一對應。對於學車來說就是根據不同的路況,執行不同的駕駛動作。其本質也是輸入輸出相互對應。比如,遇到紅燈,要踩剎車停車等待。紅燈信號就是輸入,踩剎車的動作就是輸出。

所以,學習的實質就是建立因果關係。輸入特定的因,輸出對應的果。

那如何學習呢?和標準因果比對。

對於學車來說,紅燈和剎車就是標準因果。看到紅燈踩剎車就是正確操作。如果看到紅燈你踩了油門,和標準不一致,那就錯了。你需要反覆比對、調整,直至正確的因果關係建立,學習也就完成了。

對於機器學習來說,訓練數據就是標準因果。輸入數據是標準因,輸出數據是標準果。

學習的過程就是給模型輸入標準因,拿輸出跟標準果進行比對,如果不一致則調整參數,如此反覆,直至和標準果相同或足夠接近。

學習結束以後,參數固定下來,模型就具備了預測能力,能夠用於處理類似的問題。就好比,一旦紅燈和剎車在你腦海裡建立了聯繫,不管是在北京還是上海,廣州還是深圳,只要是紅燈的場景,你都會採取同樣的剎車動作,因為你已經具備了處理這類問題的能力。

學習好的機器模型也同樣就具備了某種能力,可以自動的處理某一類問題。

三、梯度下降算法

前面舉了只有一個參數的模型,主要用於說明機器學習的過程和原理。而在實際的應用中,參數通常會有很多。ω不再是一個單純的數,而是一個多維的向量,輸入輸出也是。

此時的模型可以用:

機器學習-反向傳播算法

來表示。其中y、ω、x都是多維向量。

機器學習-反向傳播算法

但不管模型如何複雜,參數如何多,學習的方法基本一樣。都是通過預測值和標準值的偏差來調整參數。

偏差的大小跟參數ω有關,是ω的函數,如下:

機器學習-反向傳播算法

參數雖然多,但不用害怕,我們採用分而治之的策略將其簡化。

首先,假設只有一個參數​,其它的保持不變。根據我們開頭付出與收穫的例子,可以得到參數調整如下:

機器學習-反向傳播算法

而其它參數不變,只對其中一個求導,又叫偏導,可以用下式表示:

機器學習-反向傳播算法

依次類推可以得到所有參數的調整策略:

機器學習-反向傳播算法

所有參數的偏導數放到一塊兒:

機器學習-反向傳播算法

叫梯度,它指向損失函數上升最快的方向。

所以參數的調整策略就可以統一到一個公式表示:

機器學習-反向傳播算法

這就是梯度下降算法。

它的效果直觀看起來是這樣的:

機器學習-反向傳播算法

四、反向傳播算法

反向傳播算法主要用於神經網絡。神經網絡沒有什麼神秘的,也無非就是眾多學習模型中的一類。

但這類模型有一個特點,就是傻瓜化。基本上不用費太多的神思去設計模型,只需要根據問題的規模增刪網絡節點和層數,總能滿足你的要求。

因為已經有人證明過,只要規模夠大,神經網絡基本可以擬合任何你可以想出來的函數。就像信號處理界的傅里葉變換。

但不好的是,參數特別多,學習起來比較耗時費力。

所以,你需要的就是大量的訓練數據,加上強大的計算機處理能力。剩下的就可以交給時間。

好在現在的計算機處理能力有了大幅度的提升,互聯網上的數據也呈爆炸式的增長,這也是當前神經網絡比較有效的重要原因。

言歸正傳,繼續反向傳播算法。

前面說過,不管再複雜的系統,再多的參數。學習的根本大法不變,比較、調參,比較、調參,直到滿意的結果為止。調參的策略就是梯度下降。神經網絡也不例外。

那既然這樣,反向傳播算法又是個什麼東東?

我們知道,梯度下降需要求偏導。這對簡單的模型不算什麼,可如果是成百上千層,有千萬甚至上億參數的神經網絡呢?能計算得出來嗎?即使能計算得出來,一個一個算,得算到什麼時候?

反向傳播算法算法解決的就是如何快速求偏導的問題。

本著複雜問題簡單化的指導思想,舉一個簡單的例子。

有這麼一個簡單的神經網絡:

機器學習-反向傳播算法

其中:

機器學習-反向傳播算法

偏差:

機器學習-反向傳播算法

為了訓練這個神經網絡,得出各個ω參數的值,需要最小化這個偏差。可以採用梯度下降算法來做,如下:

機器學習-反向傳播算法

問題的關鍵是求偏差函數的梯度。也就是求各個參數的偏導數。首先看第一個參數:

機器學習-反向傳播算法

一臉懵,不知道從何下手。

沒關係,先從網絡結構上理一下各個量之間的關係:

機器學習-反向傳播算法

求偏導:

機器學習-反向傳播算法

對比偏導結果和神經網絡結構圖,是不是發現了什麼規律?

每個參數的偏導數只跟正向傳播的輸入和輸出路徑上的參數有關。如果由後往前看,偏導數好像是順著路徑在反向傳播一樣。

這樣,對於一個神經網絡,只要知道每個節點的正向傳播輸入,以及由後到前到達該節點的路徑上的參數就可以得到該節點的參數的偏導數。

利用神經網絡的這種規律計算梯度的算法就叫做反向傳播算法。

所以,反向傳播算法不是獨立的優化算法,它要結合著梯度下降算法來用。是計算梯度下降的算法。

為什麼參數的偏導數會有這種特點?

其實,結合神經網絡的結構,就會發現其實不難理解。

偏導數的含義是,單個參數的變化對整體結果的影響。

由於整個神經網絡的通路上的參數是相乘的關係。參數變化首先會作用於輸入,然後沿著路徑向後傳播,每過一個節點都會被放大或縮小,放大或縮小的倍數是跟節點的參數有關的。所以最終反應到整體結果上就是輸入和路徑參數的連乘了。

五、題外

知道了反向傳播和偏導數的特點,一些相關的術語也就很容易理解了。

比如,梯度消失和梯度爆炸。

如果神經網絡的層數比較多,每一層上的參數都小於1,那麼由反向傳播算法可知,由後向前經過一些層以後,由於偏導是連乘的結果,就會導致前面一些層的偏導趨於0,參數得不到學習,到達不了理想的目標點。這就是梯度消失。

梯度爆炸正好相反,如果每一層的參數都大於1,連乘以後層層放大,導致偏導過大,從而跳過目標點。

不管是梯度消失還是梯度爆炸,對機器學習都是不利的。

這也是為什麼目前的神經網絡中,激活函Sigmoid被ReLU取代的原因。

下圖左側是Sigmoid原函數,右側是其導數。可以看出來,即使是最大值也才0.25,所以放到神經網絡路徑上極易造成梯度消失。

機器學習-反向傳播算法

下圖是ReLU函數,可以看出來,當函數值大於0時,其導數恆為1,連乘後也不會縮小或放大,有效的避免了梯度消失和爆炸。

機器學習-反向傳播算法

學習率。

在我們的參數調整策略公式中:

機器學習-反向傳播算法

參數η就叫學習率。

學習率的大小對學習過程的影響很大。如果設的太小就會導致學習速度太慢,加長學習時間。如果設的太大,導致震盪,或發散,影響最終效果。

機器學習-反向傳播算法

(本文部分圖片來自於網絡,如有侵權請聯繫作者刪除)


分享到:


相關文章: