訂閱
糾錯(cuò)
加入自媒體

什么是梯度下降,為什么它很重要?

梯度下降是有時(shí)會(huì)嚇到初學(xué)者和從業(yè)者的話題之一。大多數(shù)人在聽到梯度這個(gè)詞時(shí),他們?cè)噲D在不了解其背后的數(shù)學(xué)的情況下完成該主題。本文,將從一個(gè)非;A(chǔ)的層面解釋梯度下降,并用簡(jiǎn)單的數(shù)學(xué)示例為你提供幫助,并使梯度下降完全為你所用。

目錄

什么是梯度下降,為什么它很重要?

梯度下降背后的直覺

梯度下降背后的數(shù)學(xué)

具有 1 個(gè)變量的梯度下降代碼

具有 2 個(gè)變量的梯度下降

學(xué)習(xí)率的影響

損失函數(shù)的影響

數(shù)據(jù)效果

尾注

什么是梯度下降?

梯度下降是一種用于尋找局部最小值或優(yōu)化損失函數(shù)的一階優(yōu)化技術(shù)。它也被稱為參數(shù)優(yōu)化技術(shù)。

為什么是梯度下降?

使用封閉形式的解決方案很容易找到斜率和截距的值,但是當(dāng)你在多維數(shù)據(jù)中工作時(shí),該技術(shù)成本太高,并且需要大量時(shí)間,因此它在這里失敗了。因此,新技術(shù)以梯度下降的形式出現(xiàn),它可以非常快速地找到最小值。梯度下降不僅適用于線性回歸,而且是一種可以應(yīng)用于任何機(jī)器學(xué)習(xí)部分的算法,包括線性回歸、邏輯回歸,它是深度學(xué)習(xí)的完整支柱。梯度下降背后的直覺考慮到我有一個(gè)包含CGPA和薪資待遇的學(xué)生數(shù)據(jù)集。

我們必須找到最佳擬合直線,當(dāng)損失最小時(shí),給出b的最小值。損失函數(shù)定義為實(shí)際值和預(yù)測(cè)值之間的差的平方和。

為了使問題更容易理解,假設(shè)給定 m 的值,我們必須預(yù)測(cè)截距(b)的值。所以我們想找出 b 的最小值,其中 L(loss) 應(yīng)該是最小值。因此,如果我們繪制 L 和 b 之間的圖形,那么它將是一個(gè)拋物線形狀,F(xiàn)在在這個(gè)拋物線中,我們必須找到使損失最小的 b 的最小值。如果我們使用普通最小二乘法,它會(huì)微分并等于零。但這對(duì)于處理高維數(shù)據(jù)并不方便。所以,這里出現(xiàn)了梯度下降。讓我們開始執(zhí)行梯度下降。

選擇一個(gè)隨機(jī)值 b

我們選擇 b 的任意隨機(jī)值并找到其對(duì)應(yīng)的 L 值。現(xiàn)在我們想把它收斂到最小值。

在左側(cè),如果b 增加,則我們將趨于最小值,如果b減小,則我們將遠(yuǎn)離最小值。

在右側(cè),如果 b減小,那么我們將接近最小值,而在b增加時(shí),則將遠(yuǎn)離最小值。

現(xiàn)在我怎么知道我想前進(jìn)還是后退?所以,答案很簡(jiǎn)單,我們找到我們當(dāng)前所在點(diǎn)的斜率。

現(xiàn)在問題又來了,怎么求斜率?為了找到斜率,我們對(duì)方程 os 損失函數(shù)進(jìn)行求導(dǎo),即斜率方程,簡(jiǎn)化后我們得到一個(gè)斜率,F(xiàn)在斜率的方向?qū)⒅甘灸惚仨毾蚯盎蛳蚝笠苿?dòng)。如果斜率是正的,那么我們必須減小 b,反之亦然。簡(jiǎn)而言之,我們用原來的截距減去斜率來求新的截距。

b_new = b_old - slope
這只是梯度方程,如果你有多個(gè)變量作為斜率和截距,則梯度表示導(dǎo)數(shù)。

現(xiàn)在再次出現(xiàn)的問題是,**我怎么知道在哪里停下來?**我們將在循環(huán)中多次執(zhí)行此收斂步驟,因此有必要知道何時(shí)停止。還有一件事是,如果我們減去斜率,則運(yùn)動(dòng)會(huì)發(fā)生劇烈變化,這被稱為之字形運(yùn)動(dòng)。為了避免這種情況,我們將斜率乘以一個(gè)非常小的正數(shù),稱為學(xué)習(xí)率。

現(xiàn)在方程是b_new = b_old - learning rate * slope
因此,這就是為什么我們使用學(xué)習(xí)率來減少步長(zhǎng)和運(yùn)動(dòng)方向的劇烈變化。在本教程中,我們將更深入地了解學(xué)習(xí)率的作用和使用,F(xiàn)在的問題是什么時(shí)候停止循環(huán)?當(dāng)我們停止時(shí)有兩種方法。

當(dāng) b_new – b_old = 0 表示我們沒有前進(jìn),所以我們可以停下來。我們可以將迭代次數(shù)限制為 1000 次。多次迭代稱為 epoch,我們可以將其初始化為超參數(shù)。這就是梯度下降背后的直覺。我們只介紹了理論部分,現(xiàn)在我們將開始梯度下降背后的數(shù)學(xué),我很確定你會(huì)很容易地掌握它。梯度下降背后的數(shù)學(xué)考慮一個(gè)數(shù)據(jù)集,我們不知道初始截距。我們想預(yù)測(cè) b 的最小值,現(xiàn)在,已知 m 的值。我們必須應(yīng)用梯度下降來獲取 b 的值。其背后的原因是理解一個(gè)變量,在本文中,我們將同時(shí)使用b和m來實(shí)現(xiàn)完整的算法。

步驟1)從隨機(jī)b開始

一開始,我們考慮 b 的任何隨機(jī)值并在 for 循環(huán)中開始迭代,并在斜率的幫助下找到 b 的新值,F(xiàn)在假設(shè)學(xué)習(xí)率為 0.001,epochs 為 1000。

步驟2) 運(yùn)行迭代

for i in epochs:
 b_new = b_old - learning_rate * slope
現(xiàn)在我們要計(jì)算 b 的當(dāng)前值處的斜率。因此,我們將借助損失函數(shù),通過對(duì)b求導(dǎo)來計(jì)算斜率方程。

這很簡(jiǎn)單,它正在計(jì)算斜率,你只需輸入值并計(jì)算斜率即可。m 的值已知,所以它更容易。我們會(huì)做這件事,直到所有的迭代都結(jié)束。我們已經(jīng)看到了梯度下降是如何工作的,現(xiàn)在讓我們用Python來實(shí)現(xiàn)梯度下降。具有1個(gè)變量的梯度下降代碼在這里,我創(chuàng)建了一個(gè)非常小的數(shù)據(jù)集,有四個(gè)點(diǎn)來實(shí)現(xiàn)梯度下降。并且我們給出了 m 的值,因此我們將首先嘗試普通最小二乘法來獲得 m,然后我們將在數(shù)據(jù)集上實(shí)現(xiàn)梯度下降。from sklearn.datasets import make_regression
import numpy as np
import matplotlib.pyplot as plt
X,y = make_regression(n_samples=4, n_features=1, n_informative=1, n_targets=1, noise=80, random_state=13)
plt.scatter(X,y)

使用OLS獲取m的值

from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X,y)
print(reg.coef_)
print(reg.intercept_)
應(yīng)用OLS后,我們得到系數(shù),m值為78.35,截距為26.15,F(xiàn)在我們將通過取截距的任何隨機(jī)值來實(shí)現(xiàn)梯度下降,你會(huì)看到在執(zhí)行 2 到 3 次迭代后,我們將達(dá)到 26.15 附近,這就是我們要實(shí)現(xiàn)的最終目標(biāo)。如果我通過 OLS 繪制預(yù)測(cè)線,則它看起來像這樣。

plt.scatter(X,y)
plt.plot(X,reg.predict(X),color='red')

現(xiàn)在我們將實(shí)現(xiàn)梯度下降,然后你將看到我們的梯度下降預(yù)測(cè)線將隨著迭代的增加而重疊。

迭代1

讓我們應(yīng)用梯度下降,假設(shè)斜率恒定在78.35,并且截距b的起始值為0。因此,讓我們應(yīng)用方程式并預(yù)測(cè)初始值。y_pred = ((78.35 * X) + 0).reshape(4)
plt.scatter(X,y)
plt.plot(X,reg.predict(X),color='red',label='OLS')
plt.plot(X,y_pred,color='#00a65a',label='b = 0')
plt.legend()
plt.show()

這是一條截距為0的直線,現(xiàn)在我們繼續(xù)計(jì)算斜率,找到一個(gè)新的b值,它會(huì)向紅線移動(dòng)。m = 78.35
b = 0
loss_slope = -2 * np.sum(y - m*X.ravel() - b)
# Lets take learning rate = 0.1
lr = 0.1
step_size = loss_slope*lr
print(step_size)
# Calculating the new intercept
b = b - step_size
print(b)
當(dāng)我們計(jì)算學(xué)習(xí)率乘以斜率時(shí),稱為步長(zhǎng),為了計(jì)算新的截距,我們從舊的截距中減去步長(zhǎng),這就是我們所做的。新的截距是 20.9,因此我們直接從 0 到達(dá)了 20.9。

迭代–2

現(xiàn)在,我們將再次計(jì)算截距 20 處的斜率,你將看到它將非常接近所需的截距 26.15。代碼與上面相同。loss_slope = -2 * np.sum(y - m*X.ravel() - b)
step_size = loss_slope*lr
b = b - step_size
print(b)
現(xiàn)在截距為 25.1,非常接近所需的截距。如果你再運(yùn)行一次迭代,那么我相信你將獲得所需的截距,并且綠線將超過紅線。在繪圖時(shí),你可以看到如下圖,其中綠線超過了紅線。

從上面的實(shí)驗(yàn)中,我們可以得出結(jié)論,當(dāng)我們遠(yuǎn)離最小值時(shí),我們會(huì)走大步,而當(dāng)我們接近最小值時(shí),我們會(huì)走小步。這就是梯度下降的美妙之處,即使你從任何錯(cuò)誤的點(diǎn)開始,比如 100,然后經(jīng)過一些迭代,你也會(huì)到達(dá)正確的點(diǎn),這都?xì)w功于學(xué)習(xí)率。2個(gè)變量的梯度下降現(xiàn)在我們可以理解梯度下降的完整工作原理了。我們將使用變量 m 和 b 執(zhí)行梯度下降,m與b都未知。

Step-1) 初始化m和b的隨機(jī)值

在這里,我們初始化任何隨機(jī)值,例如 m 為 1,b 為 0。

Step-2)初始化epoch數(shù)和學(xué)習(xí)率

將學(xué)習(xí)率盡可能小,假設(shè) 學(xué)習(xí)率為0.01 和 epochs 為 100

Step-3) 在迭代中開始計(jì)算斜率和截距

現(xiàn)在我們將在幾個(gè)時(shí)期應(yīng)用一個(gè)循環(huán)并計(jì)算斜率和截距。for i in epochs:
 b_new = b_old - learning_rate * slope
 m_new = m_old - learning_rate * slope
該方程與我們上面通過求導(dǎo)推導(dǎo)出的方程相同。在這里,我們必須對(duì)等式進(jìn)行 2 次求導(dǎo)。一個(gè)關(guān)于 b(截距),一個(gè)關(guān)于 m。這就是梯度下降,F(xiàn)在,我們將使用Python為這兩個(gè)變量構(gòu)建梯度下降完整算法。用 Python 實(shí)現(xiàn)完整的梯度下降算法from sklearn.datasets import make_regression
X, y = make_regression(n_samples=100, n_features=1, n_informative=1, n_targets=1, noise=20, random_state=13)
這是我們創(chuàng)建的數(shù)據(jù)集,現(xiàn)在你可以自由應(yīng)用 OLS 并檢查系數(shù)和截距。讓我們建立一個(gè)梯度下降類。class GDRegressor:
 def __init__(self, learning_rate, epochs):
   self.m = 100
   self.b = -120
   self.lr = learning_rate
   self.epochs = epochs
 def fit(self, X, y):
   #calculate b and m using GD
   for i in range(self.epochs):
     loss_slope_b = -2 * np.sum(y - self.m * X.ravel() - self.b)
     loss_slope_m = -2 * np.sum((y - self.m * X.ravel() - self.b)*X.ravel())
     self.b = self.b - (self.lr * loss_slope_b)
     self.m = self.m - (self.lr * loss_slope_m)
   print(self.m, self.b)
 def predict(self, X):
   return self.m * X + self.b
#create object and check algorithm
gd = GDRegressor(0.001, 50)
gd.fit(X, y)
因此,我們從頭開始實(shí)現(xiàn)了完整的梯度下降。學(xué)習(xí)率的影響學(xué)習(xí)率是梯度下降中一個(gè)非常關(guān)鍵的參數(shù),應(yīng)該通過實(shí)驗(yàn)兩到三次來明智地選擇。如果你設(shè)置學(xué)習(xí)率為一個(gè)非常高的值,那么將永遠(yuǎn)不會(huì)收斂,并且斜率將從正軸跳到負(fù)軸。

學(xué)習(xí)率總是設(shè)置為一個(gè)小的值以快速收斂。損失函數(shù)的影響一個(gè)是學(xué)習(xí)率,我們已經(jīng)看到了它的影響,接下來影響梯度下降的是損失函數(shù)。我們?cè)诒疚闹惺褂昧司秸`差,這是一個(gè)非常簡(jiǎn)單且最常用的損失函數(shù)。這個(gè)損失函數(shù)是凸的。凸函數(shù)是一個(gè)函數(shù),如果你在兩點(diǎn)之間畫一條線,那么這條線永遠(yuǎn)不會(huì)與這個(gè)函數(shù)相交,這就是所謂的凸函數(shù)。梯度下降總是一個(gè)凸函數(shù),因?yàn)樵谕购瘮?shù)中只有一個(gè)最小值。

數(shù)據(jù)的影響

數(shù)據(jù)影響梯度下降的運(yùn)行時(shí)間。如果數(shù)據(jù)中的所有特征都在一個(gè)共同的尺度上,那么它收斂得非常快,等高線圖恰好是圓形的。但是如果特征尺度相差很大則收斂時(shí)間太長(zhǎng),你會(huì)得到一個(gè)更平坦的輪廓。尾注我們已經(jīng)從頭學(xué)習(xí)了梯度下降,并用一個(gè)和兩個(gè)變量構(gòu)建它。

它的美妙之處在于,無論你從任何奇怪的點(diǎn)開始,它都能讓你找到正確的點(diǎn)。梯度下降用于大多數(shù)機(jī)器學(xué)習(xí),包括線性和邏輯回歸、PCA、集成技術(shù)。

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

    掃碼關(guān)注公眾號(hào)
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯(cuò)
    x
    *文字標(biāo)題:
    *糾錯(cuò)內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號(hào)