鸣谢&参考:
- ChristopherOlah的博⽂《理解LSTM⽹络》
- @Not_GOD翻译ChristopherOlah的博⽂《理解LSTM⽹络》
- 通过⼀张张动图形象的理解LSTM
- 如何理解LSTM⽹络(超经典的ChristopherOlah的博⽂之July注解版)
- LSTM相关的典型⾯试题_七月在线
- @知乎何之源_完全图解RNN、RNN变体、Seq2Seq、Attention机制
- 七月在线面试题库
1. RNN是怎么从单层网络⼀一步⼀一步构造的?
1.1从单层网络谈起
在学习RNN之前,⾸先要了解⼀下最基本的单层⽹络,它的结构如图:
输⼊是x,经过变换Wx+b和激活函数f得到输出y。
1.2 经典的RNN结构
在实际应⽤中,我们还会遇到很多序列形的数据:
如:
1.⾃然语⾔处理问题。x1可以看做是第⼀个单词,x2可以看做是第⼆个单词,依次类推。
2.语⾳处理。此时,x1、x2、x3……是每帧的声⾳信号。
3.时间序列问题。例如每天的股票价格等等。
为了建模序列问题,RNN引⼊了隐状态h(hidden state)的概念,h可以对序列形的数据提取特征,接着再转换为输出。先从h1的计算开始看:
图⽰中记号的含义是:
a)圆圈或⽅块表⽰的是向量。
b)⼀个箭头就表⽰对该向量做⼀次变换。如上图中h0和x1分别有⼀个箭头连接,就表⽰对h0和x1各 做了⼀次变换。
在很多论⽂中也会出现类似的记号,初学的时候很容易搞乱,但只要把握住以上两点,就可以⽐ 较轻松地理解图⽰背后的含义。h2的计算和h1类似。要注意的是,在计算时,每⼀步使⽤的参数U、 W、b都是⼀样的,也就是说每个步骤的参数都是共享的,这是RNN的重要特点,⼀定要牢记。
依次计算剩下来的(使⽤相同的参数U、W、b)
我们这⾥为了⽅便起见,只画出序列长度为4的情况,实际上,这个计算过程可以⽆限地持续下 去。
我们⽬前的RNN还没有输出,得到输出值的⽅法就是直接通过h进⾏计算:
正如之前所说,⼀个箭头就表⽰对对应的向量做⼀次类似于f(Wx+b)的变换,这⾥的这个箭头就表 ⽰对h1进⾏⼀次变换,得到输出y1。
剩下的输出类似进⾏(使⽤和y1同样的参数V和c):
OK!⼤功告成!这就是最经典的RNN结构,我们像搭积⽊⼀样把它搭好了。它的输⼊是x1, x2, …xn,输出为y1, y2, …yn,也就是说,输⼊和输出序列必须要是等长的。
由于这个限制的存 在,经典RNN的适⽤范围⽐较⼩,但也有⼀些问题适合⽤经典的RNN结构建模,如:
1.计算视频中每⼀帧的分类标签。因为要对每⼀帧进⾏计算,因此输⼊和输出序列等长。
2.输⼊为字符,输出为下⼀个字符的概率。这就是著名的Char RNN
1.3 N --> 1
有的时候,我们要处理的问题输⼊是⼀个序列,输出是⼀个单独的值⽽不是序列,应该怎样建模 呢?实际上,我们只在最后⼀个h上进⾏输出变换就可以了:
这种结构通常⽤来处理序列分类问题。如输⼊⼀段⽂字判别它所属的类别,输⼊⼀个句⼦判断其 情感倾向,输⼊⼀段视频并判断它的类别等等。
1.4 1 --> N
这种1 --> N的结构可以处理的问题有:
1.从图像⽣成⽂字(image caption),此时输⼊的X就是图像的特征,⽽输出的y序列就是⼀段句⼦.
2.从类别⽣成语⾳或⾳乐等 .
1.4 N --> M
下⾯我们来介绍RNN最重要的⼀个变种:N vs M。这种结构又叫Encoder-Decoder模型,也可以称 之为Seq2Seq模型。
原始的N vs N RNN要求序列等长,然⽽我们遇到的⼤部分问题序列都是不等长的,如机器翻译 中,源语⾔和⽬标语⾔的句⼦往往并没有相同的长度。为此,Encoder-Decoder结构先将输⼊数据编码 成⼀个上下⽂向量c:
得到c有多种⽅式,最简单的⽅法就是把Encoder的最后⼀个隐状态赋值给c,还可以对最后的隐状 态做⼀个变换得到c,也可以对所有的隐状态做变换。
拿到c之后,就⽤另⼀个RNN⽹络对其进⾏解 码,这部分RNN⽹络被称为Decoder。具体做法就是将c当做之前