網(wǎng)站建設(shè)的目的分析國內(nèi)新聞最新消息今天簡短
文章目錄
- 一、說明
- 二、了解基礎(chǔ)知識的重要性:
- 2.1 什么是梯度下降?
- 2.2 梯度下降的類型:
- 三、隨機梯度下降 (SGD) 有何不同
- 3.1 隨機性的概念:
- 3.2 SGD的優(yōu)點和缺點:
- 四、隨機梯度下降的分步說明
- 五、在 Python 中從頭開始實現(xiàn)隨機梯度下降
- 5.1 設(shè)置環(huán)境:
- 5.2 編寫 SGD 函數(shù):
- 5.3 常見陷阱
- 六、何時使用隨機梯度下降 (SGD)
- 七、與其他優(yōu)化器的比較
- 八、結(jié)論
一、說明
想象一下,在一個霧蒙蒙的早晨,你試圖找到山谷中的最低點——你邁出的每一步都像是在猜測地形。在機器學(xué)習(xí)的世界中,這種 “猜測” 過程正是優(yōu)化算法的作用 — 它們調(diào)整模型的參數(shù)以找到最佳結(jié)果。這就是SGD。
二、了解基礎(chǔ)知識的重要性:
以下是您可能不知道的事情:從頭開始學(xué)習(xí)實施 SGD 很像學(xué)習(xí)駕駛手動汽車。當(dāng)然,有自動變速器汽車(預(yù)構(gòu)建的庫和優(yōu)化器),但當(dāng)您了解底層機制時,您將獲得對機器學(xué)習(xí)模型行為方式的控制、精度和信心。通過從頭開始構(gòu)建,您將深入了解優(yōu)化算法,從而更輕松地解決問題,甚至在未來提高性能。
2.1 什么是梯度下降?
簡要說明:
將坡度下降想象成徒步下山以找到山谷中的最低點。您根據(jù)地形的坡度采取步數(shù) — 坡度越陡,步長越大。在機器學(xué)習(xí)中,這個“谷值”是成本函數(shù)的最小值,它表示模型的表現(xiàn)如何。Gradient descent 就像您的指南,告訴您向哪個方向調(diào)整模型的參數(shù)(權(quán)重和偏差),以便在每次迭代中表現(xiàn)更好。目標(biāo)是什么?盡可能降低成本功能。
2.2 梯度下降的類型:
事情變得有趣了:走下這座山的方法不止一種。您有三種主要類型的梯度下降,每種類型都有自己的個性:
批量梯度下降:此 SQL 會等到它擁有所有數(shù)據(jù)后再進行移動。這就像計算完美的步驟,但需要大量的時間和內(nèi)存。
隨機梯度下降 (SGD):啊,我們節(jié)目的明星。SGD 不會等待整個數(shù)據(jù)集;相反,它在每個數(shù)據(jù)點之后需要一個步驟。它快速、靈活,而且 - 就像你可能已經(jīng)猜到的那樣 - 有點混亂。
小批量梯度下降:一個快樂的中間地帶。小批量梯度下降不是等待所有數(shù)據(jù)或在每一個點之后匆忙前進,而是以小組(小批量)的形式處理數(shù)據(jù)。它在速度和準(zhǔn)確性之間取得了平衡。
您可能會想,“為什么 SGD 對于大型數(shù)據(jù)集如此有價值?原因如下:假設(shè)您有數(shù)百萬個數(shù)據(jù)點。使用批量梯度下降意味著您將陷入處理困境,永遠等待進行更新。但是,借助 SGD,您幾乎可以在每個數(shù)據(jù)點到達時立即更新模型,這使其非常適合需要快速獲得結(jié)果的大型數(shù)據(jù)集。
三、隨機梯度下降 (SGD) 有何不同
3.1 隨機性的概念:
事情是這樣的:SGD 被稱為“隨機”,因為它將隨機性引入到流程中。它不是根據(jù)您的所有數(shù)據(jù)計算梯度(就像在批量梯度下降中一樣),而是一次選擇一個數(shù)據(jù)點來調(diào)整參數(shù)。這種隨機性為 SGD 提供了速度優(yōu)勢,但也使其更加不穩(wěn)定 — 有時,您會朝著正確的方向邁進,有時您會稍微偏離路徑。但隨著時間的推移,步驟會平均化,你(希望)最終得到最優(yōu)解的速度比一次計算所有內(nèi)容更快。
3.2 SGD的優(yōu)點和缺點:
優(yōu)勢:
速度:由于它會在每個數(shù)據(jù)點后更新,因此它比大型數(shù)據(jù)集的批量梯度下降要快得多。您幾乎可以立即獲得有關(guān)每個步驟如何影響模型的反饋。
正則化效果:SGD 引入的隨機噪聲可以幫助防止過擬合,起到一種隱式正則化的作用。
內(nèi)存效率:一次只有一個樣本加載到內(nèi)存中,非常適合大型數(shù)據(jù)集。
缺點:
嘈雜的更新:由于您在每個數(shù)據(jù)點之后都進行了更改,因此通往最佳解決方案的路徑可能會參差不齊且不太穩(wěn)定。
在某些情況下收斂速度較慢:在某些情況下,可能需要更長的時間才能達到確切的最小值,尤其是在學(xué)習(xí)率沒有得到很好的調(diào)整時。
四、隨機梯度下降的分步說明
- 初始化參數(shù):
在運行模型之前,您需要從頭開始 — 這意味著初始化模型的參數(shù)(權(quán)重和偏差)。想象一下,你正在開始一個沒有放置任何塊的拼圖。你不知道最終的圖片是什么樣子的,所以你隨機放置這些碎片,希望它們最終能形成一些有意義的東西。同樣,在 SGD 中,我們隨機初始化權(quán)重和偏差。
事情是這樣的:當(dāng)這些權(quán)重被隨機初始化時,它們將在訓(xùn)練期間進行調(diào)整,以盡可能準(zhǔn)確地擬合數(shù)據(jù)。對于線性回歸問題,這些權(quán)重確定線的斜率,而偏差調(diào)整線的截距。在 Python 中,您可以使用正態(tài)分布中的隨機值或僅使用小隨機數(shù)來初始化這些值。
- 選擇學(xué)習(xí)率:
您可能想知道,“每個人都在談?wù)摰倪@個學(xué)習(xí)率是多少?將學(xué)習(xí)率視為您在優(yōu)化路徑上所采取的步驟的大小。如果你的學(xué)習(xí)率太高,就像進行巨大的跳躍——你可能會超過最佳點,在目標(biāo)周圍彈跳而從未著陸。如果它太低,就像小步走——當(dāng)然,你會到達那里,但需要令人沮喪的很長時間。
要找到最佳點,需要仔細選擇學(xué)習(xí)率。一種常見的技術(shù)是使用學(xué)習(xí)率衰減,其中學(xué)習(xí)率會隨著模型越來越接近最佳解決方案而降低。這樣,您首先會采取較大的步驟來加快流程,但當(dāng)您接近最小值時,會逐漸采取更小、更精確的步驟。
- 更新規(guī)則:
訓(xùn)練開始后,每個數(shù)據(jù)點都會為您提供有關(guān)調(diào)整體重方式的線索。這就是魔法發(fā)生的地方。每次迭代(使用單個樣本)后,您計算梯度,然后使用學(xué)習(xí)率更新參數(shù)(權(quán)重和偏差)。
交易是這樣的:對于數(shù)據(jù)集中的每個樣本,都會重復(fù)此更新過程,這意味著在每個數(shù)據(jù)點之后,您的模型會進行微小的調(diào)整,逐漸學(xué)習(xí)隱藏在數(shù)據(jù)中的模式。
- 停止標(biāo)準(zhǔn):
你怎么知道什么時候停止?這就像問:“畫家什么時候完成他們的杰作?在 SGD 中,您可以根據(jù)以下條件停止訓(xùn)練:
epoch 數(shù):紀(jì)元是指算法查看整個數(shù)據(jù)集一次的時間。您可以設(shè)置固定數(shù)量的 epoch,例如 100 或 200,以確保足夠的迭代。
成本函數(shù)的收益遞減:您還可以監(jiān)控成本函數(shù)(您的模型有多錯誤),并在改進變得可以忽略不計時停止 — 當(dāng)進一步的訓(xùn)練并沒有真正使模型變得更好時。
現(xiàn)在我們已經(jīng)有了理論基礎(chǔ),讓我們卷起袖子開始編寫代碼。
五、在 Python 中從頭開始實現(xiàn)隨機梯度下降
5.1 設(shè)置環(huán)境:
要從頭開始實施 SGD,我們需要能夠高效處理矩陣運算的 Python 庫。具體來說,您將使用:
numpy用于線性代數(shù)運算和矩陣作。
您還可以添加以可視化學(xué)習(xí)過程(例如繪制成本函數(shù)的減少)。matplotlib
現(xiàn)在,讓我們從一個簡單的線性回歸模型開始,我們的目標(biāo)是通過數(shù)據(jù)找到最合適的線。
5.2 編寫 SGD 函數(shù):
以下是編寫 SGD 函數(shù)的方法:
初始化參數(shù):初始化權(quán)重和偏差。在這種情況下,假設(shè)我們的權(quán)重從小的隨機數(shù)開始,我們的偏差為 0。
import numpy as np# Initialize parameters
def initialize_params(n_features):weights = np.random.randn(n_features) * 0.01bias = 0.0return weights, bias
- 編寫循環(huán):現(xiàn)在,您需要一個循環(huán)來遍歷每個數(shù)據(jù)樣本,計算成本函數(shù)的梯度,并相應(yīng)地更新權(quán)重和偏差。您還需要跟蹤每個步驟的成本,以便了解模型的學(xué)習(xí)效果。
def stochastic_gradient_descent(X, y, learning_rate=0.01, epochs=100):weights, bias = initialize_params(X.shape[1])n_samples = X.shape[0]for epoch in range(epochs):for i in range(n_samples):# Select one samplex_i = X[i]y_i = y[i]# Predict the outputprediction = np.dot(x_i, weights) + bias# Calculate gradientsdw = (prediction - y_i) * x_idb = (prediction - y_i)# Update weights and biasweights -= learning_rate * dwbias -= learning_rate * db# Optionally, print the cost for trackingcost = np.mean((np.dot(X, weights) + bias - y) ** 2)print(f'Epoch {epoch+1}, Cost: {cost}')return weights, bias
- 跟蹤成本函數(shù):您可能希望定期打印或繪制成本函數(shù),以監(jiān)控模型的學(xué)習(xí)方式。這可能是查看您的學(xué)習(xí)率是太高(成本會大幅波動)還是太低(成本會非常緩慢地降低)的好方法。
代碼演練:
讓我們分解一下這里發(fā)生的事情:
initialize_params():此函數(shù)將您的權(quán)重和偏差設(shè)置為較小的初始值,以確保您的模型可以開始學(xué)習(xí)。
stochastic_gradient_descent():在這個循環(huán)中,我們:
1 單獨瀏覽每個數(shù)據(jù)點。
2 根據(jù)當(dāng)前權(quán)重和偏差進行預(yù)測。
3 計算誤差 (預(yù)測與實際值的偏差)。
4 計算成本函數(shù)相對于權(quán)重和偏差的梯度。
5 使用學(xué)習(xí)率更新權(quán)重和偏差。
5 跟蹤成本函數(shù)以監(jiān)控進度。
5.3 常見陷阱
您可能會想,“這聽起來很簡單,但哪里會出錯呢?以下是一些常見錯誤:
不對數(shù)據(jù)進行隨機排序:如果您不在每個 epoch 之前對數(shù)據(jù)進行隨機排序,則您的模型可能會學(xué)習(xí)數(shù)據(jù)排序中的模式,而不是數(shù)據(jù)本身的模式。始終在 epoch 之間對數(shù)據(jù)進行隨機排序。
使用過高的學(xué)習(xí)率:如前所述,過高的學(xué)習(xí)率會導(dǎo)致模型劇烈振蕩,永遠無法收斂。密切關(guān)注 cost 函數(shù) — 如果它跳動太多,請考慮降低學(xué)習(xí)率。
六、何時使用隨機梯度下降 (SGD)
實際應(yīng)用:
您可能想知道,“什么時候是 Stochastic Gradient Descent 我最好的選擇?事情是這樣的:SGD 在處理大型數(shù)據(jù)集或復(fù)雜的神經(jīng)網(wǎng)絡(luò)時真正閃耀。將其視為實時學(xué)習(xí)的首選算法,您需要快速更新,而無需等待處理整個數(shù)據(jù)集。
例如,假設(shè)您正在使用用于圖像識別的深度學(xué)習(xí)模型。數(shù)據(jù)集很大 — 數(shù)百萬張圖像。如果您使用批量梯度下降,則必須在對模型進行任何調(diào)整之前加載和處理每張圖像。但是使用 SGD 時,模型會在每張圖像之后更新其參數(shù)。這使您可以立即查看進度并減少計算負載,從而使其更快、更節(jié)省內(nèi)存。
在金融或電子商務(wù)等行業(yè)中,模型需要使用流數(shù)據(jù)(想想推薦系統(tǒng)或股票價格預(yù)測)不斷更新,SGD 一次處理一個數(shù)據(jù)點的能力非常寶貴。它用于訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò) (CNN) 和遞歸神經(jīng)網(wǎng)絡(luò) (RNN) 等大規(guī)模神經(jīng)網(wǎng)絡(luò),這些網(wǎng)絡(luò)為從自動駕駛汽車到語言翻譯的所有功能提供支持。
七、與其他優(yōu)化器的比較
現(xiàn)在,您可能會想,“好吧,SGD 聽起來不錯,但 Adam 或 RMSprop 等其他優(yōu)化器呢?讓我們來分析一下。
Adam (Adaptive Moment Estimation):Adam 結(jié)合了 SGD 與 momentum 和 RMSprop 的優(yōu)點。它使用梯度(如 momentum)和平方梯度(如 RMSprop)的運行平均值來調(diào)整每個參數(shù)的學(xué)習(xí)率。這通常會導(dǎo)致更快的收斂。在訓(xùn)練需要平衡速度和精度的深度網(wǎng)絡(luò)時,您可能更喜歡 Adam。
RMSprop:此優(yōu)化器根據(jù)最近梯度的大小單獨調(diào)整每個參數(shù)的學(xué)習(xí)率。它對于處理非平穩(wěn)目標(biāo)特別有用,因為在訓(xùn)練過程中,最佳學(xué)習(xí)率可能會發(fā)生變化。您會發(fā)現(xiàn) RMSprop 對于訓(xùn)練 RNN 特別方便。
那么,什么時候應(yīng)該堅持使用 SGD?如果您正在尋找簡單性、內(nèi)存效率和控制力,SGD 仍然是一個不錯的選擇。例如,如果您有一個非常大的數(shù)據(jù)集,并且無法承受 Adam 或 RMSprop 所需的額外內(nèi)存開銷,則 SGD 是一種更直接的解決方案。此外,如果您工作的環(huán)境中訓(xùn)練需要對每個新數(shù)據(jù)點做出更快的響應(yīng)(例如在實時應(yīng)用程序中),SGD 的頻繁更新使其更合適。
這可能會讓您感到驚訝:盡管有所有花哨的新優(yōu)化器,但 SGD 仍然因其簡單性和效率而受到從業(yè)者的最愛。在擔(dān)心過擬合的情況下,SGD 固有的噪聲(由于其頻繁更新)甚至可以充當(dāng)正則化器,防止模型過于完美地擬合訓(xùn)練數(shù)據(jù)。
八、結(jié)論
那么,這給我們留下了什么呢?讓我們回顧一下:
我們首先深入研究了是什么讓 Stochastic Gradient Descent 成為如此強大和高效的優(yōu)化算法。從梯度下降背后的理論到在 Python 中從頭開始實施 SGD,您已經(jīng)看到了如何在細粒度級別控制和理解此過程中的每個步驟。您已經(jīng)了解到:
SGD 提供了速度和內(nèi)存效率,尤其是在處理大型數(shù)據(jù)集時。
它在神經(jīng)網(wǎng)絡(luò)和依賴快速迭代學(xué)習(xí)的行業(yè)中具有實際應(yīng)用。
雖然有更高級的優(yōu)化器,如 Adam 和 RMSprop,但 SGD 由于其簡單性和靈活性而仍然是最受歡迎的。