文章目錄
- 0. 首先聊聊什么是RNN
- 1. 理解LSTM,從數據如何喂給 LSTM開始
- 2. LSTM每個門是如何處理序列數據的?
- 2.1 遺忘門(Forget Gate):該忘掉哪些信息?
- 2.2 輸入門(Input Gate):該記住哪些新信息?
- 2.3 輸出門(Output Gate):此刻該吐露什么?
- 3. 用代碼實現文本情感識別
- **數據預處理**
- **構建LSTM模型**
- 4. 總結:LSTM如何發掘情感?
- 5. 內容延展
- 6.參考資料
想象這樣一個任務:你希望訓練一個模型,它能說出一段文字的情感是“正面”還是“負面”,比如:
- “這部電影簡直太棒了!” → 正面情感
- “糟糕透頂,浪費了兩個小時的時間。” → 負面情感
這就是一個典型的文本情感識別任務,而LSTM(長短期記憶網絡)特別適合這種順序依賴的數據。
接下來,我們通過這個具體的例子,從輸入文本到情感分類,逐步剖析LSTM的內部機制,結合每一個“門”的作用,幫助你理解它是如何工作的。
0. 首先聊聊什么是RNN
思考問題時,人類不是每一時刻都是從零開始的。當你閱讀這篇短文時,對于每一個詞的理解都是基于這個詞之前的詞的含義。你不會把前面看到的丟棄,然后從零開始。你的思考是連貫的。
傳統的神經網絡無法做到這一點,并且這是它的一個主要的缺點。例如,假如你想清楚地知道在一個電影的每一個片段發生了什么樣的事情。現在,還不能確定,傳統的神經網絡如何能夠基于已知的事件推斷出將要發生的事件。
循環神經網絡致力于解決該問題。這樣的網絡通過環回鏈接,保持信息的連貫性。

在上圖中,A是一個神經網絡的一部分,輸入 x t x_t xt?得到輸出 h t h_t ht?。環回鏈接控制信息被從網絡的一層傳遞到下一層。
這些環回鏈接使得循環神經網絡看起來有些神秘。但是,如果你更進一步地思考,它與普通的神經網絡沒有太大的區別。一個循環神經網絡可以被認為是一個網絡的多個拷貝,每一個把信息傳遞給下一個。對循環神經網絡做循環展開后,它就是下面的樣子:
這種鏈式的本質說明了循環神經網絡本質上與序列和鏈表相關。它天生就是要應用到這樣的數據上。
RNNs最令人著迷的是,它也許能夠將當前的任務與之前的信息聯系起來。例如,通過視頻以播放過的幀來理解當前的這一幀。如果RNNs能做到,它的作用是巨大的。RNNs能做到嗎?在某些條件下是的。
有些時候,當前的任務是可以依據最近的信息推測出來的。例如,依據前面已經出現的詞推測下一個詞的語言模型。當我們推測“the clouds are in the sky,”這句話的最后一個詞時,已經不需要其他的上下文了;非常明顯這個詞是“sky”或者"mountain"。在這種情況下,相關聯的詞匯間的距離很短,RNNs能夠學習如何使用這些信息。
但是在某些情況下需要更多的上下文。例如預測這句話 - “I grew up in France… I speak fluent French.” - 的最后一個詞。與目標詞最近的相關信息表明這個詞很可能指某個語言。但是如果把這個詞縮小到某個具體的語言上,就需要與距離較遠的France的上下文考慮到。
與目標點相關的信息與目標點之間的間隔非常的大,這是完全可能的。
不幸的是,隨著距離的增加,RNNs就不能學習到這些關聯信息。
在理論上,RNNs絕對能夠處理長距離間的依賴關系。通過仔細挑選參數,能夠在一些實驗性的玩具項目上取得很好的效果。不幸的是,在現實中,RNNs不能學習使用這些信息。Hochreiter (1991) [German] 和 Bengio, et al. (1994), 在這方面做了深入的研究,他們的研究結果揭示了一些RNNs在這方面的本質上的缺陷。
令人欣慰的是,LSTMs能解決這個問題!
1. 理解LSTM,從數據如何喂給 LSTM開始
在情感識別中,輸入是一段文本,比如:
輸入句子:
“This movie is fantastic and I love it!”
LSTM接收的數據要求是一個序列型輸入,因此我們需要以下預處理步驟:
-
分詞和索引化
將句子分割成單詞并用數值表示。例如:
"This movie is fantastic and I love it!" → [1, 2, 3, 4, 5, 6, 7]
(假設 “This” 對應索引 1,“movie” 對應索引 2,依此類推。) -
嵌入向量表示
每個單詞會用一個固定長度的向量表示,例如通過**詞嵌入(Embedding)**生成300維向量:[1, 2, 3, 4, 5, 6, 7] → [[0.5, 0.8, ...], [0.2, 0.9, ...], ..., [0.7, 0.4, ...]]
輸入的數據就變成了一個二維矩陣,形狀為:
(單詞數, 每個單詞的向量維度) = (7, 300)
2. LSTM每個門是如何處理序列數據的?
現在我們以這句輸入 “This movie is fantastic and I love it!” 為例,逐步拆解 LSTM 的門機制,看看它是如何從文字序列中提取情感特征的。
2.1 遺忘門(Forget Gate):該忘掉哪些信息?
首先,遺忘門會接收當前單詞的表示(如第一個單詞 “This” 的嵌入向量)和上一時間步的信息(即隱藏狀態 h t ? 1 h_{t-1} ht?1?),決定過去哪些記憶應該被“遺忘”。
公式如下:
f t = σ ( W f [ h t ? 1 , x t ] + b f ) f_t = \sigma(W_f[h_{t-1}, x_t] + b_f) ft?=σ(Wf?[ht?1?,xt?]+bf?)
- x t x_t xt?:當前時間步的輸入(如 “This” 的向量表示)。
- h t ? 1 h_{t-1} ht?1?:上一時間步的隱藏狀態(尚未產生)。
- f t f_t ft?:遺忘門輸出向量(值在 0 和 1 之間)。接近1的值會保留過去信息,接近0的值會遺忘。
在解讀句子的時候,“This”和情感無關,因此模型可能輸出低遺忘比例,例如 f t = [ 0.3 , 0.1 , 0.2 , . . . ] f_t = [0.3, 0.1, 0.2, ...] ft?=[0.3,0.1,0.2,...],表示對當前單詞(“This”)相關的記憶會部分清除。
2.2 輸入門(Input Gate):該記住哪些新信息?
遺忘了無關信息后,輸入門決定哪些新信息需要記住。兩個核心過程:
-
生成候選記憶內容 C ~ t \tilde{C}_t C~t?
當前單詞向量(如"fantastic")經過權重變換和激活函數處理,生成可能的記憶內容:C ~ t = tanh ? ( W C [ h t ? 1 , x t ] + b C ) \tilde{C}_t = \tanh(W_C[h_{t-1}, x_t] + b_C) C~t?=tanh(WC?[ht?1?,xt?]+bC?)
例如,“fantastic” 強烈關聯到積極情感,候選記憶向量 C ~ t \tilde{C}_t C~t? 的值可能表示強正面情感。
-
輸入門決定記憶的權重 i t i_t it?
i t = σ ( W i [ h t ? 1 , x t ] + b i ) i_t = \sigma(W_i[h_{t-1}, x_t] + b_i) it?=σ(Wi?[ht?1?,xt?]+bi?)輸入門輸出 i t i_t it? 決定該候選記憶的比重。
-
更新記憶單元 C t C_t Ct?
最終,記憶單元的更新公式為:C t = f t ? C t ? 1 + i t ? C ~ t C_t = f_t \cdot C_{t-1} + i_t \cdot \tilde{C}_t Ct?=ft??Ct?1?+it??C~t?
在處理"fantastic"時,輸入門可能輸出 i t = [ 0.9 , 0.8 , 0.7 , . . . ] i_t = [0.9, 0.8, 0.7, ...] it?=[0.9,0.8,0.7,...],表示“要記住這個強正面情感的單詞”。然后結合候選記憶單元 C ~ t \tilde{C}_t C~t?,將它添加到記憶中。
2.3 輸出門(Output Gate):此刻該吐露什么?
最后,輸出門決定當前記憶中哪些信息需要釋放給下一層或時間步,用于接續處理或最終的分類。
-
計算輸出門權重 o t o_t ot?:
o t = σ ( W o [ h t ? 1 , x t ] + b o ) o_t = \sigma(W_o[h_{t-1}, x_t] + b_o) ot?=σ(Wo?[ht?1?,xt?]+bo?) -
生成隱藏狀態 h t h_t ht?:
h t = o t ? tanh ? ( C t ) h_t = o_t \cdot \tanh(C_t) ht?=ot??tanh(Ct?)h t h_t ht? 是 LSTM 的輸出,會直接用于下一時間步的計算,或通過全連接層參與情感分類。
在處理到句子最后的 “it” 時,LSTM 的隱藏狀態已經累積了上下文信息。此時的 h t h_t ht? 可能非常接近“正面情感”的特征表示。
3. 用代碼實現文本情感識別
以下代碼演示如何用 TensorFlow 構建一個簡單的 LSTM 模型,用于情感分類任務。
數據預處理
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences# 樣本數據
texts = ["This movie is fantastic and I love it!", # 正面情感"This film is horrible, I hate it!" # 負面情感
]# 標簽 (1 表示正面, 0 表示負面)
labels = [1, 0]# 分詞與索引化
tokenizer = Tokenizer(num_words=10000)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)# 填充序列到固定長度
maxlen = 10
X = pad_sequences(sequences, maxlen=maxlen, padding='post')
y = labels
print("輸入形狀:", X.shape)
構建LSTM模型
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense# 定義LSTM情感分類模型
model = Sequential([Embedding(input_dim=10000, output_dim=300, input_length=maxlen),LSTM(128, return_sequences=False),Dense(1, activation='sigmoid')
])model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()# 假設使用訓練數據進行訓練
model.fit(X, y, batch_size=2, epochs=10)
4. 總結:LSTM如何發掘情感?
結合我們的例子可以看到:
- 遺忘門:過濾掉“無關”單詞對情感的影響,比如 “This”。
- 輸入門:捕捉關鍵情感詞匯,比如 “fantastic”、“horrible”。
- 輸出門:輸出情感特征,逐步累積句子的情感信息。
最后,通過分類器,我們得到了精準的情感判斷:
“This movie is fantastic and I love it!” → Positive
從這一任務中,可以感受到 LSTM 對時間序列建模的強大能力,它讓機器逐步理解了句子的情感含義!
5. 內容延展
雖然LSTM在處理文本、音頻和其他序列數據時表現十分優秀,但它也有一定的局限性,例如當序列非常長時,仍然可能有信息丟失的問題。近年來,更加先進的模型正在逐漸取代LSTM:
-
Transformer
Transformer模型通過自注意力機制建模長距離依賴,極大提升了序列數據的建模能力。在自然語言處理任務(如機器翻譯)中,Transformer已成為主流。 -
Conformer
在語音識別任務中,Conformer結合了卷積網絡和Transformer的優勢,是處理語音序列的強大模型。 -
Mamba
Mamba 是一種由斯坦福大學研究團隊在 2023 年底提出的新型狀態空間模型架構,它專為信息密集型任務(如長序列數據或高維數據)而生。與LSTM相比,Mamba使用選擇性狀態空間模型(Selective State Space Model, SSM),能夠以線性時間復雜度處理長序列數據。
在后續內容中,我們將逐步介紹這些更現代、更強大的模型,敬請期待!
6.參考資料
[1] 理解LSTM網絡 (https://colah.github.io/posts/2015-08-Understanding-LSTMs/).
[2] 深入理解LSTM (https://xiaohutou.github.io/2018/05/01/understanding-lstm-networks/).
[3] LSTM情緒識別實戰 (https://github.com/lukasgarbas/nlp-text-emotion).
感謝各位讀者耐心看到這里!如果這篇文章對您有所啟發,請收藏、點贊和分享給更多的朋友,讓我們一起交流人工智能的魅力。如果您有任何問題或想法,歡迎在評論區留言,我會盡量回復每一條評論!
期待我們在學習之路上的共同成長!🎉