策略產(chǎn)品經(jīng)理必讀系列— 第三講梯度下降法

2 評論 5683 瀏覽 17 收藏 16 分鐘

編輯導(dǎo)語:機(jī)器學(xué)習(xí)是策略產(chǎn)品經(jīng)理需要了解的一個(gè)方面,而梯度下降法則是學(xué)習(xí)機(jī)器學(xué)習(xí)必須了解的思想,本文作者通過一個(gè)案例介紹了梯度下降法,一起來看一下吧。

策略產(chǎn)品經(jīng)理必須要對機(jī)器學(xué)習(xí)有一定的了解,而梯度下降法則是學(xué)習(xí)機(jī)器學(xué)習(xí)必須要了解的思想,本篇通過一個(gè)生動的案例來為大家介紹到底什么是梯度下降法。

01 引入

我們先從一個(gè)案例入手,下圖是一組上海市靜安區(qū)的房價(jià)信息:

我們用Python在坐標(biāo)系上面畫出來如下圖:

我們現(xiàn)在想擬合一個(gè)線性函數(shù)來表示房屋面積和房價(jià)的關(guān)系。我們初中都學(xué)過的一元一次函數(shù)表達(dá)式為:y=kx+b(k≠0)。很明顯不可能有一對組合(k,b)全部經(jīng)過上圖7個(gè)點(diǎn),我們只能盡可能地找到一對組合,使得該線性函數(shù)離上圖7個(gè)點(diǎn)的總距離最近。

如上圖所示,實(shí)際值與預(yù)測值之間差異的均方差我們把它稱為損失函數(shù),也有叫做成本函數(shù)或者代價(jià)函數(shù)的,意義都一樣。我們希望找到一個(gè)組合(k,b)可以使得損失函數(shù)的值最小。

上述只有一個(gè)輸入變量x,如果我們多加入幾個(gè)輸入變量,比如臥室的數(shù)量、離最近地鐵站的距離。最終目標(biāo)變量和損失函數(shù)我們用下述函數(shù)表達(dá)式來表達(dá):

現(xiàn)在我們的任務(wù)就是求出一組θ,在已知【x,y】的前提下使得損失函數(shù)的值最小。那么如何計(jì)算出θ了,使用什么方法了?我們首先回到損失函數(shù)表達(dá)式本身,損失函數(shù)本身是一個(gè)y=x^2的形式,高中數(shù)學(xué)大家應(yīng)該都學(xué)過這是一個(gè)開口向上的拋物線方程,大概長下圖這樣:

我們?nèi)绾握业竭@個(gè)函數(shù)的最低點(diǎn)?上圖是一個(gè)二維圖,我們很輕松就可以肉眼看出x=0時(shí),y最小。如果維度更多,比如z = (x-10)^2 + (y-10)^2,則得到下圖:

我們?nèi)绾味ㄎ怀鲎钚≈?,特別強(qiáng)調(diào)一點(diǎn),這里的x是一個(gè)“大”參數(shù)的概念,x應(yīng)該等于下述公式

大家要明確上圖橫坐標(biāo)是x和y,函數(shù)表達(dá)式里的θ已經(jīng)知道了,所以我們是找到最合適的(x,y)使得函數(shù)值最小。如果我們現(xiàn)在是已知樣本(x,y),那么上圖的變量就變?yōu)榱甩萠0和θ_i,并不是x_i,我們是以θ_0和θ_i作為輸入變量做的圖,x_i和y_i都是已知的固定值,這一點(diǎn)必須明確了。上圖的縱坐標(biāo)的值就變?yōu)閾p失函數(shù)的值。

我們的問題是已知樣本的坐標(biāo)(x,y),來求解一組θ參數(shù),使得損失函數(shù)的值最小。我們?nèi)绾握业缴蠄D中的最低點(diǎn)?因?yàn)檎业阶畹忘c(diǎn),那么最低點(diǎn)對應(yīng)的橫坐標(biāo)所有維度就是我們想得到的θ_0和θ_i,而縱坐標(biāo)就是損失函數(shù)的最小值。找到最低點(diǎn)所有答案就全部解出來了。

現(xiàn)在問題來了?有沒有一種算法讓我們可以慢慢定位出最小值,這個(gè)算法就是梯度下降法。

02 梯度下降法簡介

1. 梯度下降法的思想

我們首先介紹梯度下降法的整體思想。假設(shè)你現(xiàn)在站在某個(gè)山峰的峰頂,你要在天黑前到達(dá)山峰的最低點(diǎn),那里有食品水源供給站,可以進(jìn)行能量補(bǔ)充。你不需要考慮下山的安全性,即使選擇最陡峭的懸崖下山,你也可以全身而退,那么如何下山最快了?

最快的方法就是以當(dāng)前的位置為基準(zhǔn),尋找該位置最陡峭的地方,然后沿該方向往下走。走一段距離后,再以當(dāng)前位置為基準(zhǔn),重新尋找最陡峭的地方,一直重復(fù)最終我們就可以到達(dá)最低點(diǎn)。我們需要不停地去重新定位最陡峭的地方,這樣才不會限于局部最優(yōu)。

那么整個(gè)下山過程中我們會面臨兩個(gè)問題:

  1. 如何測量山峰的“陡峭”程度
  2. 每一次走多長距離后重新進(jìn)行陡峭程度測量;走太長,那么整體的測量次數(shù)就會比較少,可能會導(dǎo)致走的并不是最佳路線,錯(cuò)過了最低點(diǎn)。走太短,測量次數(shù)過于頻繁,整體耗時(shí)太長,還沒有到達(dá)食品供給站就已經(jīng)GG了。這里的步長如何設(shè)置?

Part1里面介紹了如何從一個(gè)開口向上的拋物線高點(diǎn)定位到最低點(diǎn)的問題和下山的場景是完全類似的,拋物線就相當(dāng)于一個(gè)山峰,我們的目標(biāo)就是找到拋物線的最低點(diǎn),也就是山底。

最快的下山方式就是找到當(dāng)前位置最陡峭的方向,然后沿著此方向向下走,對應(yīng)到拋物線中,就是計(jì)算給定點(diǎn)的梯度,然后朝著梯度相反的方向( Part 2.3里面會解釋為什么是朝著梯度相反的方向),就能讓拋物線值下降的最快。同時(shí)我們也要和下山一樣,不停地定位新位置,再計(jì)算新位置的梯度,然后按照新方向下降,最后慢慢定位到拋物線的最低點(diǎn)。

2. 梯度下降法算法

Part2.1里面已經(jīng)介紹了梯度下降法的思想,遺留了兩個(gè)問題。第一就是如何計(jì)算“陡峭”程度,我們這里把它叫做梯度,我們用?J_θ來代替。第二個(gè)也就是步長問題,我們用一個(gè)α學(xué)習(xí)率來代表這個(gè)步長,α越大代表步長越大。知道了這兩個(gè)值,我們?nèi)绾稳サ玫溅葏?shù)的更新表達(dá)式了?

J是關(guān)于θ的一個(gè)函數(shù),假設(shè)初始時(shí)我們在θ_1這個(gè)位置,要從這個(gè)點(diǎn)走到J的最小值點(diǎn),也就是山底。首先我們先確定前進(jìn)的方向,也就是梯度的反向“-?J_θ”,然后走一段距離的步長,也就是α,走完這個(gè)段步長,就到達(dá)了θ_2這個(gè)點(diǎn)了。表達(dá)式如下圖:

我們按照上述表達(dá)式一直不停地更新θ的值,一直到θ收斂不變?yōu)橹?,?dāng)我們到達(dá)山底,此時(shí)函數(shù)的梯度就是0了,θ值也就不會再更新了,因?yàn)楸磉_(dá)式的后半部分一直是0了。

整個(gè)下降過程中損失函數(shù)的值是一定在減少,但是我們想學(xué)習(xí)出來的參數(shù)值θ不一定一直在減小。因?yàn)槲覀冃枰业綋p失函數(shù)最小時(shí)的坐標(biāo)點(diǎn),這個(gè)坐標(biāo)點(diǎn)的坐標(biāo)不一定是原點(diǎn),很可能是(2,3)甚至是(4,6),我們找到的是最合適的θ值使得損失函數(shù)最小。下圖我們用一個(gè)例子來進(jìn)行說明:

上圖的最低點(diǎn)很明顯就是原點(diǎn),我們通過梯度下降法來逼近這個(gè)最低點(diǎn)。我們可以看到損失函數(shù)的值在一直減少,θ的值也在往0這個(gè)值進(jìn)行收斂。

3. 梯度下降法數(shù)學(xué)計(jì)算

Part1和2介紹了梯度下降的思想和θ更新的表達(dá)式,現(xiàn)在我們從數(shù)學(xué)層面進(jìn)行解釋:

1)為什么是向梯度相反的方向下降

上圖應(yīng)該很形象地顯示為什么要朝著梯度的反方向了。梯度是一個(gè)向量,梯度的方向是函數(shù)在指定點(diǎn)上升最快的方向,那么梯度的反方向自然是下降最快的方向了。

2)泛化的θ參數(shù)更新公式

Part2.2里面的例子我們選擇的是一個(gè)最簡單的函數(shù)表達(dá)式,θ參數(shù)分為兩種,一種是和輸入變量x配對的參數(shù)θ_i,一種是固定的偏差θ_0。我們用已知的樣本數(shù)據(jù)(x,y)來求解出使得損失函數(shù)最小的一組θ參數(shù)。下面我們來計(jì)算一個(gè)通用泛化的θ參數(shù)更新表達(dá)式。我們只需要用到高中數(shù)學(xué)中的導(dǎo)數(shù)知識即可,朋友們相信我真的很easy。

下圖是對和輸入變量x配對的參數(shù)θ_i更新表達(dá)式:

下圖是對固定的偏差θ_0的更新表達(dá)式:

上面的數(shù)學(xué)過程也就是高中我們學(xué)習(xí)導(dǎo)數(shù)里面最簡單的求導(dǎo)過程了。那么至此我們也就將梯度下降算法的思想和數(shù)學(xué)解釋全部介紹完了。

4. 梯度下降法分類

Part2.3里面的公式大家也看到了我們要借助樣本的(x,y)的數(shù)據(jù)來進(jìn)行參數(shù)θ的更新,如果現(xiàn)在樣本有100條數(shù)據(jù),我們?nèi)绾蝸砀隆UG闆r下,我們更新的方式有兩種:

1)隨機(jī)梯度下降(Stochastic Gradient Descent)

我們每次只使用單個(gè)訓(xùn)練樣本來更新θ參數(shù),依次遍歷訓(xùn)練集,而不是一次更新中考慮所有的樣本。就像開頭介紹那7條房價(jià)數(shù)據(jù),我們一個(gè)一個(gè)來計(jì)算,計(jì)算一次更新一次θ,直到θ收斂或者達(dá)到后期更新幅度已經(jīng)小于我們設(shè)置的閥值。

2)批量梯度下降(Batch Gradient Descent)

我們每次更新都遍歷訓(xùn)練集中所有的樣本,以它們的預(yù)測誤差之和為依據(jù)更新。我們會一次性將7條樣本數(shù)據(jù)的預(yù)測誤差都匯總,然后進(jìn)行一次更新。更新完以后,繼續(xù)以7條樣本數(shù)據(jù)的預(yù)測誤差之和進(jìn)行匯總,再更新,直到θ收斂或者達(dá)到后期更新幅度已經(jīng)小于我們設(shè)置的閥值。

當(dāng)訓(xùn)練樣本數(shù)很大時(shí),批量梯度下降的每次更新都會是計(jì)算量很大的操作,而隨機(jī)梯度下降可以利用單個(gè)訓(xùn)練樣本立即更新,因此隨機(jī)梯度下降 通常是一個(gè)更快的方法。但隨機(jī)梯度下降也有一個(gè)缺點(diǎn),那就是θ可能不會收斂,而是在最小值附近振蕩,但在實(shí)際中也都會得到一個(gè)足夠好的近似。

所以實(shí)際情況下,我們一般不用固定的學(xué)習(xí)率,而是讓它隨著算法的運(yùn)行逐漸減小到零,也就是在接近“山底”的時(shí)候慢慢減小下降的“步幅”,換成用“小碎步”走,這樣它就更容易收斂于全局最小值而不是圍繞它振蕩了。

03 梯度下降法Python實(shí)踐

以下就是通過實(shí)際運(yùn)行程序得到的相關(guān)結(jié)果圖。

1. 單變量:y = x^2求最低點(diǎn)

假設(shè)X的初始值是10,我們讓程序迭代10次得到的結(jié)果如下圖:

2. 多變量:z = (x-10)^2 + (y-10)^2求最低點(diǎn)

假設(shè)X和Y的初始值都是20,我們讓模型迭代100次得到的效果如下圖:

3. 根據(jù)給定樣本求解出最佳θ組合

假設(shè)樣本中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]

我們希望找到一組參數(shù)θ_0和θ_1來擬合一個(gè)X和Y之間的最優(yōu)線性模型,最終擬合結(jié)果如下:

本篇文章前半部分通俗易懂地將整個(gè)梯度下降算法全面地講解了一遍,后半部分通過Python實(shí)際落地了各種案例,希望看完后大家對于梯度下降法有一個(gè)全面且具象的了解。

本文由 @King James 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。

題圖來自 Unsplash,基于 CC0 協(xié)議

該文觀點(diǎn)僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺僅提供信息存儲空間服務(wù)。

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 你在這上課呢?

    回復(fù)
    1. 這是一節(jié)教你如何快速下山課

      來自上海 回復(fù)