今天,我想講一下梯度下降法(Gradient Descent),基於線性回歸損失函數的梯度下降法。
題圖已經非常清晰地表示什麼是梯度下降法。首先,橫軸是 weight(參數),豎軸是 Cost(損失值)。初始一個參數的開始位置,也就是圖右邊的一個大黑點,然後一步一步地往下移動,直到到達曲線底部的一個點,一般叫全局最優解,或者全局最小損失值。
下面,我來說明一下,那個大黑點是如何移動的。
圖一:
看圖一(1),還記得線性回歸方程(線性回歸模型)麼,簡單來說就是熟悉的 「y=kx+b」。只是「k」變成了「w」,指代「weight」;「b」還是自己,指代「bias」,偏差。
看圖一(2),要計算線性回歸方程與實際的(x,y)點是否吻合貼近,就要計算方程的「y」值與實際點「y」值的差值。所以,才有了損失函數(Loss Function)。而且為了求出方程與所有實際點的整體差距,於是把所有的差值開平方求和。因此,才有了對Loss Function求和匯總的損失函數(Cost Function)。
光求出損失函數值是不行的,還需要想辦法把損失函數值儘可能減少。只有不斷減少損失函數值,才能夠提高線性回歸模型「y=kx+b」的預測準確度。
看圖一(3),因此,需要每當求出損失函數後,對其進行求導數。大家都知道,求導數就是求斜率,知道了斜率就知道了函數值的變化方向。
因為,線性回歸模型中的每個參數都需要知道各自的「變化方向」,所以,需要求偏導數。如果不熟悉導數的概念,也沒關係。只需要知道這麼個理就行了,越複雜的模型越難求導,而且很多現有的材料已經給出正確的答案。
看圖一(4),求出導數值後就需要一個「學習率」(Learning Rate)推動損失函數值往下走。學習率一般用「α」來表示。線性回歸模型中的每個參數都會根據學習率與導數值的乘積進行「自我更新」。
圖二:
圖二類似吳恩達機器學習課程版本的梯度下降法表示。大家可以看出,梯度下降法的數學表達式寫法有很多種,但思路都一樣,只是數學符號不同而已。
圖三:
梯度下降法讓所有參數都得以更新,損失函數值朝著全局最優解的方向一步一步移動。在梯度下降的過程中,最經典的就是採用「Batch Gradient Descent」方法更新所有參數,這種方法雖然效率最低,但容易入門。
「Batch Gradient Descent」具體做法:
後面有機會會介紹在實際操作中,「Batch Gradient Descent」用得很少。例如,Sci-kit Learn (sklearn)開發框架默認就不是用它做梯度下降。
圖四:
有時候,不是每個模型都可以到達全局最優解(Global Minimum),也許會到達局部最優解(Local Minimum),例如神經網絡模型。所以,有時候面對這種「人工智障」的場景就需要多次隨機初始化參數值,做多次訓練,觀察損失函數值是否真的人為覺得「足夠小」。
圖五:
學習率設置太大會容易讓損失函數值「逃逸」,模型越學越不像話。但設置太小會讓訓練的過程很漫長,白白浪費計算機運算資源。
至此,三個概念都已經分別說明完畢了,其實機器學習無論怎麼變化都離不開這些基本的概念,就連深度學習也不例外。隨著機器學習的光速發展,模型越來越複雜,人工智慧可以解決的問題越來越多,而且解決得越來越好。我也會緊跟時代的步伐,不斷學習和分享學習成果。
Reference
一分鐘看完假設函數
三分鐘看完損失函數vs損失函數