时间序列的深度学习模型(RNN和LSTM)

一、RNN(循环神经网络)
Recurrent Neural Networks(RNN)用于处理序列模型的问题,是一种对序列数据建模的神经网络。

1.RNN与一般NN的不同
传统NN每个样本输入、输出之间相互独立,不能处理很多情况。比如预测句子的下一个单词是什么,需要用到之前的信息。

在这一讲中
我们将会学习处理时间序列的深度学习模型
到目前为止
我们学到的深度学习模型都是基于数据是瞬时获取这一假设
例如一张图片是可以在瞬时拍摄完成的
棋盘的状态也是可以瞬时获取的
而另外一些应用
例如语音识别
即通过声音识别文字行为识别即通过视频识别行为
却需要针对一段时间的信息进行处理后获得最终的结果
我们把这样的应用任务叫做针对时间序列
time serious的学习任务
下面我们以语音识别为例
说明针对时间序列学习任务和瞬时学习任务的区别
例如给定一个语音文件
我们要识别说的是什么
假设这个语音文件说的是三个字
大家好
但是这三个字的说法却有很多种
例如在文件一当中
我们比较短促地说出了这三个字
大家好
而在文件二中
每一个字被拖长了
大家好
在文件山中
前面一个字和后面一个字很短
而中间一个字耗费的时间很长
大家好
可以看到语音识别涉及各个音之间的对齐问题
如果我们将整个语音文件作为一个整体提取
特征
而一点儿也不管音与音之间的对齐
那么识别效果肯定是不好的
同样的道理
视频中动作行为的识别也存在类似的情况
本讲的主要内容是讲解处理上述时间序列的深度学习模型
我们主要讲两个著名的模型
第一循环神经网络
recurrent neural network
rnn和long short term memory l s t m
首先我们讲解rnn
rnn的输入状态和输出之间的关系
可以用下面的公式来描述
这是一个绕圈的设置
也就是说t时刻的状态ht是t减一时刻的状态
ht减一和t时刻的输入x t的函数
而t时刻的输出y t是t时刻的状态
ht的函数在rnn中
ht等于fw
ht减1x t
而其中fw可以用一个线性的函数
再加上tnh来设置
而yt是ht的函数
我们可以设置为一个线性的函数的格式
我们也可以把这个绕圈的图展开成为这幅图
可以看到从第一个状态h0 开始
根据f or ega和输入x1
我们可以获得h1
然后从h一开始
根据f ma和输入x2
我们可以获得h2
以此类推
直到获得大t时刻的状态h大t为止
同时根据每一个状态ht
我们可以得到输出y t这样一个简单的rnn模型
能够解决很多基于时间序列的问题
我在这里把这些问题归纳总结为三类
第一类问题
多个输入和多个输出
其典型的应用如大词汇量的语音识别
如图所示
提取的特征
我们可以用mfcc来提取特征
而输出yi是这一小段语音对应的因素的标签
如图中yi上面的标注
需要强调的是
实际的语音识别当中
我们不是基于字来划分因素
因为字作为因素来说时间太长且种类繁多
相反我们是将每一个字拆成更小的因素
例如大可以拆成两个因素的和a家可以拆为两个因素
就和a好可以拆为和和二这两个因素
当我们识别出这些很小的因素过后
再根据语言模型language model获得最终的结果
在这幅图中
为了表达方便
我们以字作为因素来讲解给大家
在2013年hinton等人的文章中
利用rnn进行吹风的识别
在t i m i t数据集上获得了比传统的隐含马尔可夫过程
更高的识别率
另外还有其他基于多个输入和输出的rnn的应用
例如机器翻译
我们可以输入是一种文字
而输出是另一种文字
rnn的第二类问题是多个输入和一个输出的问题
如图所示
输入是x一到x大t
而只在最后大题时刻输出y典型的应用包括行为和动作的识别
单词量有限的语音识别等等
例如在动作识别中输入一段视频
那么x一到x大t可以代表视频的每一帧提取到的特征
而最后输出y代表这段视频的动作标签
rnn应用的第三类问题是一个输入和多个输出的问题
在这里输入只有一个x
而输出是y一到y大t典型的应用包含文本生成
text generation
图像注释
image captioning等等
在2014年
有人以莎士比亚的剧本作为训练样本
做出了深成莎士比亚风格文字的rnn
这种想法很直接
如图所示
在训练阶段
输入是字符
输出是下一个字符
字符包含字母空格和标点符号
而在测试阶段
我们只需要随机的输入一个字符
接下来让rnn自动的输出后续的字符
以此类推
这样就完成了文本的生成
这里是训练的结果
可以看到随着训练次数的增加
rnn逐渐地学会了莎士比亚的风格
能够写出带有莎士比亚风格的句子了
我们也可以用中文来做类似的实验
例如利用一些中文的古诗词进行训练
我们最终可以让rnn写出新的中文古体诗
一个输入和多个输出的第二个例子是图像注释
在2014年
这篇论文将rnn用于图像注释
image captioning
图像注释要解决的问题是输入一幅图像
输出是描述这幅图像的文字
在这篇文章当中
利用rnn做图像注释的流程非常简单
但是他却可以获得非常不错的
比传统方法更好的效果
在训练阶段将图像通过已经训练好的cnn网络
例如alex l
这样就会获得一个特征向量
将这个特征作为状态h0 输入进rnn中
接下来再将每一个训练样本中人工写出的单词作为rnn的输入
而输出是它的下一个单词
当然句子的开始start和结束end
用专门的符号来输入
而在测试阶段
将测试的图片通过同样的cnn网络获得特征作为输入状态h0
然后将start符号作为x一输入到rnn当中
接下来将会依次产生输出的单词
直到产生n的符号后结束
这里给出了一些测试的例子
可以看到在这些图片上对这些图片生成的描述是很准确的
当然也有一些描述不准确的例子
接下来我们从理论层面讲一下rnn网络的训练过程
他的训练方式很简单
可以将rnn沿时间轴展开如下
前项计算后
将每一个时刻t的north加到一起
作为总的目标函数
逐级求导更新参数
但是由于很多时候时间轴很长
这样做会导致计算量大
实际的训练过程中
采用折中的方式
如图所示
大t时刻的误差不回传到h0
而只回传到ht减10s reshold这样一小段时间轴
这样就降低了计算量的同时
也保证了训练的效果
rnn存在的不足之处在于状态之间的转移函数
以及状态到输出的转移函数都过于简单
回顾一下状态之间的转移函数是线性函数加t i n h
而状态到输出的转移函数就是线性函数
由于这样过于简单的转移函数
导致网络的表现力不够
难以学习到复杂的状态与输入输出之间的对应关系
因此有人提出了利用多层神经网络来模拟这些转移函数
如图所示
但是这样做导致的结果是需要训练的参数过多
难以收敛
模型的表现力和复杂性之间的权衡取舍总是困难的问题
在rnn领域
基于这两者的权衡取舍
孕育了一个有影响力的工作
l s t m non short term memory
在l s t m中输入x t和输出y t由上面这些复杂的关系是获得
而我们可以把上面关系之中
mtt和ct通道看成是状态h据说tm的发明者是去md
uber是基于人类的记忆机制获得灵感
设计了这样一套记忆和忘却相互交织的流程
尽管欠缺直观的道理
但基于lstm的rnn表现得很好
因此成为了越来越多的研究者普遍采用的模型
本讲中我们讲解了利用rnn和lstm处理时间序列的基本原理及方法
留一道思考题给大家
请你举出一些可能用到rnn的实际应用问题
并思考一下rnn是解决这些问题的合适的模型吗
本讲就到这里
谢谢同学们

发表评论

邮箱地址不会被公开。 必填项已用*标注