天天看點

LSTM 與 GRU

總結RNN 兩個變體 (針對梯度消失) LSTM 和 GRU 的特點和應用

弄完這塊, 感覺對于 RNN (遞歸神經網絡) 基本就接近尾聲了. 相對于 之前的卷積神經網絡, 我感覺 RNN 還是相對有意思一些, 也可能是在前面手推 CNN 公式時弄翻車的原因, 以及實在對圖像處理那塊沒啥興趣, 就擱置了. RNN 的應用, 越發現越廣泛, 打算這階段把理論大緻了解後, 代碼走一波. 搞搞什麼對話機器人, 機器翻譯這樣的東西來玩一玩.

回顧LSTM

之前在處理關于 RNN 在梯度消失方面, 引入的 LSTM 這樣的變體, 它的核心在于, 構造有 3個 所謂 "門" gate 的向量, 具體細節我也沒仔細看過, 但中心思想是, 保留早期狀态的資訊 而不是向咱之前的直接進行覆寫.

LSTM 與 GRU

在衆多的RNN變體中, 應用最為廣泛的, 除了 LSTM 還有這裡要談的 GRU.

GRU

Proposed by Cho et al. in 2014 as a simpler alternative to the LSTM.

On the each timestep t, we have input \(x^{(t)}\) and hidden state \(h^{(t)}\)

\(u^{(t)} = \sigma(W_u h^{(t-1)} + U_u x^{(t)} + b_u)\)

\(r^{(t)} = \sigma(W_r h^{(t-1)} + U_r x^{(t)} + b_r)\)

這有點那種 EM 算法的感覺, 計算, 更新, 計算, 更新....

\(\hat h^{(t)} = tanh(W_h (r^{(t) } * h^{(t-1)}) + U_h x^{(t)} + b_h )\)

\(h^{(t)} = (1-u^{(t)}) * h^{(t-1)} + u^{(t)} * \hat h^{(t)}\)

可以看出, GRU 的出發點跟 LSTM 是一樣的, 也是希望能夠記住更長的資訊. 隻不過可以看到, 這裡的 GRU 起碼在公式上, 是要比 LSTM 要簡潔一些的, 同時這也意味着, 其所要維護的參數也相對少的呀.

LSTM 與 GRU

Researches have proposed many gated RNN variants, but LSTM and GRU are the most widely-used. (應用最為廣泛的兩種RNN變體)

The biggest difference is that **GRU is quicker to compute ** and has fewer parameters. (計算快且需要的參數較少, 就與 LSTM 對比, 它的 gate 隻有2個呀)

There is no conclusive evidence (決定性的證據) that one consistently performs better than the other.

LSTM is a good default choice (especially if you data has particularly long dependencies, or you have lots of training data).

Rule or thumb start with LSTM, (一般來說, 可先嘗試用 LSTM) , but switch to GRU if you want something more efficient. (等訓練的結構基本穩定下來了, 可再換為GRU, 這樣模型也會跑得更快哦)

Vanishing / Exploding Grandient

關于這個梯度消失, 梯度爆炸的問題, 其實不僅僅是隻有 RNN 特有的. It can be a problem for all neural architectures (including **feed-forward, convolutional) especially **deep ones. 就咱傳統的 F-B (前向, 後向) 人工神經網絡, 多層的卷積神經網絡, 都是會從存在的, 尤其在深度學習中更加常見.

從網絡結構, 從數學上看, 對于梯度消失, 表明節點間沒有什麼**"關聯性" **了. (導數的實體意義, "變化率"); 而對于梯度爆炸, 則參數很難去更新. (梯度下降法) . 導緻模型都訓練不了啦.

如果要論本質原因, 即現在的網絡訓練都是基于 BP 算法的呀.

  • BP 算法的原理, 就是多元函數求偏導, 這個過程應用到, 求導的鍊式法則
  • Thus lower layers are learnt very slowly (hard to train)

solve

從總體的解決方案上來看呢, 在 BP 訓練中, 有大緻這麼幾種方式來處理.

  • Skip - connections : 讓誤差向後傳播的時候呢, 給跳躍式的傳遞, 而不必一層層地傳
  • Dence connections aka "DenceNet" 後一層直接跟前面的所有層都産生聯系, 讓誤差就一步傳遞過去這樣子.
  • HightWay connections aka "HightWayNet". 思路也差不多, 隻不過在連接配接的時候, 多了些 gate. 現在也不咋用

總之, 結論是: Though vanishing / exploding gradients are a general problem, RNN are particularly unstable due to the repeat multiplication by the same weight matrix . 還是 RNN 這種權值矩陣複用所帶來的讓人又愛又恨的問題呀.

小結

從最初的 RNN 認識其核心的特點, "權值矩陣複用, 和上一個的輸出作為, 下一個狀态的輸入" 來認識這種新的神經網絡, 然後到, 權值矩陣複用, 會帶來, 梯度消失 和 梯度爆炸的問題, 這兩個極端的會讓訓練出來的網絡是錯誤的或者根本訓練不了網絡結構. 因而引出了一些 RNN 的變體, 重點瞧了一波 LSTM 和 GRU. 通過這種很多的 "gate" 的向量, 來儲存 RNN 更早期的狀态資訊, 來試圖解決梯度消失的問題. 而GRU 跟 LSTM 類似, 也是通過這種 gate 的思路 update, reset .. 但GRU 的效率會更高( 畢竟門少了, 參數也少了嘛).

就到這, 後面如果有興趣, 再去看一些更多的變體, 如 雙向的 RNN 和 多層的 RNN . 我其實有瞟過一眼, 感覺有點難..暫時就不搞了..等稍微了解了再補上來吧.

繼續閱讀