看这篇文章首先你要懂NN,也就是神经网络,我也是只懂神经网络,RNN是我学的第二个神经网络。如果你以前啥都不懂的话,推荐去这个网站
http://neuralnetworksanddeeplearning.com/
真的贼J8好,笔者是这样看的,看完第一章,Using neural nets to recognize handwritten digits,我大概明白了什么叫神经网络,然后它还有代码,我就直接看代码了,然后我就理解了反向传播,我觉得这个是最主要的吧,然后第二章我就没看了,因为懂了反向传播,然后我又看了第三章和第六章,知道了一点CNN(卷积神经网络)的事,里面是用theano实现的,然后我又开始学习theano,觉得光学没有什么用,得找个项目做一做,于是就找到了这个用theano写的RNN,上面的网站我真的极力推荐,里面的公式最好全部手推一遍,如果你不想看英文版的话,我们实验室翻译了这个网站,你可以在微信里搜“哈工大SCIR”,然后在文章目录里找到《NN&DL》连载,然后你就可以看了。说实话,那本书废话贼J8多,你们最好和我一样跳着看。
好了说我要讲的RNN,看这篇文章请结合http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-2-implementing-a-language-model-rnn-with-python-numpy-and-theano/里面的文章来看,我会把代码里面的公式给你们推一遍,你们先看看这篇文章到底要做什么
我不会讲全部内容,我只讲到反向传播,其他的你们自己可以推
RNN网络结构如下
你们看了上面的网站应该知道,输入Xt是一个句子中的一个单词的one-hot-vector(不明白的同学百度一下),这个向量就是这个词在词表中的下标(id),比如“I like you”
中的“I”,它在词表中的id可能是5,那么它就是[0,0,0,0,0,1,.....0],然后当前隐层的状态与当前输入Xt和上一个隐层状态St-1有关,
通过与U和W的线性变换相加后做tanh得到。输出Ot是预测的下一个词在词表里的下标,比如输入是“I”,我们希望输出是“like”在词表里的下标(id)。为了减小计算范围,
我们限定词表大小为8000,即只包含了8000个词,所以Xt与Ot维度也是8000,隐层为100层,Ot的每一维对应词表的8000个单词,其中一维的概率越大(softmax会把输入压缩到0和1之间,因此可以把它当作一个不同分类的概率)则表示单词下标越有可能就是这个维度。Loss函数是输出每维×Yk的总和取负,Yk只能为0或者1,1表示是这个单词,0表示不
是这个单词。接下来介绍用softmax函数作为激活函数的反向传播
Softmax完整函数形式如下
对于Zt的每一维度Zti,softmax为