在6.28號我發了一個博客《RNN(循環神經網絡)與LSTM(長短期記憶網絡)輸出的詳細對比分析》,但是我并未詳細講解LSTM,LSTM是循環神經網絡中的一個模型,然而通過這篇博客給大家深度解析一下LSTM,重點關注其內部結構和參數。
LSTM是為了解決標準RNN在處理長序列時出現的梯度消失/爆炸問題而設計的一種特殊循環神經網絡結構。它的核心在于引入了門控機制和細胞狀態,使得網絡能夠有選擇地記住或忘記信息。
核心思想:解決長期依賴問題
-
標準RNN的問題:?RNN通過循環隱藏層處理序列。計算梯度時(如通過BPTT),梯度會隨著時間步長呈指數級衰減(消失)或增長(爆炸),導致網絡難以學習到序列中遠距離元素之間的依賴關系。
-
LSTM的解決方案:
-
細胞狀態:?引入一條貫穿整個序列的“信息高速公路”,稱為細胞狀態。這個狀態的設計使得信息可以在其中相對無損地流動較長的距離。
-
門控機制:?使用三個“門”(由Sigmoid神經網絡層和逐點乘法操作組成)來精細調控細胞狀態:
-
遺忘門:?決定從細胞狀態中丟棄哪些舊信息。
-
輸入門:?決定將哪些新信息寫入細胞狀態。
-
輸出門:?決定基于當前的細胞狀態輸出什么信息到隱藏狀態。
-
-
LSTM單元的內部結構與計算流程(關鍵!)
想象一個LSTM單元在時間步?t
?的處理過程。它接收三個輸入:
-
當前時間步的輸入:?
x_t
?(維度?input_dim
) -
前一時間步的隱藏狀態:?
h_{t-1}
?(維度?hidden_dim
) -
前一時間步的細胞狀態:?
C_{t-1}
?(維度?hidden_dim
)
它產生兩個輸出:
-
當前時間步的隱藏狀態:?
h_t
?(維度?hidden_dim
) -
當前時間步的細胞狀態:?
C_t
?(維度?hidden_dim
)
單元內部的計算涉及以下步驟:
-
遺忘門:
-
計算遺忘因子:
f_t = σ(W_f · [h_{t-1}, x_t] + b_f)
-
σ
?是 Sigmoid 激活函數(輸出 0 到 1)。 -
W_f
?是權重矩陣(維度?hidden_dim x (hidden_dim + input_dim)
)。 -
[h_{t-1}, x_t]
?表示將?h_{t-1}
?和?x_t
?拼接成一個向量(維度?hidden_dim + input_dim
)。 -
b_f
?是偏置向量(維度?hidden_dim
)。 -
f_t
?的每個元素在 0(完全忘記)到 1(完全保留)之間,決定了?C_{t-1}
?中每個對應分量被保留的程度。
-
-
輸入門 & 候選值:
-
輸入門:?
i_t = σ(W_i · [h_{t-1}, x_t] + b_i)
-
計算哪些新值需要更新到細胞狀態。
i_t
?在 0(不更新)到 1(完全更新)之間。
-
-
候選細胞狀態:?
g_t = tanh(W_g · [h_{t-1}, x_t] + b_g)
-
計算一個由當前輸入和前一個隱藏狀態生成的新的候選值向量,這些值是可能要加入到細胞狀態中的。
-
tanh
?激活函數將值壓縮到 -1 到 1 之間。
-
-
W_i
,?W_g
?是各自的權重矩陣(維度同上),b_i
,?b_g
?是偏置向量。
-
-
更新細胞狀態:
-
C_t = f_t * C_{t-1} + i_t * g_t
-
*
?表示逐元素乘法。 -
這是LSTM的核心操作:
-
首先,用遺忘門?
f_t
?控制性地遺忘舊細胞狀態?C_{t-1}
?的一部分。 -
然后,用輸入門?
i_t
?控制性地添加候選值?g_t
?的一部分。 -
結果就是新的細胞狀態?
C_t
。這個操作(加法和乘法)允許梯度在?C_t
?上相對穩定地流動。
-
-
-
輸出門:
-
o_t = σ(W_o · [h_{t-1}, x_t] + b_o)
-
計算基于細胞狀態?
C_t
?應該輸出哪些部分到隱藏狀態?h_t
。o_t
?在 0(不輸出)到 1(完全輸出)之間。
-
-
W_o
?是權重矩陣,b_o
?是偏置向量。
-
-
計算當前隱藏狀態:
-
h_t = o_t * tanh(C_t)
-
首先,將新的細胞狀態?
C_t
?通過?tanh
?激活(將其值規范到 -1 到 1 之間)。 -
然后,用輸出門?
o_t
?控制性地輸出?tanh(C_t)
?的一部分。這個?h_t
?就是當前時間步的輸出(如果需要預測,比如?y_t
,通常會對?h_t
?應用一個額外的全連接層?W_y * h_t + b_y
),同時也是下一個時間步的輸入之一。
-
可視化表示(簡化)
LSTM的內部參數詳解
從上面的計算過程可以看出,一個標準的LSTM單元包含以下參數:
-
權重矩陣 (Weights):?共有 4 組,分別對應遺忘門、輸入門、候選值、輸出門。
-
W_f
: 遺忘門的權重矩陣 (維度:?hidden_dim x (hidden_dim + input_dim)
) -
W_i
: 輸入門的權重矩陣 (維度:?hidden_dim x (hidden_dim + input_dim)
) -
W_g
: 候選細胞狀態的權重矩陣 (維度:?hidden_dim x (hidden_dim + input_dim)
) -
W_o
: 輸出門的權重矩陣 (維度:?hidden_dim x (hidden_dim + input_dim)
)
-
-
偏置向量 (Biases):?共有 4 組,與權重矩陣一一對應。
-
b_f
: 遺忘門的偏置向量 (維度:?hidden_dim
) -
b_i
: 輸入門的偏置向量 (維度:?hidden_dim
) -
b_g
: 候選細胞狀態的偏置向量 (維度:?hidden_dim
) -
b_o
: 輸出門的偏置向量 (維度:?hidden_dim
)
-
重要說明
-
參數共享:?同一個LSTM層中的所有時間步?
t
?共享同一套參數?(W_f
,?W_i
,?W_g
,?W_o
,?b_f
,?b_i
,?b_g
,?b_o
)。這是RNN/LSTM的關鍵特性,使得模型能夠處理任意長度的序列,并且大大減少了參數量(相比于為每個時間步都設置獨立參數)。 -
參數總量計算:?對于一個LSTM層:
-
總參數量 =?
4 * [hidden_dim * (hidden_dim + input_dim) + hidden_dim]
-
簡化:?
4 * (hidden_dim * hidden_dim + hidden_dim * input_dim + hidden_dim) = 4 * (hidden_dim^2 + hidden_dim * input_dim + hidden_dim)
-
例如:
input_dim=100
,?hidden_dim=256
, 則參數量 =?4 * (256*256 + 256*100 + 256) = 4 * (65536 + 25600 + 256) = 4 * 91392 = 365, 568
。可見,參數量主要受?hidden_dim
?的平方影響。
-
-
輸入維度:?
input_dim
?是你的輸入數據?x_t
?的特征維度。 -
隱藏層維度:?
hidden_dim
?是一個超參數,決定了:-
細胞狀態?
C_t
?和隱藏狀態?h_t
?的維度。 -
每個門(
f_t
,?i_t
,?o_t
)和候選值(g_t
)向量的維度。 -
模型的容量(表示能力)。更大的?
hidden_dim
?通常能學習更復雜的模式,但也需要更多計算資源和數據,更容易過擬合。
-
-
激活函數:
-
門(f, i, o):?使用?Sigmoid?(
σ
),因為它輸出 0-1,完美模擬“開關”或“比例控制器”的概念。 -
候選值(g)和 細胞狀態輸出:?使用?tanh,因為它輸出 -1 到 1,有助于穩定梯度流(中心化在0附近),且能表示正負信息。
-
-
細胞狀態 vs 隱藏狀態:
-
細胞狀態 (
C_t
):是LSTM的“記憶體”,承載著長期信息流。它主要受門控機制調控,其內部變換(加法和乘法)是梯度穩定流動的關鍵。 -
隱藏狀態 (
h_t
):是LSTM在時間步?t
?的“輸出表示”。它由輸出門?o_t
?基于當前的細胞狀態?C_t
?過濾后得到。h_t
?是傳遞給下一個時間步(作為?h_{t-1}
)和/或用于當前時間步預測的輸出。
-
LSTM如何解決長期依賴問題?
-
細胞狀態作為信息高速公路:?
C_t = f_t * C_{t-1} + i_t * g_t
?這個設計是核心。梯度可以通過?C_t
?直接流向?C_{t-1}
(通過加法操作?+
),而不會像標準RNN那樣在每個時間步都經過壓縮性的激活函數(如?tanh
)導致指數級衰減。乘法操作?f_t *
?雖然也可能導致梯度消失,但?f_t
?是由網絡學習的,它可以選擇讓某些維度的遺忘因子接近1(即完全保留),使得對應維度上的梯度可以幾乎無損地流過很多時間步。 -
門控機制賦予選擇性:?三個門讓LSTM擁有強大的能力:
-
有選擇地遺忘:?遺忘門?
f_t
?可以主動丟棄與當前任務無關的舊信息(例如,在分析一個新句子時,忘記前一個句子的主題)。 -
有選擇地記憶:?輸入門?
i_t
?可以決定哪些新信息是重要的,需要加入到長期記憶中(例如,記住當前句子中的關鍵實體)。 -
有選擇地輸出:?輸出門?
o_t
?可以根據當前細胞狀態和任務需求,決定輸出哪些信息給隱藏狀態(例如,在情感分析中,可能只需要輸出與情感相關的特征)。
-
-
加法更新:?新細胞狀態是通過?加法?(
+
) 來更新的,而不是像標準RNN那樣通過函數?變換。加法操作在反向傳播時梯度是常數1(d(C_t)/d(C_{t-1}) = f_t
,且?f_t
?可以通過學習接近1),這大大緩解了梯度消失問題。乘法操作(f_t *
,?i_t *
)雖然會導致梯度消失/爆炸,但門控信號?f_t
,?i_t
?本身是Sigmoid輸出且受網絡控制,網絡可以學會讓這些門在需要長期記憶的位置保持打開(值接近1)。
變體與改進
-
Peephole Connections:?一些LSTM變體讓門 (
f_t
,?i_t
,?o_t
) 的計算不僅依賴?[h_{t-1}, x_t]
,也直接依賴?C_{t-1}
?或?C_t
(如?i_t = σ(W_i · [C_{t-1}, h_{t-1}, x_t] + b_i)
)。這被認為能提供更精細的時序控制。 -
GRU (Gated Recurrent Unit):?一個更流行的LSTM簡化變體。它將遺忘門和輸入門合并為一個“更新門”,并合并了細胞狀態和隱藏狀態。GRU通常參數更少,計算更快,在很多任務上與LSTM性能相當。
-
Bidirectional LSTM (BiLSTM):?同時運行前向和后向兩個LSTM層,并將它們的隱藏狀態(通常在對應時間步拼接)作為最終輸出。這允許模型利用序列的過去和未來上下文信息,對許多序列標注和理解任務非常有效。
-
Stacked LSTM:?堆疊多個LSTM層,將前一層的隱藏狀態序列作為下一層的輸入序列。這可以學習更復雜的、分層次的時序表示。
總結
LSTM通過精心設計的細胞狀態和門控機制(遺忘門、輸入門、輸出門),有效地解決了標準RNN在處理長序列時的長期依賴問題。其內部參數主要包括四組權重矩陣(W_f
,?W_i
,?W_g
,?W_o
)和對應的偏置向量(b_f
,?b_i
,?b_g
,?b_o
),這些參數在層內所有時間步共享。關鍵的細胞狀態更新公式?C_t = f_t * C_{t-1} + i_t * g_t
?通過加法操作維持了梯度的穩定流動,而Sigmoid門則賦予了模型有選擇地遺忘、記憶和輸出信息的強大能力。理解這些內部結構和參數的作用,對于有效使用、調優LSTM模型以及在實踐中診斷問題至關重要。雖然GRU等變體在某些場景下可能更受歡迎,但LSTM的設計思想和門控機制仍然是理解現代序列建模的基礎。