最佳化演算法

钰见梵星發表於2024-11-21

最佳化演算法

  1. Batch梯度下降法每次對整個訓練集進行計算,這在資料集很大時計算效率低下,因為每次更新權重前必須先處理整個訓練集。
    可以將訓練集劃分為多個小子集,稱為mini-batch。每次只使用一個mini-batch來計算梯度並更新引數。取出 \(x^{(1)}\)\(x^{(1000)}\),將其組成第一個mini-batch,記作 \(X^{\{1\}}\)。對應的標籤 \(y^{(1)}\)\(y^{(1000)}\) 記作 \(Y^{\{1\}}\)。接下來,依次取出 \(x^{(1001)}\)\(x^{(2000)}\) 等,直到訓練集被分成若干個mini-batch
    如果訓練集共有 \(t\) 個mini-batch,則 \(X^{\{t\}}\) 是第 \(t\) 個子集樣本矩陣,維度為 \((n_x, \text{mini-batch size})\)\(Y^{\{t\}}\) 是第 \(t\) 個子集標籤矩陣,維度為 \((1, \text{mini-batch size})\)
    mini-batch梯度下降法每次訓練會遍歷 \(t\) 個mini-batch,每次更新包括:

    • 從訓練集中取出一個mini-batch \(X^{\{t\}}\)\(Y^{\{t\}}\) 並計算神經網路的預測值 \(A^{\{t\}}\) 以及當前的損失 \(J^{\{t\}}\)。如果使用正則化,計算公式為:

    \[ J^{\{t\}} = \frac{1}{\text{mini-batch size}} \sum_{i=1}^{\text{mini-batch size}} L(\hat{y}^{(i)}, y^{(i)}) + \frac{\lambda}{2 \cdot \text{mini-batch size}} \sum_{l=1}^L ||W^{[l]}||_F^2 \]

    • 計算損失函式 \(J^{\{t\}}\) 對權重 \(W^{[l]}\) 和偏置 \(b^{[l]}\) 的梯度並根據學習率 \(\alpha\) 更新權重和偏置。

    完成一整個訓練集的遍歷,可以稱為1代(epoch),通常需要多次epoch來使模型收斂。當資料規模非常大時,mini-batch梯度下降法會比batch梯度下降法訓練更快。

  2. 使用batch梯度下降法時,每次迭代都需要遍歷整個訓練集,因此每次迭代代價函式都會下降。

    如果使用mini-batch梯度下降,每次迭代的代價函式並不一定是單調下降的,會存在很多的噪聲,但整體趨勢是下降的。

    https://i.iter01.com/images/c135a2d0ea19057ef906424d9b677070baa5be8a36bce50fdd9e7a951c286ff3.png

  3. 如果mini-batch size等於 \(m\),那麼就等價於batch梯度下降法。這種情況下每次迭代處理整個資料集,計算開銷大,單次迭代耗時過長,尤其是在樣本數目巨大時。

    如果mini-batch size等於1,那麼就等價於隨機梯度下降法。雖然每次迭代處理一個樣本,計算開銷小,但會喪失向量化的加速優勢,且計算噪聲較大,最佳化路徑易波動且不收斂。

    為綜合計算效率和最佳化效果,mini-batch size通常選擇一個介於1和 \(m\) 之間的值。

    當樣本數量小於2000時,直接使用batch梯度下降法即可,因處理整個資料集的開銷較低,無需拆分成 mini-batch。

    當樣本數量較大時,mini-batch size一般取64,128,256,512這幾個2的冪次方值,因為計算裝置在處理這種尺寸時最佳化效果更好。

    mini-batch size還應該適配硬體的CPU/GPU記憶體容量。如果 mini-batch size 超過記憶體限制,計算效能將嚴重下降,可能導致程式無法執行。實驗時可以嘗試不同的mini-batch size,觀察哪個值能夠以最高效率最佳化成本函式。

  4. 指數加權移動平均是一種平滑時間序列的方法,透過賦予近期資料點更大的權重,來計算一段時間內的均值,其公式為:

    \[v_t=\beta v_{t-1}+(1-\beta)\theta_t \]

    其中 \(v_t\) 是第 \(t\) 時刻的加權平均值, \(\theta_t\) 是第 \(t\) 時刻的觀測值, \(\beta\) 是平滑係數,取值範圍為 \(0 \leq \beta < 1\),通常接近於1。

    \(v_t\) 近似表示過去 \(\frac{1}{1-\beta}\) 個時刻的加權均值。 \(\beta\) 越大,平滑效果越顯著,但響應新變化的速度會降低(曲線更平穩但滯後)。 \(\beta\) 越小,對資料變化會更敏感。

    https://i.iter01.com/images/2ae97ca73a67031ebebb2df6d505b73c24f076a0dc6d2cc69daa8acd404007f7.png

    在程式碼中,可以透過以下迴圈公式逐步更新 \(v_t\)

    \[v_{t}=\beta v_{t-1} + (1-\beta) \theta_t \]

    在一開始, \(v_0=0\),因此 \(v_1=(1-\beta)\theta_1\),會出現冷啟動的問題。如圖中紫色曲線所示,在一開始均值會明顯低於正常值。

    https://i.iter01.com/images/0aa644d37b7c077868c355d272bf9816ef6981e68c23b55e1647827b39708d9b.png

    為了修正初始階段的偏差,使用以下公式:

    \[v_t=\frac{\beta v_{t-1}+(1-\beta)\theta_t}{1-\beta^t} \]

    其中修正項 \(1-\beta^t\) 隨時間 \(t\) 增加逐漸趨近於 1,因此當 \(t\) 較大時,偏差修正的作用逐漸減弱。隨時間推移,紫色曲線(真實均值曲線)逐漸與修正均值曲線(綠色)重合。

  5. 在最佳化某些狹長形狀的成本函式時,梯度下降法會出現顯著的震盪問題,尤其是在縱軸方向上(例如陡峭方向),這會減緩收斂速度。然而,橫軸方向的梯度更新通常較為平穩,並符合最佳化的總體趨勢。

    https://i.iter01.com/images/c52fa83601a957208b506a12807178b7e1fa91825dd0dec427839c46feb958e9.png

    為了減小縱軸方向的震盪,同時保持橫軸方向的學習趨勢,動量梯度下降法(Momentum Gradient Descent)被提出。其核心思想是透過對歷史梯度進行指數加權移動平均,消除震盪頻繁的高頻梯度分量(縱軸正負振盪相互抵消),從而加速收斂。

    動量梯度下降法透過以下步驟更新引數:

    \[\text{Compute dW,db on the current mini-batch} \\ V_{d\omega} = \beta V_{d\omega} + (1-\beta)d\omega \\ V_{db}= \beta V_{db} + (1-\beta)db \\ \omega = \omega - \alpha V_{dw} \quad b=b-\alpha V_{db} \]

    其中,\(\beta\) 為動量超引數,通常取值為 0.9。若最佳化過程中震盪較嚴重,可以稍微增大 \(\beta\);若最佳化過於平滑,可能需要降低 \(\beta\)。動量法中一般不對動量項進行偏差修正,因為影響較小。
    在縱軸方向上,由於正負梯度交替,指數加權平均使動量值趨於零,從而顯著減小震盪。在橫軸方向上,梯度更新方向一致,動量疊加加速收斂。動量法的平滑效果使引數更新軌跡更加穩定,接近成本函式最優解時收斂速度更快。

  6. 除了動量梯度下降法外,均方根傳滴(RMSProp)也可以加速梯度下降,透過自適應調整不同方向上的學習率,避免過大的更新步長,從而加速收斂。RMSProp 的關鍵思想是對每個引數的梯度平方進行指數加權移動平均,用於調整學習率的分母,使學習率在陡峭方向縮小,而在平緩方向保持較大。

    RMSProp透過以下步驟更新引數:

    \[\text{Compute dW,db on the current mini-batch} \\ S_{d\omega}=\beta_2S_{d\omega}+(1-\beta_2)d\omega^2 \\ S_{db}=\beta_2S_{db}+(1-\beta_2)db^2 \\ \omega = \omega -\alpha \frac{d\omega}{\sqrt{S_{d\omega}}+\epsilon} \\ b = b -\alpha \frac{db}{\sqrt{S_{db}}+\epsilon} \]

    這裡的 \(\beta_2\) 為控制歷史平均的超引數,但區分於動量梯度下降法中的超引數 \(\beta\)\(\epsilon\) 是一個極小值,用於防止分母除零。

    陡峭方向的梯度較大,其平方值在移動平均中占主導地位,使得分母較大,從而減小該方向上的更新步長,避免震盪。平緩方向的梯度較小,其平方值使分母較小,從而增大該方向的更新步長,加速收斂。

  7. Adam(Adaptive Moment Estimation)自適應矩估計最佳化演算法是一種結合了動量梯度下降法(Momentum)均方根傳遞(RMSProp)思想的最佳化演算法,具有兩者的優點:動量法的加速收斂和平滑軌跡,以及 RMSProp 的自適應學習率調整。Adam 在深度學習中非常流行,因為它對超引數的依賴較少且具有良好的收斂效能,適用於稀疏梯度和高噪聲問題。
    Adam 同時維護兩個變數:梯度的動量(第一矩估計),透過對梯度的指數加權平均,積累方向性資訊,平滑最佳化過程。梯度平方的均值(第二矩估計),記錄梯度平方的加權平均,自適應調整學習率大小。

    \[ V_{d\omega}=0 \quad S_{d\omega}=0 \quad V_{db}=0 \quad S_{db}=0 \\ \text{Compute dW,db on the current mini-batch} \\ V_{d\omega} = \beta_1 V_{d\omega} + (1-\beta_1)d\omega \\ V_{db}= \beta_1 V_{db} + (1-\beta_1)db \\ S_{d\omega}=\beta_2S_{d\omega}+(1-\beta_2)d\omega^2 \\ S_{db}=\beta_2S_{db}+(1-\beta_2)db^2 \\ V_{d\omega}^{\text{corrected}}=\frac{V_{d\omega}}{1-\beta_1^t} \quad V_{db}^{\text{corrected}}=\frac{V_{db}}{1-\beta_1^t} \\ S_{d\omega}^{\text{corrected}}=\frac{S_{d\omega}}{1-\beta_2^t} \quad S_{db}^{\text{corrected}}=\frac{S_{db}}{1-\beta_2^t} \\ \omega = \omega -\alpha \frac{V_{d\omega}^{\text{corrected}}}{\sqrt{S_{d\omega}^{\text{corrected}}}+\epsilon} \\ b = b -\alpha \frac{V_{db}^{\text{corrected}}}{\sqrt{S_{db}^{\text{corrected}}}+\epsilon} \]

    在Adam演算法中,一般取 \(\beta_1=0.9\)\(\beta_2=0.999\)\(\epsilon=10^{-8}\)

    但是在某些情況下,Adam 的動態學習率可能導致未能找到最優解。而且Adam針對深度學習中的非凸目標更有效,但對於嚴格凸最佳化問題可能表現不如 SGD。

  8. 在深度學習中,學習率是控制每次引數更新步長的關鍵超引數。為了兼顧初期快速收斂和後期精細調整,學習率衰減被廣泛應用。初期學習率較大,加速學習速度;隨著訓練的進行,學習率逐漸減小,從而在接近最優解時更穩定地最佳化目標函式。
    常用的學習率衰減策略:

    • 基於迭代的衰減。學習率隨著訓練代數逐漸減小。

      \[ \alpha = \frac{\alpha_0}{1 + \text{decayRate} \times \text{epochNumber}}. \]

      引數: \(\alpha_0\) 初始學習率, \(\text{decayRate}\) 學習率衰減率, \(\text{epochNumber}\) 當前訓練代數。

    • 指數衰減。學習率按指數規律衰減,簡單易用,且衰減速度較快,適用於較短的訓練過程。

      \[\alpha = \alpha_0 \times \gamma^{\text{epochNumber}}, \quad \gamma < 1. \]

      \(\gamma\) 是衰減因子(例如 \(\gamma = 0.95\) 表示每輪訓練學習率縮小為原來的 95%)。

    • 分段衰減。在訓練的特定階段手動調整學習率。適合需要靈活控制學習率的場景,能夠手動調整需要監控模型效能。

      \[\alpha = \begin{cases} \alpha_0 & \text{if } \text{epochNumber} < \text{step1}, \\ \alpha_0 / k & \text{if } \text{step1} \leq \text{epochNumber} < \text{step2}, \\ \alpha_0 / k^2 & \text{if } \text{epochNumber} \geq \text{step2}. \end{cases} \]

    • 基於效能的學習率調整。透過監控模型效能(如驗證集損失或精度)動態調整學習率。若驗證集損失在一段時間內不下降,則減小學習率。

    如果學習率衰減過快,可能導致模型在找到區域性最優解前停止最佳化。如果學習率衰減過慢,可能會浪費計算資源,甚至陷入震盪。

  9. 在深度學習研究早期,人們擔心最佳化演算法會被困在區域性最優值,無法找到全域性最優值。這種直覺主要來源於低維空間的損失函式影像。在這些低維影像中,區域性最優點分佈廣泛,最佳化演算法可能停留在某個區域性最優點無法跳出。
    在高維空間(如 2 萬維引數的神經網路)中,梯度為零的點並不一定是區域性最優點,而是更有可能是鞍點。在某些方向是凸的(曲線向上彎曲),而在另一些方向是凹的(曲線向下彎曲)。在高維空間中,滿足所有方向均為區域性最優點的機率極低,甚至接近於 \(2^{-20000}\)
    平穩段是指梯度接近於零的一塊區域。在這一區域內,最佳化演算法會學習得非常緩慢。在平穩段中,演算法需要依靠微弱的隨機擾動(如噪聲)才能走出平穩段,找到下坡的路徑。
    動量梯度下降(Momentum)、均方根傳遞(RMSProp)、Adam 等最佳化演算法透過動態調整更新方向和步長,可以加速穿越平穩段。隨機擾動和高維引數空間的特性也使得最佳化演算法能夠逐步擺脫平穩段,繼續下降。

相關文章