梯度下降?梯度上升?梯度提升?

最近被這三個詞搞蒙了。原本沒覺得它們有多難區分,但真要向一個人解釋清類似“爲何要有梯度提升”這類問題,似乎還是很吃力,從而發現自己其實並沒有完全理解其中的含義。

 

也許根本就不存在什麼“梯度上升”,只有“梯度提升”罷,但我覺得,至少在中文環境裏,大家越發的喜歡無意識地將這兩個詞分別開來,從而這兩個詞逐漸顯示出不同的含義。下面我就簡單介紹一下他們之間的差別吧。

 

首先,梯度下降

梯度下降應該是機器學習入門第一課水平的知識,我這裏當然不是來做無謂掃盲的,畢竟這樣的帖子太多了。我只是想說,爲何會存在“梯度下降”。對於高中時代的我們,求一個一元二次函數極值的好方法,就是求導,然後令導數爲0。但在機器學習損失函數空間中,由於特徵(或言之變量)數目衆多,導致函數曲面非常複雜,以致於幾乎不可能有這樣一個點,在這個點上各個方向導數都是0,哪怕從計算的角度來說也是這樣,我們太難找到這樣一個點了。那麼,我們可以忍受我們不能一下子做對,但我們可以一步步走向正確。那麼,當下能做的最好的決定,就是做我眼前可見的最好的事情。所以我要按照梯度方向走(梯度方向爲全部方向導數中絕對值最大的方向,由此易得,我們肯定會得到互爲相反數的兩個梯度方向,一個是梯度最大方向,一個是梯度最小方向)。由於我的目標是更新參數,然後使得損失函數最小,因而我當然要沿着梯度最小的方向去更新我的參數。

我在這裏不得不再提一次“梯度最小”的含義——梯度最小,我覺得有必要說明到底是“誰”的梯度最小。是目標函數在當前點的梯度最小。所以,對於參數列表中的每個參數而言,你可能反而變大了,但總目標函數是在減小的,因爲它們沿着負梯度的方向在前進。

所以說,這個“梯度下降”,目的指的是損失函數取值的下降,而非參數在下降。只不過參數沿着負梯度的方向前進,大概率也是在下降罷了。正因爲“負梯度”,導致那個參數更新公式裏也是減號。

同理——梯度上升

“梯度上升”,指的是目標函數取值的上升,而非參數的上升。參數本身是沿着正梯度的方向前進的。

 

然後,我們說一說“梯度提升”

梯度提升,英文應該叫Gradient Boosting,反正我只在GBDT中聽到過這種說法。這裏的“GBDT”的“梯度提升”,我認爲和“梯度上升”還是不同的,二者的確是兩個不同的概念——梯度上升,指的是求解目標函數最值的一種方案——沿正梯度方向上升;而梯度提升,指的是一種算法思想。首先它是一個”提升“算法,所以使用加法模型思想,一步步將結果進行提升。所以我們表面上是在最小化損失函數,而損失函數就是所謂前M輪加法模型得到的結果與真實值之間的差值,而如果我們想讓這個差值最小,當然就是讓新函數取沿着負梯度方向下降,結果的確就是在擬合負梯度。如果我們擬合的是正梯度,則加法模型之間就都應該是減號,這就很不美觀了,所以我們要擬合負梯度,這樣加法模型就更名副其實了,雖然加法模型也沒要求一定要加,它只是說明要進行線性組合。

 

所以,我覺得,梯度下降和梯度上升,是針對目標函數的一種學習算法,是針對目標函數中參數的更新所提出來的,但“下降”or“上升”實際上指的還是目標函數的取值變化; 

梯度提升,僅指GBDT,指的是對“新函數”求導,然後讓新函數沿着梯度方向,對加法模型累加得到的整體函數提升,這更像是一種算法思想。

 

實際上具體操作基本都是一樣的,所以也沒什麼必要區分了。。。

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