倒數兩天,總覺得依循著別人的脈絡(Coursera)寫文章有點彆扭,但是若要自己根據一項主題去分章節介紹,或許需要花更多時間去編排。總而言之,雖然跌跌撞撞,至少剩兩天,今天把gradient descent講完,明天做總回顧+牢騷。
針對不同的最佳化問題,有許多最佳化的技巧,甚至有些模型(Lazy Learning Model)不需要進行最佳化,今天主要專注於介紹目前在機器學習領域最泛用(容易懂)的一種方法,Gradient-Based Optimization.
梯度下降法(Gradient Descent Method)也有人稱最陡下降法(Steepest Descent Method),此方法是所謂 Gradient-Based Optimization中最經典的方法,也是一切的核心。
1.梯度是什麼呢?
一般定義就是對函數進行向量微分 所得到的向量。
2.為什麼梯度的反方向是下降最快的方向?
從多變數函數微分的定義出發,可以利用方向導數的公式與內積去推得梯度就是函數在該點變化量最大的方向,因此,其反方向就會式下降最快的方向。
3.真的會收斂到函數最小值(參數最佳解)嗎?
利用一階泰勒去分析,在取得合適的步長之下,每次迭代都能確保函數值下降,當函數最小值存在時(Local or Global),該點的梯度的數值會是0,因此,最終會收斂到最小值而停止。
4.可以用二階泰勒嗎?
可以,那樣就能推出牛頓法。
5.SGD(Stochastic Gradient Descent)和GD有什麼差別?
前面提到的都是Gradient descent,針對的是固定的目標函數進行最佳化,在機器學習中代表著針對相同的資料進行分類與度量,什麼意思呢?如果今天有十筆資料,那麼就是根據預測完這十筆後的結果,進行loss function的度量得到的目標函數進行最佳化。但如果是十億筆資料,就必須將十億筆資料都進行預測後,才能最佳化。這件事情聽起來似乎不那麼可行,無論是從儲存空間或運算效能來看,都會耗費大量時間,卻只進行了一次的更新迭代。因此,SGD的方法出現,每次只看一筆資料就進行迭代,這樣就算有十億筆資料,每次的迭代卻不會因為資料量的大小而變得笨重。然而,這也意味著每次最佳化的目標函數都不同,許多最佳化中美好的性質都無法確保,對於最佳解的收斂性也無法被很好保證(只能以sublinear的收斂速度機率收斂)。但在trade-off後,這項解決方案在巨量資料的背景中,的確能夠達到非常好的表現。