通俗易懂循環神經網絡(RNN)指南

本文用直觀類比、圖表和代碼,帶你輕松理解RNN及其變體(LSTM、GRU、雙向RNN)的原理和應用。


什么是循環神經網絡

循環神經網絡(Recurrent Neural Network, RNN)是一類專門用于處理序列數據的神經網絡。與前饋神經網絡不同,RNN具有“記憶”能力,能夠利用過去的信息來幫助當前的決策。這使得RNN特別適合處理像語言、語音、時間序列這樣具有時序特性的數據。

類比:你在閱讀一句話時,會基于前面看到的單詞來理解當前單詞的含義。RNN就像有記憶力的神經網絡。


RNN的核心思想

RNN的核心思想非常簡單而巧妙:網絡會對之前的信息進行記憶并應用于當前輸出的計算中。也就是說,隱藏層的輸入不僅包括輸入層的輸出,還包括上一時刻隱藏層的輸出。

公式表示:

ht=f(W?xt+U?ht?1+b)h_t = f(W \cdot x_t + U \cdot h_{t-1} + b)ht?=f(W?xt?+U?ht?1?+b)

其中:

  • hth_tht?:當前時刻的隱藏狀態
  • xtx_txt?:當前時刻的輸入
  • ht?1h_{t-1}ht?1?:上一時刻的隱藏狀態
  • W,UW, UW,U:權重矩陣
  • bbb:偏置項
  • fff:非線性激活函數(如tanh或ReLU)

RNN結構圖

輸入x?
隱藏層h?
輸出y?
輸入x?
隱藏層h?
輸出y?
輸入x?
隱藏層h?
輸出y?

RNN的工作機制舉例

假設我們要預測句子中的下一個單詞:

輸入序列:“我” → “愛” → “機器”

  1. 處理第一個詞“我”:
    • 輸入:“我”的向量表示
    • 初始隱藏狀態h0h_0h0?通常設為全零
    • 計算h1=f(W?x1+U?h0+b)h_1 = f(W \cdot x_1 + U \cdot h_0 + b)h1?=f(W?x1?+U?h0?+b)
    • 輸出y1=g(V?h1+c)y_1 = g(V \cdot h_1 + c)y1?=g(V?h1?+c)
  2. 處理第二個詞“愛”:
    • 輸入:“愛”的向量表示
    • 使用之前的隱藏狀態h1h_1h1?
    • 計算h2=f(W?x2+U?h1+b)h_2 = f(W \cdot x_2 + U \cdot h_1 + b)h2?=f(W?x2?+U?h1?+b)
    • 輸出y2=g(V?h2+c)y_2 = g(V \cdot h_2 + c)y2?=g(V?h2?+c)
  3. 處理第三個詞“機器”:
    • 輸入:“機器”的向量表示
    • 使用之前的隱藏狀態h2h_2h2?
    • 計算h3=f(W?x3+U?h2+b)h_3 = f(W \cdot x_3 + U \cdot h_2 + b)h3?=f(W?x3?+U?h2?+b)
    • 輸出y3=g(V?h3+c)y_3 = g(V \cdot h_3 + c)y3?=g(V?h3?+c)

RNN的優缺點

優點:

  1. 能夠處理變長序列數據
  2. 考慮了序列中的時間/順序信息
  3. 模型大小不隨輸入長度增加而變化
  4. 可以處理任意長度的輸入(理論上)

缺點:

  1. 梯度消失/爆炸問題:在反向傳播時,梯度會隨著時間步長指數級減小或增大,導致難以學習長期依賴關系
  2. 計算速度較慢(因為是順序處理,無法并行化)
  3. 簡單的RNN結構難以記住很長的序列信息


長短期記憶網絡(LSTM)

為了解決RNN的長期依賴問題,Hochreiter和Schmidhuber在1997年提出了長短期記憶網絡(Long Short-Term Memory, LSTM)。LSTM是RNN的一種特殊變體,能夠學習長期依賴關系。

LSTM的核心結構

LSTM的關鍵在于它的“細胞狀態”(cell state)和三個“門”結構:

LSTM單元
遺忘
寫入
遺忘門
輸入x?
上時刻隱藏h???
細胞狀態C???
輸入門
輸出門
輸出h?
  • 遺忘門(Forget Gate):決定從細胞狀態中丟棄哪些信息

    ft=σ(Wf?[ht?1,xt]+bf)f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)ft?=σ(Wf??[ht?1?,xt?]+bf?)

  • 輸入門(Input Gate):決定哪些新信息將被存儲到細胞狀態中

    it=σ(Wi?[ht?1,xt]+bi)i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)it?=σ(Wi??[ht?1?,xt?]+bi?)

    C~t=tanh?(WC?[ht?1,xt]+bC)\tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C)C~t?=tanh(WC??[ht?1?,xt?]+bC?)

  • 輸出門(Output Gate):決定輸出什么信息

    ot=σ(Wo?[ht?1,xt]+bo)o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)ot?=σ(Wo??[ht?1?,xt?]+bo?)

    ht=ot?tanh?(Ct)h_t = o_t * \tanh(C_t)ht?=ot??tanh(Ct?)

  • 細胞狀態更新

    Ct=ft?Ct?1+it?C~tC_t = f_t * C_{t-1} + i_t * \tilde{C}_tCt?=ft??Ct?1?+it??C~t?


LSTM如何解決長期依賴問題

LSTM通過精心設計的“門”機制解決了傳統RNN的梯度消失問題:

  1. 細胞狀態像一條傳送帶:信息可以幾乎不變地流過整個鏈條
  2. 門結構控制信息流:決定哪些信息應該被記住或遺忘
  3. 梯度保護機制:在反向傳播時,梯度可以更穩定地流動,不易消失

門控循環單元(GRU)

GRU(Gated Recurrent Unit)是2014年提出的LSTM變體,結構更簡單,性能相近。

GRU結構圖

輸入x?
更新門
上時刻隱藏h???
重置門
輸出h?
  • 重置門(Reset Gate):決定如何將新輸入與之前的記憶結合

    rt=σ(Wr?[ht?1,xt]+br)r_t = \sigma(W_r \cdot [h_{t-1}, x_t] + b_r)rt?=σ(Wr??[ht?1?,xt?]+br?)

  • 更新門(Update Gate):決定多少過去信息被保留,多少新信息被加入

    zt=σ(Wz?[ht?1,xt]+bz)z_t = \sigma(W_z \cdot [h_{t-1}, x_t] + b_z)zt?=σ(Wz??[ht?1?,xt?]+bz?)

  • 隱藏狀態更新

    h~t=tanh?(W?[rt?ht?1,xt]+b)\tilde{h}_t = \tanh(W \cdot [r_t * h_{t-1}, x_t] + b)h~t?=tanh(W?[rt??ht?1?,xt?]+b)

    ht=(1?zt)?ht?1+zt?h~th_t = (1 - z_t) * h_{t-1} + z_t * \tilde{h}_tht?=(1?zt?)?ht?1?+zt??h~t?


GRU vs LSTM

特性LSTMGRU
門數量3個(遺忘門、輸入門、輸出門)2個(重置門、更新門)
參數數量較多較少(比LSTM少約1/3)
計算效率較低較高
性能在大多數任務上表現優異在多數任務上與LSTM相當
適用場景需要長期記憶的復雜任務資源受限或需要更快訓練的場景

雙向RNN(Bi-RNN)

標準RNN只能利用過去的信息,但有時未來的信息也同樣重要。雙向RNN通過結合正向和反向兩個方向的RNN來解決這個問題。

雙向RNN結構圖

輸入x?
正向h?→
輸入x?
正向h?→
輸入x?
正向h?→
反向h?←
反向h?←
反向h?←
輸出y?
輸出y?
輸出y?

簡單RNN/LSTM/GRU代碼實現(PyTorch)

下面是用PyTorch實現的基礎RNN、LSTM和GRU的示例代碼(以字符序列為例):

import torch
import torch.nn as nn# 簡單RNN單元
class SimpleRNN(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SimpleRNN, self).__init__()self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):out, _ = self.rnn(x)out = self.fc(out[:, -1, :])return out# LSTM單元
class SimpleLSTM(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SimpleLSTM, self).__init__()self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):out, _ = self.lstm(x)out = self.fc(out[:, -1, :])return out# GRU單元
class SimpleGRU(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SimpleGRU, self).__init__()self.gru = nn.GRU(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):out, _ = self.gru(x)out = self.fc(out[:, -1, :])return out# 示例:假設輸入為(batch, seq_len, input_size)
input_size = 10
hidden_size = 20
output_size = 5
x = torch.randn(32, 15, input_size)model = SimpleLSTM(input_size, hidden_size, output_size)
output = model(x)
print(output.shape)  # torch.Size([32, 5])

RNN及變體的典型應用案例

循環神經網絡及其變體在實際中有廣泛應用,尤其在處理序列數據的任務中表現突出。

1. 自然語言處理(NLP)

  • 文本生成:如自動寫詩、對話機器人、新聞摘要。
  • 機器翻譯:將一句話從一種語言翻譯為另一種語言。
  • 命名實體識別、詞性標注:識別文本中的專有名詞、標注詞性。
  • 情感分析:判斷一段文本的情感傾向。
輸入句子
RNN/LSTM/GRU編碼
輸出標簽/翻譯/情感

2. 語音識別

  • 語音轉文字:將語音信號轉為文本。
  • 語音合成:將文本轉為自然語音。
  • 說話人識別:識別說話人身份。
語音信號
聲學特征提取
RNN/BiLSTM建模
文字輸出

3. 時間序列預測

  • 金融預測:如股票價格、匯率、銷售額等的趨勢預測。
  • 氣象預測:溫度、降雨量等氣象數據的預測。
  • 設備故障預警:工業傳感器數據異常檢測。
歷史數據序列
RNN/LSTM/GRU建模
未來預測值

4. 生物信息學

  • DNA/RNA序列分析:基因序列的功能預測、蛋白質結構預測。

5. 視頻分析

  • 動作識別:分析視頻幀序列,識別人物動作。
  • 視頻字幕生成:為視頻自動生成描述性字幕。

總結

循環神經網絡及其變體是處理序列數據的強大工具。從基本的RNN到LSTM、GRU,再到雙向結構,每一種創新都解決了前一代模型的特定問題。理解這些模型的原理和差異,有助于我們在實際應用中選擇合適的架構。

雖然Transformer架構近年來在某些任務上表現更優,但RNN家族仍然在許多場景下保持著重要地位,特別是在資源受限、序列較短或需要在線處理的場景中。

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

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

相關文章

【SVM】支持向量機實例合集

基于Java的SVM(支持向量機)實例合集 以下是一個基于Java的SVM(支持向量機)實例合集,包含核心代碼示例和應用場景說明。這些例子基于流行的機器學習庫(如LIBSVM、Weka、JSAT)實現。 數據準備與加載 使用LIBSVM格式加載數據集: // 加載LIBSVM格式數據 svm_problem pr…

Python100個庫分享第38個—lxml(爬蟲篇)

目錄專欄導讀📚 庫簡介🎯 主要特點🛠? 安裝方法Windows安裝Linux/macOS安裝驗證安裝🚀 快速入門基本使用流程HTML vs XML解析🔍 核心功能詳解1. XPath選擇器2. CSS選擇器支持3. 元素操作🕷? 實戰爬蟲案例…

imx6ull-系統移植篇17——linux頂層 Makefile(上)

目錄 前言 頂層 Makefile 源碼簡析 版本號 MAKEFLAGS 變量 命令輸出 靜默輸出 設置編譯結果輸出目錄 代碼檢查 模塊編譯 設置目標架構和交叉編譯器 調用 scripts/Kbuild.include 文件 交叉編譯工具變量設置 頭文件路徑變量 導出變量 make xxx_defconfig 過程 …

OpenCV 官翻6 - Computational Photography

文章目錄圖像去噪目標理論OpenCV中的圖像去噪1、cv.fastNlMeansDenoisingColored()2、cv.fastNlMeansDenoisingMulti()附加資源圖像修復目標基礎概念代碼補充資源練習高動態范圍成像(HDR)目標理論基礎曝光序列HDR1、將曝光圖像加載到列表中2、將曝光序列…

APT32F1732RBT8愛普特微電子 32位MCU國產芯片 智能家居/工業控制 首選

APT32F1732RBT8 愛普特微電子,32位MCU國產芯片一、產品簡介APT32F1732RBT8 是愛普特微電子(APT)推出的高性能32位ARM Cortex-M0內核MCU,主頻高達48MHz,內置64KB Flash8KB RAM,專為智能家居、工業控制、消費…

Smart Tomcat

本篇博客的內容是教你借助idea中的插件,把tomcat集成到idea中安裝 Smart Tomcat 插件搜索下載 ,如果一直處于加載界面,就嘗試一下科學上網配置 Smart Tomcat 插件 點擊右上角的 "Add Configuration"選擇左側的 "Smart Tomcat" 在 Name 這一欄填寫一個名字(…

Linux_shell編寫

title: Linux_4 shell編寫 shell pwd (/root/A/2025_7/19/myshell) 首先需要設計命令行提示 (MakeCommandLine()) 首先獲取相關信息 getenv(“name”) // 獲取用戶名 const char* GetUserName() {const char* name getenv("USER");if (name …

【數據結構】棧的深入解析--用C語言實現

文章目錄1.棧的概念2.棧的底層結構3.棧的功能4.棧的實現4.1.棧結構的定義4.2.棧的初始化4.3.棧的銷毀4.4.入棧4.5.出棧4.6.取棧頂元素4.7.獲取棧中有效元素個數5.完整代碼Stack.hStack.cmain.c運行結果1.棧的概念 是一種特殊的線性表,只允許數據在固定的一段進行插…

Git倉庫核心概念與工作流程詳解:從入門到精通

Git倉庫的基本概念版本庫(Repository)是Git的核心概念,你可以簡單理解為一個被Git管理的目錄。這個目錄里的所有文件都能被Git跟蹤,記錄每次修改和刪除,讓你可以隨時追溯歷史或在未來某個時刻"還原"文件。Gi…

Web開發 05

1 React庫(人話詳解版)別慌,React 剛接觸時是會有點懵,咱們用 “人話 類比” 一步步拆:核心概念先抓牢組件(Component)把它想成 “樂高積木”,比如做個社交 App,頂部導航…

RustDesk 自建中繼服務器教程(Mac mini)

📖 教程目標 在家里的 Mac mini 上部署 RustDesk 中繼服務器 (hbbs hbbr),讓你從辦公室、筆電或手機 低延遲、安全 地遠程控制家里的 Windows 和 Mac mini。 ? 不依賴第三方服務器 ? 支持 P2P 和中繼雙模式 ? 全流量可控、跨平臺 🏗? 架…

數據庫—修改某字段默認值

前言有時候,數據庫的字段默認值沒有正確設置,這時候需要改默認值。以下是我做的改默認值的記錄,希望對網友有所幫助。1.SQL SERVER下面的示例假設你要修改名為 YourColumnName 的字段,并為其設置一個新的默認值 NewDefaultValue。…

Spring快速整合Mybatis

MyBatis是一個優秀的持久層框架&#xff0c;Spring則是廣泛使用的Java應用框架。可以將兩者整合可以充分發揮各自的優勢。 1、Spring整合MyBatis的基本配置 添加依賴&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spri…

基于深度學習的語音識別:從音頻信號到文本轉錄

前言 語音識別&#xff08;Automatic Speech Recognition, ASR&#xff09;是人工智能領域中一個極具挑戰性和應用前景的研究方向。它通過將語音信號轉換為文本&#xff0c;為人們提供了更加自然和便捷的人機交互方式。近年來&#xff0c;深度學習技術在語音識別領域取得了顯著…

本地部署Nacos開源服務平臺,并簡單操作實現外部訪問,Windows 版本

Nacos 是一款阿里開源的動態服務發現、配置、管理平臺&#xff0c;擁有易于集成、高可用與可擴展等特點。它提供了動態服務注冊和發現能力&#xff0c;使得服務自動注冊到服務器并且消費真能夠發現提供者。本文將詳細介紹如何在本地安裝 Nacos &#xff0c;以及結合nat123端口映…

數據結構:反轉字符串(Reversing a String)

目錄 方法一&#xff1a;雙指針法 方法二&#xff1a;輔助數組 方法對比總結&#xff1a; 問題定義 給定一個字符串&#xff0c;例如&#xff1a; char str[] "hello";我們的目標是把它反轉成&#xff1a; "olleh"&#x1f4cc; 輸入特點&#xff…

Redis Copy-on-Write機制:

Copy-on-Write機制&#xff1a; 父子進程共享內存頁 當父進程修改數據時&#xff0c;內核會復制被修改的頁 這可能導致內存使用量暫時增加 通俗的話描述一下可以用一個生活中的例子來通俗解釋 Copy-on-Write&#xff08;寫時復制&#xff09; 機制&#xff1a;&#x1f4d6; 比…

iOS加固工具有哪些?從零源碼到深度混淆的全景解讀

在iOS安全加固領域&#xff0c;不同項目類型對保護需求有著本質差異&#xff1a;“我有源碼”與“我只有IPA”兩條路徑決定了你該用什么工具。本文將從 無需源碼處理整個IPA包 到 源碼級編譯期混淆&#xff0c;分層探討主流工具如何發揮價值&#xff0c;并附上適配方案建議。工…

Composer 可以通過指定 PHP 版本運行

是的&#xff0c;Composer 可以通過指定 PHP 版本運行&#xff0c;尤其是在服務器上有多個 PHP 版本時&#xff08;如 PHP 7.x 和 PHP 8.x&#xff09;。以下是幾種常見方法&#xff1a;方法 1&#xff1a;使用 php 命令指定版本 Composer 依賴系統中的 php 命令&#xff0c;因…

vscode文件顏色,只顯示自己更改的文件顏色

這個主要是因為你github git下來以后&#xff0c;用vscode打開會默認顯示更改了&#xff0c;你只要在這里先手動取消更改就行了&#xff0c;注意不要把你自己更改的取消了