怎么申請(qǐng)公司網(wǎng)站互動(dòng)營銷的案例及分析
丹尼爾·林肯 (Daniel Lincoln)在Unsplash上拍攝的照片
一、說明
????????基于動(dòng)量的梯度下降是一種梯度下降優(yōu)化算法變體,它在更新規(guī)則中添加了動(dòng)量項(xiàng)。動(dòng)量項(xiàng)計(jì)算為過去梯度的移動(dòng)平均值,過去梯度的權(quán)重由稱為 Beta 的超參數(shù)控制。
????????這有助于解決與普通梯度下降相關(guān)的一些問題,例如振蕩、收斂速度慢以及陷入局部最小值。
????????基于動(dòng)量的梯度下降背后的基本直覺是物理學(xué)中動(dòng)量的概念。一個(gè)經(jīng)典而簡(jiǎn)單的例子是,一個(gè)球從山上滾下來,它聚集了足夠的動(dòng)量來克服高原區(qū)域,使其達(dá)到全局最小值,而不是陷入局部最小值。Momentum 為下降問題的參數(shù)更新添加了歷史記錄,從而顯著加速了優(yōu)化過程。
????????更新方程中包含的歷史量由超參數(shù)確定。該超參數(shù)的值范圍為0到1,其中動(dòng)量值為0相當(dāng)于沒有動(dòng)量的梯度下降。動(dòng)量值越高意味著考慮過去(歷史)的更多梯度。
二、梯度下降的問題
讓我們首先概述一些影響普通梯度下降算法的問題。
- 局部極小值
梯度下降可能會(huì)陷入局部最小值,即不是成本函數(shù)的全局最小值但仍低于周圍點(diǎn)的點(diǎn)。當(dāng)成本函數(shù)有多個(gè)谷值時(shí),就會(huì)發(fā)生這種情況,并且算法陷入其中而不是達(dá)到全局最小值,如下所示:
所有圖像均由作者創(chuàng)建
2. 鞍點(diǎn)
鞍點(diǎn)是成本函數(shù)中的一個(gè)點(diǎn),其中一個(gè)維度具有比周圍點(diǎn)更高的值,而另一個(gè)維度具有更低的值。梯度下降可能會(huì)在這些點(diǎn)上陷入困??境,因?yàn)橐粋€(gè)方向上的梯度指向較低的值,而另一個(gè)方向上的梯度則指向較高的值。
3. 高原期
平穩(wěn)期是成本函數(shù)中梯度非常小或接近于零的區(qū)域。這可能會(huì)導(dǎo)致梯度下降需要很長(zhǎng)時(shí)間或不收斂。
4. 振蕩
當(dāng)學(xué)習(xí)率太高時(shí)就會(huì)出現(xiàn)振蕩,導(dǎo)致算法超過最小值并來回振蕩。
梯度下降還面臨其他一些困難,其中最值得注意和廣泛討論的是梯度消失和梯度爆炸。
三、基于動(dòng)量的梯度下降如何工作
????????在研究了梯度下降的問題以及提出增強(qiáng)和改進(jìn)的動(dòng)機(jī)之后,讓我們繼續(xù)討論梯度下降的實(shí)際工作原理。這只需要一些基本的代數(shù),并且會(huì)用簡(jiǎn)單的英語進(jìn)行解釋。
????????常規(guī)梯度下降的基本表達(dá)式如下:
這里,w_t是當(dāng)前時(shí)間步的權(quán)重,w_{t-1}是上一個(gè)時(shí)間步的權(quán)重,η是學(xué)習(xí)率,最后一項(xiàng)是損失函數(shù)相對(duì)于權(quán)重的偏導(dǎo)數(shù)上一步(又名漸變)。
現(xiàn)在,我們必須包含動(dòng)量項(xiàng)并修改更新方程以考慮新的超參數(shù)和動(dòng)量。
這里,V_t定義為:
該方程稱為指數(shù)加權(quán)平均值。β 是我們的動(dòng)量超參數(shù)。當(dāng) β = 0 時(shí),方程與普通梯度下降相同。
我們從 V_0 = 0 開始,并將方程更新為 t= 1…n。
使用Codecog制作
替換:
簡(jiǎn)化:
現(xiàn)在,
替換:
簡(jiǎn)化:
概括:
廣義求和包括通過所有迭代建立的所有先前梯度。
四、超參數(shù) Beta
現(xiàn)在的問題是我們將新的超參數(shù) β 設(shè)置為什么。
如果我們將其設(shè)置為一個(gè)較低的值,例如0.1,那么t=3時(shí)的梯度將貢獻(xiàn)其值的100%,t=2時(shí)的梯度將貢獻(xiàn)其值的10%,而t=1時(shí)的梯度將僅貢獻(xiàn)其值。貢獻(xiàn)其價(jià)值的1%。您可以看到,如果我們將 β 設(shè)置得太低,早期梯度的貢獻(xiàn)會(huì)迅速減少。
另一方面,如果我們?yōu)?β 設(shè)置一個(gè)較高的值,例如 0.9,則 t=3 時(shí)的梯度將貢獻(xiàn)其值的 100%,t=2 時(shí)的梯度將貢獻(xiàn)其值的 90%,而 t=3 時(shí)的梯度將貢獻(xiàn)其值的 90%。 t=1將貢獻(xiàn)其價(jià)值的81%。
我們得出的結(jié)論是,較高的 β 將包含更多來自過去的梯度。這就是動(dòng)力的含義以及它如何在整個(gè)過程中建立起來。
五、使用 NumPy 在 Python 中實(shí)現(xiàn)
????????這是帶有動(dòng)量的梯度下降的實(shí)現(xiàn),以及與普通梯度下降的逐步解釋和輸出比較。在深入實(shí)現(xiàn)之前,我們先了解一下普通梯度下降和動(dòng)量梯度下降之間的區(qū)別:
普通梯度下降:
1. 計(jì)算損失函數(shù)相對(duì)于參數(shù)的梯度。
2. 通過從當(dāng)前參數(shù)值中減去梯度大小的一小部分(學(xué)習(xí)率)來更新參數(shù)。
3. 重復(fù)步驟 1 和 2,直到達(dá)到收斂。
帶動(dòng)量的梯度下降:
1. 計(jì)算損失函數(shù)相對(duì)于參數(shù)的梯度。
2. 計(jì)算步驟 1 中梯度的指數(shù)加權(quán)移動(dòng)平均值(動(dòng)量)。
3. 通過使用動(dòng)量項(xiàng)修改普通梯度下降中的更新步驟來更新參數(shù)。
4. 重復(fù)步驟 1-3,直至達(dá)到收斂。
現(xiàn)在,我們來看看實(shí)現(xiàn)過程:
import numpy as npdef gradient_descent_momentum(X, y, learning_rate=0.01, momentum=0.9, num_iterations=100):# Initialize the parametersnum_samples, num_features = X.shapetheta = np.zeros(num_features)# Initialize the velocity vectorvelocity = np.zeros_like(theta)# Perform iterationsfor iteration in range(num_iterations):# Compute the predictions and errorspredicted = np.dot(X, theta)errors = predicted - y# Compute the gradientsgradients = (1/num_samples) * np.dot(X.T, errors)# Update the velocityvelocity = momentum * velocity + learning_rate * gradients# Update the parameterstheta -= velocity# Compute the mean squared errormse = np.mean(errors**2)# Print the MSE at each iterationprint(f"Iteration {iteration+1}, MSE: {mse}")return theta
Now, let’s compare the output of Gradient Descent with Momentum to Vanilla Gradient Descent using a simple linear regression problem:# Generate some random data
np.random.seed(42)
X = np.random.rand(100, 1)
y = 2 + 3 * X + np.random.randn(100, 1)# Apply Gradient Descent with Momentum
theta_momentum = gradient_descent_momentum(X, y, learning_rate=0.1, momentum=0.9, num_iterations=100)# Apply Vanilla Gradient Descent
theta_vanilla = gradient_descent(X, y, learning_rate=0.1, num_iterations=100)
????????現(xiàn)在,讓我們使用簡(jiǎn)單的線性回歸問題將動(dòng)量梯度下降與普通梯度下降的輸出進(jìn)行比較:
# Generate some random data
np.random.seed(42)
X = np.random.rand(100, 1)
y = 2 + 3 * X + np.random.randn(100, 1)# Apply Gradient Descent with Momentum
theta_momentum = gradient_descent_momentum(X, y, learning_rate=0.1, momentum=0.9, num_iterations=100)# Apply Vanilla Gradient Descent
theta_vanilla = gradient_descent(X, y, learning_rate=0.1, num_iterations=100)
輸出:
Iteration 1, MSE: 5.894802675477298
Iteration 2, MSE: 4.981474209682729
Iteration 3, MSE: 4.543813739311503
...
Iteration 98, MSE: 0.639280357661573
Iteration 99, MSE: 0.6389711476228525
Iteration 100, MSE: 0.63867258334531Iteration 1, MSE: 5.894802675477298
Iteration 2, MSE: 4.981474209682729
Iteration 3, MSE: 4.543813739311503
...
Iteration 98, MSE: 0.639280357661573
Iteration 99, MSE: 0.6389711476228525
Iteration 100, MSE: 0.63867258334531
正如我們從輸出中看到的,動(dòng)量梯度下降和普通梯度下降都提供了相似的結(jié)果。然而,由于動(dòng)量項(xiàng),動(dòng)量梯度下降可以更快地收斂,這加速了最新梯度方向的更新,從而導(dǎo)致更快的收斂。
六、應(yīng)用領(lǐng)域
????????動(dòng)量在機(jī)器學(xué)習(xí)社區(qū)中廣泛用于優(yōu)化非凸函數(shù),例如深度神經(jīng)網(wǎng)絡(luò)。根據(jù)經(jīng)驗(yàn),動(dòng)量方法優(yōu)于傳統(tǒng)的隨機(jī)梯度下降方法。在深度學(xué)習(xí)中,SGD 廣泛流行,是許多優(yōu)化器(例如 Adam、Adadelta、RMSProp 等)的底層基礎(chǔ),這些優(yōu)化器已經(jīng)利用動(dòng)量來降低計(jì)算速度
????????優(yōu)化算法的動(dòng)量擴(kuò)展可在許多流行的機(jī)器學(xué)習(xí)框架中使用,例如 PyTorch、張量流和 scikit-learn。一般來說,任何可以用隨機(jī)梯度下降解決的問題都可以從動(dòng)量的應(yīng)用中受益。這些通常是無約束的優(yōu)化問題??梢詰?yīng)用動(dòng)量的一些常見 SGD 應(yīng)用包括嶺回歸、邏輯回歸和支持向量機(jī)。當(dāng)實(shí)施動(dòng)量時(shí),包括與癌癥診斷和圖像確定相關(guān)的分類問題也可以減少運(yùn)行時(shí)間。就醫(yī)療診斷而言,計(jì)算速度的提高可以通過神經(jīng)網(wǎng)絡(luò)內(nèi)更快的診斷時(shí)間和更高的診斷準(zhǔn)確性直接使患者受益。
七、總結(jié)
????????動(dòng)量通過減少振蕩效應(yīng)并充當(dāng)優(yōu)化問題解決的加速器來改善梯度下降。此外,它還找到全局(而不僅僅是局部)最優(yōu)值。由于這些優(yōu)點(diǎn),動(dòng)量常用于機(jī)器學(xué)習(xí),并通過 SGD 廣泛應(yīng)用于所有優(yōu)化器。盡管動(dòng)量的超參數(shù)必須謹(jǐn)慎選擇,并且需要一些試驗(yàn)和錯(cuò)誤,但它最終解決了梯度下降問題中的常見問題。隨著深度學(xué)習(xí)的不斷發(fā)展,動(dòng)量應(yīng)用將使模型和問題的訓(xùn)練和解決速度比沒有的方法更快。
參考
Brownlee, J.(2021 年,10 月 11 日)。從頭開始的梯度下降勢(shì)頭。掌握機(jī)器學(xué)習(xí)。Gradient Descent With Momentum from Scratch - MachineLearningMastery.com。
Sum,C.-S。Leung 和 K. Ho,“梯度下降學(xué)習(xí)的局限性”,發(fā)表于 IEEE Transactions on Neural Networks and Learning Systems,卷。31、沒有。6,第 2227–2232 頁,2020 年 6 月,doi:10.1109/TNNLS.2019.2927689?弗朗西斯科·佛朗哥
Srihari,S.(nd)。基本優(yōu)化算法。深度學(xué)習(xí)。https://cedar.buffalo.edu/~srihari/CSE676/8.3%20BasicOptimizn.pdf