前篇链接 link
目录
第五章 RNN
前面介绍的word2vec是前馈神经网路,无法很好的处理时序信息,引入RNN来解决问题
语言模型
目标:求后验概率 P( w_t | w_1, W_2, …, W_t-1 ),从而求出语言模型的联合概率
RNN模型
模型架构
- 输入:将时序单词序列 { w0, w1, w2, …, wt } 在空间上展开,依次输入到对应的RNN单元中(即上图等号右侧的一个个RNN框)
- 输出:对于输入单词 w_n,输出 w_n 接下来出现的一个单词的概率向量
一个典型RNN单元的计算图
h_prev为前一个RNN单元输出的隐藏状态,x为当前时序下输入的单词向量,tanh为激活函数
损失函数的设置
- 总结——基于时序序列输出的结果序列 { x0, x1, … , xT-1 } 与正确标签{ t0, t1, … , tT-1 }的逐元素二分类交叉熵损失的求和取均值
评价指标
- 困惑度
总结
-
RNN 具有环路,可以记忆隐藏状态;
-
通过展开 RNN 的循环,可以将其解释为多个 RNN 单元水平方向上延伸的神经网络,可以通过基于时间的反向传播进行学习(BPTT);
-
在学习长时序数据时,要生成长度适中的数据块,进行以块为单位的截断 BPTT 学习(Truncated BPTT);
-
Truncated BPTT 只截断反向传播的连接;
-
在 Truncated BPTT 中,为了维持正向传播的连接,需要按顺序输入数据;
-
语言模型将单词序列解释为概率;
-
理论上,使用 RNN 层的条件语言模型可以记忆所有已出现单词的信息;
第六章 Gated RNN
- 上一章的 RNN 存在环路,可以记忆过去的信息,其结构非常简单,易于实现。不过这个 RNN 的效果并不好。许多情况下它都无法很好地学习到时序数据的长期依赖关系。
- 现在,上一章的简单 RNN 经常被 LSTM 层所代替。实际上RNN更多的是指 LSTM 层,而不是上一章的 RNN。
- LSTM 增加了一种名为 门 的结构。基于这个门,可以学习到时序数据的长期依赖关系。本章我们将指出上一章的 RNN 的问题,介绍代替它的 LSTM 等 “Gated RNN”。
- 我们将花很多时间研究 LSTM 的结构,并揭示它实现“长期记忆”的机制。此外,我们将使用 LSTM 创建语言模型,并展示它可以在实际数据上很好地学习。
上一章RNN存在的问题
梯度爆炸与梯度消失
- 原因:
- 激活函数 tanh 的值域 (-1, 1),累积运算使得梯度的传播在逐渐衰减)
- 计算图中 MatMul (矩阵乘积) ,矩阵的最大特征值的模(是否大于1)决定了这个矩阵的特性——累积运算中对于输入信号是放大还是衰减
LSTM
一个 LSTM 单元的结构
记忆单元c_t的引入
- c_t / c_t-1:记忆单元,存储了t时刻LSTM的记忆,会在LSTM单元之间水平向右传播
- 计算路径不包括tanh或MatMul,可以有效避免梯度爆炸或者梯度消失
3个门:遗忘门、输入门、输出门
- f :遗忘门,输入的 x_t 与 h_t-1 被sigmoid函数激活
- g:h_t-1 与 x_t 向当前记忆单元添加的新信息,采用tanh函数激活
- i:输入门,判断新添信息 g 的权重意义
- o:输出门,将当前时刻的记忆单元 c_t 与通过输出门的 h_t-1 , x_t 加权求和得到隐藏状态 h_t
tanh函数值域(-1,1),用于编码信息的强弱幅度;sigmoid函数值域(0,1),用于控制输出数据的比例。
通常,门使用sigmoid,包含实际数据的信息使用tanh。
计算图
LSTM的网络架构
- 上图所示的是一个由两层LSTM层构成的RNNLM
改进
- 设置多个LSTM层
- 可以通过在层与层之间添加 Dropout 抑制过拟合
- 可以对上图的Embedding层和Affine层使用权值共享,减少参数,抑制过拟合
最终如下图:
总结
-
在简单 RNN 的学习中,存在梯度消失和梯度爆炸问题;
-
梯度裁剪对解决梯度爆炸有效,LSTM、GRU 等 Gated RNN 对解决梯度消失有效;
-
LSTM 中有 3 个门:输入门、遗忘门和输出门 ;
-
门有专门的权重,并使用 sigmoid 函数输出 0.0 ~ 1.0 的实数;
-
LSTM 的多层化、Dropout 和权重共享等技巧可以有效改进语言模型;
-
RNN 的正则化很重要,人们提出了各种基于 Dropout 的方法;
第七章 基于 RNN 生成文本
本章会介绍一种结构名为 seq2seq 的新神经网络。seq2seq 是 “(from) sequence to sequence”(从时序到时序)的意思,即将一个时序数据转换为另一个时序数据。
通过组合两个 RNN,可以轻松实现 seq2seq。seq2seq 可以应用于多个应用,比如机器翻译、聊天机器人和邮件自动回复等。
seq2seq
原理
-
Encoder-Decoder模型
-
Encoder示例:
下图是对日语“我是一只猫”的编码,输出为最终的隐藏状态h
-
Decoder示例:
- 下图是解码器对上图输出的h进行英文解码,解码器区别于译码器:LSTM层会得到一个由解码器输入的初始h
- 解码器第一个LSTM单元固定输入作为起始标识符
- 重复步骤:每个LSTM单元输出的概率分布中最大值代表的单词作为下一个LSTM的输入
改进
Reverse
- reverse输入的序列(似乎可以使梯度传播更平滑,玄学)
Peeky
- 将编码器得到的h依次与解码器输入的单词进行concat,从而输入到所有LSTM单元中
- 将编码器得到的h依次与每个LSTM输出的隐藏状态进行concat,从而输入到所有Affine单元中
自动图像描述
- 对输入的图像,生成语言描述
- 采用seq2seq结构,编码器是CNN,一维化CNN输出的特征图并输入到LSTM解码器中
总结
-
基于 RNN 的语言模型可以生成新的文本;
-
在进行文本生成时,重复【输入一个单词(字符),基于模型的输出 (概率分布)进行采样】这一过程;
-
通过组合两个 RNN,可以将一个时序数据转换为另一个时序数据(seq2seq);
-
在 seq2seq 中,编码器对输入语句进行编码,解码器接收并解码这个编码信息,获得目标输出语句;
-
反转输入语句(Reverse)和将编码信息分配给解码器的多个层(Peeky)可以有效提高 seq2seq 的精度;
-
seq2seq 可以用在机器翻译、聊天机器人和自动图像描述等各种各样的应用中;