- RNN(Recurrent neural network,循环神经网络) 把所有的信息都记住,不管是有用的还是没用的. - LSTM 设计一个记忆细胞,具有选择性记忆的功能,可以选择记忆重要的信息,过滤掉噪声信息,减轻记忆负担.
RNN
每一次hidden layer
里面的neuron产生output的时候,这个output都会存储到memory
里面,当下一次有input的时候,hidden layer的neuron不只会考虑input的和,还会考虑存储在memory中的值.
例:
假设上图中的network,其所有weight都为1,所有的neuron都没有任何bias值,假设所有的activation function都是linear的.现假设input是一个sequence,即input是[1 1],[1 1],[2 2],将这个sequence input到这个RNN中去,在使用RNN的时候要给memory赋初始值,在此题中,假设在还没有放进任何东西之前,给memory的起始值为0.
输入第一个sequence[1 1]
此时对于neuron来说,不只接到了来自input的[1 1],而且还接到了来自memory的[0 0],因为所有的weight都是1,所以此时neuron的output都是2,接下来因为所有的weight都是1,所以两个红色的neuron的output都是4.
即input是[1 1]时,output是[4 4].
接下来RNN会将两个绿色的neuron的output存储到memory中去,所以memory中的值就会更新成[2 2].
第二次输入[1 1]
这时绿色的neuron的输入有四个,[1 1]和memory的[2 2],由于weight都是1,所以此时neuron的输出是2+2+1+1=6,红色的neuron的输出是6+6=12,所以当第二次输入[1 1]时,输出就是[12 12].
绿色的neuron再将[6 6]存储到memory中,将原先的[2 2]洗掉.
第三次输入sequence[2 2]
它考虑四个input,2 2 6 6,绿色neuron的output为2+2+6+6=16,红色neuron的output为16+16=32,
由上述例题可以看出,RNN不会单独考虑input,也就是说会考虑input的order,在改变了input的sequence顺序之后,output也会改变.
RNN的架构是可以自己设计的,也就是说,可以设计很多个hidden layer.丢入一个以后,它可以通过第一个hidden layer,然后通过第二个hiden layer,以此类推,通过所有的hidden layer之后才得到最后的output.每一个hidden layer都会被存在memory里面,在下一个时间点的时候,每一个hidden layer会再把前一个时间点存在memory的值读取出来,最后的到最后的output.
上述的这种将hidden layer的值存起来,然后在下一个时间点在读取出来的network,叫做Elman Network,还有一种叫做Jordan Network 【待补充】
Bidirectional RNN(双向RNN)
RNN可以是双向的.上面的这种RNN,input一句话,它就是从句首一直读到句尾.假设句子里面每一个单词我们都用来表示的话,它就是先读,再读,再读.但这个过程是可以反过来的,它可以先读,再读!,再读. 可以同时训练两个RNN,一个正向,一个逆向,然后将这两个RNN的hidden layer拿出来,都接给一个output layer,的到最后的y.
.
可以同时训练两个RNN,一个正向,一个逆向,然后将这两个RNN的hidden layer拿出来,都接给一个output layer,的到最后的y.
Long Short-term Memory(LSTM)
上述的memory是最简单的一个版本,因为我们随时都可以把值写入到memory,又随时可以将值读出来,现在比较常用的memory是被称为Long Short-term的memory.
LSTM有三个gate,当neural的某个output想要被写入到memory cell里面的时候,必须先经过一扇门(input gate),只有当input gate打开之后才能将值写入到memory cell,当input gate关闭的时候,其他neural就无法将值写进去.input gate什么时候打开、什么时候关闭是由network自己学习得到的.
输出的地方也有一扇门(output gate),output gate决定外界其他的neuron可不可以从memory中将数据读取出来.output gate什么时候打开、什么时候关闭是由network自己学习得到的.
第三个gate,叫做forget gate,forget gate决定memory什么时候将过去记录的东西忘掉,或是什么时候将记录的东西format掉.forget gate什么时候将存在memory的信息format掉是由network自己学习得到的.
整个LSTM可以看成有四个input、一个output.这四个input分别是:①想要被存到memory里的值 ②操控input gate的信号 ③操控output gate的信号 ④操控forget gate的信号.
LSTM最重要的是这个传输带,记为向量,过去的信息通过传输带直接送到下一个时刻,不会发生太大的变化,LSTM就是通过传输带来避免梯度消失的问题。
LSTM中有很多gates来让信息有选择地通过。
先来看一下forget gate。
遗忘门有一个sigmoid函数和elementwise multiplication两部分组成,输入sigmoid的为向量a,通过sigmoid函数将向量a中的每一个元素压到0~1之间,例子:
sigmoid的输入与输出向量的维度是相同的。
计算出向量f之后,计算传输带向量c和f的elementwise multiplication,是这样计算的:
遗忘门f有选择地让传送带c的值通过,如上图中,遗忘门向量中有一个元素为
0,那么c对应的元素则不能通过,对应的输出则是0;假如对应的一个元素为1,则c对应的元素则全部通过。
遗忘门f具体计算:
上一个状态的与当前输入,将与做一个拼接,得到一个更高的向量,计算矩阵与这个拼接向量的乘积,得到一个向量,在对这个向量运用sogmoid函数,得到一个向量,的每一个元素都是介于0~1之间,遗忘门的参数矩阵需要通过反向传播从训练数据里学习。
输入门:
在这张结构图里,输入门依赖于旧的状态向量和新的输入。 输入门的计算类似于遗忘门。除此之外还需要计算一个新的值。是个向量,计算与遗忘门和输入门很像。其计算如下:
区别是激活函数不是sigmoid而是tanh双曲正切函数,所以算出的的元素都介于-1~1之间,
更新传输带c。 现在我们已经知道,输入以及new values ,我们还知道传输带旧的值,现在可以更新传输带c了。如下图:
这样就完成了传送带的更新,用遗忘门删除了传送带的一些信息。
最后一步是计算LSTM的输出,即状态向量。 计算方法如下: 先计算输出门,
然后计算状态向量,
从上图可以看出有两份copies,一份传输给下一步,一份成为LSTM的输出。
计算LSTM的参数数量。
LSTM的四个模块:遗忘门、输入门、new value、输出门,这四个模块都有其各自的参数矩阵w,所以已拥有四个参数矩阵。矩阵的行数是h的维度,列数是h的维度+x的维度,所以LSTM参数的数量是4 x h的维度 x (h的维度 + x的维度)
例题
假设g和h都是linear的,存在memory里面的初始值为0.
memory cell有四个input,这四个input都是scalar,这四个scalar的产生方式为:input的三维的vector,,,分别乘以对应linear的transform,然后加上最后的bias,以[3 1 0]为例,
想要被存到memory的值: * 1 + * 0 + * 0 + bias = 3x1+1x0+0x0+0=4;input gate:3 * 0 + 1 * 100 + 0 * 0 -10 = 90,经过sigmoid的activation function以后,它的值会接近1,代表它是打开的(如果的值为0,在经过运算再加上bias之后,所得到的值为-10,这时再经过sigmoid的activation function以后,其值会接近0,代表它是被关闭的,此时对应的scalar无法进入).
| vector | input | input gate | forget gate | memory | output gate | y |
|---|---|---|---|---|---|---|
| [3 1 0] | 3 | 1 | 1 | 3 | 0 | 0 |
| [4 1 0] | 4 | 1 | 1 | 7 | 0 | 0 |
| [2 0 0] | 2 | 0 | 1 | 7 | 0 | 0 |
| [1 0 1] | 1 | 0 | 1 | 7 | 1 | 7 |
| [3 -1 0] | 3 | 0 | 0 | 0 | 0 | 0 |
LSTM与RNN的关系
每一个LSTM都有一个memory cell,每一个cell里面都存了一个值(scalar),把这些scalar接起来,就变成了一个vector(向量),写成,可以理解为每一个cell里面的值,都是vector的一个dimension(维度).
在时间点t,input一个vector,,这个vector会先乘上一个linear的transform,乘上一个matrix(矩阵),变成另外一个vector ,的dimension就是LSTM memory cell的数目,z的第一维就丢给第一个cell,第二维就丢给了第二个cell,以此类推;
会再乘上另外一个transform得到,的dimension也跟cell的数目一样,的每一个dimension都会去操控一个memory,所以的第一维去操控第一个cell的input gate,第二维去操控第二个cell的input gate......
~ forget gate
~ output gate
,,,,是四个vector,input的值是每一个vector的一个dimension,也就是说input的值是不一样的.但所有的cell是可以共同一起被运算的.
要乘上经过activation function后的值,经过activation function之后得到的值与之前存在cell里面的值相乘,然后把这两个值加起来(这时所得到的和,就是在这次运算中要被存入到cell里面的值),经过activation function之后与之前的和相乘,得到最后的y. 上述的LSTM是较简单的一个版本
下面是一个相对标准的LSTM
为什么要把RNN换成LSTM
LSTM可以解决梯度爆炸和梯度消失的问题.
那为什么可以解决呢?
RNN和LSTM在面对cell的时候,处理的操作是不一样的.
在RNN中,每一个时间点,memory中的信息都会被洗掉,每一个时间点,neuron的output都会被放到memory中去,所以在每一个时间点,memory之前存储的信息都会被覆盖掉;
但在LSTM中是不一样的.它会把原来memory中的值乘上一个值,再加上input的值,放到cell内,所以它的memory和input是相加的.所以LSTM与RNN不同的是,如果weight产生了影响,则这个影响是一直存在的(除非forget gate打开,决定把memory洗掉),不像RNN在每一个时间点的值都会被覆盖掉,只要值一被覆盖掉,这个影响就消失了.
Keras
Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化 。
Keras支持三种RNN,分别是LSTM、GRU(LSTM稍微简化的一个版本,只有两个gate,但是表现跟LSTM差不多,而且少了1/3的参数)、SimpleRNN.
GRU
由于GRU相较于LSTM的gate更少(GRU只有两个gate),所以在训练的时候是比较robust的.所以在训练的时候,觉得overfitting(过拟合)的情况很严重,可以尝试一下GRU.
GRU的"精神"讲的直白点就是"旧的不去,新的不来",它会将input gate与forget gate联动起来,也就是说,当input gate打开的时候,forget gate就会自动打开并format掉存储在cell中的值,当forget gate没有要format的值的时候,input gate就会被关起来.也就是说只有把memory中的值清掉之后才可以把新的值存进来.
还有一些技术也可以解决梯度消失的问题
比方说Clockwise RNN或是SCRNN(Structurally Constrained Recurrent Network)
Embedding Layer
Slot Filling