初学者——从NN到RNN,深刻理解以softmax为激活函数的反向传播,有代码

来源:互联网 发布:awscli json 编辑:程序博客网 时间:2024/04/29 02:04

看这篇文章首先你要懂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为


根据随机梯度下降算法思想,我们现在需要求,而就拿上图为例,我们希望我们预测出来的词在词表中的下标是4(词表总共0-7999),

所以Y4 = 1其他的Yk = 0,那么loss函数就可以简化成

现在我们来求一下


看上面的公式可以推出来图上所写的对吧,但是我想提醒一下,我这里写成的是向量模式,一会真正求得时候我们得一个数一个数地求,先求,看下图


发现了吗,除了为1外,其他的都是0,那么我们只看Ot4,这里是重点哈,只看Ot4,之后所有的偏导都是用Ot4(数字/标量)去求,如果遇到

Ot4和向量在一起,得分开每个数每个数地求!

那现在就变成了


下一步要求的这步求导即是对softmax函数的求导,softmax函数的求导要分两种情况,比如上图就应该分为I = 4与i != 4的情况,你们看一下下面的求导


这个求导不是我求的,它来自于http://blog.csdn.net/u014313009/article/details/51045303,这小伙子确实不错,只不过他忘记了LOSS函数前面还有个负号,大家记得把

他求导的结果加上个负号,让我们再次感谢这位小伙子

那我就直接写了,


然后看到这你所有的理论应该都没啥问题了,你可以直接去看http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-2-implementing-a-language-model-rnn-with-python-numpy-and-theano/

的代码。

其实从代码中我们也能看出来我这个推导结果是正确的



你们看这一句delta_o[np.arange(len(y)), y] -=1.,也就是说i=4的时候所有输出都-1,其他输出都保持不变

符合下图


好的你们去看代码吧,加油


如果你看懂了这篇文章请顶一下,毕竟每个人所学的程度不同,我不知道自己讲明白没有,之后还会调整一些错误吧,感谢你们长得这么好看还

看我的文章


好了我去学LSTM了,good白!




2 0
原创粉丝点击