策略產品經理必讀系列— 第三講梯度下降法
編輯導語:機器學習是策略產品經理需要了解的一個方面,而梯度下降法則是學習機器學習必須了解的思想,本文作者通過一個案例介紹了梯度下降法,一起來看一下吧。
策略產品經理必須要對機器學習有一定的了解,而梯度下降法則是學習機器學習必須要了解的思想,本篇通過一個生動的案例來為大家介紹到底什么是梯度下降法。
01 引入
我們先從一個案例入手,下圖是一組上海市靜安區的房價信息:
我們用Python在坐標系上面畫出來如下圖:
我們現在想擬合一個線性函數來表示房屋面積和房價的關系。我們初中都學過的一元一次函數表達式為:y=kx+b(k≠0)。很明顯不可能有一對組合(k,b)全部經過上圖7個點,我們只能盡可能地找到一對組合,使得該線性函數離上圖7個點的總距離最近。
如上圖所示,實際值與預測值之間差異的均方差我們把它稱為損失函數,也有叫做成本函數或者代價函數的,意義都一樣。我們希望找到一個組合(k,b)可以使得損失函數的值最小。
上述只有一個輸入變量x,如果我們多加入幾個輸入變量,比如臥室的數量、離最近地鐵站的距離。最終目標變量和損失函數我們用下述函數表達式來表達:
現在我們的任務就是求出一組θ,在已知【x,y】的前提下使得損失函數的值最小。那么如何計算出θ了,使用什么方法了?我們首先回到損失函數表達式本身,損失函數本身是一個y=x^2的形式,高中數學大家應該都學過這是一個開口向上的拋物線方程,大概長下圖這樣:
我們如何找到這個函數的最低點?上圖是一個二維圖,我們很輕松就可以肉眼看出x=0時,y最小。如果維度更多,比如z = (x-10)^2 + (y-10)^2,則得到下圖:
我們如何定位出最小值,特別強調一點,這里的x是一個“大”參數的概念,x應該等于下述公式
大家要明確上圖橫坐標是x和y,函數表達式里的θ已經知道了,所以我們是找到最合適的(x,y)使得函數值最小。如果我們現在是已知樣本(x,y),那么上圖的變量就變為了θ_0和θ_i,并不是x_i,我們是以θ_0和θ_i作為輸入變量做的圖,x_i和y_i都是已知的固定值,這一點必須明確了。上圖的縱坐標的值就變為損失函數的值。
我們的問題是已知樣本的坐標(x,y),來求解一組θ參數,使得損失函數的值最小。我們如何找到上圖中的最低點?因為找到最低點,那么最低點對應的橫坐標所有維度就是我們想得到的θ_0和θ_i,而縱坐標就是損失函數的最小值。找到最低點所有答案就全部解出來了。
現在問題來了?有沒有一種算法讓我們可以慢慢定位出最小值,這個算法就是梯度下降法。
02 梯度下降法簡介
1. 梯度下降法的思想
我們首先介紹梯度下降法的整體思想。假設你現在站在某個山峰的峰頂,你要在天黑前到達山峰的最低點,那里有食品水源供給站,可以進行能量補充。你不需要考慮下山的安全性,即使選擇最陡峭的懸崖下山,你也可以全身而退,那么如何下山最快了?
最快的方法就是以當前的位置為基準,尋找該位置最陡峭的地方,然后沿該方向往下走。走一段距離后,再以當前位置為基準,重新尋找最陡峭的地方,一直重復最終我們就可以到達最低點。我們需要不停地去重新定位最陡峭的地方,這樣才不會限于局部最優。
那么整個下山過程中我們會面臨兩個問題:
- 如何測量山峰的“陡峭”程度
- 每一次走多長距離后重新進行陡峭程度測量;走太長,那么整體的測量次數就會比較少,可能會導致走的并不是最佳路線,錯過了最低點。走太短,測量次數過于頻繁,整體耗時太長,還沒有到達食品供給站就已經GG了。這里的步長如何設置?
Part1里面介紹了如何從一個開口向上的拋物線高點定位到最低點的問題和下山的場景是完全類似的,拋物線就相當于一個山峰,我們的目標就是找到拋物線的最低點,也就是山底。
最快的下山方式就是找到當前位置最陡峭的方向,然后沿著此方向向下走,對應到拋物線中,就是計算給定點的梯度,然后朝著梯度相反的方向( Part 2.3里面會解釋為什么是朝著梯度相反的方向),就能讓拋物線值下降的最快。同時我們也要和下山一樣,不停地定位新位置,再計算新位置的梯度,然后按照新方向下降,最后慢慢定位到拋物線的最低點。
2. 梯度下降法算法
Part2.1里面已經介紹了梯度下降法的思想,遺留了兩個問題。第一就是如何計算“陡峭”程度,我們這里把它叫做梯度,我們用?J_θ來代替。第二個也就是步長問題,我們用一個α學習率來代表這個步長,α越大代表步長越大。知道了這兩個值,我們如何去得到θ參數的更新表達式了?
J是關于θ的一個函數,假設初始時我們在θ_1這個位置,要從這個點走到J的最小值點,也就是山底。首先我們先確定前進的方向,也就是梯度的反向“-?J_θ”,然后走一段距離的步長,也就是α,走完這個段步長,就到達了θ_2這個點了。表達式如下圖:
我們按照上述表達式一直不停地更新θ的值,一直到θ收斂不變為止,當我們到達山底,此時函數的梯度就是0了,θ值也就不會再更新了,因為表達式的后半部分一直是0了。
整個下降過程中損失函數的值是一定在減少,但是我們想學習出來的參數值θ不一定一直在減小。因為我們需要找到損失函數最小時的坐標點,這個坐標點的坐標不一定是原點,很可能是(2,3)甚至是(4,6),我們找到的是最合適的θ值使得損失函數最小。下圖我們用一個例子來進行說明:
上圖的最低點很明顯就是原點,我們通過梯度下降法來逼近這個最低點。我們可以看到損失函數的值在一直減少,θ的值也在往0這個值進行收斂。
3. 梯度下降法數學計算
Part1和2介紹了梯度下降的思想和θ更新的表達式,現在我們從數學層面進行解釋:
1)為什么是向梯度相反的方向下降
上圖應該很形象地顯示為什么要朝著梯度的反方向了。梯度是一個向量,梯度的方向是函數在指定點上升最快的方向,那么梯度的反方向自然是下降最快的方向了。
2)泛化的θ參數更新公式
Part2.2里面的例子我們選擇的是一個最簡單的函數表達式,θ參數分為兩種,一種是和輸入變量x配對的參數θ_i,一種是固定的偏差θ_0。我們用已知的樣本數據(x,y)來求解出使得損失函數最小的一組θ參數。下面我們來計算一個通用泛化的θ參數更新表達式。我們只需要用到高中數學中的導數知識即可,朋友們相信我真的很easy。
下圖是對和輸入變量x配對的參數θ_i更新表達式:
下圖是對固定的偏差θ_0的更新表達式:
上面的數學過程也就是高中我們學習導數里面最簡單的求導過程了。那么至此我們也就將梯度下降算法的思想和數學解釋全部介紹完了。
4. 梯度下降法分類
Part2.3里面的公式大家也看到了我們要借助樣本的(x,y)的數據來進行參數θ的更新,如果現在樣本有100條數據,我們如何來更新。正常情況下,我們更新的方式有兩種:
1)隨機梯度下降(Stochastic Gradient Descent)
我們每次只使用單個訓練樣本來更新θ參數,依次遍歷訓練集,而不是一次更新中考慮所有的樣本。就像開頭介紹那7條房價數據,我們一個一個來計算,計算一次更新一次θ,直到θ收斂或者達到后期更新幅度已經小于我們設置的閥值。
2)批量梯度下降(Batch Gradient Descent)
我們每次更新都遍歷訓練集中所有的樣本,以它們的預測誤差之和為依據更新。我們會一次性將7條樣本數據的預測誤差都匯總,然后進行一次更新。更新完以后,繼續以7條樣本數據的預測誤差之和進行匯總,再更新,直到θ收斂或者達到后期更新幅度已經小于我們設置的閥值。
當訓練樣本數很大時,批量梯度下降的每次更新都會是計算量很大的操作,而隨機梯度下降可以利用單個訓練樣本立即更新,因此隨機梯度下降 通常是一個更快的方法。但隨機梯度下降也有一個缺點,那就是θ可能不會收斂,而是在最小值附近振蕩,但在實際中也都會得到一個足夠好的近似。
所以實際情況下,我們一般不用固定的學習率,而是讓它隨著算法的運行逐漸減小到零,也就是在接近“山底”的時候慢慢減小下降的“步幅”,換成用“小碎步”走,這樣它就更容易收斂于全局最小值而不是圍繞它振蕩了。
03 梯度下降法Python實踐
以下就是通過實際運行程序得到的相關結果圖。
1. 單變量:y = x^2求最低點
假設X的初始值是10,我們讓程序迭代10次得到的結果如下圖:
2. 多變量:z = (x-10)^2 + (y-10)^2求最低點
假設X和Y的初始值都是20,我們讓模型迭代100次得到的效果如下圖:
3. 根據給定樣本求解出最佳θ組合
假設樣本中X和Y的值如下:
x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
y = [3,4,5,5,2,4,7,8,11,8,10,11,13,13,16,17,16,17,18,20]
我們希望找到一組參數θ_0和θ_1來擬合一個X和Y之間的最優線性模型,最終擬合結果如下:
本篇文章前半部分通俗易懂地將整個梯度下降算法全面地講解了一遍,后半部分通過Python實際落地了各種案例,希望看完后大家對于梯度下降法有一個全面且具象的了解。
本文由 @King James 原創發布于人人都是產品經理。未經許可,禁止轉載。
題圖來自 Unsplash,基于 CC0 協議
該文觀點僅代表作者本人,人人都是產品經理平臺僅提供信息存儲空間服務。
你在這上課呢?
這是一節教你如何快速下山課