一文讀懂循環神經網絡(RNN)—語言模型+讀取長序列數據(2)

目錄

讀取長序列數據

為什么需要 “讀取長序列數據”?

讀取長序列數據的核心方法

1. 滑動窗口(Sliding Window)

2. 分段截取(Segmentation)

3. 滾動生成(Rolling Generation)

4. 關鍵信息采樣

讀取長序列數據的核心挑戰

隨機抽樣(Random Sampling)

1.核心原理

2.具體操作

3.優缺點

4.適用場景

順序分區(Sequential Partitioning)

1.核心原理

2.具體操作

3.優缺點

4.適用場景

4種核心方法的區別

完整代碼

實驗結果

第一次運行結果

第二次運行結果


讀取長序列數據

讀取長序列數據指的是對超出模型單次處理能力(或固定長度限制)的超長序列進行讀取、拆分和預處理的過程。其核心目標是將長序列轉換為模型可接受的格式,同時盡可能保留序列中的時序關系和上下文信息

為什么需要 “讀取長序列數據”?

  1. 模型輸入長度限制: 大多數序列模型(如 RNN、Transformer)對輸入長度有固定限制(例如,早期 Transformer 的輸入長度上限為 512 個詞元)。若原始序列(如一篇萬字文章、1 小時的語音)遠超此限制,無法直接輸入模型。

  2. 計算資源約束: 即使模型支持變長輸入,超長序列會導致計算量和內存占用呈指數級增長(例如,自注意力機制的時間復雜度為?\(O(n^2)\),n?為序列長度),實際訓練或推理時難以承受。

  3. 保留時序關系: 長序列的核心價值在于其內部的時序依賴(如文本中的上下文關聯、時間序列中的長期趨勢)。讀取時需避免破壞關鍵依賴,否則會導致模型性能下降。

讀取長序列數據的核心方法

處理長序列的核心思路是 “拆分”,但需根據任務需求選擇合適的拆分策略,常見方法包括:

1. 滑動窗口(Sliding Window)
  • 原理:用固定長度的 “窗口” 在長序列上滑動,每次截取窗口內的子序列作為樣本,窗口間可重疊(保留部分上下文)。
  • 示例:對長度為 1000 的文本,用長度為 100 的窗口,步長為 50 滑動,可得到 19 個樣本(窗口位置:[0-99], [50-149], ..., [900-999])。
  • 適用場景:時間序列預測(如預測未來溫度需保留近期趨勢)、文本分類(需捕捉局部上下文)。
  • 優點:保留局部時序關系,樣本數量多;
  • 缺點:窗口外的遠距離依賴可能被割裂。
2. 分段截取(Segmentation)
  • 原理:將長序列按固定長度直接分割為不重疊的子序列(類似 “分塊”)。
  • 示例:將 1000 個詞的文本按 200 個詞一段,分為 5 段(無重疊)。
  • 適用場景:對局部信息依賴較強的任務(如語音識別中的短句分割、長文檔的段落級分類)。
  • 優點:簡單高效,無冗余;
  • 缺點:可能切斷段落中間的關鍵依賴(如句子被拆分為兩段)。
3. 滾動生成(Rolling Generation)
  • 原理:對超長序列,每次用前序子序列的輸出作為 “記憶”,輔助處理下一段子序列(類似人類 “分段閱讀并記憶上下文”)。
  • 示例:用 RNN 處理 10000 詞文本時,先處理前 1000 詞并保存隱藏狀態,再用該隱藏狀態初始化模型,處理接下來的 1000 詞,以此類推。
  • 適用場景:長文本生成(如小說續寫)、實時數據流處理(如股票實時行情)。
  • 優點:可處理無限長序列,保留長期記憶;
  • 缺點:誤差可能累積(前序處理的偏差會影響后續結果)。
4. 關鍵信息采樣
  • 原理:對超長序列,只抽取關鍵部分(如摘要、峰值點),忽略冗余信息。
  • 示例:在長文本中提取關鍵詞或句子組成短序列;在高頻時間序列中保留峰值和谷值點。
  • 適用場景:對全局趨勢而非細節敏感的任務(如長文檔摘要、異常檢測)。
  • 優點:大幅降低序列長度,保留核心信息;
  • 缺點:可能丟失重要細節,依賴有效的采樣策略。

讀取長序列數據的核心挑戰

  1. 平衡長度與信息保留:拆分過短會丟失上下文,過長則增加計算負擔。
  2. 處理時序斷裂:拆分點可能位于關鍵依賴處(如句子中間、事件轉折點),導致語義割裂。
  3. 動態適配模型:不同模型(如 RNN 對長距離依賴敏感,Transformer 對局部依賴更高效)需匹配不同的拆分策略。

隨機抽樣(Random Sampling)

1.核心原理
  • 用固定長度的 “窗口” 在長序列上隨機滑動,截取不重疊(或少量重疊)的子序列作為樣本。
  • 子序列的起始位置隨機打亂,打破原始序列的連續性,降低樣本間的相關性。
2.具體操作
  • 設定窗口長度(num_steps)和批量大小(batch_size)。
  • 從序列中隨機選擇起始點,生成多個子序列,組成批量數據。
  • 標簽為子序列向右偏移 1 位的結果(預測下一個元素)。

示例

對序列?[0,1,2,...,34],用窗口長度 5 隨機抽樣,可能得到子序列:
[3,4,5,6,7][18,19,20,21,22][10,11,12,13,14]

3.優缺點
  • 優點:樣本隨機性高,訓練時梯度波動小,適合并行計算
  • 缺點:破壞長距離時序依賴(如子序列前后的關聯被割裂)。
4.適用場景

長期依賴要求不高的任務(如文本分類、短期時間序列預測)。

順序分區(Sequential Partitioning)

1.核心原理
  • 將長序列按固定長度分割為連續的子序列,保留原始時序順序,子序列間可連續拼接。
  • 按 “批次” 劃分序列:先將序列均勻分為?batch_size?個連續片段,再從每個片段中按順序截取子序列。
2.具體操作
  • 設定窗口長度(num_steps)和批量大小(batch_size)。
  • 將序列分為?batch_size?個并行的連續子序列(如序列分為 2 段:[0,1,...,17]?和?[18,19,...,34])。
  • 從每個子序列中按順序截取窗口,組成批量(確保同批次樣本在原始序列中位置對齊)。

示例

對序列?[0,1,2,...,34],分 2 個批次,窗口長度 5,可能得到:

  • 第 1 批:[0,1,2,3,4]?和?[18,19,20,21,22]
  • 第 2 批:[5,6,7,8,9]?和?[23,24,25,26,27]
3.優缺點
  • 優點:保留時序連續性,適合捕捉長期依賴(子序列可拼接為完整原始序列)。
  • 缺點:樣本相關性高,訓練時梯度可能震蕩(同批次樣本來自相鄰區域)。
4.適用場景

時序依賴敏感的任務(如語言生成、長文本翻譯、長期時間序列預測)。

4種核心方法的區別

方法核心邏輯關鍵特點典型場景
隨機抽樣隨機截取子序列,打破順序隨機性高,丟失長期依賴文本分類、短期預測
順序分區連續截取子序列,保留順序時序完整,樣本相關性高語言生成、長期預測
滑動窗口重疊截取,保留局部上下文平衡信息與效率語音識別、段落理解
滾動生成迭代處理,延續隱藏狀態支持無限序列,誤差累積實時數據流、超長文本處理

完整代碼

"""
文件名: 8.4 讀取長序列數據
作者: 墨塵
日期: 2025/7/14
項目名: dl_env
備注: 實現長序列數據的兩種讀取方式(隨機抽樣和順序分區),將超長序列拆分為小批量子序列,適配序列模型的訓練需求
"""
import random
import torch
import collections  # 備用:用于統計(本代碼未直接使用)
import re  # 備用:用于文本處理(本代碼未直接使用)
from d2l import torch as d2l  # 提供輔助功能(本代碼未直接使用)
# 手動顯示圖像相關庫(本代碼未涉及繪圖,僅保留配置)
import matplotlib.pyplot as plt
import matplotlib.text as text# -------------------------- 1. 隨機抽樣讀取長序列 --------------------------
def seq_data_iter_random(corpus, batch_size, num_steps):  #@save"""使用隨機抽樣生成小批量子序列(打破原始序列順序,適合并行訓練)參數:corpus: 長序列數據(1D列表或數組,如[0,1,2,...,34])batch_size: 批量大小(每個批次包含的樣本數)num_steps: 每個子序列的長度(模型單次處理的序列長度)生成器返回:X: 輸入子序列(批量),形狀為(batch_size, num_steps)Y: 標簽子序列(批量),形狀為(batch_size, num_steps),其中Y[i]是X[i]向右偏移1位的結果"""# 步驟1:隨機偏移起始位置,避免總是從序列開頭抽樣(增加隨機性)# 偏移范圍為[0, num_steps-1],確保初始偏移不超過子序列長度corpus = corpus[random.randint(0, num_steps - 1):]# 步驟2:計算可生成的子序列總數# 減1是因為Y需要比X右移1位(最后一個元素沒有標簽)num_subseqs = (len(corpus) - 1) // num_steps  # 整數除法,確保子序列完整# 步驟3:生成所有子序列的起始索引# 從0開始,每隔num_steps取一個索引(如num_steps=5時,索引為0,5,10,...)initial_indices = list(range(0, num_subseqs * num_steps, num_steps))# 步驟4:隨機打亂起始索引(核心:打破原始序列的順序,避免樣本相關性過高)random.shuffle(initial_indices)# 輔助函數:根據起始索引pos,返回長度為num_steps的子序列def data(pos):return corpus[pos: pos + num_steps]# 步驟5:按批量生成樣本num_batches = num_subseqs // batch_size  # 總批次數 = 子序列總數 // 批量大小for i in range(0, batch_size * num_batches, batch_size):# 當前批次的起始索引列表(從打亂的索引中取batch_size個)initial_indices_per_batch = initial_indices[i: i + batch_size]# 生成輸入X:每個元素是長度為num_steps的子序列X = [data(j) for j in initial_indices_per_batch]# 生成標簽Y:每個元素是X中對應子序列右移1位的結果(預測下一個元素)Y = [data(j + 1) for j in initial_indices_per_batch]# 返回當前批次的X和Y(轉換為張量)yield torch.tensor(X), torch.tensor(Y)# -------------------------- 2. 順序分區讀取長序列 --------------------------
def seq_data_iter_sequential(corpus, batch_size, num_steps):  #@save"""使用順序分區生成小批量子序列(保留原始序列順序,適合捕捉長期依賴)參數:corpus: 長序列數據(1D列表或數組)batch_size: 批量大小num_steps: 每個子序列的長度生成器返回:X: 輸入子序列(批量),形狀為(batch_size, num_steps)Y: 標簽子序列(批量),形狀為(batch_size, num_steps),Y是X右移1位的結果"""# 步驟1:隨機偏移起始位置(與隨機抽樣類似,增加隨機性)offset = random.randint(0, num_steps)# 步驟2:計算有效序列長度(確保能被batch_size整除,便于均勻分區)# 總有效長度 = ((原始長度 - 偏移 - 1) // batch_size) * batch_size# 減1是因為Y需要右移1位,確保X和Y長度相同num_tokens = ((len(corpus) - offset - 1) // batch_size) * batch_size# 步驟3:生成輸入X和標簽Y,并重塑為(batch_size, 總長度//batch_size)# X:從偏移開始,取num_tokens個元素Xs = torch.tensor(corpus[offset: offset + num_tokens])# Y:比X右移1位,同樣取num_tokens個元素Ys = torch.tensor(corpus[offset + 1: offset + 1 + num_tokens])# 重塑為二維:每行是一個樣本,列數為總長度//batch_sizeXs, Ys = Xs.reshape(batch_size, -1), Ys.reshape(batch_size, -1)# 步驟4:按順序生成批次(保留序列順序)num_batches = Xs.shape[1] // num_steps  # 總批次數 = 每行長度 // num_stepsfor i in range(0, num_steps * num_batches, num_steps):# 從每行中截取第i到i+num_steps列,作為當前批次的輸入XX = Xs[:, i: i + num_steps]# 對應的標簽Y(同樣截取,與X對齊)Y = Ys[:, i: i + num_steps]yield X, Y# -------------------------- 3. 測試兩種讀取方法 --------------------------
if __name__ == '__main__':# 生成測試序列:0到34(長度35的序列)my_seq = list(range(35))print("測試序列:", my_seq)print("序列長度:", len(my_seq))# 超參數:批量大小=2,每個子序列長度=5batch_size = 2num_steps = 5# 測試1:隨機抽樣讀取print("\n===== 隨機抽樣生成的批量 =====")for X, Y in seq_data_iter_random(my_seq, batch_size, num_steps):print("X(輸入):")print(X)print("Y(標簽,X右移1位):")print(Y)print("-" * 50)# 只打印3個批次(避免輸出過長)break# 測試2:順序分區讀取print("\n===== 順序分區生成的批量 =====")for X, Y in seq_data_iter_sequential(my_seq, batch_size, num_steps):print("X(輸入):")print(X)print("Y(標簽,X右移1位):")print(Y)print("-" * 50)# 只打印3個批次break

實驗結果

第一次運行結果

第二次運行結果

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

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

相關文章

Oracle Virtualbox 虛擬機配置靜態IP

Oracle Virtualbox 虛擬機配置靜態IP VirtualBox的網卡,默認都是第一個不能自定義,后續新建的可以自定義。 新建NAT網卡、host主機模式網卡 依次點擊:管理->工具->網絡管理器新建host主機模式網卡 這個網卡的網段自定義,創建…

Linux RAID1 創建與配置實戰指南(mdadm)

Linux RAID1 創建與配置實戰指南(mdadm)一、RAID1 核心價值與實戰目標RAID1(磁盤鏡像) 通過數據冗余提供高可靠性:當單塊硬盤損壞時,數據不丟失支持快速陣列重建讀寫性能略低于單盤(鏡像寫入開銷…

MySQL數據庫----函數

目錄函數1,字符串函數2,數值函數3,日期函數4,流程函數函數 1,字符串函數 MySQL中內置了很多字符串函數 2,數值函數 3,日期函數 4,流程函數

1.2 vue2(組合式API)的語法結構以及外部暴露

vue2 vue3中可以寫vue2的語法&#xff0c;vue2的結構像一個花盆里的根&#xff08;根組件App.vue&#xff09;&#xff0c;根上可以插上不同的枝杈和花朵&#xff08;組件&#xff09;。 組件的結構&#xff1a; // 這里寫邏輯行為 <script lang"ts"> export d…

Swift 解 LeetCode 324:一步步實現擺動排序 II,掌握數組重排的節奏感

文章目錄摘要描述題解答案題解代碼&#xff08;Swift&#xff09;題解代碼分析步驟一&#xff1a;排序數組步驟二&#xff1a;左右指針分段步驟三&#xff1a;按位置交錯插入示例測試及結果示例 1示例 2示例 3&#xff08;邊界情況&#xff09;時間復雜度分析空間復雜度分析總結…

使用SQLMAP的文章管理系統CMS的sql注入滲透測試

SQLMAP注入演示&#xff1a;抓包拿到Cookie:召喚sqlmap&#xff1a;sqlmap -u "http://192.168.1.99:8085/show.php?id34" --cookie "pma_langzh_CN; kbqug_admin_username2621-PL_LxhFjyVe43ZuQvht6MI5q0ZcpRVV5FI0pzQ6XR8; kbqug_siteid2621-PL_LxhFjyVe4yA5…

I3C通信協議核心詳解

一、物理層與電氣特性雙線結構 SCL&#xff08;串行時鐘線&#xff09;&#xff1a;主設備控制&#xff0c;支持 推挽&#xff08;Push-Pull&#xff09;輸出&#xff08;高速模式&#xff09;和 開漏&#xff08;Open-Drain&#xff09;&#xff08;兼容I2C模式&#xff09;。…

Docker搭建Redis哨兵集群

Redis提供了哨兵機制實現主從集群下的故障轉移&#xff0c;其中包含了對主從服務的檢測、自動故障恢復和通知。 1.環境 centos7、redis6.2.4、MobaXterm 目的&#xff1a; 搭建redis的主從同步哨兵集群&#xff08;一主一從三哨兵&#xff09; 2.步驟 1.主從集群的搭建 主從…

暑假Python基礎整理 --異常處理及程序調試

異常概念 在程序運行過程中&#xff0c;經常會遇到各種各樣的錯誤&#xff0c;這些錯誤統稱為“異常”。如下表是Python常見的異常與描述&#xff1a; 異常描述NameError嘗試訪問一個未聲明的變量引發錯誤IndexError索引超出序列范圍引發錯誤IndentationError縮進錯誤ValueErr…

k8s-高級調度(二)

目錄 Taint(污點)與Toleration(容忍) Taint&#xff08;污點&#xff09;&#xff1a;節點的排斥標記 Toleration&#xff08;容忍&#xff09;&#xff1a;Pod的適配聲明 與節點親和性的對比 警戒(cordon)和轉移(drain) Cordon&#xff1a;節點隔離&#xff08;阻止新 Po…

基于OpenCV的深度學習人臉識別系統開發全攻略(DNN+FaceNet核心技術選型)

核心技術選型表 技術組件版本/型號用途OpenCV DNN4.5.5人臉檢測FaceNet (facenet-pytorch)0.5.0人臉特征提取MiniConda最新版Python環境管理PyTorch1.8.0FaceNet運行基礎OpenVINO2021.4模型加速(可選)SSD Caffe模型res10_300x300高精度人臉檢測 一、環境準備與項目搭建 1.1 M…

【AI News | 20250714】每日AI進展

AI Repos 1、All-Model-Chat All Model Chat 是一款為Google Gemini API家族設計的網頁聊天應用&#xff0c;支持多模態輸入&#xff08;圖片、音頻、PDF等&#xff09;和多種模型&#xff08;如Gemini Flash、Imagen&#xff09;。它提供了豐富的自定義功能&#xff0c;包括高…

C 語言(二)

主要包括變量與常量、數據類型、存儲方式、數制轉換以及字符處理等內容一、變量與常量在 C 語言中&#xff0c;變量是用來存儲數據的命名空間&#xff0c;它會在內存中分配地址。例如&#xff1a;int i; i 12345; 其中 i 是變量&#xff0c;12345 是常量。常量表示在程序運行過…

原型繼承(prototypal inheritance)的工作原理

這是一個非常常見的 JavaScript 問題。所有 JS 對象都有一個__proto__屬性&#xff0c;指向它的原型對象。當試圖訪問一個對象的屬性時&#xff0c;如果沒有在該對象上找到&#xff0c;它還會搜尋該對象的原型&#xff0c;以及該對象的原型的原型&#xff0c;依次層層向上搜索&…

OpenCV 視頻處理與攝像頭操作詳解

1. 引言大家都來寫OpenCV&#x1f60a;&#xff0c;學的好開心&#xff01;2. 視頻基礎與OpenCV簡介2.1 視頻的定義視頻&#xff08;Video&#xff09;是由一系列靜態圖像&#xff08;幀&#xff09;以一定速率連續播放形成的動態影像。其本質是利用人眼的視覺暫留效應&#xf…

Agentic AI 的威脅與緩解措施

原文&#xff1a;https://www.aigl.blog/content/files/2025/04/Agentic-AI—Threats-and-Mitigations.pdf AI Agent 的定義 1. 定義與基礎 智能代理&#xff08;Agent&#xff09;的定義&#xff1a; 智能代理是一種能夠感知環境、進行推理、做出決策并自主采取行動以實現特定…

ArrayList列表解析

ArrayList集合 ArrayList 的底層是數組隊列&#xff0c;相當于動態數組。與 Java 中的數組相比&#xff0c;它的容量能動態增長。在添加大量元素前&#xff0c;應用程序可以使用ensureCapacity操作來增加 ArrayList 實例的容量。這可以減少遞增式再分配的數量。 ArrayList 繼承…

《戀與深空》中龍和蛇分別是誰的代表

在《戀與深空》宏大而神秘的世界觀中&#xff0c;每一個符號都蘊含著深意。當玩家們熱議“龍”和“蛇”這兩種強大而古老的生物究竟代表著誰時&#xff0c;所有的線索都默契地指向了同一個名字——秦徹。 他不僅是力量與權威的象征“惡龍”&#xff0c;也是背負著宿命與糾葛的“…

gitignore添加后如何生效?

清除 Git 緩存&#xff1a; git rm -r --cached .添加文件到 Git&#xff1a;git add .使用 git commit 命令提交這些更改git commit -m "Update .gitignore"

多尺度頻率輔助類 Mamba 線性注意力模塊(MFM),融合頻域和空域特征,提升多尺度、復雜場景下的目標檢測能力

在偽裝物體檢測領域&#xff0c;現有方法大多依賴空間局部特征&#xff0c;難以有效捕捉全局信息&#xff0c;而 Transformer 類方法雖能建模長距離依賴關系&#xff0c;卻存在計算成本高、網絡結構復雜的問題。同時&#xff0c;頻域特征雖具備全局建模能力&#xff0c;可頻繁的…