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