gradient descent 梯度下降算法

            今天給大家介紹一個machine learning中非常基礎又非常重要的算法:gradient descent 梯度下降算法。其實在寫這篇文章之前,我前面的文章中就有提到gradient descent,它實在是太“氾濫”了,幾乎到處都能看到它的身影。那麼,它到底是什麼?能幹什麼?它是一種優化算法,在machine learning中經常用來優化目標函數,那什麼是目標函數?目標函數根據問題的不同而不同,大家可以看我的另外兩篇文章,裏面就用到在gradient descent優化目標函數,大家可以看看裏面的目標函數是什麼,這兩篇文章是BP神經網絡推薦系統之矩陣分解

       這裏就給大家舉個稍微簡單一點的例子,假設有一堆男生女生的身高體重數據(training set),假一條是身高體重數據,x1是身高,x2是體重,y是類標號,y=1表示這條數據是男生的,y=-1表示這條數據是女生的。我們希望能學習出一個函數f(X),使得f(X)能夠儘可能準確地描述這些數據,如果能求出這個f(X),那麼任給一個身高體重,就能預測出這人是男生還是女生。

       那麼f(X)長什麼樣?它的形式需要我們來指定,gradient descent只幫我們訓練出其中的參數。爲了方便講解,我設f(X)爲下面的形式,也就是一個線性的函數(一般來說,非線性的要比線性的函數的擬合能力要強,這裏暫不討論線性與非線性的問題):


       我們希望f(X)能夠儘可能準確地描述training set中的樣本,那麼如何衡量它描述得準確不準確?那就要定義誤差,而定義誤差就要和類標號聯繫起來,因爲我們的類標號是y=1表示這條數據是男生的,y=-1表示這條數據是女生的,因此我們希望f(X)對男生的數據輸出的值儘量接近1,對女生的數據輸出的值儘量接近-1。於是就能計算誤差了,對於

男生的數據,誤差就是f(X)算出來的值與1的差距,對於女生的數據,誤差就是f(X)算出來的值與-1的差距,注意這裏的差距,大於或小於都是差距。於是對於一個training set,總的誤差函數(cost function)可以定義如下:


       Xi是第i的樣本,Yi是第i個樣本對應的類標號,在這裏就是1或者-1,因爲大於或小於類標號都是誤差,而誤差是非負的,因此加個平方就可以達到這個效果。但是爲什麼前面有個1/2呢?回想,梯度下降,那肯定要用到梯度,而求梯度是不是要求導呢?那個1/2可以在後面求導的時候把平方的那個2給消掉,方便後續計算。

       好了,現在有了cost function,那麼我們下一步的目標就是,求出一最優的參數,使得cost最小,也就是求當取什麼值時,cost最小。那麼怎麼求呢?大家是否還記得“梯度”這個東西?一個在當時學高等數學的時候看似沒用的東西,在這裏卻有極大的作用,還記得梯度是什麼東西嗎?梯度是一個向量梯度所指的方向就是函數增長最快的方向,也就是說,如果我們沿着梯度的方向調整參數(注意在cost function中,自變量是參數,而不是x),就可以使我們的cost變化得最快。但是梯度所指的方向就是函數增長最快的方向,而我們是需要cost減少而不是增加,這怎麼辦呢?取反方向就好了,也就是說,梯度的反方向指向的就是函數值下降最快的方向,因此沿着梯度的反方向調整參數,就能讓cost function以最快的速度下降。我們來求L的梯度,那麼就要對求偏導:




       接下來讓參數沿着梯度方向走,也就是每個分量沿着對應的梯度反方向的分量走,因此參數在每次迭代的更新規則如下:

        其中是學習率(learning rate),一般取值爲0到1之間,它可以控制每步走的大小,走得太大的話,有可能走到臨近極佳點時,下一步就跨過去了,這樣就不收斂了,走得太慢的話,會迭代很多次才收斂。實際上,learning rate的選擇也是有專門研究的,這裏就不討論這個問題啦。

        經過多次迭代之後,我們就得到了的最優值,也就是在這些個參數下,f(X)對於training set的樣本的識別誤差最小。這樣,我們就訓練出了f(X),就可以用來識別新的樣本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章