深度學習處理時間序列(5)

Keras中的循環層

上面的NumPy簡單實現對應一個實際的Keras層—SimpleRNN層。不過,二者有一點小區別:SimpleRNN層能夠像其他Keras層一樣處理序列批量,而不是像NumPy示例中的那樣只能處理單個序列。也就是說,它接收形狀為(batch_size,timesteps, input_features)的輸入,而不是(timesteps, input_features)。指定初始Input()的shape參數時,你可以將timesteps設為None,這樣神經網絡就能夠處理任意長度的序列,如代碼清單10-16所示。

代碼清單10-16 能夠處理任意長度序列的RNN層

num_features = 14
inputs = keras.Input(shape=(None, num_features))
outputs = layers.SimpleRNN(16)(inputs)

果你想讓模型處理可變長度的序列,那么這就特別有用。但是,如果所有序列的長度相同,那么我建議指定完整的輸入形狀,因為這樣model.summary()能夠顯示輸出長度信息,這總是很好的,而且還可以解鎖一些性能優化功能。Keras中的所有循環層(SimpleRNN層、LSTM層和GRU層)都可以在兩種模式下運行:一種是返回每個時間步連續輸出的完整序列,即形狀為(batch_size, timesteps,output_features)的3階張量;另一種是只返回每個輸入序列的最終輸出,即形狀為(batch_size, output_features)的2階張量。這兩種模式由return_sequences參數控制。我們來看一個SimpleRNN示例,它只返回最后一個時間步的輸出,如代碼清單10-17所示。

代碼清單10-17 只返回最后一個時間步輸出的RNN層

>>> num_features = 14
>>> steps = 120
>>> inputs = keras.Input(shape=(steps, num_features))
>>> outputs = layers.SimpleRNN(16, return_sequences=False)(inputs)----請注意,默認情況下使用return_sequences=False
>>> print(outputs.shape)
(None, 16)

代碼清單10-18給出的示例返回了完整的狀態序列。

代碼清單10-18 返回完整輸出序列的RNN層

>>> num_features = 14
>>> steps = 120
>>> inputs = keras.Input(shape=(steps, num_features))
>>> outputs = layers.SimpleRNN(16, return_sequences=True)(inputs)
>>> print(outputs.shape)
(None, 120, 16)

為了提高神經網絡的表示能力,有時將多個循環層逐個堆疊也是很有用的。在這種情況下,你需要讓所有中間層都返回完整的輸出序列,如代碼清單10-19所示。

代碼清單10-19 RNN層堆疊

inputs = keras.Input(shape=(steps, num_features))
x = layers.SimpleRNN(16, return_sequences=True)(inputs)
x = layers.SimpleRNN(16, return_sequences=True)(x)
outputs = layers.SimpleRNN(16)(x)

我們在實踐中很少會用到SimpleRNN層。它通常過于簡單,沒有實際用途。特別是SimpleRNN層有一個主要問題:在t時刻,雖然理論上來說它應該能夠記住許多時間步之前見過的信息,但事實證明,它在實踐中無法學到這種長期依賴。原因在于梯度消失問題,這一效應類似于在層數較多的非循環網絡(前饋網絡)中觀察到的效應:隨著層數的增加,神經網絡最終變得無法訓練。Yoshua Bengio等人在20世紀90年代初研究了這一效應的理論原因。

值得慶幸的是,SimpleRNN層并不是Keras中唯一可用的循環層,還有另外兩個:LSTM層和GRU層,二者都是為解決這個問題而設計的。我們來看LSTM層,其底層的長短期記憶(LSTM)算法由Sepp Hochreiter和Jürgen Schmidhuber在1997年開發4,是二人研究梯度消失問題的重要成果。

LSTM層是SimpleRNN層的變體,它增加了一種攜帶信息跨越多個時間步的方式。假設有一條傳送帶,其運行方向平行于你所處理的序列。序列中的信息可以在任意位置跳上傳送帶,然后被傳送到更晚的時間步,并在需要時原封不動地跳回來。這其實就是LSTM的原理:保存信息以便后續使用,從而防止較早的信號在處理過程中逐漸消失。這應該會讓你想到殘差連接,二者的思路幾乎相同。為了詳細解釋LSTM,我們先從SimpleRNN單元開始講起,如圖10-8所示。因為有許多個權重矩陣,所以對單元中的W和U兩個矩陣添加下標字母o(Wo和Uo)?,表示輸出(output)?。

在這里插入圖片描述

我們向圖10-8中添加新的數據流,其中攜帶跨越時間步的信息。這條數據流在不同時間步的值稱為c_t,其中c表示攜帶(carry)?。這些信息會對單元產生以下影響:它將與輸入連接和循環連接進行計算(通過密集變換,即與權重矩陣做點積,然后加上偏置,再應用激活函數)?,從而影響傳遞到下一個時間步的狀態(通過激活函數和乘法運算)?。從概念上來看,攜帶數據流可以調節下一個輸出和下一個狀態,如圖10-9所示。到目前為止,內容都很簡單。

在這里插入圖片描述

下面來看一下這種方法的精妙之處,即攜帶數據流下一個值的計算方法。它包含3個變換,這3個變換的形式都與SimpleRNN單元相同,如下所示。

y = activation(dot(state_t, U) + dot(input_t, W) + b)

但這3個變換都有各自的權重矩陣,我們分別用字母i、f、k作為下標。目前的模型如代碼清單10-20所示(這可能看起來有些隨意,但請你耐心一點)?。

代碼清單10-20 LSTM架構的詳細偽代碼(1/2)

output_t = activation(dot(state_t, Uo) + dot(input_t, Wo) + dot(c_t, Vo) + bo)
i_t = activation(dot(state_t, Ui) + dot(input_t, Wi) + bi)
f_t = activation(dot(state_t, Uf) + dot(input_t, Wf) + bf)
k_t = activation(dot(state_t, Uk) + dot(input_t, Wk) + bk)

通過對i_t、f_t和k_t進行計算,我們得到了新的攜帶狀態(下一個c_t)?,如代碼清單10-21所示。代碼清單10-21 LSTM架構的詳細偽代碼(2/2)

c_t+1 = i_t * k_t + c_t * f_t

添加上述內容之后的模型如圖10-10所示。這就是LSTM層,不算很復雜,只是稍微有些復雜而已。

在這里插入圖片描述

你甚至可以解釋每個運算的作用。比如你可以說,將c_t和f_t相乘,是為了故意遺忘攜帶數據流中不相關的信息。同時,i_t和k_t都包含關于當前時間步的信息,可以用新信息來更新攜帶數據流。但歸根結底,這些解釋并沒有多大意義,因為這些運算的實際效果是由權重參數決定的,而權重以端到端的方式進行學習,每次訓練都要從頭開始,因此不可能為某個運算賦予特定的意義。RNN單元的類型(如前所述)決定了假設空間,即在訓練過程中搜索良好模型配置的空間,但它不能決定RNN單元的作用,那是由單元權重來決定的。相同的單元具有不同的權重,可以起到完全不同的作用。因此,RNN單元的運算組合最好被解釋為對搜索的一組約束,而不是工程意義上的設計。這種約束的選擇(如何實現RNN單元)最好留給優化算法來完成(比如遺傳算法或強化學習過程)?,而不是讓人類工程師來完成。那將是未來我們構建模型的方式。總之,你不需要理解LSTM單元的具體架構。作為人類,你不需要理解它,而只需記住LSTM單元的作用:允許過去的信息稍后重新進入,從而解決梯度消失問題。

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

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

相關文章

操作系統相關知識點

操作系統在進行線程切換時需要進行哪些動作? 保存當前線程的上下文 保存寄存器狀態、保存棧信息。 調度器選擇下一個線程 調度算法決策:根據策略(如輪轉、優先級、公平共享)從就緒隊列選擇目標線程。 處理優先級:實時…

從0到1:Rust 如何用 FFmpeg 和 OpenGL 打造硬核視頻特效

引言:視頻特效開發的痛點,你中了幾個? 視頻特效如今無處不在:短視頻平臺的濾鏡美化、直播間的實時美顏、影視后期的電影級調色,甚至 AI 生成內容的動態效果。無論是個人開發者還是團隊,視頻特效都成了吸引…

【并發編程 | 第一篇】線程相關基礎知識

1.并發和并行有什么區別 并發是指多核CPU上的多任務處理,多個任務在同一時刻真正同時執行。 并行是指單核CPU上的多任務處理,多個任務在同一時間段內交替執行,通過時間片輪轉實現交替執行,用于解決IO密集型瓶頸。 如何理解線程安…

Kafka 偏移量

在 Apache Kafka 中,偏移量(Offset)是一個非常重要的概念。它不僅用于標識消息的位置,還在多種場景中發揮關鍵作用。本文將詳細介紹 Kafka 偏移量的核心概念及其使用場景。 一、偏移量的核心概念 1. 定義 偏移量是一個非負整數…

18.redis基本操作

Redis(Remote Dictionary Server)是一個開源的、高性能的鍵值對(Key-Value)存儲數據庫,廣泛應用于緩存、消息隊列、實時分析等場景。它以其極高的讀寫速度、豐富的數據結構和靈活的應用方式而受到開發者的青睞。 Redis 的主要特點 ?高性能: ?內存存儲:Redis 將所有數…

歷年跨鏈合約惡意交易詳解(一)——THORChain退款邏輯漏洞

漏洞合約函數 function returnVaultAssets(address router, address payable asgard, Coin[] memory coins, string memory memo) public payable {if (router address(this)){for(uint i 0; i < coins.length; i){_adjustAllowances(asgard, coins[i].asset, coins[i].a…

通俗易懂的講解SpringBean生命周期

&#x1f4d5;我是廖志偉&#xff0c;一名Java開發工程師、《Java項目實戰——深入理解大型互聯網企業通用技術》&#xff08;基礎篇&#xff09;、&#xff08;進階篇&#xff09;、&#xff08;架構篇&#xff09;清華大學出版社簽約作家、Java領域優質創作者、CSDN博客專家、…

深入理解 `git pull --rebase` 與 `--allow-unrelated-histories`:區別、原理與實戰指南

&#x1f680; git pull --rebase vs --allow-unrelated-histories 全面解析 在日常使用 Git 時&#xff0c;我們經常遇到兩種拉取遠程代碼的方式&#xff1a;git pull --rebase 和 git pull --allow-unrelated-histories。它們的區別是什么&#xff1f;各自適用哪些場景&…

Matlab_Simulink中導入CSV數據與仿真實現方法

前言 在Simulink仿真中&#xff0c;常需將外部數據&#xff08;如CSV文件或MATLAB工作空間變量&#xff09;作為輸入信號驅動模型。本文介紹如何高效導入CSV數據至MATLAB工作空間&#xff0c;并通過From Workspace模塊實現數據到Simulink的精確傳輸&#xff0c;適用于運動控制…

Spring Boot 中 JdbcTemplate 處理枚舉類型轉換 和 減少數據庫連接的方法 的詳細說明,包含代碼示例和關鍵要點

以下是 Spring Boot 中 JdbcTemplate 處理枚舉類型轉換 和 減少數據庫連接的方法 的詳細說明&#xff0c;包含代碼示例和關鍵要點&#xff1a; 一、JdbcTemplate 處理枚舉類型轉換 1. 場景說明 假設數據庫存儲的是枚舉的 String 或 int 值&#xff0c;但 Java 實體類使用 enu…

API 安全之認證鑒權

作者&#xff1a;半天 前言 API 作為企業的重要數字資源&#xff0c;在給企業帶來巨大便利的同時也帶來了新的安全問題&#xff0c;一旦被攻擊可能導致數據泄漏重大安全問題&#xff0c;從而給企業的業務發展帶來極大的安全風險。正是在這樣的背景下&#xff0c;OpenAPI 規范…

MATLAB繪圖配色包說明

本欄目將分享MATLAB數據分析圖表&#xff0c;該貼講述配色包的使用 將配色包colormap_nclCM文件夾添加到路徑close all&#xff08;盡量不要刪&#xff09;&#xff0c;使用map colormap(nclCM(309))時會多出來一張空白圖片。配色資源來自slandarer&#xff1b;找不到合適顏色…

Oracle 數據庫系統全面詳解

Oracle 數據庫是全球領先的關系型數據庫管理系統(RDBMS)&#xff0c;由 Oracle 公司開發。它為企業級應用提供了高性能、高可用性、安全性和可擴展性的數據管理解決方案。 目錄 一、Oracle 數據庫體系結構 1. 物理存儲結構 主要組件&#xff1a; 存儲層次&#xff1a; 2. …

Flink介紹——發展歷史

引入 我們整個大數據處理里面的計算模式主要可以分為以下四種&#xff1a; 批量計算&#xff08;batch computing&#xff09; MapReduce Hive Spark Flink pig流式計算&#xff08;stream computing&#xff09; Storm SparkStreaming/StructuredStreaming Flink Samza交互計…

在MFC中使用Qt(四):使用屬性表(Property Sheet)實現自動化Qt編譯流程

前言 首先回顧下前面文章介紹的&#xff1a; 在MFC中使用Qt&#xff08;一&#xff09;&#xff1a;玩膩了MFC&#xff0c;試試在MFC中使用Qt&#xff01;&#xff08;手動配置編譯Qt&#xff09; 在MFC中使用Qt&#xff08;二&#xff09;&#xff1a;實現Qt文件的自動編譯流…

Go紅隊開發— 收官工具

文章目錄 免責聲明個人武器開發美觀輸出Whois查詢反查ip目錄掃描子域名爆破被動掃描主動掃描(字典爆破)CDN檢測 免責聲明 &#x1f4a1; 本博客絕不涉及任何非法用途。 &#x1f4a1; 使用者風險自擔&#xff0c;違規后果自負。 &#x1f4a1; 守法為先&#xff0c;技術向善。 …

論文閱讀《P?roximal Curriculum for Reinforcement Learning Agents》——提升智能體學習速度的

老規矩&#xff0c;今天是使用Gemini2.5pro來生成的模板 這篇論文研究了如何為處理多個相關任務的強化學習智能體自動設計學習課程&#xff08;即任務順序&#xff09;&#xff0c;以加速訓練過程&#xff0c;并解決現有方法需要大量調參或缺乏理論依據的問題。為此&#xff0…

【面試題】在 CSS 中,實現一個 div 中的子 div 水平垂直居中

1. 使用 Flexbox 特點&#xff1a;簡單、直觀&#xff0c;現代瀏覽器支持良好。 代碼&#xff1a; css .parent {display: flex;justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */height: 200px; /* 父容器需有高度 */ } .child {…

基于SpringBoot的失物招領平臺(源碼+數據庫)

476基于SpringBoot的失物招領平臺&#xff0c;有用戶和管理員兩個角色&#xff0c;主要功能如下 失物招領系統功能介紹如下&#xff1a; 1. 用戶功能&#xff1a; - 發布失物公告&#xff1a;用戶可以發布自己的失物信息 - 失物分類&#xff1a;用戶可以根據失物的類型進行分類…

PyQt6實例_批量下載pdf工具_批量pdf網址獲取

目錄 前置&#xff1a; 步驟&#xff1a; step one 安裝包 step two 獲取股票代碼 step three 敲代碼&#xff0c;實現 step four 網址轉pdf網址 視頻 前置&#xff1a; 1 本系列將以 “PyQt6實例_批量下載pdf工具”開頭&#xff0c;放在 【PyQt6實例】 專欄 2 本節講…