什么是梯度下降,為什么它很重要?
梯度下降是有時會嚇到初學者和從業(yè)者的話題之一。大多數(shù)人在聽到梯度這個詞時,他們試圖在不了解其背后的數(shù)學的情況下完成該主題。本文,將從一個非;A(chǔ)的層面解釋梯度下降,并用簡單的數(shù)學示例為你提供幫助,并使梯度下降完全為你所用。
目錄
什么是梯度下降,為什么它很重要?
梯度下降背后的直覺
梯度下降背后的數(shù)學
具有 1 個變量的梯度下降代碼
具有 2 個變量的梯度下降
學習率的影響
損失函數(shù)的影響
數(shù)據(jù)效果
尾注
什么是梯度下降?
梯度下降是一種用于尋找局部最小值或優(yōu)化損失函數(shù)的一階優(yōu)化技術(shù)。它也被稱為參數(shù)優(yōu)化技術(shù)。
為什么是梯度下降?
使用封閉形式的解決方案很容易找到斜率和截距的值,但是當你在多維數(shù)據(jù)中工作時,該技術(shù)成本太高,并且需要大量時間,因此它在這里失敗了。因此,新技術(shù)以梯度下降的形式出現(xiàn),它可以非常快速地找到最小值。梯度下降不僅適用于線性回歸,而且是一種可以應用于任何機器學習部分的算法,包括線性回歸、邏輯回歸,它是深度學習的完整支柱。梯度下降背后的直覺考慮到我有一個包含CGPA和薪資待遇的學生數(shù)據(jù)集。
我們必須找到最佳擬合直線,當損失最小時,給出b的最小值。損失函數(shù)定義為實際值和預測值之間的差的平方和。
為了使問題更容易理解,假設給定 m 的值,我們必須預測截距(b)的值。所以我們想找出 b 的最小值,其中 L(loss) 應該是最小值。因此,如果我們繪制 L 和 b 之間的圖形,那么它將是一個拋物線形狀,F(xiàn)在在這個拋物線中,我們必須找到使損失最小的 b 的最小值。如果我們使用普通最小二乘法,它會微分并等于零。但這對于處理高維數(shù)據(jù)并不方便。所以,這里出現(xiàn)了梯度下降。讓我們開始執(zhí)行梯度下降。
選擇一個隨機值 b
我們選擇 b 的任意隨機值并找到其對應的 L 值。現(xiàn)在我們想把它收斂到最小值。
在左側(cè),如果b 增加,則我們將趨于最小值,如果b減小,則我們將遠離最小值。
在右側(cè),如果 b減小,那么我們將接近最小值,而在b增加時,則將遠離最小值。
現(xiàn)在我怎么知道我想前進還是后退?所以,答案很簡單,我們找到我們當前所在點的斜率。
現(xiàn)在問題又來了,怎么求斜率?為了找到斜率,我們對方程 os 損失函數(shù)進行求導,即斜率方程,簡化后我們得到一個斜率。現(xiàn)在斜率的方向?qū)⒅甘灸惚仨毾蚯盎蛳蚝笠苿。如果斜率是正?那么我們必須減小 b,反之亦然。簡而言之,我們用原來的截距減去斜率來求新的截距。
b_new = b_old - slope
這只是梯度方程,如果你有多個變量作為斜率和截距,則梯度表示導數(shù)。
現(xiàn)在再次出現(xiàn)的問題是,**我怎么知道在哪里停下來?**我們將在循環(huán)中多次執(zhí)行此收斂步驟,因此有必要知道何時停止。還有一件事是,如果我們減去斜率,則運動會發(fā)生劇烈變化,這被稱為之字形運動。為了避免這種情況,我們將斜率乘以一個非常小的正數(shù),稱為學習率。
現(xiàn)在方程是b_new = b_old - learning rate * slope
因此,這就是為什么我們使用學習率來減少步長和運動方向的劇烈變化。在本教程中,我們將更深入地了解學習率的作用和使用,F(xiàn)在的問題是什么時候停止循環(huán)?當我們停止時有兩種方法。
當 b_new – b_old = 0 表示我們沒有前進,所以我們可以停下來。我們可以將迭代次數(shù)限制為 1000 次。多次迭代稱為 epoch,我們可以將其初始化為超參數(shù)。這就是梯度下降背后的直覺。我們只介紹了理論部分,現(xiàn)在我們將開始梯度下降背后的數(shù)學,我很確定你會很容易地掌握它。梯度下降背后的數(shù)學考慮一個數(shù)據(jù)集,我們不知道初始截距。我們想預測 b 的最小值,現(xiàn)在,已知 m 的值。我們必須應用梯度下降來獲取 b 的值。其背后的原因是理解一個變量,在本文中,我們將同時使用b和m來實現(xiàn)完整的算法。
步驟1)從隨機b開始
一開始,我們考慮 b 的任何隨機值并在 for 循環(huán)中開始迭代,并在斜率的幫助下找到 b 的新值,F(xiàn)在假設學習率為 0.001,epochs 為 1000。
步驟2) 運行迭代
for i in epochs:
b_new = b_old - learning_rate * slope
現(xiàn)在我們要計算 b 的當前值處的斜率。因此,我們將借助損失函數(shù),通過對b求導來計算斜率方程。
這很簡單,它正在計算斜率,你只需輸入值并計算斜率即可。m 的值已知,所以它更容易。我們會做這件事,直到所有的迭代都結(jié)束。我們已經(jīng)看到了梯度下降是如何工作的,現(xiàn)在讓我們用Python來實現(xiàn)梯度下降。具有1個變量的梯度下降代碼在這里,我創(chuàng)建了一個非常小的數(shù)據(jù)集,有四個點來實現(xiàn)梯度下降。并且我們給出了 m 的值,因此我們將首先嘗試普通最小二乘法來獲得 m,然后我們將在數(shù)據(jù)集上實現(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_)
應用OLS后,我們得到系數(shù),m值為78.35,截距為26.15,F(xiàn)在我們將通過取截距的任何隨機值來實現(xiàn)梯度下降,你會看到在執(zhí)行 2 到 3 次迭代后,我們將達到 26.15 附近,這就是我們要實現(xiàn)的最終目標。如果我通過 OLS 繪制預測線,則它看起來像這樣。
plt.scatter(X,y)
plt.plot(X,reg.predict(X),color='red')
現(xiàn)在我們將實現(xiàn)梯度下降,然后你將看到我們的梯度下降預測線將隨著迭代的增加而重疊。
迭代1
讓我們應用梯度下降,假設斜率恒定在78.35,并且截距b的起始值為0。因此,讓我們應用方程式并預測初始值。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ù)計算斜率,找到一個新的b值,它會向紅線移動。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)
當我們計算學習率乘以斜率時,稱為步長,為了計算新的截距,我們從舊的截距中減去步長,這就是我們所做的。新的截距是 20.9,因此我們直接從 0 到達了 20.9。
迭代–2
現(xiàn)在,我們將再次計算截距 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,非常接近所需的截距。如果你再運行一次迭代,那么我相信你將獲得所需的截距,并且綠線將超過紅線。在繪圖時,你可以看到如下圖,其中綠線超過了紅線。
從上面的實驗中,我們可以得出結(jié)論,當我們遠離最小值時,我們會走大步,而當我們接近最小值時,我們會走小步。這就是梯度下降的美妙之處,即使你從任何錯誤的點開始,比如 100,然后經(jīng)過一些迭代,你也會到達正確的點,這都歸功于學習率。2個變量的梯度下降現(xiàn)在我們可以理解梯度下降的完整工作原理了。我們將使用變量 m 和 b 執(zhí)行梯度下降,m與b都未知。
Step-1) 初始化m和b的隨機值
在這里,我們初始化任何隨機值,例如 m 為 1,b 為 0。
Step-2)初始化epoch數(shù)和學習率
將學習率盡可能小,假設 學習率為0.01 和 epochs 為 100
Step-3) 在迭代中開始計算斜率和截距
現(xiàn)在我們將在幾個時期應用一個循環(huán)并計算斜率和截距。for i in epochs:
b_new = b_old - learning_rate * slope
m_new = m_old - learning_rate * slope
該方程與我們上面通過求導推導出的方程相同。在這里,我們必須對等式進行 2 次求導。一個關(guān)于 b(截距),一個關(guān)于 m。這就是梯度下降。現(xiàn)在,我們將使用Python為這兩個變量構(gòu)建梯度下降完整算法。用 Python 實現(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)在你可以自由應用 OLS 并檢查系數(shù)和截距。讓我們建立一個梯度下降類。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)
因此,我們從頭開始實現(xiàn)了完整的梯度下降。學習率的影響學習率是梯度下降中一個非常關(guān)鍵的參數(shù),應該通過實驗兩到三次來明智地選擇。如果你設置學習率為一個非常高的值,那么將永遠不會收斂,并且斜率將從正軸跳到負軸。
學習率總是設置為一個小的值以快速收斂。損失函數(shù)的影響一個是學習率,我們已經(jīng)看到了它的影響,接下來影響梯度下降的是損失函數(shù)。我們在本文中使用了均方誤差,這是一個非常簡單且最常用的損失函數(shù)。這個損失函數(shù)是凸的。凸函數(shù)是一個函數(shù),如果你在兩點之間畫一條線,那么這條線永遠不會與這個函數(shù)相交,這就是所謂的凸函數(shù)。梯度下降總是一個凸函數(shù),因為在凸函數(shù)中只有一個最小值。
數(shù)據(jù)的影響
數(shù)據(jù)影響梯度下降的運行時間。如果數(shù)據(jù)中的所有特征都在一個共同的尺度上,那么它收斂得非?,等高線圖恰好是圓形的。但是如果特征尺度相差很大則收斂時間太長,你會得到一個更平坦的輪廓。尾注我們已經(jīng)從頭學習了梯度下降,并用一個和兩個變量構(gòu)建它。
它的美妙之處在于,無論你從任何奇怪的點開始,它都能讓你找到正確的點。梯度下降用于大多數(shù)機器學習,包括線性和邏輯回歸、PCA、集成技術(shù)。
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
-
精彩回顧立即查看>> 【限時免費下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市