1、循环神经网络和卷积神经网络
问题一:处理文本数据时,循环神经网络与前馈神经网络相比有什么特定?
前馈神经网络,eg. 卷积神经网络 CNN:
- 通过滑动窗口 + 池化的方式将原先变长的的输入转换成一个固定长度的向量表示
- 这样可以捕捉到原输入文本中一些局部的特征,但是难以学习到两个单词之间长距离的依赖关系
循环神经网络 RNN 建模长为 T 的序列:
- 第 t 层的隐含状态
编码了序列中前 t 个输入的信息
- 最后一层的状态
编码了整个序列的信息,可以用于后续任务(eg. 接一个 softmax 层做文本分类)
- 计算方式:
- f(·) 可以选取 Tanh 函数 or ReLU 函数,g(·) 可以选取 softmax 函数

2、循环神经网络的梯度消失问题
问题一:循环神经网络为什么会出现梯度消失或梯度爆炸?有哪些改进方案?
循环神经网络采用 BPTT (基于时间的反向传播) 算法,将循环神经网络按时间展开成 T 层的前馈神经网络,就和普通的反向传播没有区别,因此每层的梯度大小可能呈指数增长 → 梯度爆炸,也可能呈指数缩小 → 梯度消失
梯度消失对 RNN 的影响:很难学习到输入序列中长距离依赖关系
改进方案:
- 梯度爆炸问题:梯度裁剪,即当梯度的范式大于某个定值时,对梯度进行等比收缩
- 梯度消失问题:需要对模型本身进行改进
- 前馈神经网络 → 深度残差网络 ResNet
- 循环神经网络 RNN → LSTM(长短期记忆网络)、GRU(门控循环单元)等
3、循环神经网络中的激活函数
问题一:在循环神经网络中能否使用 ReLU 作为激活函数?
RNN 可以使用 ReLU 作为激活函数,但要初始化 W 为单位矩阵,否则会导致两个问题:
- 前向传播的数值问题:
,可以看到 的表达式最终会包含 t 个 W 的连乘,如果 W 不是单位矩阵,最终结果会趋于 0 或无穷大
- 反向传播的梯度消失/爆炸问题:梯度计算公式如 “2、问题一” 所示,当激活函数为 ReLU 时,
,因此
,如果 W 不是单位矩阵,会导致梯度消失或梯度爆炸
Tips:实验表明,初始化 W 为单位矩阵并使用 ReLU 激活函数,在一些应用中取得了与 LSTM 相似的结构,并且学习速度更快
4、长短期记忆网络 LSTM
循环神经网络 RNN 存在梯度消失和梯度爆炸问题,因此简单的 RNN 实际上只能学习到短期的依赖关系,很难建模长时间间隔的状态之间的依赖关系,称为长程依赖问题。而长短期记忆网络 LSTM 可以对有价值的信息进行长期记忆,从而减小循环神经网络的学习难度。
问题一:LSTM 是如何实现长短期记忆功能的?

如上图所示,LSTM 加入了三个门和一个内部记忆单元(内部状态)
- 用输入门
来动态地控制内部状态
应该输入多少新信息
- 用遗忘门
来动态地控制内部状态
应该遗忘多少历史信息(保存多少前一刻的内部状态?)
- 用输出门
来动态地控制当前的输出
有多大程度上取决于当前的内部记忆单元
LSTM 网络的长短期记忆功能:
- 长期记忆功能:对于一个训练好的 LSTM 网络,当输入的序列中没有重要信息时,输入门的值接近于 0,遗忘门的值接近于 1,过去的记忆会被保存,就实现了长期记忆
- 短期记忆功能:当输入的序列中有重要信息,需要存入记忆单元,意味着之前的记忆不再重要,输入门的值接近于 1,遗忘门的值接近于 0,旧的记忆被遗忘,新的重要信息被记忆
问题二:LSTM 里各模块分别使用什么激活函数,可以使用别的激活函数吗?
LSTM 各模块使用的激活函数:
- 遗忘门、输入门、输出门:使用 sigmoid 激活函数
- sigmoid 的输出在 0~1 之间,符合门控的物理定义。并且当输入较大 or 较小时,输出会非常接近 1 or 0,保证门的开 or 关
- 生成候选记忆
时:tanh 激活函数
- tanh 的输出在 -1~1 之间,与大多数场景下特征分布是 0 中心的吻合
- 此外,tanh 激活函数在 0 附近的梯度比 sigmoid 大,使模型收敛更快
LSTM 不能使用的激活函数:
- 非饱和型激活函数:LSTM 常用的 sigmoid 和 tanh 激活函数都是饱和的,输入达到一定值输出就不会发生明显变化。如果使用 ReLU 等非饱和的激活函数,就难以实现门控的效果
LSTM 可以使用的其它激活函数:
- Sigmoid 激活函数的变种,eg.
2sigmoid(x)-1 - 0/1 门:在一些计算能力有限的设备(eg. 可穿戴设备),由于 sigmoid 函数求指数需要一定的计算量,可以使用 0/1 门让门控输出为 0 or 1 的离散值(当输入小于阈值时输出 0,大于阈值时输出 1),以减小计算量
5、Seq2Seq 模型
问题一:什么是 Seq2Seq 模型?Seq2Seq 模型有哪些优点?
- Seq2Seq 模型将一个变长的输入序列映射到另一个输出序列
- Seq2Seq 模型包含编码器和解码器
- 编码器:将输入序列编码为一个向量表示
- 解码器:将编码器得到的向量表示解码为输出序列
- 编码器和解码器的实现:
- 循环神经网络 RNN
- 自注意力
- 编码器和解码器之间还可以加上注意力机制
问题二:Seq2Seq 模型在解码时,有哪些常用的办法?
Seq2Seq 模型最核心的部分是其解码部分,大量的改进也是在解码环节衍生的
Seq2Seq 模型的解码方法:
- 贪心法:最基础的解码方法
- 选取一种度量标准后,每次在当前状态下选择最佳的一个结果,直到结束
- 优点:计算代价低
- 缺点:获得的是局部最优解,往往不能获得最好的结果
- 集束搜索(beam search):每次都保存 b 个最佳选择
- b 取 1 → 退化为贪心法
- b 增大,搜索空间增大,最终效果会提升,但计算量也增大
- 实际应用 b 往往取 8~12

- 解码环节其它常见的改进:解码时使用堆叠的 RNN、增加 Dropout 机制、与编码器之间建立残差连接、注意力机制(使得在解码时每一步可以有针对性地关注与当前有关的编码结果,从而减小编码器输出表示地学习难度,也更容易学习到长期的依赖关系)等
6、注意力机制
问题一:Seq2Seq 模型引入注意力机制是为了解决什么问题?为什么选用了双向的循环神经网络模型?
为什么引入注意力机制?
- 传统的基于 RNN 的 Seq2Seq 模型,编码时将输入序列的全部信息压缩到最后一个时刻产生的隐向量
,交给解码器。只用一个固定维度的向量来囊括整个输入序列的资讯是很难得,尤其是当输入序列很长时,会造成信息丢失。因此,随着输入序列的增长,模型的性能就会显著下降
- 一些改进方法:
- 将源语言句子逆序输入,or 重复输入两遍来训练模型
- 使用 LSTM,但仍无法有效处理过长的序列
- 因此,需要引入注意力机制:将编码器处理输入序列每个 token 后得到的输出向量都交给解码器,让解码器自行决定在生成新序列的各个 token 时应该将注意力放在编码器的哪些输出向量上
为什么选用双向 RNN?
- 如果只使用单向的循环神经网络来计算隐状态
,就相当于只考虑了
到
的上文信息,没有考虑 到 的下文信息,在计算注意力权重时就丢失了后续输入的信息
- 使用双向循环神经网络建模,就可以避免上下文信息的丢失

