博客 / 詳情

返回

吳恩達深度學習課程二: 改善深層神經網絡 第二週:優化算法(四)RMSprop

此分類用於記錄吳恩達深度學習課程的學習筆記。
課程相關信息鏈接如下:

  1. 原課程視頻鏈接:[雙語字幕]吳恩達深度學習deeplearning.ai
  2. github課程資料,含課件與筆記:吳恩達深度學習教學資料
  3. 課程配套練習(中英)與答案:吳恩達深度學習課後習題與答案

本篇為第二課的第二週內容,2.7的內容。


本週為第二課的第二週內容,和題目一樣,本週的重點是優化算法,即如何更好,更高效地更新參數幫助擬合的算法,還是離不開那句話:優化的本質是數學
因此,在理解上,本週的難道要相對較高一些,公式的出現也會更加頻繁。
當然,我仍會補充一些更基礎的內容來讓理解的過程更絲滑一些。
本篇的內容關於RMSprop,同樣是應用了指數加權平均邏輯的一種優化算法。

1. RMSprop 算法

在上一部分中,我們通過 Momentum 解決了“方向震盪”的問題:

它利用 EMA 平滑梯度的方向,讓模型在主方向上走得更快,在亂方向上走得更穩。

但這時,其實還有一個問題沒解決:
不同參數的梯度幅度差異巨大,導致統一學習率無法同時適應所有參數。
這句話是什麼意思?我們開始展開闡述:

1.1 參數間的梯度差異現象

在訓練神經網絡時,我們希望通過梯度下降不斷更新參數:

\[W := W - \alpha \cdot \frac{\partial L}{\partial W} \]

但實際運行中會存在一種很難發現的問題,因為它並不明顯,而是隱藏在傳播內部:
不同參數的梯度幅度差異巨大,導致統一學習率無法同時適應所有參數。
造成這種現象的原因大致有以下幾類:

  • 不同輸入特徵的“數值範圍”不同。
  • 接近輸入的梯度更容易變小。
  • 偏置與權重的梯度規模天然不同。
    我們用幾個實例來理解一下這種現象:

(1)輸入特徵的數值範圍差異造成梯度差異

我們來看一組線性組合:

\[y = W_1 x_1 + W_2 x_2 \]

現在假設:

  • \(x_1\) 的範圍是 1~10
  • \(x_2\) 的範圍只有 0.0001~0.001
    我們知道:

\[\frac{\partial L}{\partial W} \propto x (權重的梯度和輸入成正相關) \]

也就是説,量級較小的輸入一定會得到量級較小的梯度。
因此就可能得到以下梯度:

\[\frac{\partial L}{\partial W_1} = 5.3 \]

\[\frac{\partial L}{\partial W_2} = 0.00042 \]

可以發現:兩者差了上萬倍
這時,對二者應用統一學習率就會出現:

  • 梯度大的參數更新飛快,容易發散
  • 梯度小的參數幾乎不動
    在這種情況下,如果 \(x_2\) 反而是核心特徵,那這個參數的梯度消失是不是就嚴重阻礙了擬合?

雖然但是,實際上,我們之前就已經介紹了這種問題的解決方法,那就是歸一化。
我們之前就介紹過,歸一化在保持特徵信息的同時消除上面提到的量綱差距
我們用之前學到標準化再次處理這個例子看看:
假設我們對輸入做了標準化,將兩項輸入都轉化為均值 0、方差 1 的數據:

  • 標準化後的 \(x_1\) 分佈在 \([-1,1]\) 附近
  • 標準化後的 \(x_2\) 也分佈在 \([-1,1]\) 附近
    此時,兩者的尺度不再相差上萬倍,重新計算梯度:

\[\frac{\partial L}{\partial W_1} \approx 0.84 \]

\[\frac{\partial L}{\partial W_2} \approx -1.13 \]

這兩個梯度的量級已經處於同一數量級,這樣一來:

  • 用統一學習率更新時不再一快一慢
  • 所有參數都能被“公平地”學習
  • 梯度不再因為輸入值差異而畸形縮小或放大
    可以看到,歸一化確實解決了“輸入尺度不同 → 梯度差異巨大”的問題

那RMSprop是不是還沒出現就沒用了?不至於不至於。

因為,歸一化只能解決輸入特徵量級差別導致的梯度差異,而梯度差異不只來自輸入數據的尺度,還來自網絡結構與梯度自身的性質。
我們繼續看下面幾個例子:

(2)網絡中層級間的梯度差異

我們用最簡單的舉例,假如現在有這樣一個邏輯迴歸網絡:

\[a^{(1)} = W^{(1)} x \]

\[\hat y = W^{(2)} a^{(1)} \]

而我們知道,在多層網絡結構中,梯度的計算是通過鏈式法則來傳遞的,而經過從後向前的層層相乘,網絡中靠前層的參數梯度和靠後層的參數梯度就會出現較大差異。
在這種情況下,我們假定這樣一個可能的梯度情況:

\[\frac{\partial L}{\partial W^{(1)}} = 0.00003 \quad \text{(靠近輸入層,梯度很小)} \]

\[\frac{\partial L}{\partial W^{(2)}} = 1.2 \quad \text{(靠近輸出層,梯度較大)} \]

差距可能超過幾千倍。
這時,對二者應用統一學習率就會出現:

  • 梯度大的層更新快,甚至梯度爆炸
  • 梯度小的層更新慢,可能幾乎不動,梯度消失。
  • 模型整體收斂受阻,尤其前層學習慢會影響特徵提取

那這時候就需要 RMSProp 登場了?還得等等。
回想一下,針對這種層層傳播導致的梯度差異,我們是不是還介紹了一種技術,叫權重初始化?
權重初始化即通過控制權重的方差,讓信號方差保持恆定,這樣既避免了梯度爆炸,又避免了梯度消失。
可是,權重初始化可以像歸一化解決輸入數據差異一樣完全解決層間傳播差異嗎?

很可惜答案是不能,我們再展開一下:
權重初始化(如 Xavier/He 等)的主要目的是:控制信號方差在前向傳播時不爆炸或消失這樣可以保證前向傳播的輸出方差大致和輸入方差相當,避免信號在網絡中逐層放大或縮小。
而我們剛剛又提過,反向傳播的梯度是鏈式相乘的,如果每一層權重方差合適,梯度也能大致保持穩定,所以權重初始化可以降低深層網絡訓練早期出現梯度爆炸或消失的概率

這是權重初始化能起到的正面效果,現在我們來看看它的不足之處,即為什麼權重初始化不能完全保證訓練中梯度恆定?

  1. 梯度依賴於訓練中的權重:初始化只是訓練的起點,隨着迭代,權重會不斷更新,可能偏離初始分佈,如果權重變得過大或過小,梯度仍可能出現爆炸或消失。
  2. 非線性激活函數的影響:ReLU、sigmoid、tanh 等激活函數會改變信號方差,例如 sigmoid 的輸出在飽和區,梯度幾乎為零。因此,即便初始化合適,深層網絡仍可能出現梯度消失。
  3. 梯度放大或縮小的累積效應始終存在:鏈式法則讓每層梯度相乘,當網絡很深時,即便每層梯度稍微偏大或偏小,累積起來也會導致前層梯度消失或爆炸。
    因此,針對層間的梯度差異現象,我們仍需要解決方法。

(3)權重梯度和偏置梯度的天然規模差異

在我們現在所學的內容裏,我們知道:

\[dW = \frac{1}{m} X^T dZ \]

\[db = \frac{1}{m} \sum_{i=1}^{m} dZ^{(i)} \]

也就是説,權重梯度取決於輸入 \(x\),偏置梯度只與誤差相關。
因此,就可能出現這種情況:

\[\frac{\partial L}{\partial W} = 0.8 \]

\[\frac{\partial L}{\partial b} = 0.03 \]

偏置更新會慢很多,因此,同一個學習率也不適合它們倆。
而這種梯度性質本身導致的差異,我們目前還不知道怎麼處理。

1.2 RMSprop 算法

經過上面一大段的鋪墊,我們已經知道了“不同參數的梯度幅度差異巨大,導致統一學習率無法同時適應所有參數” 這句話的含義。
千呼萬喚始出來,我們來看看RMSprop 算法是如何解決這個問題的。

RMSProp(Root Mean Square Propagation)提出了按參數自適應調整梯度的思路,它的核心目標是:對梯度小的參數放大步長,讓它們加快學習;對梯度大的參數縮小步長,避免爆炸。
現在來詳細展開一下:

(1)梯度平方的指數加權平均

RMSProp 為每個參數維護一個梯度平方的EMA變量: \(S_t\)

\[S_t = \beta S_{t-1} + (1-\beta) g_t^2 \]

  • \(g_t\):當前梯度
  • \(\beta\):衰減因子或平滑係數,通常取 0.9
  • \(S_t\):記錄梯度歷史大小的“記憶”,刻畫了參數梯度的量級
    這一步的作用是:**用歷史梯度平方的平均來衡量該參數“走得快不快”。

(2)按參數自適應縮放學習率

現在的參數更新公式為:

\[\theta_{t+1} = \theta_t - \frac{\alpha}{\sqrt{S_t + \epsilon}} g_t \]

  • \(\alpha\):基礎學習率
  • 分母 \(\sqrt{S_t + \epsilon}\)將梯度幅度大的參數步長縮小,梯度幅度小的參數步長放大
  • \(\epsilon\):防止除零,通常取 \(10^{-8}\)
    其核心思想是:動態縮放每個參數的步長,使得梯度大小差異不會導致更新過快或過慢。
    只擺公式還是不太清晰,我們舉一個實例來看看效果。

(3)RMSProp 的應用實例

我們還是用最開始的例子,來看看使用RMSProp的過程:

參數 當前梯度 \(g\) 歷史均方 \(S_t\) RMSProp 步長 \(\alpha/\sqrt{S_t}\) 更新量
\(W^{(2)}\) 1.2 1.44 0.01 0.012
\(W^{(1)}\) 0.00003 0.0000001 100 0.003
\(b\) 0.03 0.0009 1.05 0.0315

可以發現:

  • 梯度大的 \(W^{(2)}\) 被自動“抑制”,避免發散
  • 梯度小的 \(W^{(1)}\) 被放大,避免前層學習過慢
  • 偏置 \(b\) 的更新量也被合理調節,收斂速度更統一

現在就可以看到,RMSProp 有效解決了我們之前討論的三類梯度差異問題

  • 輸入尺度差異(歸一化+RMSProp)
  • 層間梯度差異(權重初始化+RMSProp)
  • 權重與偏置梯度差異(RMSProp 自適應縮放)

厲不厲害你RMSProp?
好了,最後再看看RMSProp和上一篇中Momentum的對比。

(4)RMSProp 與 Momentum 的對比

特性 Momentum RMSProp
解決問題 梯度方向震盪 參數間梯度幅度差異,步長自適應
核心機制 指數加權平均梯度方向 指數加權平均梯度平方,按參數縮放步長
適用場景 梯度方向不穩定的深層網絡 梯度量級差異大或深層網絡訓練
學習率 全局統一 每個參數自適應

有沒有發現,這兩個優化算法好像並不衝突?
那我可不可以把Momentum 和 RMSProp 結合使用

  • Momentum 負責加速收斂主方向
  • RMSProp 負責動態調節步長

那麼你就得到了目前可以説是最常用的優化器:Adam 優化算法,我們下一篇就會展開介紹它。

2."人話版總結"

概念 原理 比喻
梯度差異問題 不同參數的梯度大小差別太大,同一個學習率對每個參數都不合適:有人走太快差點摔下山,有人走太慢一直原地踏步。 一羣人下山,有人腿長一步五米,有人腿短一步十釐米;統一步長根本不公平。
RMSProp 的核心思想 給每個參數量身定製學習率:梯度大的 → 走慢點不摔;梯度小的 → 放大步子走快點。 給腿太長的人綁沙袋,讓他慢點;給腿短的人裝彈簧,讓他快點。
梯度平方的 EMA 記錄參數過去的“梯度大小平均值”,用來判斷它平常走得快還是慢。 給每個人戴個運動手環,看他過去走路多快。
按參數縮放學習率 步長公式變成:大梯度 → 被除以大數 → 變小;小梯度 → 被除以小數 → 變大。 走太快的人車速被限速,老慢的人給他開綠色通道。
解決輸入尺度差異 特徵太大導致梯度大、特徵太小導致梯度小 → RMSProp 自動調節。 富二代每次花錢花太快 → 限額;窮小孩花太慢 → 提額。
解決層間梯度衰減 前層梯度本來就小,RMSProp 會自動給它“放大步長”。 隊伍最後的人落後太多 → RMSProp 給他上電動車。
解決權重 vs 偏置差異 偏置的梯度常常比較小 → 自動放大;權重有時很大 → 自動縮小。 偏置像個小孩 → 給他增高墊;權重像大人 → 給他減速帶。
Momentum vs RMSProp Momentum 解決“方向亂”;RMSProp 解決“步子不均勻”。 Momentum = 幫你穩方向;RMSProp = 幫你調步幅。
兩者能否結合? 可以,而且非常常用 → Adam = Momentum + RMSProp。 Momentum 是指南針,RMSProp 是鞋子;Adam 直接給你導航 + 智能跑鞋。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.