ChatGPT入門之文本情緒識別:先了解LSTM如何處理文字序列

文章目錄

    • 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接收的數據要求是一個序列型輸入,因此我們需要以下預處理步驟:

  1. 分詞和索引化
    將句子分割成單詞并用數值表示。例如:
    "This movie is fantastic and I love it!" → [1, 2, 3, 4, 5, 6, 7]
    (假設 “This” 對應索引 1,“movie” 對應索引 2,依此類推。)

  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):該記住哪些新信息?

遺忘了無關信息后,輸入門決定哪些新信息需要記住。兩個核心過程:

  1. 生成候選記憶內容 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? 的值可能表示強正面情感。

  2. 輸入門決定記憶的權重 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? 決定該候選記憶的比重。

  3. 更新記憶單元 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):此刻該吐露什么?

最后,輸出門決定當前記憶中哪些信息需要釋放給下一層或時間步,用于接續處理或最終的分類。

  1. 計算輸出門權重 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?)

  2. 生成隱藏狀態 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:

  1. Transformer
    Transformer模型通過自注意力機制建模長距離依賴,極大提升了序列數據的建模能力。在自然語言處理任務(如機器翻譯)中,Transformer已成為主流。

  2. Conformer
    在語音識別任務中,Conformer結合了卷積網絡和Transformer的優勢,是處理語音序列的強大模型。

  3. 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).


感謝各位讀者耐心看到這里!如果這篇文章對您有所啟發,請收藏、點贊和分享給更多的朋友,讓我們一起交流人工智能的魅力。如果您有任何問題或想法,歡迎在評論區留言,我會盡量回復每一條評論!

期待我們在學習之路上的共同成長!🎉

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65880.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65880.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65880.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI學習路線圖-邱錫鵬-神經網絡與深度學習

1 需求 神經網絡與深度學習 2 接口 3 示例 4 參考資料

C#用直線和曲線抗鋸齒

使用 GDI 繪制一條線時,要提供線條的起點和終點,但不必提供有關線條上各個像素的任何信息。 GDI 與顯示驅動程序軟件協同工作,確定將打開哪些像素以在特定顯示設備上顯示該線條。 效果對比 代碼實現 關鍵代碼 e.Graphics.SmoothingMode Sm…

【opencv】第8章 圖像輪廓與圖像分割修復

8.1 查找并繪制輪廓 一個輪廓一般對應一系列的點,也就是圖像中的一條曲線。其表示方法可能 根據不同的情況而有所不同。在OpenCV 中,可以用findContours()函數從二值圖 像中查找輪廓 8.1.1 尋找輪廓: findContours() 函數 findContours) 函…

基于文件系統分布式鎖原理

分布式鎖:在一個公共的存儲服務上打上一個標記,如Redis的setnx命令,是先到先得方式獲得鎖,ZooKeeper有點像下面的demo,比較大小的方式判決誰獲得鎖。 package com.ldj.mybatisflex.demo;import java.util.*; import java.util.co…

Unity 大地圖功能 離線瓦片地圖

不使用第二個攝像機實現類似開放世界的大地圖功能。 功能如下: 按下M鍵打開/關閉大地圖功能 打開大地圖時,默認玩家位置居中 大地圖支持拖拽,可調節拖拽速度,支持XY軸翻轉 支持大地圖設置邊緣偏移量 可設置是否啟動拖拽邊界 …

Bootstrap 前端 UI 框架

Bootstrap官網:Bootstrap中文網 鉑特優選 Bootstrap 下載 點擊進入中文文檔 點擊下載 生產文件是開發響應式網頁應用,源碼是底層邏輯代碼,因為是要制作響應式網頁,所以下載開發文件 引入 css 文件, bootstrap.css 和 …

記一次sealos部署k8s集群之delete了第一臺master如何恢復

記一次sealos部署k8s集群之delete了第一臺master如何恢復 一、背景描述 使用sealos部署了一套K8S集群 master信息:172.27.100.1、172.27.100.2、172.27.100.3 node信息:172.27.100.4、172.27.100.5 sealos安裝在172.27.100.1節點,根目錄下/root/.sealos/文件還在! [root…

error: linker `link.exe` not found

開始學習rust,安裝好rust的環境,開始從hello world開始,結果用在win10環境下,使用vs code或cmd窗口編譯rust報錯: PS E:\study_codes\rust-demo\chart01> rustc hello.rs error: linker link.exe not found| note:…

用 HTML5 Canvas 和 JavaScript 實現雪花飄落特效

這篇文章將帶您深入解析使用 HTML5 Canvas 和 JavaScript 實現動態雪花特效的代碼原理。 1,效果展示 該效果模擬了雪花從天而降的動態場景,具有以下特點: 雪花數量、大小、透明度和下落速度隨機。雪花會在屏幕底部重置到頂部,形成循環效果。隨窗口大小動態調整,始終覆蓋…

django基于Python的校園個人閑置物品換購平臺

Django 基于 Python 的校園個人閑置物品換購平臺 一、平臺概述 Django 基于 Python 的校園個人閑置物品換購平臺是專為校園師生打造的一個便捷、環保且充滿活力的線上交易場所。它借助 Django 這一強大的 Python Web 開發框架,整合了校園內豐富的閑置物品資源&…

【Vim Masterclass 筆記10】S06L23:Vim 核心操作訓練之 —— 文本的搜索、查找與替換操作(第二部分)

文章目錄 S06L23 Search, Find, and Replace - Part Two1 文本替換命令 :s/old/new/2 指定范圍的文本替換3 特例:路徑的替換4 文件行號的配置5 要點總結(1)搜索當前行(Same Line Searching)(2)跨…

【計算機網絡】課程 實驗五 靜態路由配置

實驗五 靜態路由配置 一、實驗目的 理解靜態路由的工作原理,掌握如何配置靜態路由。 二、實驗分析與設計 【背景描述】 假設校園網分為 2 個區域,每個區域內使用 1 臺路由器連接 2 個子網, 現要在路由器上 做適當配置,實現校…

Python 繼承示例:有與無 `super().__init__()` 的區別

文章目錄 Python 繼承示例:有與無 super().__init__() 的區別父類(Parent)子類(Child)不調用 super().__init__()子類(Child)調用 super().__init__() Python 繼承示例:有與無 super…

Linux下部署Redis(本地部署超詳細)

非docker 1、下載Redis 歷史版本: http://download.redis.io/releases 我的: http://download.redis.io/releases/redis-7.0.5.tar.gz 2.安裝教程 1.Redis是基于c語言編寫的需要安裝依賴,需要安裝gcc yum install gcc-c 2.查看gcc版…

Spring——幾個常用注解

環境配置 1.在配置文件中導入約束(context — 共三個)并添加一項配置( context:annotation-config/) 才能支持注解的使用 context 約束: xmlns:context“http://www.springframework.org/schema/context” 2.xsi:schemaLocation下的:" http://ww…

Oopsie【hack the box】

Oopsie 解題流程 文件上傳 首先開啟機器后,我們先使用 nmap -sC -SV來掃描一下IP地址: -sC:使用 Nmap 的默認腳本掃描(通常是 NSE 腳本,Nmap Scripting Engine)。這個選項會自動執行一系列常見的腳本&am…

單片機-定時器中斷

1、相關知識 振蕩周期1/12us; //振蕩周期又稱 S周期或時鐘周期(晶振周期或外加振蕩周期)。 狀態周期1/6us; 機器周期1us; 指令周期1~4us; ①51單片機有兩組定時器/計數器,因為既可以定時,又可以計數,故稱之為定時器…

【藍牙】win11 筆記本電腦連接 hc-06

文章目錄 前言步驟 前言 使用電腦通過藍牙添加串口 步驟 設置 -> 藍牙和其他設備 點擊 顯示更多設備 更多藍牙設置 COM 端口 -> 添加 有可能出現卡頓,等待一會 傳出 -> 瀏覽 點擊添加 hc-06,如果沒有則點擊 再次搜索 確定 添加成…

Android切換語言不退出App

1.需求 實現用戶選擇語言(未點擊下一步),更新當前界面UI,點擊下一步后,更新App的語言,并進行保存。 實現目標: 1.設置App的語言,本地進行保存 2.updateResources更新本地語言配置…

一鍵獲取Linux主機配置信息shell腳本,含網卡詳情,網卡綁定等

cat > /tmp/get_os_info.sh <<"EOF"#!/bin/bashexport LANG=en_US.UTF-8# 如果 cat /proc/1/cgroup | grep docker | wc -l 大于0 或 systemd-detect-virt 返回 docker,則為 docker容器,# 如果 virt-what 返回 kvm或vmware或hyperv或xen、xen-hvm、lxc 或…