文章目录
前言
监督学习先放一下,先来学习RNN,本节课先从一个订票系统实例出发,得到前馈神经网络在相同输入只能相同输出的缺点,引入了RNN来解决这个问题。
接下来讲解了RNN常见的几种结构,尤其重点讲解了LSTM,并给出了LSTM计算实例。
公式输入请参考:在线Latex公式
实例应用引入
实例论文
slot不知道怎么翻译,卡槽,槽位?
比如在一个订票系统上,我们的输入 “I would like to arrive Taipei on November ” 这样一句话(序列),我们设置几个槽位(Slot),希望算法能够将关键词’Taipei’放入目的地(Destination)槽位,将November和2nd放入到达时间(Time of Arrival)槽位,将其他词语放入其他(Other)槽位,实现对输入序列的一个归类,以便后续提取相应信息。能否用前馈神经网络(Feedforward Neural Network)来解决这个问题?
向量化
我们首先要对输入序列向量化,将每一个输入的单词用向量表示,可以使用 One-of-N Encoding 或者是 Word hashing 等编码方法,输出预测槽位的概率分布。
这个在读DEEP LEARNING REVIEW笔记一文中有写。
还有一种改进方法:Beyond 1-of-N encoding
1-of-N encoding中有很多词可能都没有见过,没有在词典里面,这个时候就可以放到Other这个dimension里面。
例如:“Gandalf” 甘道夫,“Sauron”索伦不在词典中,被分到other中。
也可以用词汇的数组来表示,这样就不会出现word不在词典中里面。例如“apple”里面有“app”、“ppl”、“ple”,这三个dimension是1,其他的是0。
前馈训练结果缺点
把词汇表示为vector之后,就可以把句子丢到上面那个前馈神经网络里面去。
但是这样做的话,有个问题就出现了。如果现在又有一个输入是 “Leave Taipei on November ”,这里Taipei是作为一个出发地(Place of Departure),所以我们应当是把Taipei放入Departure槽位而不是Destination 槽位,但对于前馈网络来说,对于同一个输入,输出的概率分布应该也是一样的,不可能出现既是Destination的概率最高又是Departure的概率最高。
所以我们就希望能够让神经网络拥有“记忆”的能力,能够根据之前的信息(在这个例子中是Arrive或Leave),相同的输入,得到不同的输出。将两段序列中的Taipei分别归入Destionation槽位和Departure槽位。这种有记忆的神经网络就是RNN。
RNN结构及小实例
RNN结构
先来看RNN的结构以及解决上面订票的问题的过程。
其中蓝色方框就是用于存储的隐藏层的输出的单元。下一次计算的时候,除了考虑和之外,还需要考虑和。
RNN小实例
假设有如下的神经网络结构,而且所有的权重都为1,没有bias,所有的**函数都为线性的。
假设输入是一个sequence:
1、在计算之前,先初始化,假设、都为0,和都为1。
2、接下来绿色神经元的output为2和2,同时将输出存到、,即、都等于2,然后,红色神经元的output为4和4。即整个神经网络的输出是:
3、第二次计算如下图所示:
这个时候绿色神经元不但接收和、还接收和的值,所以从图中可以看出来每个绿色神经元的输出等于+++=2+2+1+1=6,同时会把绿色的输出存到和中
整个神经网络的输出:
这个时候可以看到即使相同的输入,他的输出也是不一样的。
4、接下来的输入是结果如图:
可以看出来如果改变输入的sequence,输出是会变化的。
RNN解决Slot Filling问题
根据刚才的小例子,注意的是,下面不是三个神经网络,而是同一个神经网络,老师非常贴心的相同的结构都是对应相同颜色。
考虑不同的输入,结果如下:
RNN的深度问题
上面的例子中的RNN只有一层隐藏层,如果要加深度是增加绿色部分就可以:
RNN的常见变种
Elman Network
Jordan Network
可以看到Jordan network存的不算隐藏层的输出,而是整个网络的输出,论文控给出了大概结论:Jordan network的效果好,因为在Elman network中隐藏层是很难控制的,没有办法决定它学到什么样的information;在Jordan network中y是有target的,比较清楚中间存放的是什么东西
Bidirectional RNN
之前只有一个方向的RNN在产生的时候,只看过到的输入;而Bidirectional RNN不但看过到的输入,还看了句尾一直到的输入。
To determine yi, you have to consider a lot ……
You should see the whole sequence
LSTM( Long Short-term Memory)
Normal neuron: 1 input, 1 output
This one: 4 input, 1 output
当外界信息想要写入Memory Cell必须先经过Input gate,input gate打开的时候才能把值写入Memory Cell,input gate打开还是关闭状态是RNN自己学的。同样原理还有Forget Gate,Ourput Gate。
PS:冷知识,Long Short-term的-要放在short和term之间,因为从原理上看,整个Memory还是短期的,只不过整个这个短期Memory比较长(只要你的Forget gate不format Memory cell里面的值都会一直保留)。
在上图中,、都是scalar,三个门使用的**函数通常是sigmoid函数,因此输出的范围为0到1,代表门打开的程度,1是打开,0是关闭。上图中的Memory Cell中本来是,后来经过右边公式操作后变成。注意:Forget Gate打开的时候表示记得,关闭代表忘记。
LSTM实例
输入是三维vector,输出是一维vector ,神经网络中只有一个LSTM的CELL。
当输入中的,的值就会被累加写到Memory中;
当输入中的,Memory中的值就会reset;
当输入中的,output gate才会打开,才输出Memory中的内容
注意:第一次出现(蓝色框),就把当前写入下一个时间点的memory中;
第二次出现,,就把当前和累加,变成;
第一次出现(紫色框),就把下一个时间点的memory清空;
当出现(绿色框),就把memory里面的值输出。
输入要乘以权重加上bias才是输出,权重本来是应该用GD学习得来,现在暂且当做已知条件(蓝色数字)。
存在memory的初始值为0
下面开始输入第一组r,即右下角第一组
输入部分:通过线性**函数g得到3
Input Gate:通过sigmoid函数约等于1,Input Gate打开,输入的3往下走
Forget Gate:通过sigmoid函数约等于1,Forget Gate打开,memory记录3,然后经过线性**函数f得到3
Output Gate:通过sigmoid函数约等于0,Output Gate关闭,输出y为0。
同理,下面开始输入第二组r,即右下角第二组
与第一次不一样的地方是Forget Gate把传过来的4累加到memory中变成了7。
第三组输入
第四组输入
第四组输入
这里Forget Gate计算后的值为-90,经过sigoid后变0,Forget Gate会关闭,并清空memory中的值。
普通NN变身LSTM过程
假设现在有这样一个神经网络:
变身为LSTM只要Simply replace the neurons with LSTM,就变成:
可以看出来LSTM的参数是普通NN参数的4倍。
LSTM与RNN啥关系
上面的图貌似看不出来LSTM是RNN,现在整理一下:
假设我们有一整排的LSTM神经元,他们每个memory cell里面都存了一个值scalar。把这些scalar连起来,可以写成,现在在时间点输入一个vector:,
这个会先乘上一个matrix,做linear的transfor,变成vector:,它的dimension对应的是每一个LSTM神经元输入,所以这个dimension的大小等于LSTM神经元的数量;
这个会先乘上一个matrix,做linear的transfor,变成vector:,它的dimension的大小等于LSTM神经元的数量,对应于LSTM神经元的input gate;
同理对应于LSTM神经元的forget gate;
同理对应于LSTM神经元的output gate;
整个计算过程可以表示为下图:
到时间点的LSTM计算如下图:
这里比上面的图要多了两个东西,输入的地方除了之外,还会接入上一个LSTM神经元隐藏层的输出,还会把memory cell中的值(红色箭头表示,这个叫peephole),也就是说输入的东西由三个vector并在一起,乘上不同的transfor,操控不同的gate。
上面是单层LSTM,下面多层LSTM感受一下。。。
老师表示看不懂没关系,会调包就可以。