锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

深度学习实战 第7章循环神经网络笔记

时间:2023-09-09 22:07:02 whj1精密电位器精密电位器whj1

第7章 循环神经网络

1.前馈神经网络总是单向的,从输入层到低隐藏层,从低隐藏层到高隐藏层,最后到输出层。但无论网络有多少层,它都是一层一层地向前输出的。但这实际上是一个问题,因为这种前馈结构需要假设数据是独立分布的,但现实中,音频数据、视频数据、自然语言数据等复杂数据并不符合这一条件。

2.当我们将英文文本翻译成中文文本时,句子和段落之间存在上下文关系,单词在特定情况下的意义也不同。而且这些数据的长度不同,很难规范这些序列数据进行训练,所以前馈网络很难处理这种变长的序列数据。当然,我们也可以把整篇文章作为文本数据,把整个音频作为音频数据输入前馈网络学习,但数据维度太高,无法想象,会产生可怕的维度灾难( Curse of Dimensionality)

3.另一种方式是对序列数据进行切割,例如,将机器翻译任务中的文章切割成段落训练,或将段落切割成句子训练,将手写识别的句子切割成单词进行识别训练。然而,这需要强烈的人为干预。数据分割越详细,数据的上下文关系就越严重,数据分割不合理也会引起强烈的人为噪声。

4.为了有效地处理这些序列数据,我们允许神经网络水平连接。当前的网络输出不仅取决于当前的输入信息,还取决于以前的数据信息。这种网络结构是本章的主角——循环神经网络(Recurrent Neural Network, RNN)

5.这里需要注意的是,循环神经网络有时会被翻译成递归神经网络,但这是真的递归网络( Recursive Neural Network)这是不公平的。循环网络代表信息从前到后的传输和积累,其扩展是一个链式结构,在机器翻译中的应用是假设句子背后的信息与句子之前的信息有关。递归网络在空间维度上的扩展是一种树结构。在机器翻译中的应用是假设句子是由几个部分(主语、谓语、宾语)组成的树结构,每个部分可以分为几个小部分,即某个部分的信息由其子树组成。

7.1 循环神经网络

1.我们也可以理解,循环神经网络是在前馈网络中添加的记忆单元。当神经元向前传输时,隐藏层将信息保存在记忆单元中,除了将信息输出到网络的前端。执行下一个数据时,将下一个数据与存储在记忆单元中的当前信息一起输入到隐藏层中提取特征,然后将处理后的信息保存到记忆单元中。

2.假设长度为 T T T 的序列 X X X : I I I H H H 分别表示 RNN 循环网络的前馈输出如下所示。
a h t = ∑ i = 1 I w i h x i t ∑ h ′ = 1 H w h ′ h b h ′ t ? 1 a_h^{t} = \sum_{i=1}^I w_{ih}x_i^t \sum_{h^{'}=1}^H w_{h^{'}h}b_{h^{'}}^{t-1} aht=i=1Iwihxit+h=1Hwhhbht1

b h t = f ( a h t ) b_h^{t} = f(a_h^{t}) bht=f(aht)

其中 x i t x_i^t xit 表示第 t t t 时刻序列数据 x x x 的第 i i i 维; a j t a_j^{t} ajt b j t b_j^{t} bjt分别表示 t t t 时刻第 j j j 隐藏单元的输入值与激活值; w i h w_{ih} wih 表示输入层第 i i i 单元与隐藏层 h h h 单元的连接权重; w h ′ h w_{h^{'}h} whh 表示隐藏层 h ′ h^{'} h 单元与隐藏层 h h h 单元的连接权重; b h ′ t − 1 b_{h^{'}}^{t-1} bht1表 示 t − 1 t-1 t1 时刻隐藏层 h ′ h^{'} h 单元的激活值。

需要注意的是,在第 t = 1 t=1 t=1时刻,也就是序列第一条数据输入网络时,隐藏层还没有激活值,因此我们会设置 b h ′ 0 = 0 b_{h^{'}}^{0}=0 bh0=0。当然,如果我们执行类似图像说明这样的联合RNN与CNN的任务时, b h ′ 0 b_{h^{'}}^{0} bh0 就为卷积网络的输出特征。

7.1.1 循环神经元展开

1.为了更好地说明循环神经网络的工作模式,如下图所示,我们将序列数据按照时间维度展开。假设我们的序列长度为 t t t ,那么该神经网络就有 t t t 层隐藏层, t t t 层输入层。其中隐层之间的连接,以及输入层到隐藏层的连接都是共享的。

如果以静态的方式看待循环神经网络,那该网络就非常的“怪异”:虽然它有 t t t 层隐藏层,是非常深的神经网络,但却层层参数共享,实际上只有三套参数,输入层到隐藏层参数 U U U ,隐藏层到隐藏层参数 W W W ,隐藏层到输出层参数 V V V

1

这样的参数共享结构有以下两个主要优点。

1,无论序列的长度多长,学习模型始终具有相同大小的输入

2,由于每个时间步的参数都相同,因此我们可以使用相同的转移函数学习。

这两个因素使得我们不需要针对每个时间片段配置特定的参数,学习单独的函数。我们只需要学习一个转移函数即可,这样既可以节约大量的参数,并且也有利于提升模型的泛化能力,可以很方便地使用网络处理任意长的序列数据。

7.1.2 循环网络训练

1.通常,我们使用**时间反向传播(BackPropagation Through Time,BPTT)**算法训练循环神经网络。它是BP算法应用在循环网络上的一种扩展形式,如果将循环网络展开成一个深层参数共享网络,那么将此算法看作BP算法即可。

2.根据学习输出种类的不同,我们主要将RNN分为三种:固定长度到可变长度可变长度到固定长度可变长度到可变长度的学习。接下来我们就简单地介绍这三种训练模式。

固定长度到可变长度学习

我们将固定(特征)大小的数据传入RNN中,然后将其输出位可变长度数据。比知自动图片说明任务就采用这种网络架构。在该任务中,我们首先会将图片经过卷积网络进行图片特征提取,然后将图片特征当作RNN的隐藏层初始状态进行学习,最后RNN会输出一段该图片的文字描述。

可变长度到固定长度的学习

如图 7-3 所示,我们将序列数据映射到一个固定大小的隐藏层,在隐藏层中进行循环处理后,将最后隐藏层的状态输出到输出层。这种方式使得我们的序列可以由变长转化为固长,例如情感分类任务便是典型地将一段文字进行分类识别的任务。

这种序列到固定长度学习的任务训练起来也非常的方便,只需要将时间看作是原始前馈网络的 t t t 层,然后使用BP算法训练这种按层共享参数的“深层神经网络”即可。

可变长度到可变长度的学习

如图7-4所示,序列的每一个时间片段都对应着一个输出结果,此时我们的任务就交成了学习如何映射输入序列到输出序列。

这类任务的训练方式和前面方法类似,都是将整个序列完全地输入到网络中,然后从序列的最后一个时间片段开始时间反向传播训练,只是在训练每个时间片段时,残差除了来自于上一时间片段,还来自于当前时间片段。
δ h t = f ′ ( a h t ) ( ∑ k = 1 K δ k t w h k + ∑ h ′ = 1 K δ h ′ t w h h ′ ) \delta_h^t = f^{'}(a_h^t)(\sum_{k=1}^K \delta_k^t w_{hk}+\sum_{h^{'}=1}^K \delta_{h^{'}}^t w_{hh^{'}}) δht=f(aht)(k=1Kδktwhk+h=1Kδhtwhh)
如上式所示, δ h t \delta_h^t δht 表示第 t t t 时间片段,隐藏层 h h h 的残差。而该残差来自于当前时间片段 t t t各输出层残差与隐藏层到输出层连接权重乘积的累加。需要说明的是在 t = T t=T t=T,也就是训练序列最后一个时间片段时,我们没有 t = T + 1 t=T+1 t=T+1 时的残差,一般情况下我们会将其设置为 0 0 0 ,因此在 t = T t=T t=T 时,我们仅需要计算当前时刻的输出层残差即可。

7.2.1 双向循环网络结构

1.在某些任务中,我们可能也需要整合“未来”的信息来处理当前信息。如在语音识别中,由于协同发音(co- articulation)的问题,当前的语音翻译可能需要依赖于接下来的一些音素( phonemes,最小的语音单位)。甚至由于一些语言的语法依赖关系,当前的音素也可能依赖于接下来的一些单词。在这类任务中,我们需要结合之前和之后的信息去消除歧义。双向循环神经网络( Bidirectional Recurrent Neural Networks, BRNNS)是一种结合过去和未来信息处理当前信息的网络结构,目前该网络结构广泛地应用于手写识别及语音识别领域

顾名思义,双向 RNN 其实就是由两个 RNN 同时组成,其中一个 RNN 前向处理序列数据从序列的起始片段处理;另一个 RNN 反向处理序列数据,从序列的末尾片段开始,然后倒序处理。如图7-5所示, h ( t ) h^{(t)} h(t) 表示顺序处理的子 RNN 中 t t t 时刻的隐藏单元, g ( t ) g^{(t)} g(t) 表示逆序处理的子 RNN 中 t t t 时刻的隐藏单元,在计算 t t t 时刻的输出单元 o ( t ) o^{(t)} o(t) 时,网络既考虑了之前的信息 h ( t ) h^{(t)} h(t) ,又考虑了之后的信息 g ( t ) g^{(t)} g(t)

7.2.2 编码-解码网络结构

1.**编码-解码( Encoder-Decoder)序列到序列( Sequence-to- Sequence)结构便是最简单的一种映射变长序列( Variable-length Sequence)**到变长序列的网络结构。需要说明的是,我们经常将 RNN 的输入称之为“上下文(context)”,而我们需要做的是生成该上下文 C 的某种表示。这种表示你可以理解成是由输入转化的一些特定概念,它可以是一个固定向量,也可以是一个序列向量。

2.如图 7-6 所示,编码-解码主要分为以下两个部分。

我们将输入序列输入到一个称为**编码器( Encoder)读者( Reader)**的 RNN 中,编码器将序列映射到一个向量 C 中,通常此向量为 RNN 隐藏层的最后状态。

我们将向量 C 作为输入数据,输入到一个称为**解码器( Decoder)**或者写者(Writer)的RNN中,从而生成一条输出序列。

7.2.3 深度循环网络结构

1.**RNN一般可以分解成三个部分:一是输入层到隐藏层;二是前一隐藏层到下一隐藏层;三是隐藏层到输出层。**这三个部分,我们可以用三组权重矩阵来表示。虽然从训练角度出发,将隐藏层单元按照时间展开可以看作是一个非常深的权重共享网络;但从模型能力的角度,其依然只能算浅层的网络。这就好像没有公主的命(不是深层结构),却得了公主的病(训练困难,梯度消失、爆炸等问题)。

2.在 RNN 中加入深层的结构,主要有三种常用的深层 RNN 结构作为参考。

如图 7-7(a) 所示,我们将RNN中隐藏层扩展为多层 RNN 的结构 h h h z z z 分别表示不同的RNN隐藏层,元器件数据手册、IC替代型号,打造电子元器件IC百科大全!

相关文章