從認識AI開始-----解密LSTM:RNN的進化之路

前言

我在上一篇文章中介紹了 RNN,它是一個隱變量模型,主要通過隱藏狀態連接時間序列,實現了序列信息的記憶與建模。然而,RNN在實踐中面臨嚴重的“梯度消失”與“長期依賴建模困難”問題:

  • 難以捕捉相隔很遠的時間步之間的關系
  • 隱狀態在不斷更新中容易遺忘早期信息。

為了解決這些問題,LSTM(Long Short-Term Memory)?網絡于 1997 年被 Hochreiter等人提出,該模型是對RNN的一次重大改進。


一、LSTM相比RNN的核心改進

接下來,我們通過對比RNN、LSTM,來看一下具體的改進:

模型特點優勢缺點
RNN單一隱藏轉態,時間步傳遞結構簡答容易造成梯度消失/爆炸,對長期依賴差
LSTM多門控機制 + 單獨的“記憶單元”解決長距離依賴問題,保留長期信息結構復雜,計算開銷大

通過對比,我們可以發現,其實LSTM的核心思想是:引入了一個專門的“記憶單元”,在通過門控機制對信息進行有選擇的保留、遺忘與更新


二、LSTM的核心結構

LSTM的核心結構如下圖所示:

?如圖可以輕松的看出,LSTM主要由門控機制和候選記憶單元組成,對于每個時間步,LSTM都會進行以下操作:

1. 忘記門

忘記門F_t主要的作用是:控制保留多少之前的記憶:

F_t=\sigma(X_t@W_{xf}+H_{t-1}@W_{hf}+b_f)

2. 輸入門

輸入門I_t主要的作用是:決定當前輸入中哪些信息信息被寫入記憶:

I_t=\sigma(X_t@W_{xi}+H_{t-1}@W_{hi}+b_i)

3. 候選記憶單元

\tilde C_t=tanh(X_t@W_{xc}+H_{t-1}@W_{hc}+b_c)

4. 輸出門

輸出門O_t的作用是:決定是是否使用隱狀態:

O_t=\sigma(X_t@W_{xo}+H_{t-1}@W_{ho}+b_o)

5. 真正記憶單元

記憶單元(?C_t?)用于長期存儲信息,解決RNN容易遺忘的問題:

C_t=F_t*C_{t-1}+I_t*\tilde C_{t}

7. 隱藏轉態

H_t=O_t*tanh(C_t)

LSTM引入了專門的記憶單元?C_t??,長期存儲信息,解決了傳統RNN容易遺忘的問題。


三、手寫LSTM

通過上面的介紹,我們現在已經知道了LSTM的實現原理,現在,我們試著手寫一個LSTM核心層:

首先,初始化需要訓練的參數:

import torch
import torch.nn as nn
import torch.nn.functional as Fdef params(input_size, output_size, hidden_size):W_xi, W_hi, b_i = torch.randn(input_size, hidden_size) * 0.1, torch.randn(hidden_size, hidden_size) * 0.1, torch.zeros(hidden_size)W_xf, W_hf, b_f = torch.randn(input_size, hidden_size) * 0.1, torch.randn(hidden_size, hidden_size) * 0.1, torch.zeros(hidden_size)W_xo, W_ho, b_o = torch.randn(input_size, hidden_size) * 0.1, torch.randn(hidden_size, hidden_size) * 0.1, torch.zeros(hidden_size)W_xc, W_hc, b_c = torch.randn(input_size, hidden_size) * 0.1, torch.randn(hidden_size, hidden_size) * 0.1, torch.zeros(hidden_size)W_hq = torch.randn(hidden_size, output_size) * 0.1b_q = torch.zeros(output_size)params = [W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c, W_hq, b_q]for param in params:param.requires_grad = Truereturn params

接著,我們需要初始化0時刻的隱藏轉態:

import torchdef init_state(batch_size, hidden_size):return (torch.zeros((batch_size, hidden_size)), torch.zeros((batch_size, hidden_size)))

然后, 就是LSTM的核心操作:

import torch
import torch.nn as nn
def lstm(X, state, params):[W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c, W_hq, b_q] = params(H, C) = stateoutputs = []for x in X:I = torch.sigmoid(torch.mm(x, W_xi) + torch.mm(H, W_hi) + b_i)F = torch.sigmoid(torch.mm(x, W_xf) + torch.mm(H, W_hf) + b_f)O = torch.sigmoid(torch.mm(x, W_xo) + torch.mm(H, W_ho) + b_o)C_tilde = torch.tanh(torch.mm(x, W_xc) + torch.mm(H, W_hc) + b_c)C = F * C + I * C_tildeH = O * torch.tanh(C)Y = torch.mm(H, W_hq) + b_qoutputs.append(Y)return torch.cat(outputs, dim=1), (H, C)

四、使用Pytroch實現簡單的LSTM

在Pytroch中,已經內置了lstm函數,我們只需要調用就可以實現上述操作:

import torch
import torch.nn as nnclass mylstm(nn.Module):def __init__(self, input_size, output_size, hidden_size):super(mylstm, 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, h0, c0):out, (hn, cn) = self.lstm(x, h0, c0)out = self.fc(out)return out, (hn, cn)# 示例
input_size = 10
hidden_size = 20
output_size = 10
batch_size = 1
seq_len = 5
num_layer = 1 # lstm堆疊層數h0 = torch.zeros(num_layer, batch_size, hidden_size)
c0 = torch.randn(num_layer, batch_size, hidden_size)
x = torch.randn(batch_size, seq_len, hidden_size)model = mylstm(input_size=input_size, hidden_size=hidden_size, output_size=output_size)out, _ = model(x, (h0, c0))
print(out.shape)

總結

在現實中,LSTM的實際應用場景很多,比如語言模型、文本生成、時間序列預測、情感分析等長序列任務重,這是因為相比于RNN而言,LSTM能夠更高地捕捉長期依賴,而且也更好的緩解了梯度消失問題;但是由于LSTM引入了三個門控機制,導致參數量比RNN要多,訓練慢。

總的來說,LSTM是對傳統RNN的一次革命性升級,引入門控機制和記憶單元,使模型能夠選擇性地記憶與遺忘,從而有效地捕捉長距離依賴。盡管LSTM近年來Transformer所取代,但LSTM依然是理解深度學習序列模型不可繞開的一環,有時在其他任務上甚至優于Transformer。


如果小伙伴們覺得本文對各位有幫助,歡迎:👍點贊 |?? 收藏 | ?🔔 關注。我將持續在專欄《人工智能》中更新人工智能知識,幫助各位小伙伴們打好扎實的理論與操作基礎,歡迎🔔訂閱本專欄,向AI工程師進階!

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

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

相關文章

接地氣的方式認識JVM(一)

最近在學jvm,浮于表面的學了之后,發現jvm并沒有我想象中的那么神秘,這篇文章將會用接地氣的方式來說一說這些jvm的相關概念以及名詞解釋。 帶著下面兩個問題來閱讀 認識了解JVM大致有什么在代碼運行時的都在背后做了什么 JVM是個啥&#xf…

Next.js 15 與 Apollo Client 的現代集成及性能優化

Next.js 15 與 Apollo Client 的現代集成及性能優化 目錄 技術演進集成實踐性能優化應用案例未來趨勢 技術演進 Next.js 15 核心特性對開發模式的革新 Next.js 15 通過引入 App Router、服務器組件(Server Components)和客戶端組件(Clie…

無人機橋梁3D建模、巡檢、檢測的航線規劃

無人機橋梁3D建模、巡檢、檢測的航線規劃 無人機在3D建模、巡檢和檢測任務中的航線規劃存在顯著差異,主要體現在飛行高度、航線模式、精度要求和傳感器配置等方面。以下是三者的詳細對比分析: 1. 核心目標差異 任務類型主要目標典型應用場景3D建模 生成…

Hive數據傾斜問題深度解析與實戰優化指南

一、數據傾斜現象的本質與危害 數據傾斜是Hive在MapReduce計算過程中,?部分Key對應的數據量遠超其他Key,導致少數Reducer任務處理時間遠高于其他任務的性能瓶頸問題。典型表現為: ?作業進度卡在99%??:99%的Reducer已完成,剩余1%持續數小時?資源利用率失衡?:部分節…

VRRP 原理與配置:讓你的網絡永不掉線!

VRRP 原理與配置:讓你的網絡永不掉線! 一. VRRP 是什么,為什么需要它?二. VRRP 的核心概念三. VRRP 的工作原理四. 華為設備 VRRP 配置步驟 (主備模式)4.1 拓撲示例4.2 🛠 配置步驟 五. VRRP 配…

解決開發者技能差距:AI 在提升效率與技能培養中的作用

企業在開發者人才方面正面臨雙重挑戰。一方面,IDC 預測,到2025年,全球全職開發者將短缺400萬人;另一方面,一些行業巨頭已暫停開發者招聘,轉而倚重人工智能(AI)來滿足開發需求。這不禁…

痛點即爆點?如何挖掘客戶的痛點和需求?

銷售的核心在于精準洞察客戶需求與痛點,并運用專業能力為其提供定制化解決方案,從而消除客戶顧慮、解決問題,最終實現雙贏。而快速識別客戶痛點,不僅是成交的關鍵,更是建立專業形象、贏得客戶信任的核心能力。那么&…

云服務器如何自動更新系統并保持安全?

云服務器自動更新系統是保障安全、修補漏洞的重要措施。下面是常見 Linux 系統(如 Ubuntu、Debian、CentOS)和 Windows 服務器自動更新的做法和建議: 1. Linux 云服務器自動更新及安全維護 Ubuntu / Debian 系統 手動更新命令 sudo apt up…

fvm install 下載超時 過慢 fvm常用命令、flutter常用命令

Git 配置問題 確保 Git 使用的是 HTTPS,而不是 SSH。如果你有 .gitconfig,確保沒有配置奇怪的代理: git config --global --get http.proxy git config --global --get https.proxy如果有代理設置且不需要,取消代理:…

多語種OCR識別系統,引領文字識別新時代

在全球化與數字化深度融合的今天,語言障礙成為企業跨國協作、信息管理的一大挑戰。無論是跨國合同簽署、多語言檔案管理,還是跨境商務溝通,高效精準的文字識別技術已成為剛需。中安智能OCR多語種識別系統應運而生,憑借其強大的光學…

Pyenv 使用指南:多版本 Python 環境管理

目錄 Pyenv 是什么?安裝 Pyenv管理 Python 版本虛擬環境管理項目級 Python 版本控制高級技巧常見問題解決最佳實踐 Pyenv 是什么? Pyenv 是一個強大的 Python 版本管理工具,允許你: 在同一臺機器上安裝多個 Python 版本輕松切換…

Windows 11 家庭版 安裝Docker教程

Windows 家庭版需要通過腳本手動安裝 Hyper-V 一、前置檢查 1、查看系統 快捷鍵【winR】,輸入“control” 【控制面板】—>【系統和安全】—>【系統】 2、確認虛擬化 【任務管理器】—【性能】 二、安裝Hyper-V 1、創建并運行安裝腳本 在桌面新建一個 .…

leetcode:479. 最大回文數乘積(python3解法,數學相關算法題)

難度:簡單 給定一個整數 n ,返回 可表示為兩個 n 位整數乘積的 最大回文整數 。因為答案可能非常大,所以返回它對 1337 取余 。 示例 1: 輸入:n 2 輸出:987 解釋:99 x 91 9009, 9009 % 1337 …

VR看房系統,新生代看房新體驗

VR看房系統的概念 虛擬現實(VirtualReality,VR)看房系統,是近年來隨著科技進步在房地產行業中興起的一種創新看房方式。看房系統利用先進的計算機技術模擬出一個三維環境,使用戶能夠身臨其境地瀏覽和體驗房源,無需親自…

棧與隊列:數據結構的有序律動

在數據結構的舞臺上,棧與隊列宛如兩位優雅的舞者,以獨特的節奏演繹著數據的進出規則。它們雖不像順序表與鏈表那般復雜多變,卻有著令人著迷的簡潔與實用,在眾多程序場景中發揮著不可或缺的作用。今天,就讓我們一同去探…

Flutte ListView 列表組件

目錄 1、垂直列表 1.1 實現用戶中心的垂直列表 2、垂直圖文列表 2.1 動態配置列表 2.2 for循環生成一個動態列表 2.3 ListView.builder配置列表 列表布局是我們項目開發中最常用的一種布局方式。Flutter中我們可以通過ListView來定義列表項,支持垂直和水平方向展示…

跟Gemini學做PPT-模板樣式的下載

好的,這里有一些推薦的網站,您可以在上面找到PPT目錄樣式和模板的靈感: SlideModel (slidemodel.com) 提供各種預先設計的目錄幻燈片模板。這些模板100%可編輯,可用于PowerPoint和Google Slides。您可以找到不同項目數量&#xff…

【Netty系列】Reactor 模式 1

目錄 一、Reactor 模式的核心思想 二、Netty 中的 Reactor 模式實現 1. 服務端代碼示例 2. 處理請求的 Handler 三、運行流程解析(結合 Reactor 模式) 四、關鍵點說明 五、與傳統模型的對比 六、總結 Reactor 模式是 Netty 高性能的核心設計思想…

LDAP(Lightweight Directory Access Protocol,輕量級目錄訪問協議)認證

理解 LDAP(Lightweight Directory Access Protocol,輕量級目錄訪問協議)認證,核心在于將其看作一種用于查詢和驗證用戶身份信息的標準協議,類似于一個專門為“查找”優化的電子電話簿系統。以下是分層解析:…

LeetCodeHot100_0x09

LeetCodeHot100_0x09 70. 最小棧數據結構實現 求解思路: 一開始想著只用一個最小棧結構不就實現了,結果測試的時候發現,在pop元素后,它的最小值有可能不受影響,但是只用一個最小棧的話,最小值一定是作為棧…