AI智能
改变未来

递归神经网络

         递归神经网络(RNN)是一组特殊的神经网络,旨在按时间顺序处理数据,例如一组文本信息(文本情感分析和随后的文本内容预测)或股票市场价格。 RNN保留状态变量,这些状态变量用于捕获时间序列数据中存在的某些连接,因此可以对序列数据进行建模。除非对原始序列执行特征提取以获取一些重要信息,否则传统前馈神经网络不具有此功能。然而,提取这样的特征表达非常困难。如果使用前馈模型对顺序数据进行建模,则可以使用替代方案在序列中的每个位置设置唯一的参数级别。它旨在在特定位置指定参数,分配可以学习在该位置发生的模式,但这样做会大大增加模型的内存需求。这样的模型可能非常耗时,并且会消耗计算机资源。

        RNN能够学习序列每一刻的主要原因是它们随时间共享参数,并且序列的每个输入处的状态变量随时间更新。 给定先前观察到的序列值,可以将随时间共享的这些参数与状态变量进行组合后以预测序列中的下一个值。

然后,接下来将讨论RNN的详细信息,RNN的基本功能,RNN输出的计算,参数更新的规则以及RNN的一些局限性。

         如前所述,RNN维护状态变量,状态变量会随着时间而变化。当RNN接触更多数据并允许对序列数据进行建模时,就会发生这种情况。特别是,一组循环连接会随时间更新此状态变量。循环连接是RNN与前馈网络之间的主要结构差异。循环连接可以理解为RNN过去已获悉的一组保存状态之间的链接,并且已连接到RNN的当前状态变量。也就是说,循环连接根据RNN的过去存储状态更新当前状态变量,并允许RNN根据当前和先前的输入进行预测。如图5-5所示为循环连接的RNN结构图。 

图5-5 循环连接的RNN结构图

                                                                                     

    假定一个数据序列:

    这里的x为输入值,y为输出值,可以建立它们之间的联系关系如下:

       g1和g2为某种函数,意味着当前的输出y取决于产生x和y输出的模型的某个状态所呈现的状态是通过当前输入的和先前状态的计算得到的。

       使用一个参数为的函数逼近器替换,,作为输入,产生当前状态;将替换,它的输入是当前状态

代入可得:

 

通过以上公式进行展开可以得到 如下所示:

可以看出 为一个递归迭代的过程,随着y的下标越来越大,公式也就越来越复杂,由此可以得出RNN的展开结构图如下:

 

神经网络是由一组权重和偏置以及一些非线性激活函数组成。因此,我们可以将上面的关系写成如下形式:

tanh是一个激活函数,U是大小为m * d的权重矩阵,m为隐藏层单元的数量,d为输入的数据维度,W是创建从 到 循环链的权重矩阵。tanh的范围为(-1,1),图形如下所示:

 

     RNN的训练不能使用传统的BP算法,由于E是关于的函数,而依赖前一状态 ,所以最后的 会有产生无穷多的导数,也就是说 是递归的。若要解决这个问题,可以将数据序列按事件展开,对于每个输入创建RNN副本,分别计算每个副本的导数,并通过计算梯度的总和将他们回滚,以计算需要更新的权重大小。

    截断的BPTT仅计算T时间步长的固定数量的梯度。更具体地,当计算时间步t时,仅计算t-T的导数(也就是不计算直到最开始的导数)。这比标准的BPTT计算效率更高。标准BPTT在每个时间步t处计算到序列开头的导数。但是随着序列长度变大,这在计算上变得不可行。但是,截断的BPTT仅计算后面方向的固定数量的导数,并随着序列的增大,计算量不会改变。

    BPTT的限制:梯度消失和梯度爆炸,拥有计算递归权重梯度的方法,并拥有高效的近似计算算法(如TBPTT),并没能让我们完全没有问题地训练RNN。计算时可能会出现其他问题。要明白为什么会这样,可以展开中 的单独一项,由于循环连接导致反向传播问题,所以可以忽略 ,得到以下公式:

                             

 

      如果只有四个时间步,则知道只有一项时。因此,在第n个时间步成为 。如果将其初始化为非常小的值(例如0.00001),则在n = 100个时间步长时,斜率将非常小。此外,此更新(即算术下溢)将被忽略,因为计算机表示数字的精度有限。这称为消失梯度。解决梯度损失不是那么容易。没有简单的方法可以重新缩放渐变以使其正确传播。可以在某种程度上解决梯度消失问题的一些技术是在初始化权重(例如Xavier初始化)时或使用基于动量的优化方法时(即除了更新当前梯度之外)。除了当前梯度的更新,还添加了一个额外项,即所有过去斜率的累加,称为速度项。但是,已经找到了针对此问题的更多理论解决方案,例如标准RNN的各种结构转换。

     另一方面,如果将 初始化为非常大的值(例如1000.00),则在n = 100个时间步长处,斜率将非常大。这会导致数值不稳定,在Python中您会获得Inf(无穷大的数)和NaN之类的值(非数字类型)成为梯度爆炸。

    由于输入维数和模型中存在的大量参数(权重),复杂的非凸面损失曲面在深度神经网络中非常常见。下图显示了RNN有损表面,突出了可以形成墙的非常高的曲率。当优化方法碰到这样的墙时,梯度会爆炸或超调,如图中的实线所示。这可能会导致最小的损失最小化,数量不稳定或两者兼而有之。在这种情况下,避免梯度爆炸的一种简单解决方案是,当梯度高于某个阈值时,将梯度裁剪为一个合理的较小值。图中的虚线显示了将渐变裁剪到较小值时会发生的情况。

 

 

接下来,讨论一下RNN解决问题的不同方法。这些应用程序包括句子分类,图像字幕和机器翻译。 RNN分为几种不同的类别,例如一对一,一对多,多对一和多对多。

在一对一RNN中,当前输入取决于先前观察到的输入。这种RNN可以应用于每个输入都有输出的问题,但是其输出取决于当前输入和导致当前输入的输入历史记录。这样的任务的一个示例是股票市场预测,该预测基于当前输入的值来获取其输出,该输入也取决于先前输入的表现。另一个例子是场景分类。标记图像中的每个像素(例如,汽车,道路,人等)。对于某些问题, 可能与 相同。例如,在文本生成问题中,先前预测的单词是用于预测下一单词的输入。

                                         

 

 

一对多RNN接受输入并输出一个序列。假设输入彼此独立。也就是说,不需要使用先前输入的相关信息来预测当前输入。但是,即使在处理单个输入时,也需要进行循环连接,因为输出是一组取决于先前输出值的值。使用此RNN的一项任务是为图像生成标题。

 

                                                  

 

多对一的RNN输入任意长度的序列并产生输出。 句子分类是一项受益于多对一RNN的任务。 句子是任意长度的单词序列,被视为网络的输入,用于生成将句子分类为一组预定义类别之一的输出。 句子分类的具体示例如下:

●将电影评论分类为正面或负面陈述(即情感分析)

●根据描述内容(人,物体,地点等)对句子进行分类

多对一RNN的另一种应用是通过一次仅处理一个图像块并将该窗口在图像上移动来对大型图像进行分类。

                                       

 

        多对多RNN是根据任意长度的输入生成任意长度的输出,这意味着输入和输出不必具有相同的长度。 这在机器翻译中特别有用,在机器翻译中,将句子从一种语言翻译成另一种语言。 一种语言的句子词数不一定与另一种语言的句子词数相对应。 另一个这样的例子是聊天机器人。 聊天机器人读取一系列单词(即用户的请求)并输出一系列单词(即答案)。

                                   

       综上所述,RNN主要是研究对象,与传统的前馈神经网络不同,RNN在解决时间任务方面更强大。此外,RNN可以采用多种形式,例如一对一(文本生成),多对一(顺序图像分类),一对多(图像描述)和多对多(机器翻译)。

       具体来说,主要解释了如何从前馈神经网络类型结构过渡到RNN。假设输入和输出都是具有序列性的数据,请设计一个可以表示输入和输出序列的计算图。该计算图产生该函数的一系列副本。这适用于序列的各个输入和输出元组。然后,可以通过将模型应用于序列中任何单个时间步长t来获得RNN的基本计算图。解释了用于计算隐藏状态和输出的确切数学方程式和更新规则。

       接下来,研究了如何从标准反向传播过渡到BPTT,以及为什么标准反向传播不能用于RNN。还讨论了BPTT的两个重要的实际问题:消失的梯度和爆炸的梯度,以及如何在表面解决这些问题。

        之后,研究了RNN的实际应用。描述了RNN的四种主要类型。一对一体系结构用于诸如文本生成,场景分类和视频帧标记之类的任务。多对一体系结构用于情感分析,可以逐词处理句子/短语(与上一章中描述的全文一步处理相比)。一对多体系结构在生成图像标题的任务中很常见。将一个图像映射到描述图像中长句子的短句子。可以使用多对多体系结构执行机器翻译任务。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 递归神经网络