当前位置: 首页 > news >正文

动手学深度学习(pytorch版):第八章节—循环神经网络(4)循环神经网络

循环神经网络(recurrent neural networks,RNNs) 是具有隐状态的神经网络。 在介绍循环神经网络模型之前, 首先回顾介绍的多层感知机模型。

1. 无隐状态的神经网络

来看一看只有单隐藏层的多层感知机。如果是分类问题,我们可以来计算输出类别的概率分布。

这完全类似于之前解决的回归问题, 因此省略了细节。 无须多言,只要可以随机选择“特征-标签”对, 并且通过自动微分和随机梯度下降能够学习网络参数就可以了。

2. 有隐状态的循环神经网络

有了隐状态后,情况就完全不同了。 假设我们在时间步有小批量输入。 换言之,对于个序列样本的小批量, 每一行对应于来自该序列的时间步处的一个样本。循环神经网络在三个相邻时间步的计算逻辑。 在任意时间步,隐状态的计算可以被视为:

  1. 拼接当前时间步的输入和前一时间步的隐状态;

  2. 将拼接的结果送入带有激活函数的全连接层。 全连接层的输出是当前时间步的隐状态。

刚才提到,隐状态中 的计算, 相当于和的拼接 与和的拼接的矩阵乘法。 虽然这个性质可以通过数学证明, 但在下面我们使用一个简单的代码来说明一下。 首先,我们定义矩阵XW_xhHW_hh, 它们的形状分别为,、,、,和,。 分别将X乘以W_xh,将H乘以W_hh, 然后将这两个乘法相加

import torch
from d2l import torch as d2lX, W_xh = torch.normal(0, 1, (3, 1)), torch.normal(0, 1, (1, 4))
H, W_hh = torch.normal(0, 1, (3, 4)), torch.normal(0, 1, (4, 4))
torch.matmul(X, W_xh) + torch.matmul(H, W_hh)
tensor([[-1.6506, -0.7309,  2.0021, -0.1055],[ 1.7334,  2.2035, -3.3148, -2.1629],[-2.0071, -1.0902,  0.2376, -1.3144]])

现在,沿列(轴1)拼接矩阵XH, 沿行(轴0)拼接矩阵W_xhW_hh。 这两个拼接分别产生形状和形状的矩阵。 再将这两个拼接的矩阵相乘, 得到与上面相同形状的输出矩阵。

torch.matmul(torch.cat((X, H), 1), torch.cat((W_xh, W_hh), 0))
tensor([[-1.6506, -0.7309,  2.0021, -0.1055],[ 1.7334,  2.2035, -3.3148, -2.1629],[-2.0071, -1.0902,  0.2376, -1.3144]])

3. 基于循环神经网络的字符级语言模型

回想一下 语言模型, 目标是根据过去的和当前的词元预测下一个词元, 因此将原始序列移位一个词元作为标签。 Bengio等人首先提出使用神经网络进行语言建模。 接下来,看一下如何使用循环神经网络来构建语言模型。 设小批量大小为1,批量中的文本序列为“machine”。 为了简化后续部分的训练,我们考虑使用 字符级语言模型(character-level language model), 将文本词元化为字符而不是单词。 

在训练过程中,我们对每个时间步的输出层的输出进行softmax操作, 然后利用交叉熵损失计算模型输出和标签之间的误差。 由于隐藏层中隐状态的循环计算, 第个时间步的输出 由文本序列“m”“a”和“c”确定。 由于训练数据中这个文本序列的下一个字符是“h”, 因此第个时间步的损失将取决于下一个字符的概率分布, 而下一个字符是基于特征序列“m”“a”“c”和这个时间步的标签“h”生成的。

4. 困惑度(Perplexity)

最后,让讨论如何度量语言模型的质量, 这将在后续部分中用于评估基于循环神经网络的模型。 一个好的语言模型能够用高度准确的词元来预测我们接下来会看到什么。 考虑一下由不同的语言模型给出的对“It is raining …”(“…下雨了”)的续写:

  1. “It is raining outside”(外面下雨了);

  2. “It is raining banana tree”(香蕉树下雨了);

  3. “It is raining piouw;kcj pwepoiut”(piouw;kcj pwepoiut下雨了)。

就质量而言,例显然是最合乎情理、在逻辑上最连贯的。 虽然这个模型可能没有很准确地反映出后续词的语义, 比如,“It is raining in San Francisco”(旧金山下雨了) 和“It is raining in winter”(冬天下雨了) 可能才是更完美的合理扩展, 但该模型已经能够捕捉到跟在后面的是哪类单词。 例则要糟糕得多,因为其产生了一个无意义的续写。 尽管如此,至少该模型已经学会了如何拼写单词, 以及单词之间的某种程度的相关性。 最后,例表明了训练不足的模型是无法正确地拟合数据的。

我们可以通过计算序列的似然概率来度量模型的质量。 然而这是一个难以理解、难以比较的数字。 毕竟,较短的序列比较长的序列更有可能出现, 因此评估模型产生托尔斯泰的巨著《战争与和平》的可能性 不可避免地会比产生圣埃克苏佩里的中篇小说《小王子》可能性要小得多。 而缺少的可能性值相当于平均数。

在这里,信息论可以派上用场了。 在引入softmax回归 时定义了熵、惊异和交叉熵, 论了更多的信息论知识。 如果想要压缩文本,可以根据当前词元集预测的下一个词元。 一个更好的语言模型应该能让我们更准确地预测下一个词元。 因此,它应该允许我们在压缩序列时花费更少的比特。 所以我们可以通过一个序列中所有的个词元的交叉熵损失的平均值来衡量

其中由语言模型给出, 是在时间步从该序列中观察到的实际词元。 这使得不同长度的文档的性能具有了可比性。 由于历史原因,自然语言处理的科学家更喜欢使用一个叫做困惑度(perplexity)的量。 

困惑度的最好的理解是“下一个词元的实际选择数的调和平均数”。 看看一些案例。

  • 在最好的情况下,模型总是完美地估计标签词元的概率为1。 在这种情况下,模型的困惑度为1。

  • 在最坏的情况下,模型总是预测标签词元的概率为0。 在这种情况下,困惑度是正无穷大。

  • 在基线上,该模型的预测是词表的所有可用词元上的均匀分布。 在这种情况下,困惑度等于词表中唯一词元的数量。 事实上,如果我们在没有任何压缩的情况下存储序列, 这将是我们能做的最好的编码方式。 因此,这种方式提供了一个重要的上限, 而任何实际模型都必须超越这个上限。

http://www.dtcms.com/a/392494.html

相关文章:

  • Jenkins与Arbess,CICD工具一文全面对比分析
  • 矩阵、线性代数
  • react常用的hooks
  • 重构的艺术:从‘屎山’恐惧到优雅掌控的理性之旅
  • 在c++中,怎么理解把析构函数设置为virtual呢?
  • CUDA性能优化 ---- 通过矢量化内存访问提高性能
  • 【序列晋升】39 Spring Data REST 的优雅实践,让数据交互更符合 REST 规范
  • 能当关系型数据库还能玩对象特性,能拆复杂查询还能自动管库存,PostgreSQL 凭什么这么香?
  • 【2025PolarCTF秋季个人赛】WEB方向wp
  • Go基础:Go语言函数和方法详解
  • Redis 遍历指定格式的所有key
  • 插入mathtype/latex公式在word中行间距变高了
  • 设计模式学习(四)代理模式、适配器模式
  • ​​[硬件电路-279]:DRV8818PWP功能概述、管脚定义
  • 【51单片机】【protues仿真】基于51单片机恒温箱系统
  • zk管理kafka有哪些不足
  • Java 大视界 -- Java 大数据机器学习模型在金融衍生品复杂风险建模与评估中的应用
  • 半导体制造中常见工艺之LPCVD
  • D01粉尘传感器详解(STM32)
  • 【小程序】微信小程序页面之间数据传递的五种方法
  • Taichi太极图形编程语言实践demo
  • [xboard]07-Makefile逐行分析1
  • 基于规则的专家系统对自然语言处理深层语义分析的影响与启示:历史演进、技术局限与未来融合路径
  • 鸿蒙分布式服务架构实战:从服务注册到远程调用的完整指南
  • PPT中设置和应用空白版式,和占位符干扰说再见
  • Elasticsearch 02
  • 283-基于Django的AppStore应用榜单数据可视化分析推荐系统
  • 星际漫游2025“∞无限”潮玩艺术周于顺德启幕,以东方符号重构潮流宇宙
  • Rust:重塑系统编程的未来,从安全到性能的技术革命
  • Vue 3 提供的 createElement 工具函数——h