上海網(wǎng)站建設sheji021廣州網(wǎng)站排名優(yōu)化公司
鶴壁市浩天電氣有限公司
2026/01/24 14:05:09
上海網(wǎng)站建設sheji021,廣州網(wǎng)站排名優(yōu)化公司,佛山多語網(wǎng)站制作,網(wǎng)站做分屏好不好目錄
動量法 是什么#xff1f;
從數(shù)學上理解
案例#xff1a;尋找最佳學習節(jié)奏
公式推導與解析
1. 基礎梯度下降回顧
2. 引入動量項
3. 物理意義與優(yōu)勢
擴展#xff1a;NAG (Nesterov Accelerated Gradient)
優(yōu)缺點和適用場景
完整代碼示例#xff1a;在回歸問題…目錄動量法 是什么從數(shù)學上理解案例尋找最佳學習節(jié)奏公式推導與解析1. 基礎梯度下降回顧2. 引入動量項3. 物理意義與優(yōu)勢擴展NAG (Nesterov Accelerated Gradient)優(yōu)缺點和適用場景完整代碼示例在回歸問題中對比SGD與動量法有小伙伴在學優(yōu)化算法時問梯度下降已經(jīng)有了隨機版本為什么還需要動量法它到底解決了什么問題今天我們就來深入聊聊動量法Momentum看看它是如何讓梯度下降變得更“聰明”、更穩(wěn)定的。首先動量法是一種在梯度下降基礎上引入“慣性”思想的優(yōu)化算法。它的目標是加速收斂并減少優(yōu)化過程中的振蕩讓參數(shù)更新更加平滑。下面我們從一個生活化的比喻開始逐步展開。動量法 是什么想象你在下山目標是盡快到達山谷最低處。普通的下山方式是看眼前最陡的方向直接邁一步。普通梯度下降GD/SGD就像每走一步都重新判斷方向。如果地面坑洼不平梯度有噪聲你的路徑就會左搖右擺走得很慢甚至可能在溝壑里來回震蕩。動量法Momentum給你一個帶輪子的滑板。你當前要前進的方向不僅由這一步看到的坡度決定還會受到之前速度動量的影響。這樣在平緩地帶你會加速遇到反向坡度時慣性也能幫你沖過去一部分減少擺動整體路徑更平滑、更快地指向山谷。從數(shù)學上理解動量法旨在最小化目標函數(shù) L(θ)其更新規(guī)則在梯度下降的基礎上增加了動量項θ模型參數(shù)。?θL(θt)當前時刻的梯度。η學習率控制當前梯度的影響。β動量系數(shù)通常取0.9左右控制歷史動量速度的保留比例。vt當前時刻的更新速度它累積了歷史梯度的方向。核心思想當前的更新方向是“歷史方向”與“當前梯度方向”的加權(quán)組合。這有助于在梯度方向連續(xù)一致的方向上加速在梯度方向頻繁變化的方向上抑制振蕩。案例尋找最佳學習節(jié)奏假設你在調(diào)整學習計劃中“每日做題數(shù)”和“每日復習小時數(shù)”兩個參數(shù)目標是讓學習效率最高。效率損失函數(shù)為理想狀態(tài)是 題20, 時3此時損失最小。模擬計算對比SGD和動量法為了對比我們先看SGD的更新過程學習率 η0.1η0.1初始化題 5, 時 1。計算梯度?L?題2(5?20)?30?題?L?2(5?20)?30?L?時2(1?3)?4?時?L?2(1?3)?4。SGD更新題 5 - 0.1*(-30) 8.0 時 1 - 0.1*(-4) 1.4。接下來我們使用動量法設 β0.9,η0.1β0.9,η0.1初始化參數(shù)題 5, 時 1。初始化速度v題0,v時0v題?0,v時?0。計算當前梯度同上g題?30,g時?4g題??30,g時??4。更新速度v題0.9?00.1?(?30)?3.0v題?0.9?00.1?(?30)?3.0v時0.9?00.1?(?4)?0.4v時?0.9?00.1?(?4)?0.4更新參數(shù)題 5 - (-3.0) 8.0時 1 - (-0.4) 1.4第一步結(jié)果看似與SGD相同因為初始速度為0。進行第二步迭代當前參數(shù)題8.0, 時1.4。計算新梯度g題2(8.0?20)?24.0g題?2(8.0?20)?24.0g時2(1.4?3)?3.2g時?2(1.4?3)?3.2SGD更新題 8.0 - 0.1*(-24) 10.4 時 1.4 - 0.1*(-3.2) 1.72。動量法更新速度v題0.9?(?3.0)0.1?(?24.0)?2.7?2.4?5.1v題?0.9?(?3.0)0.1?(?24.0)?2.7?2.4?5.1v時0.9?(?0.4)0.1?(?3.2)?0.36?0.32?0.68v時?0.9?(?0.4)0.1?(?3.2)?0.36?0.32?0.68動量法更新參數(shù)題 8.0 - (-5.1) 13.1時 1.4 - (-0.68) 2.08對比可見在第二步動量法由于累積了第一步的梯度速度-3.0在參數(shù)“題”上的更新幅度(-5.1)遠大于SGD的更新幅度(-2.4)從而更快地朝著最優(yōu)值20靠近。這就是“動量”帶來的加速效果。公式推導與解析1. 基礎梯度下降回顧標準梯度下降更新它只考慮當前時刻的梯度。2. 引入動量項為了模擬物理中的動量我們引入速度變量 vt?其更新是指數(shù)移動平均為了簡化并與常見形式一致令 αη并將(1?β)吸收進學習率或直接采用另一種常見表述參數(shù)更新為3. 物理意義與優(yōu)勢將 vt 展開更新方向是當前梯度與歷史梯度的加權(quán)和。越近的梯度權(quán)重越大。加速收斂在損失函數(shù)曲面在某個方向持續(xù)下降梯度方向一致時動量會不斷累積更新速度越來越快。抑制振蕩在梯度方向變化頻繁如峽谷形曲面的方向上正負梯度會部分抵消使得更新幅度變小路徑更穩(wěn)定。擴展NAG (Nesterov Accelerated Gradient)動量法的一個改進版本是NAG它“向前看”一步NAG先根據(jù)累積速度“預覽”下一步的參數(shù)位置然后計算該預覽位置的梯度再進行更新。這使得它在面對即將變化的梯度時能更早地做出調(diào)整理論上有更好的收斂性。優(yōu)缺點和適用場景優(yōu)點加速收斂在目標函數(shù)呈狹長峽谷狀或存在平緩區(qū)域時能顯著加快訓練速度。減少振蕩平滑優(yōu)化路徑使訓練過程更穩(wěn)定有助于使用更大的學習率。有助于跳出局部極小動量帶來的“慣性”可能幫助參數(shù)沖過一些狹窄的局部極小點。缺點引入超參數(shù)需要調(diào)整動量系數(shù) β通常為0.9但最優(yōu)值可能因問題而異??赡?overshooting在極陡的梯度面前過大的動量可能導致更新過頭在最優(yōu)值附近震蕩甚至發(fā)散。適用場景高維非凸優(yōu)化如深度學習特別是網(wǎng)絡層數(shù)較深時。梯度噪聲較大或方向不一致當數(shù)據(jù)存在噪聲或Mini-batch較小時動量能起到平滑作用。追求更快的訓練速度在資源有限的情況下希望用更少的迭代次數(shù)達到可接受的損失。完整代碼示例在回歸問題中對比SGD與動量法下面我們用一個簡單的線性回歸問題來可視化對比普通SGD和帶動量的SGD的優(yōu)化軌跡。import numpy as np import matplotlib.pyplot as plt # 1. 生成模擬數(shù)據(jù) np.random.seed(42) # 真實參數(shù)w_true 2.5, b_true 1.0 X 2 * np.random.rand(100, 1) y 2.5 * X 1.0 np.random.randn(100, 1) * 0.5 # 添加噪聲 # 2. 定義損失函數(shù)均方誤差和梯度 def compute_gradients(X, y, w, b): m len(X) y_pred X * w b dw (-2/m) * np.sum(X * (y - y_pred)) db (-2/m) * np.sum(y - y_pred) return dw, db # 3. 定義優(yōu)化器 def sgd_optimizer(w, b, dw, db, lr): w_new w - lr * dw b_new b - lr * db return w_new, b_new def momentum_optimizer(w, b, dw, db, lr, beta, v_w, v_b): v_w beta * v_w lr * dw v_b beta * v_b lr * db w_new w - v_w b_new b - v_b return w_new, b_new, v_w, v_b # 4. 訓練參數(shù)設置 lr 0.1 beta 0.9 n_iterations 50 # 初始化參數(shù)兩者起點相同 w_sgd, b_sgd np.random.randn(2) * 5 # 隨機初始化 w_mom, b_mom w_sgd, b_sgd v_w, v_b 0, 0 # 動量速度初始化為0 # 用于記錄軌跡 path_sgd [(w_sgd, b_sgd)] path_mom [(w_mom, b_mom)] # 5. 執(zhí)行訓練 for i in range(n_iterations): # 計算梯度使用全量數(shù)據(jù)簡化演示 dw, db compute_gradients(X, y, w_sgd, b_sgd) # SGD 更新 w_sgd, b_sgd sgd_optimizer(w_sgd, b_sgd, dw, db, lr) path_sgd.append((w_sgd, b_sgd)) # 動量法更新 (需要重新計算當前參數(shù)的梯度) dw_m, db_m compute_gradients(X, y, w_mom, b_mom) w_mom, b_mom, v_w, v_b momentum_optimizer(w_mom, b_mom, dw_m, db_m, lr, beta, v_w, v_b) path_mom.append((w_mom, b_mom)) # 轉(zhuǎn)換為數(shù)組方便繪圖 path_sgd np.array(path_sgd) path_mom np.array(path_mom) # 6. 可視化優(yōu)化軌跡 plt.figure(figsize(12, 5)) # 子圖1參數(shù)空間軌跡 plt.subplot(1, 2, 1) # 繪制損失函數(shù)等高線近似 W_grid, B_grid np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100)) Loss np.zeros_like(W_grid) for i in range(W_grid.shape[0]): for j in range(W_grid.shape[1]): Loss[i,j] np.mean((y - X * W_grid[i,j] - B_grid[i,j])**2) plt.contour(W_grid, B_grid, Loss, levels30, alpha0.5) plt.scatter(2.5, 1.0, cred, s100, marker*, labelTrue Optimum (w2.5, b1.0)) plt.plot(path_sgd[:,0], path_sgd[:,1], o-, labelSGD Path, linewidth2, markersize4) plt.plot(path_mom[:,0], path_mom[:,1], s-, labelMomentum Path, linewidth2, markersize4) plt.xlabel(Weight (w)) plt.ylabel(Bias (b)) plt.title(Optimization Path in Parameter Space) plt.legend() plt.grid(True, alpha0.3) # 子圖2損失下降曲線 plt.subplot(1, 2, 2) loss_sgd [np.mean((y - X * w - b)**2) for w, b in path_sgd] loss_mom [np.mean((y - X * w - b)**2) for w, b in path_mom] plt.plot(range(len(loss_sgd)), loss_sgd, labelSGD Loss) plt.plot(range(len(loss_mom)), loss_mom, labelMomentum Loss) plt.xlabel(Iteration) plt.ylabel(Mean Squared Error Loss) plt.title(Loss Convergence Curve) plt.legend() plt.grid(True, alpha0.3) plt.tight_layout() plt.show()代碼說明與結(jié)果解讀左圖參數(shù)空間軌跡背景等高線代表損失函數(shù)值中心紅五星為全局最優(yōu)點。SGD圓點線的更新路徑曲折呈“鋸齒狀”緩慢靠近最優(yōu)點。動量法方塊線的路徑明顯更加平滑、直接更快地指向最優(yōu)點體現(xiàn)了動量在一致梯度方向上的加速效果。右圖損失下降曲線動量法橙色的損失值下降速度整體快于普通SGD藍色尤其是在初期收斂更快。通過這個對比實驗可以直觀地看到動量法如何優(yōu)化梯度下降的過程使其更高效、更穩(wěn)定