1. 程式人生 > >【吳恩達機器學習筆記】005 梯度下降(Gradient Descent)

【吳恩達機器學習筆記】005 梯度下降(Gradient Descent)

一、引入

        在前幾節課我們講到,我們希望能夠找到曲線擬合效果最好的線條,這樣的線條的誤差最小,所以就轉化成了下面這幅圖所表達的內容。

        我們有一些函式,這些函式會有n個引數,我們希望能得到這個函式的最小值,為了方便計算,我們從最簡單的入手,讓引數的個數僅有兩個。對於這個函式,我們會給定初始的引數θ0和θ1,不斷改變他們的值,從而改變函式值,直到我們找到我們希望的函式的最小值。所以,我們引入梯度下降演算法。

二、什麼是梯度?

        在微積分裡面,對多元函式的引數求∂偏導數,把求得的各個引數的偏導數以向量的形式寫出來,就是梯度。比如函式f(x,y), 分別對x,y求偏導數,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T

,簡稱grad f(x,y)或者▽f(x,y)。對於在點(x0,y0)的具體梯度向量就是(∂f/∂x0, ∂f/∂y0)T.或者▽f(x0,y0),如果是3個引數的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此類推。

        那麼這個梯度向量求出來有什麼意義呢?他的意義從幾何意義上講,就是函式變化增加最快的地方。具體來說,對於函式f(x,y),在點(x0,y0),沿著梯度向量的方向就是(∂f/∂x0, ∂f/∂y0)T的方向是f(x,y)增加最快的地方。或者說,沿著梯度向量的方向,更加容易找到函式的最大值。反過來說,沿著梯度向量相反的方向,也就是 -(∂f/∂x0, ∂f/∂y0)T的方向,梯度減少最快,也就是更加容易找到函式的最小值。

三、梯度上升與梯度下降

        在機器學習演算法中,在最小化損失函式時,可以通過梯度下降法來一步步的迭代求解,得到最小化的損失函式,和模型引數值。反過來,如果我們需要求解損失函式的最大值,這時就需要用梯度上升法來迭代了。

        梯度下降法和梯度上升法是可以互相轉化的。比如我們需要求解損失函式f(θ)的最小值,這時我們需要用梯度下降法來迭代求解。但是實際上,我們可以反過來求解損失函式 -f(θ)的最大值,這時梯度上升法就派上用場了。

四、梯度下降演算法理解

        下面這幅圖,可以看做兩座高山,我們希望能以最快的速度下山,那我們每一步需要朝向什麼方向呢?假設我們從圖上“+”位置開始下山,我們假定第二幅圖中的方向就是下山最快的方向,那達到第二個位置的時候,相當於處在一個新起點,我們會照著第一步的方法,再選擇一個新的我們認為最好的方向走第二步,如下面第三幅圖所示。我們照著這種方式,一步一步走下去,直到山腳。也就是在圖中,不管從哪個位置開始,每走到一個位置,就需要判斷,找到最好的位置走第二步。而這種找最好位置的方法就是梯度下降演算法。即每到一個位置,求解當前位置的梯度,沿著梯度的負方向(影象上當前最陡峭的位置)向下走一步,然後繼續求解當前位置梯度,向這一步所在位置沿著最陡峭的位置走一步。這樣一步步的走下去,一直走到覺得我們已經到了影象的區域性最低點。(注:區域性最低點不一定是整個資料集的最低點)。

       

        因為走到的是區域性最低點,不是整體最低點,所以梯度下降不一定能夠找到全域性的最優解,有可能是一個區域性最優解。而且,相近的起點,可能最終的結果也有很大差別。比如下圖,雖然起點與上面情況起點相差很少,但是通過下降梯度演算法,最終的位置卻到了另外一個區域性最低點。

      

五、梯度下降演算法定義

        上面這個公式就是梯度下降的演算法,那這個演算法表達的是什麼含義呢?

        首先,給出所有的符號的定義,便於大家理解:

            :=   :  這個符號是賦值符號;

            =    : 這個符號是等於符號;

            α    : 這個符號是下降速率(learning rate),它控制我們用多大的幅度來更新θj。例如在下山的例子中,它控制下山的速率;

             要注意的是,這裡的等於和賦值與C++等程式語言是不同的,以C++為例,=表示賦值,==表示等於。

在橫線的下面,寫了一個Correct:Simultaneous update(正確的:同時更新),這個是什麼意思呢?大家對比一下下面兩組公式,一個是正確的,一個是不正確的。

       

        我們能發現,區別在於,前面的θ0和θ1是同時更新的,然後在做迭代,而後面的是先求出θ0,然後求θ1,為什麼必須要同時更新呢?

        我自己的理解是: 迭代時, θ0和θ1是需要上一組的θ0和θ1,θ0和θ1是一組,即不可分的,同一組的θ0和θ1是由上一組的θ0和θ1生成的,相鄰兩組之間的θ0和θ1不能構成另一個θ0或θ1。

        所以我們要記住一句話:梯度下降,必須要同步更新;不同步更新,不是梯度下降演算法。

        我們再簡化一下,假設只有一個引數θ1,並且假設影象如下圖所示。

        那我們能從影象看出最低點的位置,計算機怎麼更加精確地找到呢?假設θ1從最低點的右側開始對影象進行初始化,函式的導數大於0,α是速率,大於0,這個時候,新的θ1小於上一個θ1。

        同理,如果θ1從最低點的左側開始對影象進行初始化,函式的導數小於0,α是速率,大於0,這個時候,新的θ1大於上一個θ1。 當然,如果恰好θ1就是最小值,那這個時候,導數等於0,θ1的值就不會變了。

        那麼,會不會出現一種情況,當初始化的值不為最小值時,進行梯度下降處理後到了最小值的另一邊呢?答案是肯定的,因為α的值沒有限制,所以在取值時要注意。如果α的值過小,下降速率會很慢,就像下面左邊的圖一樣。當然,如果α的值太大,就會出現右圖的情況,最後無法收斂,離最小值越來越遠。


六、舉例

        假設上圖是我們經過試驗計算得到的代價函式。我們從圖上的θ1點(圖中最右上角的點)開始做梯度下降。當α的值比較恰當(不會過大或過小),會得到下圖,第一次做梯度下降時,函式影象比較陡,導數值比較大,下降的比較快,第二次做梯度下降時,影象較第一次更加平緩,導數值變小,下降速度變慢,繼續做梯度下降,直到收斂到最低點,最終得到最優解。