来源
《百面机器学习》第10章
RNN
建模序列化数据的一种主流DL模型。
传统前馈NN一般的输入都是一个定长的向量,无法处理变长的序列信息,即使通过一些方法把序列处理成定长的向量,模型也很难捕捉序列中的长距离依赖关系。
RNN通过串行,累积了序列前面的信息并不断传递,最后浓缩成抽象的表示。
RNN和CNN
问:处理文本数据时,RNN与前馈NN相比有什么特点?
以TF-IDF向量作为特征输入,丢失了输入文本序列中每个单词的顺序。
CNN能够捕捉到原文本中的一些局部特征,但是两个单词之间的长距离依赖关系很难被学习到。
RNN能很好地处理文本数据变长并且有序的输入序列。相比于CNN,RNN具备对序列顺序信息的刻画能力。
RNN的梯度消失问题
问1:RNN为什么会出现梯度消失或梯度爆炸?有哪些改进方案?
RNN模型的求解可以采用BPTT(back propagation through time,基于时间的反向传播)算法实现。
使用BPTT算法学习的RNN并不能捕捉长距离的依赖关系,因为梯度消失。
当雅克比矩阵的最大特征值小于1,梯度的大小会呈现指数缩小,产生梯度消失。 雅克比矩阵??
梯度爆炸可以通过梯度裁剪来缓解。
梯度消失:ResNet、LSTM、GRU等方法。
RNN的激活函数
问1:在RNN中能否使用ReLU作为激活函数?
当采用ReLU作为RNN中隐含层的激活函数时,只有当 W 的取值在单位矩阵附近时才能取得比较好的效果,因此需要将 W 初始化为单位矩阵。
LSTM
问1:LSTM是如何实现长短期记忆功能的
三个输入,两个输出,三个门。
与RNN不同,从上一个记忆单元的状态Ct-1到当前的状态Ct的转移不一定完全取决于激活函数计算得到的状态,还由输入门和遗忘门来共同控制。
通过对遗忘门和输入门的调节,实现了旧的记忆和新的重要信息的平衡。
问2:LSTM里各模块分别使用什么激活函数,可以使用别的激活函数吗
遗忘门、输入门、输出门使用sigmoid函数作为激活函数。
生成候选记忆,使用双曲正切函数tanh函数。是因为这样输出在-1~1之间。
这两个激活函数都是饱和的,也就是说输入达到一定值,输出就不会发生明显变化。而若使用非饱和函数,将难以实现门控的效果。
事实上在门控中,使用sigmoid函数是几乎所有现在神经网络模块的共同选择。
GRU:让记忆Ct-1也参与到了门控的计算中。
Seq2Seq
问1:什么是Seq2Seq模型?Seq2Seq模型有哪些优点?
编码+解码两个环节组成。编码得到编码向量。
问2:Seq2Seq模型在解码时,有哪些常用的方法?
最基础:贪心法。
改进1:集束搜索。保存beam size个当前的较佳选择。b=1时,即为贪心。
实际应用(如机器翻译、文本摘要)时,b一般选8-12.
解码时使用堆叠的RNN、Dropout、与编码器之间建立残差链接,都是改进措施。
Attention
问1:Seq2Seq模型引入注意力机制是为了解决什么问题?为什么选用了双向的RNN模型?
问题:之前的seq2seq将整个句子的语义信息编码在一个向量中,长距离解码时势必困难。
建模小技巧:将源语言句子逆序输入,或者重复输入两遍来训练模型。但表现依然不好。
因为:Seq2Seq在解码时,当前词及对应的源语言词的上下文信息和位置信息再编解码过程中丢失了。
引入注意力机制:在解码时,每一个输出词都依赖于前一个隐状态以及输入序列每一个对应的隐状态Ci,
其中语境向量Ci是输入序列全部隐状态的一个加权和。
其中权值由输出序列前一位的隐状态和输入序列隐状态决定。
对此的直观理解:在生成一个输出词时,会考虑每一个输入词和当前输出词的对齐关系。
在机器翻译中为什么选用双向的RNN呢?
因为如果只使用一个方向的RNN来计算隐状态,会造成另一个方向词的信息丢失。