从0开始深度学习(31)——循环神经网络

ops/2024/11/28 5:29:33/

前面介绍了 n n n元语法模型,里面有一个叫隐状态,也被叫做隐藏变量,循环神经网络(recurrent neural networks,RNNs) 是具有隐状态的神经网络。

1 无隐状态的神经网络

以单隐藏层的多层感知机为例,设隐藏层的激活函数为 ϕ \phi ϕ,所以隐藏层的输出是:
H = ϕ ( X W x h + b h ) . \mathbf{H} = \phi(\mathbf{X} \mathbf{W}_{xh} + \mathbf{b}_h). H=ϕ(XWxh+bh).
然后把隐藏变量输入到输出层,则输出层的输出是:
O = H W h q + b q , \mathbf{O} = \mathbf{H} \mathbf{W}_{hq} + \mathbf{b}_q, O=HWhq+bq,

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

我们用 H t ∈ R n × h \mathbf{H}_t \in \mathbb{R}^{n \times h} HtRn×h表示时间步 t t t的隐藏变量,与多层感知机不同的是, 我们在这里保存了前一个时间步的隐藏变量 H t − 1 \mathbf{H}_{t-1} Ht1,并引入了一个新的权重参数 W h h ∈ R h × h \mathbf{W}_{hh} \in \mathbb{R}^{h \times h} WhhRh×h描述如何在当前时间步中使用前一个时间步的隐藏变量。

所以,当前时间步隐藏变量,由当前时间步的输入前一个时间步的隐藏变量一起计算得出:
H t = ϕ ( X t W x h + H t − 1 W h h + b h ) . \mathbf{H}_t = \phi(\mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} + \mathbf{b}_h). Ht=ϕ(XtWxh+Ht1Whh+bh).
与无状态的神经网络相比,多了一个 H t − 1 W h h \mathbf{H}_{t-1} \mathbf{W}_{hh} Ht1Whh,这些变量捕获并保留了序列直到其当前时间步的历史信息,就如当前时间步下神经网络的状态或记忆, 因此这样的隐藏变量被称为隐状态(hidden state)。

由于在当前时间步中, 隐状态使用的定义与前一个时间步中使用的定义相同, 因此计算是循环的(recurrent)。 于是基于循环计算的隐状态神经网络被命名为循环神经网络。 在循环神经网络中执行隐藏变量计算的层称为循环层。

下图展示了循环神经网络在三个相邻时间步的计算逻辑。 在任意时间步 t t t,隐状态的计算可以被视为:

  1. 拼接当前时间步 t t t输入 X t \mathbf{X}_t Xt,和前一时间步 t − 1 t-1 t1的隐状态 H t − 1 \mathbf{H}_{t-1} Ht1
  2. 将拼接的结果送入带有激活函数 ϕ \phi ϕ的全连接层。 全连接层的输出是当前时间步 t t t的隐状态 H t \mathbf{H}_t Ht

在这里插入图片描述

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

上一节提到,我们的目标是根据过去的和当前的词元预测下一个词元, 因此我们将原始序列移位一个词元作为标签。 Bengio等人首先提出使用神经网络进行语言建模,下图演示了如何通过基于字符级语言建模的循环神经网络, 使用当前的和先前的字符预测下一个字符。设小批量大小为1,批量中的文本序列为“machine”:
在这里插入图片描述

在训练过程中,我们对每个时间步的输出层的输出进行softmax操作, 然后利用交叉熵损失计算模型输出和标签之间的误差。

4 困惑度

如何度量语言模型的质量?由于历史原因,自然语言处理的科学家更喜欢使用一个叫做困惑度(perplexity) 的量,也就是一个序列中所有的 n n n个词元的交叉熵损失的平均值的负指数:
exp ⁡ ( − 1 n ∑ t = 1 n log ⁡ P ( x t ∣ x t − 1 , … , x 1 ) ) . \exp\left(-\frac{1}{n} \sum_{t=1}^n \log P(x_t \mid x_{t-1}, \ldots, x_1)\right). exp(n1t=1nlogP(xtxt1,,x1)).
困惑度的最好的理解是“下一个词元的实际选择数的调和平均数”:

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

http://www.ppmy.cn/ops/137269.html

相关文章

C++设计模式之组合模式实践原则

在实现组合模式时,为了确保符合软件设计原则,需要考虑以下几个重要方面: 1. 单一职责原则(Single Responsibility Principle, SRP) 考虑:组合模式中的每个类应只负责一个特定的任务。例如,Com…

python+django自动化部署日志采用‌WebSocket前端实时展示

一、开发环境搭建和配置 # channels是一个用于在Django中实现WebSocket、HTTP/2和其他异步协议的库。 pip install channels#channels-redis是一个用于在Django Channels中使用Redis作为后台存储的库。它可以用于处理#WebSocket连接的持久化和消息传递。 pip install channels…

TCP三次握手与四次挥手(TCP重传机制,2MSL)超详细!!!计算机网络

本篇是关于3次握手和四次挥手的详细解释~ 如果对你有帮助,请点个免费的赞吧,谢谢汪。(点个关注也可以!) 如果以下内容需要补充和修改,请大家在评论区多多交流~。 目录 1. TCP头部: 2. 三次握手…

Python中的简单爬虫

文章目录 一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务器和浏览器的通讯流程3. 浏览器访问Web服务器的通讯流程4. 加载图片资源代码 二. 基于Web请求的FastAPI通用配置1. 目前Web服务器存在问题2. 基于Web请求的FastAPI通用配置 三. Python爬虫介绍1. 什…

MongoDB相关问题

视频教程 【GeekHour】20分钟掌握MongoDB Complete MongoDB Tutorial by Net Ninja MongoDB开机后调用缓慢的原因及解决方法 问题分析: MongoDB开机后调用缓慢,通常是由于以下原因导致: 索引重建: MongoDB在启动时会重建索引…

Spring集成测试

Spring集成测试是一种用于测试Spring应用程序中各个组件之间的交互和集成的测试方法。它通常用于验证应用程序的整体行为,而不仅仅是单个组件的功能。以下是一些常见的Spring集成测试技术和工具: Spring TestContext Framework: Spring提供了一个强大的测…

【linux】tar命令讲解笔记

Linux tar 命令 Linux tar(英文全拼:tape archive )命令用于备份文件。 tar 是 Linux 和 Unix 系统中用于归档文件和目录的强大命令行工具。 tar 名字来自 "tape archive"(磁带归档),最初用于将…

微信小程序WXSS全局样式与局部样式的使用教程

微信小程序WXSS全局样式与局部样式的使用教程 引言 在微信小程序的开发中,样式的设计与实现是提升用户体验的关键部分。WXSS(WeiXin Style Sheets)作为微信小程序的样式表语言,不仅支持丰富的样式功能,还能通过全局样式与局部样式的灵活运用,帮助开发者构建美观且易于维…