循环神经网络RNN
序列建模
序列数据-时间
不同时间上收集到的数据,描述现象随时间变化的情况
时间序列分析是指从时间排列的数据点中抽取有价值的总结和统计信息的行为,既包含对过去数据的诊断,也包含对未来数据的预测
序列数据-文本:
由一串有序的文本组成的序列
将文本分词,然后给每个词表示成向量
主要解决的问题:
自然语言理解·
文献分类
情感分类
问答系统
分词(tokenization)
序列数据-图像
有序图像组成的序列,后一帧图像可能会受前一帧的影响
序列模型
Sequence Model: 用于处理和预测序列数据的模型
最经典的序列模型——
自回归模型
因为是x预测x自己不是预测y,所以是自回归
隐变量自回归模型
文本数据预处理
主要流程
中文文本需要用分词算法来完成分词
英文文本需要拼写检查、词干提取词形还原
去除噪声(Text Clearning)
删除文本中不相关或者无用的信息,提高文本处理的效率
停用词:英文介词、代词、连词等,中文助词、量词、词等
词元化(Tokenization)
Tokenization:把输入的文本流,切分成一个个子串
去除停用词
文本中出现频率过高或者并不具有实际意义的词
标准化(Normalization)
词干提取(stemming):抽取词的词干或词根形式
词形还原(lemmatization):把任何形式语言词汇还原为一般形式
词表(Vocabulary)
将文本中出现的所有词汇组成列表
1.遍历数据集,统计词频
2.过滤高频词和低频词,保留中间频率词
3.为每个词分配一个编号,并建立词表
高频词和低频词意义不大,我们的目的是为了提取特征
特征提取-词袋模型
Bag of Words:根据词表中单词在句子中出现次数转化为向量
对于稀疏情况不适用
而且没考虑顺序
特征提取-N-gram模型
基于概率的判别式语言模型
特征提取-词嵌入(常用)
将词表示成实数向量,可以捕捉词和词之间的语义和语法的关系,使得词之间可以通过数学方式进行比较和运算
Word Embedding 通过预测上下文的词学习词向量
word2vec
GloVe 统计词之间的共性关系
可以使用小规模数据集训练词向量模型
也可用于解决语义相似性问题和文本分类问题
实际经常组合不同方法
文本分类中通常用词嵌入表示文本特征,再用N-gram模型捕捉语序的特征
循环神经网络
神经网络可以看作拟合任何函数的黑盒子
基本思想
全连接网络结构上就没有顺序相关的这种处理模块
展开计算图
计算图是形式化一组计算结构的形式
展开(unfolding)计算图导致深度网络结构中的参数共享
网络结构
在隐藏层之间构建了循环层
网络结构
隐藏层间连接形成循环神经网络,模型由此具备了记忆能力
网络结构变体
Teacher Forcing
随时间反向传播
BPTT算法
Backpropagation Through Time将序列数据的每个时间步看作一层,然后在每个时间步上使
用标准BP算法来计算梯度。
每个隐变量都有来自后续时刻和当前时刻 输出2个方面的损失求和
有了参数梯度,就可以根据梯度下降法或其各种变体来进行迭代更新,求权重参数
每一个参数都要把各个时间步骤传过来损失的梯度进行累加
这个过程是一起进行,没办法做到时间的解耦
这也是经典循环神经网络相对难训练的原因
循环神经网络代码实现
时间序列数据预测
一半神经网络模型预测
序列数据预处理
模型训练
模型越策
RNN模型预测
RNN模型结构
数据预处理
lable从向量变成二维矩阵
构建RNN模型
训练
RNN的长期依赖问题
什么是长期依赖
当前系统的状态,可能依赖很长时间之前系统状态
长期记忆失效原因
权重矩阵连乘
当w小于1的时候,指数级衰减,h0几乎被遗忘
当大于1的时候,指数级爆炸
初始条件很小变化会导致结果不成比例严重变化,对于我们想训练一个稳定的模型不符合的
本质也是深层网络级联导致
拟改进策略:
#改激活函数
RNN中可以用ReLU函数,但不能解决梯度消失、爆炸问题
对矩阵W的初始值敏感,十分容易引发数值问题
只要w不是单位矩阵,依然会出现w的t次方的情况,和是什么样的激活函数没关系
这里和全连接神经网络梯度爆炸不同
RNN 对W权重系数矩阵初始值很敏感
RNN 不同隐层间共用相同的权值矩阵
#截断时间步
TBPTT算法:Truncated Back Propagation Through Time
依赖一个时间窗口
深度循环神经网络 Deep RNN
基本思想
能捕捉数据中更复杂模式并更好地处理长期依赖关系
深度分层模型比浅层模型更有效率
Deep RNN比传统RNN表征能力更强
如何引入深层结构?
三种深层方式
DT-RNN
DT(s)-RNN
DOT-RNN
Stacked RNN
模型比较
增加多个浅变换结构的隐藏层
实现对复杂特征更有效的捕捉和处理
双向循环神经网络 1997
单向RNN的局限:
- 多数RNN只有一个因果结构
- 许多应用中,输出预测可能依赖整个输入序列
- 往往需要捕捉序列中上下文之间的关系
双向网络结构
- 两个互相叠加的RNN
- 输出不仅取决于先前,还取决于未来
两遍运算
翻转输入,训练过程
主要特点分析
使用来自序列两端的信息来估计输出
前向传播需要在双向层中进行,反向传播依赖前向传播结果
计算速度慢,梯度求解链很长,训练代价高
主要用于序列编码和双向上下文观测统计
效果有限
门控循环单元 GRU
Gated Recurrent Unit
与LSTM的区别
1.将LSTM原来的三个门简化成为两个:重置门和更新门
2.不保留单元状态,只保留隐藏状态作为单元输出
3.重置门直接作用于前一时刻的隐藏状态
基本原理
引入了两种“门”来控制信息的流动,即重置门(reset gate)和更新门(update gate)
重置门(Reset Gate)
用来决定从上一时刻的隐藏状态中“复制”多少信息
更新门
用来决定从上一时刻的隐藏状态中“更新”多少信息
候选隐状态
用来计算当前时刻的隐藏状态
隐状态
模型在处理序列数据时记录的当前时刻之前的信息
GRU 记录了序列中上下文的信息,帮助模型更好处理序列数据
隐藏状态第一个作用记录上下文信息帮助模型更好处理序列数据,第二个控制序列流动解决梯度消失和梯度爆炸问题提高模型效率
计算步骤
GRU 的计算过程分为四个步骤:
长短期记忆网络
Long-Short Term Memory
RNN的问题:
- 处理长序列数据时会有梯度消失或爆炸的问题
- RNN的计算效率相对较低
- 长时间以前的记忆基本对现在没有什么影响了
基本思想
保留较长序列数据中重要信息,忽略不重要信息
RNN都有重复链式结构
标准RNN结构简单
LSTM链式结构特殊
门控记忆单元
门(gate)控制记忆单元,信息可以沿着这个链条传送
RNN只有底下一个链条,对短期输入很敏感
现在人为加入状态C,来保存长期记忆
怎么控制这种长期状态呢
t-1时刻传入的状态Ct-1要决定有多少信息要保留
t-1时刻传入的状态Ct-1有多少需要传递到t+1时刻
当前时刻的隐层输出ht又是什么
LSTM专门设计这种门控结构来控制信息的保留和丢弃
具体包括3个门:输入门、遗忘门、输出门
下面这条链好比短期记忆
上面这条好比日记本,保存长期记忆
决定去除哪些信息
遗忘门
0-1之间的数,越接近0代表去除,越接近1代表保留
输入门
决定什么新的信息将被保留下来
输入门和候选记忆单元联合更新状态
输出门
用于控制记忆细胞更新时所使用的输入信息
相当于用日记更新当前的短期记忆
同时保持长短期记忆,并且互相更新
某种程度上模拟大脑关注重要片段,忽略无关信息,极大拓展其应用
复杂循环神经网络代码实现
进阶循环神经网络
DRNN–更深的网络结构
BRNN-双向的训练方向
LSTM-梗直哥更强的记忆能力
GRU-更简洁而高效
模型定义
输入输出维度16,隐藏层大小64
相比前面少了64,因为少了个门
模型实验
美国道琼斯股价波动数据库
默认使用Tanh激活函数,收盘价Close数据非常大,很容易导致模型出现梯度消失或者梯度爆炸
可以修改激活函数解决
或者对数据归一化也可以进行解决 可以提高收敛速度
效果还是不行,再把学习率改小
损失函数正常了
拟合归一化后的数据
效果对比
看的绝对值,所以BRNN效果最好
编码器-解码器网络
基本思想
编码器-解码器模型:将输入数据转化成另外一种输出数据
基本思想
编码器-解码器模型:将输入数据转化成另外一种输出数据
应用广泛:机器翻译、自动摘要、文字图像自动生成
序列到序列学习
Sequence to Sequence Learning:两个循环神经网络组成
输入输出长度不一样 标准RNN不好处理
历史巧合
2014年两个团队几乎同时提出·
编码器-解码器、序列到序列·
本质都是两个RNN
编码器
把不定长的输入序列变换成定长的上下文变量
解码器
通过将上下文变量c中的信息解码生成输出序列
模型训练
最大似然估计
Seq2seq模型代码实现
模型架构
序列到序列模型简单实现
模型架构
模型训练
模型验证
因为测试集包含错误,所以结果错误挺多,如果用干净测试集效果会好点
束搜索算法
模型的输出是一个个时间步依次获得
前面的结果还会影响后面的结果
每个输出都是基于历史生成结果的条件概率
当基数大的时候,考虑遍历多个时间步构成的整个生成空间是不现实的
最容易想到的策略
贪心搜索
从词汇表V中获取条件概率最高的标记
每个实践步都选当前条件概率最大的输出
再将开始到当前步的结果作为输入去获得下一个时间步的输出,直到模型给出生成结束的标志
束搜索(对贪心搜索改进)
保留多种可能序列Beam Search:
在每个时间,不在仅保留概率最高的一个输出
而是保留beam size 多个
当为1 的时候 就退化为贪心搜索
很多情况下束搜索比贪心搜索更好
连乘可能到0溢出
改进策略
对长序列,使用log运算并增加惩罚系数
优点
高效:能同时生成多个序列·
质量高:只考虑序列中最可能元素
多样化:跟踪多个序列,而不是一个
缺点
速度慢:能同时生成多个序列
内存要求:大规模序列下有问题·
仅确定性模型可用
序列到序列最典型应用就是机器翻译
机器翻译代码实现
数据集下载
pad填充 因为输入要长度相等
unk未知字符 词表有限 对没见过token都用这个替代
序列超过48 要截断,不足要填充
模型训练
传入padding 标记,pad就不会参与计算梯度
模型训练
ignore 让pad不计算损失
模型保存
几个epoch保存一下
一来避免中间前功尽弃,二来避免训练到最后前功尽弃
模型评估
Bleu
Bilingual Evaluation Understudy
《BLEU: a Method for Automatic Evaluation of Machine Translation》
优点
计算速度快
原理容易理解
任意语言通用
实际就是计算2个句子相似程度
评价翻译质量
还有很大提升空间