Loading...

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,每个gateinput都是一样的vector,那么我们这边在做的时候就是每一个input乘以每个gatematrix,然后通过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 cellforget gate这里计算的结果是110,经过activate function(Sigmoid)是1,所以我们记住这个值(这里要注意,虽然这个gateforget 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 gateactivate function得到1,所以开放输出结果。因为之前memory cell里面存放的是7,所以输出7。但是要注意一点,虽然memory cell的值输出了,里面的值并没有被清空,仍然保留着,所以这个时候的memory cell还是7。


最后一个元素进入,input gate关闭,memory cell不更新,这时候,forget gateactivate function得到的是0,所以我们清空记忆,memory cell里面现在是0。output gate仍然关闭,所以没有output.


-------------------- LSTM·过程·expmale·详细·END --------------------


LSTM和以前学的神经网络有什么关系呢?

原网络


只需要将神经元替换为LSTM即可:



那时做的时候,一个简化的LSTM是:

如图中,我们输入一个原始的xtx^t,会通过四个linear transform变成四个vector,然后每个vector输入到LSTM对应的gate。这里要注意的是,转换后的z有多少个维度,那么我们就需要建立多少个LSTMcell,同时,每次进入cell训练的只是z的一个维度。


实际的运算过程: