机器学习&&深度学习——循环神经网络RNN

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er

🌌上期文章:机器学习&&深度学习---语言模型和数据集

📚订阅专栏:机器学习&&深度学习

希望文章对你们有所帮助

循环神经网络RNN

引入

在之前介绍了n元语法模型,其中单词xt在时间步t的概率仅取决于前n-1个单词。对于时间步t-(n-1)之前的打你,若我们想将其可能产生的影响合并到xt上,需要增加n,模型参数的数量也会指数增长,因为词表V需要存储|V|n个数字,因此我们不如使用隐变量:
P ( x t ∣ x t − 1 , . . . , x 1 ) ≈ P ( x t ∣ h t − 1 ) P(x_t|x_{t-1},...,x_1)≈P(x_t|h_{t-1}) P(xt∣xt−1,...,x1)≈P(xt∣ht−1)

其中h表示隐藏变量,存储到时间步t-1的序列信息。
h t = f ( x t , h t − 1 ) h_t=f(x_t,h_{t-1}) ht=f(xt,ht−1)

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

RNN是具有隐状态的神经网络

无隐状态的神经网络

对于只有单隐藏层的多层感知机,其隐藏层输出为:
H = φ ( X W x h + b h ) H=φ(XW_{xh}+b_h) H=φ(XWxh+bh)

将隐藏变量H用作输出层的输入,则其输出层为:
O = H W h q + b q O=HW_{hq}+b_q O=HWhq+bq

有隐状态的循环神经网络

有了隐状态后,情况就完全不同了。与多层感知机不同的是, 我们在这里保存了前一个时间步的隐藏变量:
H t − 1 H_{t-1} Ht−1

并引入了一个新的权重参数:
W h h W_{hh} Whh

用来描述如何在当前时间步中使用前一个时间步的隐藏变量。

而当前时间步隐藏变量由当前时间步的输入与前一个时间步的隐藏变量一起计算得出:
H t = φ ( X t W x h + H t − 1 W h h + b h ) H_t=φ(X_tW_{xh}+H_{t-1}W_{hh}+b_h) Ht=φ(XtWxh+Ht−1Whh+bh)

这些变量捕获并保留了序列直到其当前时间步的历史信息,就如当前时间步下神经网络的状态或记忆,因此这样的隐藏变量被称为隐状态。

由于隐状态使用的定义与前一个时间步中使用的定义相同,因此上式是循环的,基于上式的网络就称为循环神经网络RNN,执行上式的层就叫做循环层。

对于时间步t,输出层的输出类似于多层感知机:
O t = H t W h q + b q O_t=H_tW_{hq}+b_q Ot=HtWhq+bq

值得一提的是,即使在不同的时间步,循环神经网络也总是使用这些模型参数。因此,循环神经网络的参数开销不会随着时间步的增加而增加。

下面展示了RNN计算逻辑:

在任意时间步,隐状态的计算可以被视为:

1、拼接当前时间步t的输入和前一时间步t-1的隐状态

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

具有循环神经网络的字符级语言模型

设小批量大小为1,批量中的文本序列为"machine"。使用字符级语言模型,将文本次元化为字符而不是单词,如下图演示,使用当前的和先前的字符预测下一个字符:

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

在实践中,我们使用的批量大小是n>1,每个词元都由一个d维向量表示,因此,我们在时间步t的输入是一个n×d的矩阵。

困惑度

让我们讨论如何度量语言模型的质量,这将在后续部分中用于评估基于循环神经网络的模型。

我们可以通过一个序列中所有的n个词元的交叉熵损失的平均值来衡量:
1 n ∑ t = 1 n − l o g P ( x t ∣ x t − 1 , . . . , x 1 ) \frac{1}{n}\sum_{t=1}^n-logP(x_t|x_{t-1},...,x_1) n1t=1∑n−logP(xt∣xt−1,...,x1)

其中,P由语言模型给出,xt是在时间步t从该序列中观察到的实际词元。

而我们使用的是困惑度 ,是一个指数:
e x p ( − 1 n ∑ t = 1 n l o g P ( x t ∣ x t − 1 , . . . , x 1 ) ) exp(-\frac{1}{n}\sum_{t=1}^nlogP(x_t|x_{t-1},...,x_1)) exp(−n1t=1∑nlogP(xt∣xt−1,...,x1))

困惑度的最好的理解是"下一个词元的实际选择数的调和平均数"。

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

小结

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

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

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

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

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

相关推荐
cyong8881 小时前
深度学习中的向量的样子-DCN
人工智能·深度学习
Python数据分析与机器学习1 小时前
《基于深度学习的高分卫星图像配准模型研发与应用》开题报告
图像处理·人工智能·python·深度学习·神经网络·机器学习
BineHello3 小时前
强化学习 - PPO控制无人机
人工智能·算法·自动驾驶·动态规划·无人机·强化学习
牛不才3 小时前
ChatPromptTemplate的使用
人工智能·ai·语言模型·chatgpt·prompt·aigc·openai
从零开始学习人工智能3 小时前
深度学习模型压缩:非结构化剪枝与结构化剪枝的定义与对比
人工智能·深度学习·剪枝
訾博ZiBo3 小时前
AI日报 - 2025年3月18日
人工智能
go54631584654 小时前
在办公电脑上本地部署 70b 的 DeepSeek 模型并实现相应功能的大致步骤
深度学习
新说一二4 小时前
AI技术学习笔记系列004:GPU常识
人工智能·笔记·学习
一个处女座的程序猿O(∩_∩)O4 小时前
人工智能中神经网络是如何进行预测的
人工智能·深度学习·神经网络
小白的高手之路4 小时前
如何安装旧版本的Pytorch
人工智能·pytorch·python·深度学习·机器学习·conda