《动手学深度学习 Pytorch版》 9.3 深度循环神经网络
将多层循环神经网络堆叠在一起,通过对几个简单层的组合,产生一个灵活的机制。其中的数据可能与不同层的堆叠有关。

9.3.1 函数依赖关系
将深度架构中的函数依赖关系形式化,第 l l l 个隐藏层的隐状态表达式为:
H t ( l ) = ϕ l ( H t ( l − 1 ) W x h ( l ) + H t − 1 ( l ) W h h ( l ) + b h ( l ) ) \boldsymbol{H}^{(l)}_t=\phi_l(\boldsymbol{H}^{(l-1)}_t\boldsymbol{W}^{(l)}_{xh}+\boldsymbol{H}^{(l)}_{t-1}\boldsymbol{W}^{(l)}_{hh}+\boldsymbol{b}^{(l)}_h) Ht(l)=ϕl(Ht(l−1)Wxh(l)+Ht−1(l)Whh(l)+bh(l))
参数字典:
-
ϕ l \phi_l ϕl 表示第 l l l 个隐藏层的激活函数
-
X t ∈ R n × d \boldsymbol{X}_t\in\R^{n\times d} Xt∈Rn×d 表示小批量输入
-
n n n 表示样本个数
-
d d d 表示输入个数
-
-
H t ( l ) ∈ R n × h \boldsymbol{H}^{(l)}_{t}\in\R^{n\times h} Ht(l)∈Rn×h 表示 l t h l^{th} lth 隐藏层 ( l = 1 , … , L ) (l=1,\dots,L) (l=1,…,L) 的隐状态
-
h h h 表示隐藏单元个数
-
设置 H t ( 0 ) = X t \boldsymbol{H}^{(0)}_{t}=\boldsymbol{X}_{t} Ht(0)=Xt
-
-
O t ∈ R n × q \boldsymbol{O}_{t}\in\R^{n\times q} Ot∈Rn×q 表示输出层变量
- q q q 表示输出数
-
W x h ( l ) , W h h ( l ) ∈ R h × h \boldsymbol{W}^{(l)}_{xh},\boldsymbol{W}^{(l)}_{hh}\in\R^{h\times h} Wxh(l),Whh(l)∈Rh×h 表示第 l l l 个隐藏层的权重参数
-
b h ( l ) ∈ R 1 × h \boldsymbol{b}^{(l)}_h\in\R^{1\times h} bh(l)∈R1×h 表示第 l l l 个隐藏层的偏重参数
最后,输出层的计算仅基于第 l l l 个隐藏层最终的隐状态:
O t = H t L W h q + b q \boldsymbol{O}_t=\boldsymbol{H}^{L}_t\boldsymbol{W}_{hq}+\boldsymbol{b}_q Ot=HtLWhq+bq
其中 W h q ∈ R h × q \boldsymbol{W}_{hq}\in\R^{h\times q} Whq∈Rh×q 和 b q ∈ R 1 × q \boldsymbol{b}_q\in\R^{1\times q} bq∈R1×q 表示输出层的模型参数
9.3.2 简洁实现
手撸多层循环神经网络有点过于麻烦了,在此仅简单实现。
import torch
from torch import nn
from d2l import torch as d2l
batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
vocab_size, num_hiddens, num_layers = len(vocab), 256, 2 # 用 num_layers 来设定隐藏层数
num_inputs = vocab_size
device = d2l.try_gpu()
lstm_layer = nn.LSTM(num_inputs, num_hiddens, num_layers)
model = d2l.RNNModel(lstm_layer, len(vocab))
model = model.to(device)
9.3.3 训练与预测
num_epochs, lr = 500, 2
d2l.train_ch8(model, train_iter, vocab, lr*1.0, num_epochs, device) # 多了一层后训练速度大幅下降
perplexity 1.0, 116173.5 tokens/sec on cuda:0
time travelleryou can show black is white by argument said filby
travelleryou can show black is white by argument said filby

练习
(1)基于我们在 8.5 节中讨论的单层实现,尝试从零开始实现两层循环神经网络。
batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)def get_params_bilayer(vocab_size, num_hiddens, device):num_inputs = num_outputs = vocab_sizedef normal(shape):return torch.randn(size=shape, device=device) * 0.01# 隐藏层1参数W_xh1 = normal((num_inputs, num_hiddens))W_hh1 = normal((num_hiddens, num_hiddens))b_h1 = torch.zeros(num_hiddens, device=device)# 新增隐藏层2参数W_hh2 = normal((num_hiddens, num_hiddens))b_h2 = torch.zeros(num_hiddens, device=device)# 输出层参数W_hq = normal((num_hiddens, num_outputs))b_q = torch.zeros(num_outputs, device=device)# 附加梯度params = [W_xh1, W_hh1, b_h1, W_hh2, b_h2, W_hq, b_q]for param in params:param.requires_grad_(True)return paramsdef init_rnn_state_bilayer(batch_size, num_hiddens, device):return (torch.zeros((batch_size, num_hiddens), device=device),torch.zeros((batch_size, num_hiddens), device=device)) # 新增第二个隐状态初始化张量def rnn_bilayer(inputs, state, params): # inputs的形状:(时间步数量,批量大小,词表大小)W_xh1, W_hh1, b_h1, W_hh2, b_h2, W_hq, b_q = params # 新增第二层参数H1, H2 = stateoutputs = []for X in inputs: # X的形状:(批量大小,词表大小) 前面转置是为了这里遍历H1 = torch.tanh(torch.mm(X, W_xh1) + torch.mm(H1, W_hh1) + b_h1) # 计算隐状态1H2 = torch.tanh(torch.mm(H1, W_hh2) + b_h2) # 计算隐状态2Y = torch.mm(H2, W_hq) + b_q # 计算输出outputs.append(Y)return torch.cat(outputs, dim=0), (H1, H2) # 沿时间步拼接num_hiddens = 512
net_rnn_bilayer = d2l.RNNModelScratch(len(vocab), num_hiddens, d2l.try_gpu(), get_params_bilayer,init_rnn_state_bilayer, rnn_bilayer)
num_epochs, lr = 500, 1
d2l.train_ch8(net_rnn_bilayer, train_iter, vocab, lr, num_epochs, d2l.try_gpu())
perplexity 1.0, 63514.3 tokens/sec on cuda:0
time travelleryou can show black is white by argument said filby
travelleryou can show black is white by argument said filby

(2)在本节训练模型中,比较使用门控循环单元替换长短期记忆网络后模型的精确度和训练速度。
vocab_size, num_hiddens, num_layers = len(vocab), 256, 2 # 用 num_layers 来设定隐藏层数
num_inputs = vocab_size
device = d2l.try_gpu()
# lstm_layer = nn.LSTM(num_inputs, num_hiddens, num_layers)
# model = d2l.RNNModel(lstm_layer, len(vocab))
gru_layer = nn.GRU(num_inputs, num_hiddens)
model_gru = d2l.RNNModel(gru_layer, len(vocab))
model_gru = model_gru.to(device)num_epochs, lr = 500, 2
d2l.train_ch8(model_gru, train_iter, vocab, lr*1.0, num_epochs, device) # 换 gru 后更快了
perplexity 1.0, 230590.6 tokens/sec on cuda:0
time traveller for so it will be convenient to speak of himwas e
travelleryou can show black is white by argument said filby

(3)如果增加训练数据,能够将困惑度降到多低?
已经是 1 了,没得降了。
(4)在为文本建模时,是否可以将不同作者的源数据合并?有何优劣呢?
不同作者的数据源之间可能没有什么关系,拼在一起可能效果反而下降。
相关文章:
《动手学深度学习 Pytorch版》 9.3 深度循环神经网络
将多层循环神经网络堆叠在一起,通过对几个简单层的组合,产生一个灵活的机制。其中的数据可能与不同层的堆叠有关。 9.3.1 函数依赖关系 将深度架构中的函数依赖关系形式化,第 l l l 个隐藏层的隐状态表达式为: H t ( l ) ϕ l …...
2023-10-19 LeetCode每日一题(同积元组)
2023-10-19每日一题 一、题目编号 1726. 同积元组二、题目链接 点击跳转到题目位置 三、题目描述 给你一个由 不同 正整数组成的数组 nums ,请你返回满足 a * b c * d 的元组 (a, b, c, d) 的数量。其中 a、b、c 和 d 都是 nums 中的元素,且 a ! b…...
GEE:绘制土地利用类型面积分布柱状图
作者:CSDN @ _养乐多_ 本文记录了,在 Google Earth Engine (GEE)中进行随机森林分类后绘制不同类型面积分布柱状图的代码片段。 完整代码请看博客《GEE:随机森林分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)》 柱状图效果如下所示, 文章目…...
2021年03月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python编程(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 下列代码的输出结果是?( ) x 0x10print(x)A:2 B:8 Cÿ…...
全网最丑焊锡教程(仅排针焊接心得)
一直以来玩各种开发板,焊接水平太差始终是阻碍我买性价比高的板子的最大原因。淘宝上好多芯片搭载上肥猪流板子是不包排针焊接的。终于下定决心要克服这个困难。不过,只是会焊接排针在高手面前最好不要说自己会焊锡,这应该是两码事。 首先上…...
重测序基因组:Pi核酸多样性计算
如何计算核酸多样性 Pi 本期笔记分享关于核酸多样性pi计算的方法和相关技巧,主要包括原始数据整理、分组文件设置、计算原理、操作流程、可视化绘图等步骤。 基因组Pi核酸多样性(Pi nucleic acid diversity)是一种遗传学研究中用来描述种群内…...
C++学习之多态详解
目录 多态的实现 例题 重载 重写 重定义的区别 抽象类 多态实现原理 多态的实现 C中的多态是指,当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。多态意味着调用成员函数时,会根据调用函数的对象的类型来执…...
项目经理之识别项目干系人
项目干系人管理是项目管理中的重要一环,识别和管理好项目干系人是成功实施项目的关键之一。本文将介绍4321项目干系人识别方法、干系人等级册以及五步判断法等工具,帮助项目经理更好地识别和管理项目干系人。同时,本文还将介绍干系人能量方格…...
文件列表创建工具 Nifty File Lists mac中文版功能特色
Nifty File Lists mac是一款文件列表创建工具,全面的元数据支持,涵盖了从基本文件信息,如文件名、路径、大小、创建和修改日期等等内容。 Nifty File Lists mac功能特色 全面的 元数据支持强大的多线程元数据提取系统涵盖了从基本文件信息&a…...
人人自媒体的时候,Ai绘画还值得踏入吗?
前言 先说结论,如果你不打算涉足自媒体,平时也从不上网发什么内容去展示自己的话,其实AI绘画对你来说意义不大。但如果你对自媒体感兴趣,会涉及发作品,发内容,甚至去设计图片,那么AI绘画值得你…...
最近学习内容(2023-10-21)
最近学习内容 Linux编译链接命令一条有用的删除可执行文件的bash命令gcc 在macos 的编译选项,其中-g会生成一个.dSYM文件夹to long don’t read 工具的使用gnu bintuils 的使用,但是很可惜macos上的是Mach-O,不是ELFaxel多线程下载器和其余的…...
Java设计模式 | 基于订单批量支付场景,对策略模式和简单工厂模式进行简单实现
基于订单批量支付场景,对策略模式和简单工厂模式进行简单实现 文章目录 策略模式介绍实现抽象策略具体策略1.AliPayStrategy2.WeChatPayStrategy 环境 使用简单工厂来获取具体策略对象支付方式枚举策略工厂接口策略工厂实现 测试使用订单实体类对订单进行批量支付结…...
【组件专题介绍】什么是组件?
组件定义 卡耐基梅隆大学: 一个不透明的功能实体,能够被第三方组装,且符合一个构件模型。 计算机百科全书: 是软件系统中具有相对独立功能、接口由契约指定、和语境有明显依赖关系、可独立部署、可组装的软件实体。 软件构件…...
Mybatis拦截器
MyBatis插件介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能。 MyBatis允许使用者在映射语句执行过程中的某一些指定的节点进行拦截调用,通过织入拦截器,在不同节点修改一些执行过程中的关键属性&…...
【项目设计】网络对战五子棋(上)
想回家过年… 文章目录 一、项目前置知识1. websocketpp库1.1 http1.0/1.1和websocket协议1.2 websocketpp库接口的前置认识1.3 搭建一个http/websocket服务器 2. jsoncpp库3. mysqlclient库 二、 项目设计1. 项目模块划分2. 实用工具类模块2.1 日志宏封装2.2 mysql_util2.3 j…...
【Overload游戏引擎细节分析】鼠标键盘控制摄像机原理
在上文中分析了摄像机类的实现,在计算投影视图矩阵时需要给摄像机输入其位置及转动四元数。这两个量一般通过鼠标键盘来控制,从而达到控制摄像机的目的。本文分析一下其控制原理。 Overload的摄像机控制实现在类CameraController中,其有三个个…...
VScode运行SVN拉下来的项目
安装依赖包 pnpm install 启动程序 查看package.json文件中的serve,根据这个启动 pnpm dev 在浏览器使用http://localhost:8848/访问...
jmeter集成kafka测试
Kafka的使用 查看kafka的topic ./kafka-topics --bootstrap-server 10.1.9.84:9092 --list 查看topic信息 ./kafka-topics --bootstrap-server 10.1.9.84:9092 --describe --topic topic_example_1 创建topic 创建topic名为test,分区数为8,副本数为…...
Java面试题-UDP\TCP\HTTP
UDP UDP特性 (1)UDP是无连接的:发送数据之前不需要像TCP一样建立连接,也不需要释放连接,所以减少了发送和接收数据的开销 (2)UDP 使用尽最大努力交付:即不保证可靠交付 ࿰…...
使用WPF模仿Windows记事本界面
本次仅模仿Windows记事本的模样,并未实现其功能。 所有代码如下: <Window x:Class"控件的基础使用.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
