目录
循环神经网络与卷积神经网络
1. 处理文本数据时,循环神经网络与前馈神经网络相比有什么特点?(1)
在神经网络的建模过程中,一般的前馈神经网络,如卷积神经网络,通常接受一个定长的向量作为输入。卷积神经网络对文本数据建模时,输入变长的字符串或者单词串,然后通过滑动窗口加池化的方式将原先的输入转换成-个固定长度的向量表示,这样做可以捕捉到原
文本中的一些局部特征,但是两个单词之间的长距离依赖关系还是很难被学习到。循环神经网络却能很好地处理文本数据变长并且有序的输入序列。
相比于卷积神经网络等前馈神经网络,循环神经网络由于具备对序列顺序信息的刻画能力,往往能得到更准确的结果。
循环神经网络的梯度消失问题
1. 循环神经网络为什么会出现梯度消失或梯度爆炸?有哪些改进方案?(2)
循环神经网络的求解可以采用BPTT(Back Propagation Through Time, 基于时间的反向传播)算法实现,BPTT实际上是反向传播算法的简单变种,如果将循环神经网络展开成T层的前馈神经网络来理解,就和普通的反向传播算法没有区别了。循环神经网络的设计初衷之一就是能够捕获长距离输入之间的依赖。从结构上来看,循环神经网络也理应能够做到这 点。然而实践发现,使用 BPTT算法学习的循环神经网络并不能成功捕捉到长距离的依赖关系,这一现象主要源于深度神经网络中的梯度消失。
循环神经网络的梯度可以写成连乘形式如下,等号左边对应的nxn维矩阵,又被称为雅可比矩阵。
由于预测的误差是沿着神经网络的每一层反向传播的,因此当雅可比矩阵的最大特征值大于1时,随着离输出越来越远,每层的梯度大小会呈指数增长,导致梯度爆炸;反之,若雅可比矩阵的最大特征值小于1,梯度的大小会呈指数缩小,产生梯度消失。
梯度爆炸的问题可以通过梯度裁剪来缓解,当梯度的范式大于某个给定值时,对梯度进行等比收缩。 而梯度消失问题相对比较棘手,需要对模型本身进行改进。 深度残差网络是对前馈神经网络的改进,通过残差学习的方式缓解了梯度消失的现象,从而使得我们能够学习到更深层的网络表示;而对于循环神经网络来说,短时记忆模型[23]及其变种门控循环单元( Gated recurrent unit, GRU)等模型通过加入门控机制,很大程度上弥补了梯度消失所带来的损失。
循环神经网络中的**函数
1. 在循环神经网络中能否使用ReLU作为**函数?(3)
可以,但是需要对矩阵的初值做一定的限制,否则在反向传播中权重矩阵如果不是单位矩阵,最终会趋于0或者无穷,从而十分容易引发数值问题。
长短期记忆网络
1. LSTM是如何实现长短期记忆功能的?(2)
与传统的循环神经网络相比 , LSTM 仍然是基于当前输入层和前一个隐藏层来计算当前隐藏层,只不过对内部结构进行了更加精心的设计,加入了输入门,遗忘门,以及输出门三个门和一个内部记忆单元。输入门控制当前计算的新状态以多大程度更新到记忆单元中,遗忘门控制前一步记忆单元中的信息有多大程度被遗忘埠,输出门控制当前的输出有多大程度上取决于当前的记忆单元。
2. LSTM里各模块分别使用什么**函数,可以使用别的**函数吗?(3)
关于**函数的选取,在 LSTM 中,遗忘门、输入门和输出门使用 Sigmoid 函数作为**函数;在生成候选记忆肘,使用双曲正切函数 Tanh 作为**函数。值得注意的是,这两个**函数都是饱和的,也就是说在输入达到一定值的情况下,输出就不会发生明显变化了 。 如果是用非饱和的**函数,例如 ReLU ,那么将难以实现门控的效果。
Sigmoid 函数的输出在 0 ~ 1之间,符合门控的物理定义。 且当输入较大或较小时,其输出会非常接近1或 0,从而保证该门开或关。在生成候选记忆时,使用 Tanh 函数,是因为其输出在-1~1 之间 ,这与大多数场景下特征分布是 0 中心的吻合。 此外, Tanh 函数在输入为 0附近相比 Sigmoid 函数有更大的梯度,通常使模型收敛更快。
**函数的选择也不是一成不变的,也有一些使用sigmoid和Tanh的变种。
Seq2Seq模型
1. 什么是Seq2Seq模型?它有哪些优点(2)
Seq2Seq 模型的核心思想是,通过深度神经网络将一个作为输入的序列映射为一个作为输出的序列,这一过程由编码输入与解码输出两个环节构成。
在经典的实现中,编码器和解码器各由一个循环神经网络构成,既可以选择传统循环神经网络结构,也可以使用长短期记忆模型、门控循环单元等。在 Seq2Seq 模型中,两个循环神经网络是共同训练的。
2. Seq2Seq模型在解码时有哪些常用的办法?(3)
Seq2Seq 模型最核心的部分是其解码部分,大量的改进也是在解码环节衍生的。 Seq2Seq 模型最基础的解码万法是贪心法,即选取一种度量标准后,每次都在当前状态下选择最佳的一个结果,直到结束。 贪心法的计算代价低,适合作为基准结果其他方法相比较。很显然, 贪心法获得的是一个局部最优解,由于实际问题的复杂性,该方法往往并不能取得最好的效果。
集束搜索是常见的改进算法,它是一种启发式算法。 该方法会保存 beam size (后面简写为 b ) 个当前的较佳选择,然后解码时每一步根据保存的选择进行下一步扩展和排序,接着选择前 b 个进行保存,循环迭代,直到结束时选择最佳的一个作为解码的结果。图10.5 是 b 为 2时的集束搜索示例 。
由图可见,当前已经有解码得到的第一个词的两个候选: I 和My。 然后,将 I 和 My 输入到解码器,得到一系列候选的序列 ,诸如 I decided 、 My decision 、 I thought 等。最后,从后续序列中选择最优的两个,作为前两个词的两个候选序列。很显然,如果 b 取 1,那么会退化为前述的贪心法。随着 b 的增大,其搜索的空间增大,最终效果会有所提升,但需要的计算量也相应增大。在实际的应用(如机器翻译、文本摘要)中,b往往会选择一个适中的范围,以 8 ~ 12 为佳。
解码时使用堆叠的 RNN 、增加 Dropout 机制、与编码器之间建立残差连接等,均是常见的改进措施。在实际研究工作中,可以依据不同使用场景,有针对地进行选择和实践。
另外,解码环节中一个重要的改进是注意力机制,我们会在下一节深入介绍。注意力机制的引入,使得在解码时每步可以有针对性地关注与当前有关的编码结果,从而减小编码器输出表示的学习难度,也更容易学到长期的依赖关系。此外,解码时还可以采用记忆网络从外界获取知识。
注意力机制
1. Seq2Seq模型引入注意力机制是为了解决什么问题?为什么选用了双向的循环神经网络模型?(4)
在实际任务(例如机器翻译)中,使用 Seq2Seq 模型,通常会先使用一个循环神经网络作为编码器,将输入序列(源语言句子的词向量序列)编码成为一个向量表示;然后再使用一个循环神经网络模型作为解码器,从编码器得到的向量表示里解码得到输出序列(目标语言句子的词序列)
在实际使用中,会发现随着输入序列的增长,模型的性能发生了显著下降。这是因为编码时输入序列的全部信息压缩到了一个向量表示中。随着序列增长,句子越前面的词的信息丢失就越严重。试想翻译一个有100 个词的句子,需要将整个句子全部词的语义信息编码在一个向量中。而在解码时,目标语言的第一个词大概率是和源语言的第一个词相对应的,这就意味着第一步的解码就需要考虑 1 00 步之前的信息。建模时的一个小技巧是将源语言句子逆序输入,或者重复输入两遍来训练模型,以得到一定的性能提升。使用长短期记忆模型能够在一定程度上缓解这个问题,但在实践中对于过长的序列仍然难以有很好的表现。
Seq2Seq 模型中引入注意力机制就是为了解决上述的问题。 在注意力机制中,仍然可以用普通的循环神经网络对输入序列进行编码,得到隐状态 h1,h2·· ·hi 但是在解码时,每一个输出词都依赖于前一个隐状态以及输入序列每一个对应的隐状态。
注意力机制是一种思想,可以有多种不同的实现万式,在 Seq2Seq 模型以外的场景也有不少应用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:百面机器学习(10)——循环神经网络 - Python技术站