《深度学习进阶:自然语言处理》第5章 RNN

本文详细介绍了RNN在网络结构、概率模型和语言模型中的应用。从概率视角下的word2vec到RNN的原理和实现,包括BPTT和TruncatedBPTT,探讨了RNN如何处理时序数据并用于生成文本。RNN因其记忆能力在处理语言模型时展现出优势,但也有梯度消失等问题,TruncatedBPTT作为解决方案,允许在有限的时间步长内进行反向传播。
摘要由CSDN通过智能技术生成

《深度学习进阶:自然语言处理》啃书系列

  第2章 自然语言和单词的分布式表示
  第3章 word2vec
  第4章 word2vec的高速化
  第5章 RNN
  第6章 Gated RNN
  第7章 基于RNN生成文本
  第8章 Attention

第5章 RNN

前馈(feedforward)型神经网络,是指网络的传播方向是单向的,输入信号一层一层向下传递。
前馈神经网络结构简单、易于理解,且可以应用在很多应用中。但是不能很好地处理时间序列数据。循环神经网络RNN(Recurrent Neural Network)应运而生。

5.1 概率和语言模型

5.1.1 概率视角下的word2vec

CBOW模型是从语料库中获取单词序列,将第 t t t个单词作为目标词,周围单词作为上下文,认为上下文单词可以推测出当前单词,也就是按照后验概率式(5.1)建模(窗口大小为1时)。
P ( w t ∣ w t − 1 , w t + 1 ) (5.1) P(w_t|w_{t-1},w_{t+1}) \tag {5.1} P(wtwt1,wt+1)(5.1)
上面提到的窗口是正对当前单词对称,我们也可以将上下文限定为左侧窗口,按照左侧的两个单词推测当前单词,建模改为:
P ( w t ∣ w t − 2 , w t − 1 ) (5.2) P(w_t|w_{t-2},w_{t-1}) \tag {5.2} P(wtwt2,wt1)(5.2)

5.1.2 语言模型

语言模型(language model)是可以给出单词序列发生概率的模型。举个例子,给定序列“you say goodbey”,语言模型判断这句话是自然存在的句子的概率较高,而句子“you say good die”就很不自然。
使用概率来表达语言模型, m m m个单词构成的句子,语言模型给出这个序列的概率,也称为联合概率
P ( w 1 , ⋅ ⋅ ⋅ , w m ) = P ( w m ∣ w 1 , . . . , w m − 1 ) P ( w m − 1 ∣ w 1 , ⋅ ⋅ ⋅ , w m − 2 )        ⋅ ⋅ ⋅ P ( w 3 ∣ w 1 , w 2 ) P ( w 2 ∣ w 1 ) P ( w 1 ) = ∏ t = 1 m P ( w t ∣ w 1 , ⋅ ⋅ ⋅ w t − 1 ) (5.4) \begin{aligned} P(w_1,···,w_m)&=P(w_m|w_1,...,w_{m-1})P(w_{m-1}|w_1,···,w_{m-2})\\ &\ \ \ \ \ \ ···P(w_3|w_1,w_2)P(w_2|w_1)P(w_1)\\ &=\prod \limits _{t=1} ^m P(w_t|w_1,···w_{t-1}) \tag {5.4} \end{aligned} P(w1,⋅⋅⋅,wm)=P(wmw1,...,wm1)P(wm1w1,⋅⋅⋅,wm2)      ⋅⋅⋅P(w3w1,w2)P(w2w1)P(w1)=t=1mP(wtw1,⋅⋅⋅wt1)(5.4)

简单说就是一句话中的某个词发生的概率需要考虑前面所有词的发生概率(后验概率),整个句子发生的概率就是所有词的后验概率的乘积。

5.1.3 将CBOW模型用作语言模型?

从式5.4看出,语言模型中每个词的后验概率是基于这个词之前的所有词都出现的情况,也就是左侧窗口的大小不定;而CBOW模型的窗口作为超参数是需要指定的,所以和语言模型的联合概率存在差异。但是可以使用CBOW模型的概率近似表示语言模型联合概率。下面是左侧窗口大小为2、右侧窗口大小为0的情况:
P ( w 1 , ⋅ ⋅ ⋅ , w m ) = ∏ t = 1 m P ( w t ∣ w 1 , ⋅ ⋅ ⋅ w t − 1 ) ≈ ∏ t = 1 m P ( w t ∣ w t − 2 , w t − 1 ) (5.8) \begin{aligned} P(w_1,···,w_m)&=\prod \limits _{t=1} ^m P(w_t|w_1,···w_{t-1})\\ &≈ \prod \limits _{t=1} ^m P(w_t|w_{t-2},w_{t-1})\tag {5.8} \end{aligned} P(w1,⋅⋅⋅,wm)=t=1mP(wtw1,⋅⋅⋅wt1)t=1mP(wtwt2,wt1)(5.8)

马尔可夫性是指未来的状态仅依存于当前状态。当某个事件的概率仅取决于其前面的N个事件时,称为“N阶马尔可夫链”。这里展示的可以称为“2阶马尔可夫链”。

但是这样的近似丢弃了窗口外的信息,对于一些常见就无法适应了。比如“小明在校门口撞见了小华,小华向xx打了声招呼”,如果窗口大小只为2,是无法学习到“小明”这个前提条件的。
除此之外,CBOW模型本身也丢弃了窗口内的词序信息。如图5-5左侧的常规CBOW模型所示,窗口为2,窗口内的两个词与输入权重矩阵相乘的结果是想加的,没有保留顺序信息。如果将模型改造成右侧的结构,参数的数量将与窗口大小成比例增加。
在这里插入图片描述

图5-5

所以引入RNN来解决以上问题。

特别说明,CBOW模型只是为了获取词向量,一般不用于语言模型。上面的例子只是为了引出RNN。

5.2 RNN

5.2.1 循环的神经网络

循环神经网络RNN(Recurrent Neural Network),一定是存在回路,也就是在神经网络传递的过程中,在某点的输出重新回流到上游,和上游的输入合并共同作为输入。

5.2.2 展开循环

在这里插入图片描述

图5-8

一层RNN网络接收一个窗口内的多个有序输入,前一个输入对应的输出和下一个输入共同作为下一个模块的输入。换句话说,时刻 t t t的输入和时刻 t − 1 t-1 t1的输出合并共同成为时刻 t t t的最终输入。所以并不是在同一个模块中反复循环,而是有“时序的流动”。
所以每个时刻的计算公式如下:
h t = tanh ⁡ ( h t − 1 W h + x t W x + b ) (5.9) h_t=\tanh(h_{t-1}W_h+x_tW_x+b) \tag {5.9} ht=tanh(ht1Wh+xtWx+b)(5.9)

从公式中可以看出,RNN有两个权重矩阵,分别是时刻 t t t的输入 x t x_t xt对应的权重 W x W_x Wx和将前一个RNN层的输出 h t − 1 h_{t-1} ht1转化为当前时刻的输出的权重 W h W_h Wh。还有偏置 b b b。最后使用的激活函数是双曲正切函数tanh,输出 h t h_t ht一方面作为本层网络的输出传递给下层网络,另一方面也输入给下个时刻的自己。

由此RNN的输出在自身的循环迭代更新下,记录了之前时刻的输入,是具有记忆能力的神经网络。而且每个时刻都有对应的输出,都被记录了下来。输出 h t h_t ht称为隐藏状态(hidden state)隐藏状态向量(hidden state vector)

5.2.3 Backpropagation Through Time

上面介绍了RNN的正向传播,下面介绍RNN的反向传播——按照时间序列展开的神经网络的误差反向传播BPTT(Backpropagation Through Time)。
在这里插入图片描述

图5-10

要基于 BPTT 求梯度,必须在内存中保存各个时刻的RNN层的中间数据,随着时序数据变长,计算机的内存使用量、计算量也会增加,反向传播的梯度也会变得不稳定。

5.2.4 Truncated BPTT

Truncated BPTT,将时间轴方向上过长的网络在合适的位置进行截断,从而创建多个小型网络,然后对截出来的小型网络执行误差反向传播法。只是网络的反向传播的连接被截断,正向传播的连接依然被维持
在这里插入图片描述

图5-11

上图演示了以10个RNN层为单位组成块,块内完成误差反向传播法。
实际训练时,我们按照每个块为单位进行正向传播和反向传播,完成一个块之后,再处理下一个块。正向传播时前一个块的输出需要传递给下一个块,但是方向传播只局限在块内。
在这里插入图片描述

图5-14

### 5.2.5 Truncated BPTT的mini-batch学习 假如现在有一个语料库包含1000个序列,我们以10个序列为单位进行反向传播的截断。上面介绍的计算方式是将1000个序列经过一个批次完成训练,批次大小为1。但是对于很大的语料库还是需要实现mini-batch才能在合理的资源消耗下实现训练。 将1000个序列分成两段,前500个[0,499]和后500个[500,999]。第一段的样本数据从头开始,第二段从第500个序列开始,两段各取10个序列分别输入RNN网络进行正向传播和反向传播,再各取10个序列进行如上操作,以此类推直到两段训练序列结束或返回头部。

在这里插入图片描述

图5-15

5.3 RNN的实现

基于 Truncated BPTT ,只需要创建一个在水平方向上长度固定的网络序列。
在这里插入图片描述

图5-16

图中序列长度为T,保留T个时刻的隐藏状态。
可以使用下图更加模块化地表示RNN网络:
在这里插入图片描述

图5-17
这样,可以将上面的网络结果视为一层,称为Time RNN层。其中单步处理的层称为RNN层。

5.3.1 RNN层的实现

单个RNN正向传播
h t = tanh ⁡ ( h t − 1 W h + x t W x + b ) (5.10) h_t=\tanh(h_{t-1}W_h+x_tW_x+b) \tag {5.10} ht=tanh(ht1Wh+xtWx+b)(5.10)
假设batch size为N,单词向量维度为D,隐藏状态向量维度为H,则正向传播过程中各个变量的形状如下图所示:
在这里插入图片描述

图5-15

5.3.2 Time RNN层的实现

Time RNN 层由 T 个 RNN 层构成。
在这里插入图片描述

图5-22

单个RNN组成Time RNN的过程很明显,需要注意的是隐藏状态的处理。
在Time RNN类中使用类变量记录隐藏状态 h h h,将前一个块的状态带给下一个块。可以选择将隐藏状态向量置零来模拟第一个块的情况,或者是终止前面序列向后的传播。

5.4 处理时序数据的层的实现

基于 RNN 的语言模型称为 RNNLM(RNN Language Model,RNN 语言模型)。

5.4.1 RNNLM的全貌图

在这里插入图片描述

图5-25

Embedding层将单词ID转化为单词向量,输入RNN层后输出隐藏状态,再经过Affine层和Softmax层。
以“you say goodbye and i say hello.”预料库来演示上面的结构。
在这里插入图片描述

图5-26

可以看出,在模型参数比较理想时,对于第一个单词you,Softmax层的输出概率最大的应该是say。对于say,下一个词是goodbey或hello的概率都比较高,但是应为记住了序列,goodbey的概率还是要高于hello的。

5.4.2 Time层的实现

之前我们将整体处理时序数据的层实现为了 Time RNN 层,这里也同样使用Time Embedding层、Time Affine层等来实现整体处理时序数据的层,将目标神经网络转化为下图右侧。
在这里插入图片描述

图5-27
具体实现不做赘述。

5.5 RNNLM的学习和评价

5.5.1 RNNLM的实现

在这里插入图片描述

图5-30

5.5.2 语言模型的评价

语言模型基于给定的已经出现的单词(信息)输出将要出现的单词的概率分布。困惑度(perplexity)常被用作评价语言模型的预测性能的指标。
困惑度表示“概率的倒数”。对于语料库“you say goodbye and i say hello.”,向语言模型“模型1”传入单词 you 时会输出图5-32的左图所示的概率分布。此时,下一个出现的单词是 say 的概率为 0.8,这是一个相当不错的预测。取这个概率的倒数,可以计算出困惑度为 1 / 0.8 = 1.25 1/0.8= 1.25 1/0.8=1.25
在这里插入图片描述

图5-32

而图 5-32 右侧的模型2预测出的正确单词的概率为 0.2,这
显然是一个很差的预测,此时的困惑度为 1 / 0.2 = 5 1/0.2=5 1/0.2=5
困惑度越小越好,可以解释为“分叉度”,指下一个可以选择的选项的数量,当然是越小越好。
在输入数据为多个的情况下,困惑度可以根据下面的式子进行计算:
L = − 1 N ∑ n ∑ k t n k log ⁡ y n k (5.12) L=-\frac 1 N \sum \limits _n \sum \limits _k t_{nk} \log y_{nk} \tag {5.12} L=N1nktnklogynk(5.12)
困惑度 = e L (5.13) 困惑度=e^L \tag {5.13} 困惑度=eL(5.13)
假设数据量为 N 个。 t n t_n tn是one-hot向量形式的正确解标签, t n k t_{nk} tnk表示第n个数据的第k个值, y n k y_{nk} ynk表示概率分布(神经网络中的Softmax的输出)。明显,L是神经网络的损失。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MangoGO芒狗狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值