首先来看个例子,加入我们有句话,需要提取出两个slot(可以看做特征吧),一个是目的地,一个是到达时间,比如上面这句话,目的地是Taipei,达到时间是November 2 n d 2^{nd} 2nd 。我们把这句话输入到一个普通的神经网络,我们希望他能将这两个slot输出:
神经网络只能接受数字呀,所以我们得把单词转化成向量,比如可以用类似one-hot的这种:
也可以用另外的,都是编码的方法,就不多做介绍了:
我们希望输如台北的时候,它是目的概率越大越好,但是貌似普通的神经网络遇到下面这种情况就无法很好工作了,比如两个句子,一个是到达,一个是离开,每个词都做了编码,比如目的地,时间,还有其他的单词,这里Taipei的特征应该是不同的,但是对于这种神经网络来说,你给它的输入是一样的,它就给你相同的输出,这样第二句话也会把Taipei认为是目的地,其实是出发地。也就是说,要么都是目的地,要么都是出发地,没办法让他一会儿出发地,一会儿目的地:
那怎么解决这个问题呢,我们人类当然知道啦,看上下文嘛,前面不是有个词,arrvie和leave嘛。是呀,我们能看到,但是神经网路看不到呀,他又不会去前面看看是什么词,所以我们想到要给他加点记忆,让他能记住前面的词,可能会影响后面的判断,于是就提出了让神经网路有记忆。于是就提出了RNN。
上图就是简单的RNN,我们将中间层的输出保存下来,作为下一个输入的一部分,这样前面的输入就可以对后面的输出造成影响啦。举个简单的例子:
我们的输入序列如图,w=1,b=0,激活函数为线性的,可以看到输入为[1,1]的时候记忆区的数据为0,隐藏层输出为[2,2],最后输出为[4,4].我们继续:
前一次输入后,隐藏层的结果[2,2]被保存到了记忆区里,这次又是输入[1,1],但是此时记忆区有非0数据,也当作输入的一部分,新的隐藏层结果为[6,6],输出为[12,12],可以看到,相同的输入产生了不同的结果。我们继续:
前一次输入后,隐藏层的结果[6,6]被保存到了记忆区里,这次是输入[2,2],此时记忆区有非0数据,也当作输入的一部分,新的隐藏层结果为[16,16],输出为[32,32].当然如果你把上面输入顺序换了,输出的结果是不同的,如果是 [ 2 , 2 ] , [ 1 , 1 ] , [ 1 , 1 ] [2,2],[1,1],[1,1] [2,2],[1,1],[1,1]那结果应该是[8,8],[20,20],[44,44].其实就是这样把隐藏层的输入接到下一个输入上,不停循环,就是循环神经网络RNN。
上图就是同一个神经网络在不同的时间点被循环使用了。如此一来,判断Taipei应该是哪个特征的时候就会根据前一个单词来做出选择,因为前面是arrive,所以Taipei大概率是目的地。所以输入同个词,输出不同的结果就可以实现啦:
上面只是2次循环,当然可以有很多次循环啦,即是深层RNN啦:
当然RNN里的网络架构也有不同,比如一种是隐藏层当做记忆,一种是输出当做记忆:
还有一种是双向的,也就是上下文啦,比如你要做英语完形填空可能需要吧。
LSTM就是长一点的短期记忆,前面介绍的简单的那种,基本就是保存了上一个时间的记忆,可能马上又被替换成新的了,LSTM是可以根据需要保存了时间稍微长一点的。当然最简单的RNN也可能出现梯度消失和梯度爆炸问题,最开始的记忆因为前向传播被乘以N个权重,反向传播链式法则最后传到前面的梯度可能是很小,也可能很大。LSTM的一个模块包括4个输入,1个输出,1个记忆单元。
4个输入为:
输入,此刻输入的单词
输入门,控制是否要使用输入
遗忘门,控制是否要把以前的记忆给抹去
输出门,控制是否将结果输出
具体结构为:
所有控制门都会进过sigmoid激活函数,以便于输出0或者1,乘以相应的输入,就可以进行控制。
简单的来说就是,我有个输入x,要跟输入门相乘,输入门是1,就让我通过了,输入时0,就是不通过。通过了后到了记忆单元,记忆单元首先会根据将老记忆c跟遗忘门的输入相乘,也是一样,遗忘门是1,那记忆保留了,遗忘门是0,记忆丢失。将输入与老记忆相加起来,作为新的记忆=输入+老记忆。然后通过激活函数走到输出的关口,输出关口做的事也一样,输出关口是1,就输出新值,否则就输出0。
当然事实上也不都是0,1,0到1之间也可以,可以理解为权重,0就是不重要,全部丢弃,1表示很重要,全部都要。
其实RNN只是代替的普通神经网络的神经元:
因为LSTM有4个输入,所以参数是普通的4倍:
我们取出一个来看看他怎么运行的:
输入的向量 x t x^t xt通过4个权重矩阵会被转换成4个向量,然后不同的维度输入到不同的LSTM模块里,每个模块里的cell会保留一个数值,合起来就是向量 c t − 1 c^{t-1} ct−1。连起来看就是这样的:
实际上他会把前一刻的记忆和输出也当做这一刻的输入来一起控制输入的4个向量。
然而真正的LSTM可能还会叠很多层:
看起来很复杂是把,其实你弄明白了1个LSTM的原理,就可以懂啦,其实这个图看起来也就是上下个隐层层,1层里面才2个神经元哦。
RNN就是让神经网络有记忆,以便需要有关联上下文的时候可以起作用,LSTM是一种RNN,可以保持记忆一定的时间。
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵,图片来自李宏毅课件,侵删。