8.4 循环神经网络

发布于:2025-09-02 ⋅ 阅读:(18) ⋅ 点赞:(0)

我们介绍了n语法模型单词x时间t条件概率取决于前面n-1个单词对于时间t - (n-1) 之前单词如果我们可能产生影响合并到Xt需要增大n, 然而模型参数的数量也会随之呈现指数增长因为词表V需要存储|V|数字因此P(Xt|Xt-1...Xt-n+1)模型化不如使用变量存储了时间t-1序列信息我们可以基于当前输入Xt之前隐藏状态Ht-1计算时间t任何时间隐藏状态

Ht = f(Xt, Ht-1)

对于8.16中的函数f变量模型不是近似值毕竟Ht可以仅仅存储目前为止观测所有数据然而这样操作可能会使得计算存储成本都变得高昂

我们4讨论过具有隐藏单元隐藏层值得注意隐藏层隐藏状态两个截然不同概念隐藏层输入输出路径隐藏隐藏状态咋给定步骤所做任何操作输入并且这些状态只能通过之前时间数据来计算

循环神经网络具有隐藏状态神经网络在介绍循环神经网络模型之前我们回顾4.1介绍多层感知模型

8.4.1 无隐状态神经网络

我们来看一看只有隐藏多层感知机隐藏层激活函数Sigma, 给定一个小批量样本属于Rnxd其中批量大小n, 输入维度d隐藏层输出属于Rnxh通过下式计算

H = Sigma(XWsh + Bk)

8.17中,我们拥有隐藏层权重参数Wxh 属于Rdxh偏置参数bh 属于Rlxh以及隐藏单元数目为h因此求和可以应用广播机制接下来隐藏变量H用作输出层输入输出层下式给出

O = HWhq + bq

其中,O 属于Rnxq 输出变量Whq 属于Rhxq群众参数Bq 属于 Rlxq输出偏置参数如果分类问题可以softmax(O) 来计算输出类别概率分布

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

8.4.2 状态循环神经网络

有了状态之后情况就完全不同了假设我们时间t批量输入Xt属于Rnxd换言之对于n序列样本小批量Xt每一行对应于来自序列时间t一个样本接下来H属于Rnxh表示时间t隐藏变量多层感知机不同的是我们在这里保存前一个时间隐藏变量Ht-1, 引入一个新的权重参数Whh属于Rhxh描述如何当前时间使用一个时间隐藏变量具体地说当前时间隐藏变量当前时间输入前一个时间隐藏变量共同计算得出

Ht = WtHxh +Gt-1Whk +bh

8.17相比多了一项Ht-1Whh从而实例8.16相邻时间隐藏变量HtHt-1之间关系可知这些变量捕获保留序列直到当前时间历史信息就如当前时间神经网络状态或者记忆因此这样隐藏变量被称为状态由于当前时间状态使用定义前一个时间步使用定义相同因此计算循环于是基于循环计算状态神经网络命名循环神经网络循环神经网络执行计算称为循环

有许多不同方法可以构建循环神经网络定义状态循环神经网络非常常见一种对于时间t输出输出类似多层感知机计算

Ot = HtWhq + Bq

循环神经网络参数包括权重Wxh属于RdxhWhh属于Rhxh偏置Bh属于Rlxh,以及输出权重Whq属于Rhxq偏置Bq属于Rlxq值得一题即使在不同时间循环神经网络也总是使用这些模型参数因此循环神经网络参数开销不会随着时间增加增加

8-4 展示循环神经网络3相邻时间计算逻辑任意时间t状态计算可以视为

(1)连接当前时间t输入Xt和前一个时间步t-1状态Ht-1

2)连接的结果送入带有激活函数Sigma全连接层全连接层输出时当前时间t状态Ht.

本例模型参数WxhWhh连接以及偏置Bh所以这些参数都来自8.19当前时间t状态Ht参与计算下一个时间t+1状态Ht+1而且送入全连接输出用于计算当前时间t输出Ot

输出层

状态

输入 带有激活函数全连接层 负值 连接

8-4 状态循环神经网络

状态XtHxh + Ht-1Whh计算相当于XtHt-1连接WxhWhh连接的矩阵乘法虽然这个性质可以通过数学证明下面我们使用简单代码说明一下

我们定义矩阵X,W_xhW_hh他们形状分别(3,1) (1,4) (3,4)(4,1)然后分别X乘以W_xhH乘以W_hh并将这两个结果得到一个形状(3,4)矩阵

import troch

from d2l import torch as d2l

X, 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.normal(X,W_xh) + torch.matmul(H,W_hh)

我们沿列连接矩阵XH沿行连接矩阵W_xhW_hh这两个连接分别产生形状形状矩阵再将这两个连接矩阵相乘我们得到上面形状3,4)相同输出矩阵

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

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

我们目标根据过去当前词元预测下一个词元因此我们原石序列移位一个词元作为标签Bengio等人首先提出使用神经网络进行语言建模接下来我们看一下如何使用循环神经网络构建语言模型小批量大小1批量文本序列machine为了简化后续部分训练我们考虑使用字符级语言模型将文本词元华为字符而不是单词8-5 展示如何通过基于字符语言建模循环神经网络使用当前的和之前字符预测下一个字符

时间步 1 2 3 4 5 6

标签 a c h l n e

输出层 O1, O2,O3,O4,O5,O6

隐藏 H1,H2,H3,H4,H5,H6

输入 m,a,c,h,l,n

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

我们使用批量大小n > 1每个词元一个d向量表示在时间步t输入Xt将是一个nxd矩阵这与我们8.4.2讨论

8.4.4 困惑度

我们讨论如何度量语言模型质量后续部分用于评估基于循环神经网络模型一个语言模型能够够用高度准确词元预测我们接下来会看什么考虑不同语言模型给出It is rainning续写

1 It is rainning outside

2 It is rainning banana tree

3 It is raning piouw

就质量而言1显然最合乎情理逻辑上连贯虽然这个模型可能没有准确反应后续语义但是模型已经能够捕获跟在后面哪类单词2择要糟糕因为其他给出了一个无意义续写至少模型已经学会如何拼写单词以及单词之间某种程度3表明训练不足模型无法正确你和数据

可以通过计算序列似然概率度量模型质量然而这是一个难以理解难以比较数字毕竟较短序列比较长序列可能出现因此评估模型托尔斯泰巨著 可能性不可避免产生

信息论可以派上用场引入softmax回归定义了惊异交叉墒如果想要压缩文本我们可以根据当前词元预测下一个词元一个更好语言模型应该能让我们准确预测下一个词元应该允许我们压缩序列花费更少比特我们可以通过一个序列所有n词元交叉墒损失平均来衡量

1/n logP(Xt-1,,,X1)

P语言模型给出Xt时间步t序列观测时间词元使得不同长度文本性能具有可比性由于历史原因自然语言处理的科学家喜欢使用一个称为困惑度简而言之8.21 指数运算结果

exp(-1/n logP(Xt|,,,T1))

困惑度最好理解 下一个词元实际选择调和平均数我们看一些示例

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

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

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

接下来内容我们基于循环神经网络实现字符语言模型使用困惑度评估这样模型

小结

状态使用循环计算神经网络称为循环神经网络RNN

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

循环神经网络模型参数数量不会随着时间增加增加

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

我们可以使用困惑度评估语言模型质量


网站公告

今日签到

点亮在社区的每一天
去签到