当前位置: 首页 > article >正文

自然语言处理(12:RNN(正式介绍))

系列文章目录

第一章 1:同义词词典和基于计数方法语料库预处理

第一章 2:基于计数方法的分布式表示和假设,共现矩阵,向量相似度

第一章 3:基于计数方法的改进以及总结

第二章 1:word2vec

第二章 2:word2vec和CBOW模型的初步实现

第二章 3:CBOW模型的完整实现

第二章 4:CBOW模型的补充和skip-gram模型的理论

第三章 1:word2vec的高速化(CBOW的改进)

第三章 2:word2vec高速化(CBOW的二次改进)

第三章 3:改进版word2vec的学习以及总结

第四章 1:RNN(RNN的前置知识和引入)

第四章 2:RNN(RNN的正式介绍)

第四章 3:RNN的实现

第四章 4:处理时序数据的层的实现

第四章 5:RNNLM的学习和评价


文章目录

目录

系列文章目录

文章目录

前言

一、RNN

1.循环的神经网络

2.展开循环

3.Backpropagation Through Time

二、Truncated BPTT

1.Truncated BPTT的介绍

2.Truncated BPTT的mini-batch学习

总结



前言

上一节为了引出RNN的魅力,我们拓展了话题,强行将word2vec的CBOW模型应用在了语言模型上,这节开始,就会直接介绍RNN了,请各位大佬们坐稳了!!


一、RNN

1.循环的神经网络

RNN(Recurrent Neural Network)中的Recurrent 源自拉丁语,意思是“反复发生”,可以翻译为“重复发生”“周期性地发生”“循环”,因此 RNN可以直译为“复发神经网络”或者“循环神经网络”。下面,我们将探讨“循环”一词。

(注:Recurrent Neural Network通常译为“循环神经网络”。另外, 还有一种被称为Recursive Neural Network(递归神经网络)的 网络。这个网络主要用于处理树结构的数据,和循环神经网络不是一个东西。)

“循环”是什么意思呢?是“反复并持续”的意思。从某个地点出发, 经过一定时间又回到这个地点,然后重复进行,这就是“循环”一词的含 义。这里要注意的是,循环需要一个“环路”。 只有存在了“环路”或者“回路”这样的路径,媒介(或者数据)才能 在相同的地点之间来回移动。随着数据的循环,信息不断被更新。

RNN的特征就在于拥有这样一个环路(或回路)。这个环路可以使数据 不断循环。通过数据的循环,RNN一边记住过去的数据,一边更新到最新 的数据。 下面,我们来具体地看一下RNN。这里,我们将RNN中使用的层称 为“RNN层”,如下图:

如上图所示,RNN层有环路。通过该环路,数据可以在层内循环。 在图中,时刻t的输入是xt,这暗示着时序数据(x0,x1,···,xt,···)会被输入到层中。然后,以与输入对应的形式,输出(h0,h1,···,ht,···)。 这里假定在各时刻向RNN层输入的xt是向量。比如,在处理句子(单 词序列)的情况下,将各个单词的分布式表示(单词向量)作为xt输入RNN层。

可以发现输出有两个分叉,这意味着同一个东西被复制了。输出中的一个分叉将成为其自身的输入。

如下图所示,到目前为止,我们在绘制层时都是假设数据从左向右流动的。不过,从现在开始,为了节省纸面空间,我们将假设数据是从下向上流动的(这是为了在之后需要展开循环时,能够在左右方向上将层铺开)

2.展开循环

现在,准备工作已经完成了,我们来仔细看一下RNN层的循环结构。 RNN的循环结构在之前的神经网络中从未出现过,但是通过展开循环,可 以将其转化为我们熟悉的神经网络。百闻不如一见,现在我们就实际地进行展开,如下:

如上图所示,通过展开RNN层的循环,我们将其转化为了从左向右延伸的长神经网络。这和我们之前看到的前馈神经网络的结构相同(前馈网络的数据只向一个方向传播)。不过,图中的多个RNN层都是“同一个层”,这一点与之前的神经网络是不一样的。

由上图可以看出,各个时刻的RNN层接收传给该层的输入和前一个 RNN层的输出,然后据此计算当前时刻的输出,此时进行的计算可以用下式表示:

首先说明一下上式中的符号。RNN有两个权重,分别是将输入x 转化为输出h的权重Wx和将前一个RNN层的输出转化为当前时刻的输出的权重Wh。此外,还有偏置b。这里,ht−1和xt都是行向量。

在上式中,首先执行矩阵的乘积计算,然后使用tanh函数(双曲正切函数)变换它们的和,其结果就是时刻t的输出ht。这个ht一方面向上输出到另一个层,另一方面向右输出到下一个RNN层(自身)。

观察上式可以看出,现在的输出ht是由前一个输出ht−1计算出来的。从另一个角度看,这可以解释为,RNN具有“状态”h,并以式上述的形式被更新。这就是说RNN层是“具有状态的层”或“具有存储(记忆) 的层”的原因。

3.Backpropagation Through Time

将RNN层展开后,就可以视为在水平方向上延伸的神经网络,因此 RNN的学习可以用与普通神经网络的学习相同的方式进行,如图所示:

如上图所示,将循环展开后的RNN可以使用(常规的)误差反向传播法。换句话说,可以通过先进行正向传播,再进行反向传播的方式求目标梯度。因为这里的误差反向传播法是“按时间顺序展开的神经网络的误差反向传播法”,所以称为Backpropagation Through Time(基于时间的反向传播),简称BPTT

通过该BPTT,RNN的学习似乎可以进行了,

但是在这之前还有一个必须解决的问题,那就是学习长时序数据的问题。因为随着时序数据的时间 跨度的增大,BPTT消耗的计算机资源也会成比例地增大。另外,反向传播 的梯度也会变得不稳定。(要基于BPTT求梯度,必须在内存中保存各个时刻的RNN层的中 间数据(RNN层的反向传播将在后文中说明)。因此,随着时序数据 变长,计算机的内存使用量(不仅仅是计算量)也会增加。)

二、Truncated BPTT

1.Truncated BPTT的介绍

在处理长时序数据时,通常的做法是将网络连接截成适当的长度。具 体来说,就是将时间轴方向上过长的网络在合适的位置进行截断,从而创建多个小型网络,然后对截出来的小型网络执行误差反向传播法,这个方法称为Truncated BPTT(截断的BPTT)。

Truncated是“被截断”的意思。Truncated BPTT是指按适当长度截断的误差反向传播法。(这里你可以认为是木桶效应的改版)

在Truncated BPTT 中,网络连接被截断,但严格地讲,只是网络的 反向传播的连接被截断,正向传播的连接依然被维持,这一点很重要。也就是说,正向传播的信息没有中断地传播。与此相对,反向传播则被截断为适 当的长度,以被截出的网络为单位进行学习。

现在,我们结合具体的例子来介绍Truncated BPTT。假设有一个长 度为1000的时序数据。在自然语言处理的情况下,这相当于一个有1000个 单词的语料库。顺便说一下,我们之前处理的PTB数据集将多个串联起来 的句子当作一个大的时序数据。这里也一样,将多个串联起来的句子当作一 个时序数据。

在处理长度为1000的时序数据时,如果展开RNN层,它将成为在水平方向上排列有1000个层的网络。当然,无论排列多少层,都可以根据误差反向传播法计算梯度。但是,如果序列太长,就会出现计算量或者内存使用量方面的问题。此外,随着层变长,梯度逐渐变小,梯度将无法向前一层 传递。因此,如下图所示,我们来考虑在水平方向上以适当的长度截断网络的反向传播的连接。

在上图中,我们截断了反向传播的连接,以使学习可以以10个RNN层为单位进行。像这样,只要将反向传播的连接截断,就不需要再考虑块范围以外的数据了,因此可以以各个块为单位(和其他块没有关联)完成误差反向传播法。 这里需要注意的是,虽然反向传播的连接会被截断,但是正向传播的连接不会。因此,在进行RNN的学习时,必须考虑到正向传播之间是有关联的,这意味着必须按顺序输入数据。下面,我们来说明什么是按顺序输入数据。

(注意:我们之前看到的神经网络在进行mini-batch学习时,数据都是 随机选择的。但是,在RNN执行Truncated BPTT时,数据需要按顺序输入。)

现在,我们考虑使用Truncated BPTT来学习RNN。我们首先要做的是,将第1个块的输入数据(x0, ... ,x9)输入RNN层。这里要进行的处理如下图所示。

如上图所示,先进行正向传播,再进行反向传播,这样可以得到所需的梯度。接着,对下一个块的输入数据(x10,x11,···,x19)执行误差反向传播法,如下图所示。

这里,和第1个块一样,先执行正向传播,再执行反向传播。这里的重点是,这个正向传播的计算需要前一个块最后的隐藏状态h9,这样可以维持正向传播的连接。 用同样的方法,继续学习第3个块,此时要使用第2个块最后的隐藏状 态h19。像这样,在RNN的学习中,通过将数据按顺序输入,从而继承隐藏状态进行学习。根据到目前为止的讨论,可知RNN的学习流程如下图所示:

 

如上图所示,Truncated BPTT 按顺序输入数据,进行学习。这样一来,能够在维持正向传播的连接的同时,以块为单位应用误差反向传播法。

2.Truncated BPTT的mini-batch学习

到目前为止,我们在探讨Truncated BPTT时,并没有考虑mini batch 学习。换句话说,我们之前的探讨对应于批大小为1的情况。为了执行mini-batch 学习,需要考虑批数据,让它也能像上图一样按顺序输入数据。因此,在输入数据的开始位置,需要在各个批次中进行“偏移”。 为了说明“偏移”,我们仍用上一小小节的通过Truncated BPTT进行学习的例子,对长度为1000的时序数据,以时间长度10为单位进行截断。此时, 如何将批大小设为2进行学习呢?在这种情况下,作为RNN层的输入数据, 第1笔样本数据从头开始按顺序输入,第2笔数据从第500个数据开始按顺序输入。也就是说,将开始位置平移500,如下图所示:

如上图所示,批次的第1个元素是x0,···,x9,批次的第2个元素是x500,···,x509,将这个mini-batch作为RNN的输入数据进行学习。因为要输入的数据是按顺序的,所以接下来是时序数据的第10~19个数据和第510~519个数据。像这样,在进行mini-batch学习时,平移各批次输入数据的开始位置,按顺序输入。此外,如果在按顺序输入数据的过程中遇到了结尾,则需要设法返回头部。

如上所述,虽然Truncated BPTT的原理非常简单,但是关于数据的输入方法有几个需要注意的地方。具体而言,一是要按顺序输入数据,二是要平移各批次(各样本)输入数据的开始位置。这里的探讨有些复杂,大家一时间可能还不能理解,之后通过实际查看和运行代码,相信大家就能够理 解了。


总结

这一节我们已经看到了RNN的全貌,以及理论知识和计算图。后面开始实现。


http://www.kler.cn/a/611634.html

相关文章:

  • YoloV8训练和平精英人物检测模型
  • 26.红黑树及其模拟实现
  • LibVLC —— 《基于Qt的LibVLC专业开发技术》视频教程
  • 【redis】集群 如何搭建集群详解
  • AI for CFD入门指南(传承版)
  • mac m 芯片 动态切换 jdk 版本jdk8.jdk11.jdk17
  • 【洛谷题单】暴力枚举(上)
  • 【MySQL】验证账户权限
  • Spring 事件监听机制介绍以及源码分析
  • Elasticsearch 优化方案
  • 【Lua】一文快速掌握 Lua 语言指令(Lua 备忘清单)
  • 直播预告 | TDgpt 智能体发布 时序数据库 TDengine 3.3.6 发布会即将开启
  • 【第30节】MFC编程:ListCtrl控件和TreeCtrl控件
  • SPI协议(20250325)
  • HarmonyOS:统一拖拽
  • 关于 K8s 的一些基础概念整理-补充
  • 交换机及其作用详解
  • [RITSEC CTF 2025] Crypto
  • vscode 通过Remote-ssh远程连接服务器报错 could not establish connection to ubuntu
  • 使用react 引入相对路径文件