8-4 循环神经网络

news/2024/9/23 16:15:05/

请添加图片描述
对于 (8.4.2)中的函数 f f f,隐变量模型不是近似值。 毕竟 h t h_{t} ht是可以仅仅存储到目前为止观察到的所有数据, 然而这样的操作可能会使计算和存储的代价都变得昂贵。

回想一下,我们在前面讨论过的具有隐藏单元的隐藏层。 值得注意的是,隐藏层和隐状态指的是两个截然不同的概念。 如上所述,隐藏层在从输入到输出的路径上(以观测角度来理解)的隐藏的层, 而隐状态则是在给定步骤所做的任何事情(以技术角度来定义)的输入, 并且这些状态只能通过先前时间步的数据来计算

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

无隐状态的神经网络

请添加图片描述

有隐状态的循环神经网络

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

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)

请添加图片描述
现在,我们沿列(轴1)拼接矩阵X和H, 沿行(轴0)拼接矩阵W_xh和W_hh。 这两个拼接分别产生形状 ( 3 , 5 ) (3,5) (3,5)和形状 ( 5 , 4 ) (5,4) (5,4)的矩阵。 再将这两个拼接的矩阵相乘, 我们得到与上面相同形状 ( 3 , 4 ) (3,4) (3,4)的输出矩阵。

torch.matmul(torch.cat((X, H), 1), torch.cat((W_xh, W_hh), 0))

请添加图片描述

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

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

困惑度(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下雨了)。

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

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

在这里,信息论可以派上用场了。 我们在引入softmax回归时定义了熵、惊异和交叉熵, 并在信息论的在线附录 中讨论了更多的信息论知识。 如果想要压缩文本,我们可以根据当前词元集预测的下一个词元。 一个更好的语言模型应该能让我们更准确地预测下一个词元。 因此,它应该允许我们在压缩序列时花费更少的比特。 所以我们可以通过一个序列中所有的 n n n个词元的交叉熵损失的平均值来衡量
请添加图片描述
其中 P P P由语言模型给出, x t x_{t} xt是在时间步 t t t从该序列中观察到的实际词元。 这使得不同长度的文档的性能具有了可比性。 由于历史原因,自然语言处理的科学家更喜欢使用一个叫做困惑度(perplexity)的量。 简而言之,它是 (8.4.7)的指数:
请添加图片描述
困惑度的最好的理解是“下一个词元的实际选择数的调和平均数”。 我们看看一些案例。

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

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

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

在接下来的小节中,我们将基于循环神经网络实现字符级语言模型, 并使用困惑度来评估这样的模型。

  1. 词元预测压缩的关系 在数据压缩中,我们希望用尽可能少的比特来表示信息。如果我们能准确预测一个序列中的下一个词元,我们就可以更高效地压缩数据。语言模型的任务之一就是基于已知的上下文来预测下一个词元。
  • 准确预测的意义:如果模型能够非常准确地预测下一个词元,那么它只需要很少的信息(即少量的比特)就可以表示这个词元。换句话说,准确的预测使得压缩更加高效。
  1. 比特数与信息量 信息论中,比特数衡量的是存储或传输信息所需的最小单位。预测得越准确,表示下一个词元所需的比特数就越少,因为模型已经“知道”接下来很可能会是什么。反之,如果预测不准确,那么为了表示所有可能的词元,模型需要使用更多的比特

  2. 语言模型的效果

  • 更好的语言模型:能够更加准确地预测下一个词元,从而减少表示该词元所需的比特数,最终使得整个序列的压缩变得更加高效。

  • 不好的语言模型:由于预测不准确,它需要更多的比特来表示下一个词元,导致压缩效率低下。

  1. 压缩示例 举个例子,如果模型预测“外面下雨了”的概率很高,那么在压缩时就可以用较少的比特来表示这个句子,因为大部分的信息已经被预测覆盖。如果模型的预测是“香蕉树下雨了”这种不合理的内容,那为了准确传达这个奇怪的句子,可能需要更多的比特来表示。

  2. 实际应用 在实际应用中,好的语言模型不仅用于自然语言处理,也在数据压缩、信息传输等领域有重要作用。通过提高预测的准确性,可以显著提升压缩效率,从而节省存储空间和带宽。

请添加图片描述

梯度剪裁

请添加图片描述

更多的RNN应用

请添加图片描述

小结

  • 对隐状态使用循环计算的神经网络称为循环神经网络(RNN)。

  • 循环神经网络的隐状态可以捕获直到当前时间步序列的历史信息

  • 循环神经网络模型的参数数量不会随着时间步的增加而增加。

  • 我们可以使用循环神经网络创建字符级语言模型。

  • 我们可以使用困惑度来评价语言模型的质量。

请添加图片描述


http://www.ppmy.cn/news/1509848.html

相关文章

ThinkPHP6路由配置详解

一、基本路由配置 在ThinkPHP6中,路由配置文件位于route目录下,通常为route/app.php。基本路由配置包括HTTP请求方法、路由地址和路由参数。以下是一个基本路由配置示例: use think\route\Rule; // 定义GET请求的路由 Route::get(hello, ind…

html5眼镜商城模板源码

文章目录 1.设计来源1.1 主界面1.2 主界面弹框1.3 眼镜列表1.4 商品列表1.5 商品列表1.6 商城推广1.7 页面底部 2.效果和源码2.1 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 【博主推荐】:前些天发现了一个巨牛的人工智…

Docker——常用命令

1.Docker是做什么的? Docker 是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。它可以帮助我们下载应用镜像,创建并运行镜…

Python3网络爬虫开发实战(9)代理的使用 (需补充代理池的构建)

文章目录 一、代理的设置1.1 urllib 的代理设置1.2 requests 的代理设置1.3 httpx 的代理设置1.4 aiohttp 的代理设置1.4 Selenium 的代理设置1.6 Playwright 的代理设置 二、代理池的构建和维护2.1 代理池的模块构成2.2 代理池的实现 网站为了避免爬虫采集数据可能会采取一些反…

【es学习】

es学习 1. 倒排索引2. stored fields 用于存储文档信息3. doc values 用于排序和聚合4. segment 具备完整搜索功能的最小单元5. lucene单机文本搜索库6. 从lucene到es:高性能 高扩展性 高可用7. node角色分化8. es写入流程9. es搜索流程10. 倒排索引涉及的数据结构1…

粒子群算法优化BP方法

粒子群算法(Particle Swarm Optimization, PSO)是一种基于群体智能的全局优化算法,通过模拟鸟群或鱼群等自然界中的集体行为来实现优化。它在多个领域得到了广泛应用,包括函数优化、图像压缩、基因聚类以及机器学习中的参数优化等。 粒子群算法优化BP神经网络的方法通过结…

看demo学算法之 卷积神经网络(CNN)

卷积神经网络(CNN)介绍: 卷积神经网络是一种深度学习算法,主要用于处理具有类似网格结构的数据,如图像。它通过层次化的特征提取和转换来识别图像中的模式。CNN的主要组成部分包括卷积层、池化层、激活层、全连接层和…

阿里云ubuntu系统安装mysql8.0

一、安装mysql8.0 1.已安装其他版本的mysql,需要删除 若没有不需要此操作 1 #卸载MySQL5.7版本 2 apt remove -y mysql-client5.7* mysql-community-server5.7* 4 # 卸载5.7的仓库信息 5 dpkg-l | grep mysql | awk iprint $2} | xargs dpkg -P2.更新仓库 apt u…