RNN
目录
1. 为什么需要RNN?
传统的神经网络,一个输入会对应一个输出,如果输入不变,那输出也不会变。如下,一个Tappei是属于目的地类的,但换一句话又属于出发地类。这个时候就需要神经网络具有记忆功能。
实际上,循环神经网络是一类神经网络,一类具有记忆功能的神经网络。一类把上一个训练的结果带到下一次训练的神经网络
这就是一个简单的RNN,它有一个隐层,这个隐层的输出会被带到下一次训练中,和下一次训练的输入数据共同作为网络的输入
这是一个双向的RNN,这样的好处是不仅可以看到上文,还可以看到下文
LSTM是一种RNN, 实际上,现在大家讲在做RNN的时候,其实他们指的就是在做 LSTM。 LSTM已经成为了一种标准。
这是LSTM的一个Memory Cell, 也就是一个单元:
LSTM的一个memory cell 一共有4个输入,一个输出。
这种网络结构的好处就是 可以控制一个词是否应该输入,上一个词的信息是否应该被遗忘以及是否应该输出
//篇幅原因,还有几幅图就不展示了,可以前往李老师的RNN part I 的ppt里面查看。
一个LSTM网络可以有多个memory cell (先只关注只有一层的情况)
我们注意到,相比于上面介绍的简单的RNN,使用了LSTM的网络的参数会是前者的4倍,因为一个memory cell有4 个输入嘛。
这里李老师又提到了这种网络,他是先对输入乘以一个矩阵,把这个矩阵叫做transfomer,然后这个输入就由一个任意维的向量变成了一个n维的向量。这里的n等于memory cell 的数量。然后这个n维向量的每一维分别作为不同的memory cell 的input 输入。 同理创造另外3个n维向量,同理这些向量的每一维作为不同memory cell 相同位置的输入。
上面这个图以及很复杂了,但实际上在做LSTM的时候,可能还要把输出和memory(他们把这个拉memory的方式叫做peephole)拉过来做输入
通常情况下LSTM不止又一层,可能会叠5--6层。这个是叠2层的样子:
如果看不懂的话,可以回去看一看李老师的视频,讲的很清楚,一遍看不懂就看两遍。
RNN的代价函数就是每一个时间点的output向量和target向量的距离之和。
RNN也是用梯度下降算法来训练的,也是用到BP算法来求偏导,不过由于RNN是对sequence 训练,所以需要考虑时间的信息,所以这里的BP算法是做了一些改变的,叫做BPTT。具体过程李老师没有讲解。
我们可以从这个实验数据看出,随着梯度下降算法的运行,代价函数的值是没有逐渐变小,而是剧烈波动。。。09年RNN刚出来的时候,很长一段时间,只有RNN的作者能把RNN训练好。
李老师没有讲BPTT,我们不知道参数的梯度,所以李老师也没有从数学的角度来讲原因,这是一个实验的角度来将的为什么这么崎岖。
那么此时就会想,它不是梯度很大嘛,我把学习率 设置小一点就行了,
但是当w从0.99减到0.01 时,代价函数的输出都接近与0,此时梯度很小。
从这个例子可以看出,w的变化,可能造成代价函数很小的变化,可能造成天崩地裂的变化。
总结,RNN代价函数很崎岖不平时因为:同样的weight在不同的时间点会被反复地使用。
LSTM可以避免gradient 变化过小的问题。(但是不可以解决gradient变化过大的问题)。所以可以放心的把学习率设置的比较大。
因为普通的RNN每次memory都会被重置,而LSTM每次都是memory 的值乘以某一个值再与input的值相加,所以如果weight 可以影响memory里面的值的话,这个影响会一直存在。不想RNN每次都会被format掉 。(当然这是不考虑forget的问题,一开始LSTM的版本就是为了解决gradient的gradient vanishing问题,它是没有forget gate的,现在forget的bias会设置的比较大,保证一般forget gate都不起作用)
还有其他网络模型可以解决loss function 剧烈波动的问题,贴出来知道就行了
李宏毅,Structured Learning: Recurrent Neural Network, http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML16.html