1.应用实例(为什么需要RNN?)
槽位填充问题:
通过Feedforward网络解决槽位填充问题?
我们有两个句子:
- “arrive Taipei on November 2nd”
- “leave Taipei on November 2nd”
我们可以发现在第一个句子中,Taipei是destination,而第二个句子中Taipei是departure。
如果我们不去考虑Taipei前一个词的话,Taipei的vector只有一个,那么同样的vector进来吐出的predict就是一致的。所以我们在做的时候就需要把前一个的结果存起来,在下一个词进来的时候用了参考。所以这样我们就在neuron中设计一个hidden layer来存储这个值,如下图中a1,a2所示,相当于让神经网络拥有记忆能力
2.RNN的基本概念
假设我们每个weight都是1,bias=0,每个activation都是linear的。
那么我们现在有一个序列(1,1),(1,1),(2,2),那么一开始memory里面的值是(a1=0,a2=0),现在将序列第一个值传入network,我们得到(x1=1,x2=1),因为active function都是linear的,所以经过第一个hidden layer,我们输出的就是1×a1+1×a2+1×x1+1×x2,其中a1=a2=0,两个节点一致。
所以第一个hidden layer得到(2,2)(绿色方块所示),同时我们将(2,2)保存起来,更新一下得到(a1=2,a2=2),output layer是(4,4),所以得到第一个(y1=4,y2=4)。第二个input (1,1),同样计算一下,hidden layer得到的是(6,6)和(a1=6,a2=6),output layer是(12,12)。同理第三个input最后得到的output是(32,32),所最后得到的三个output序列是(4,4),(12,12),(32,32)。以此类推。
思考:那么我们可以想一下,如果现在的序列顺序变化一下,结果是否会不一致?如果现在的序列是(1,1),(2,2),(1,1),我们得到的是(4,4),(16,16),(36,36)。结果发生了变化。所以RNN对序列是敏感的,这样的特性就表示,在slot filling的task里面,我们前面的arrive和leave将会影响后面接着的Taipei的结果。
深度RNN:
艾尔曼(Elman)网络和约旦(Jordan)网络(有更好的表现):
双向RNN:
3.Long Short-term Memory (LSTM)
仔细来看,LSTM形式如下:
C表示Memory中存储的原始值,C’表示新的存储值。
可以看到,一个output受到三个gate的影响:
- input gate决定一个input是否可以进入memory cell
- forget gate决定是否要忘记之前的memory
- output gate决定最后是否可以输出。这样一个非常复杂的neuron
-------------------- LSTM·过程·expmale·BEGIN --------------------
那么实作上这个neuron是如何工作的呢?假设我们现在有一个最简单的LSTM,每个gate的input都是一样的vector,那么我们这边在做的时候就是每一个input乘以每个gate的matrix,然后通过active function进行计算。这里做一个最简单的人肉LSTM。假设我们有一个序列是:
假设:
- 当x2=1的时候,我们将x1加入memory中
- 当x2=−1的时候,memory重置为0
- 当x3=1的时候,我们输出结果
-------------------- LSTM·过程·expmale·END --------------------
-------------------- LSTM·过程·expmale·详细·BEGIN --------------------
现在,将第一个元素放进来,我们得到是3,input gate部分的结果是90,经过activate function得到的是1,所以允许通过进入memory cell。forget gate这里计算的结果是110,经过activate function(Sigmoid)是1,所以我们记住这个值(这里要注意,虽然这个gate叫forget gate,但是当取值是1的时候其实是记住,0的时候是遗忘)。然后到output gate这里,output gate计算是-10,activate function输出是0,所以我们不output结果。
输入下一个元素(4,1,0)。直接输入计算是4,经过input gate,得到的是4。因为原来memory cell里面已经存了3,所以这一轮的计算是原来的memory加上新进入的4,得到7。然后output gate依然关闭,所以memory cell还是存7。
第三个元素类似的计算,发现input gate关闭,所以没法进入memory cell,因此memory cell没有更新。同时output gate关闭,没有输出。
第四个元素进入,input gate关闭,memory cell不更新,但是这时候output gate的activate function得到1,所以开放输出结果。因为之前memory cell里面存放的是7,所以输出7。但是要注意一点,虽然memory cell的值输出了,里面的值并没有被清空,仍然保留着,所以这个时候的memory cell还是7。
最后一个元素进入,input gate关闭,memory cell不更新,这时候,forget gate的activate function得到的是0,所以我们清空记忆,memory cell里面现在是0。output gate仍然关闭,所以没有output.
-------------------- LSTM·过程·expmale·详细·END --------------------
LSTM和以前学的神经网络有什么关系呢?
原网络:
只需要将神经元替换为LSTM即可:
那时做的时候,一个简化的LSTM是:
如图中,我们输入一个原始的,会通过四个linear transform变成四个vector,然后每个vector输入到LSTM对应的gate。这里要注意的是,转换后的z有多少个维度,那么我们就需要建立多少个LSTM的cell,同时,每次进入cell训练的只是z的一个维度。
实际的运算过程: