相关讨论
http://tieba.baidu.com/p/3960350008
基于教程
http://deeplearning.net/tutorial/lstm.html
因为原教程有些不太直观的地方,展开讲一下
目的:根据IMDB影评网站扒取的文本,及文本对应的对电影的评分(一颗星到五颗星)作为训练集;得到自动分析文本情绪的LSTM分类器;可用来分析任意文本的情绪(积极或消极)
目的:根据IMDB影评网站扒取的文本,及文本对应的对电影的评分(一颗星到五颗星)作为训练集;得到自动分析文本情绪的LSTM分类器;可用来分析任意文本的情绪(积极或消极)
理论部分:
模型的时间展开图:
![](http://imgsrc.baidu.com/forum/w%3D580/sign=621201540f24ab18e016e13f05fbe69a/2f0e0d338744ebf82a38804ddff9d72a6159a7e1.jpg)
如果一句话有n个词,那么将这n个词用维数为d的向量表示,分别为x0到xn;
这里的LSTM方框是一个又m个LSTM节点组成的阵列;m是模型中LSTM节点的总数。
也就是说x0箭头所指的LSTM和x1所指的LSTM是同一个阵列,只不过它们发生在不同的时间。可以认为这个模型运行了n个时间单位(n为文本长度),每个时间单位t上,LSTM阵列的输入为xt,输出为ht, 其中t<=n;
Mean pooling是对所有时间单位上的ht的平均,得到向量h,再用逻辑回归分类。
![](http://imgsrc.baidu.com/forum/w%3D580/sign=621201540f24ab18e016e13f05fbe69a/2f0e0d338744ebf82a38804ddff9d72a6159a7e1.jpg)
如果一句话有n个词,那么将这n个词用维数为d的向量表示,分别为x0到xn;
这里的LSTM方框是一个又m个LSTM节点组成的阵列;m是模型中LSTM节点的总数。
也就是说x0箭头所指的LSTM和x1所指的LSTM是同一个阵列,只不过它们发生在不同的时间。可以认为这个模型运行了n个时间单位(n为文本长度),每个时间单位t上,LSTM阵列的输入为xt,输出为ht, 其中t<=n;
Mean pooling是对所有时间单位上的ht的平均,得到向量h,再用逻辑回归分类。
![](http://imgsrc.baidu.com/forum/w%3D580/sign=4104675bedc4b7453494b71efffd1e78/f410cb8065380cd7da72439fa744ad34588281c6.jpg)
如果对上图x0到LSTM到h0放大就是这个样子;其中LSTM阵列中包含m个LSTM单元;
而其中每个单元如L1,有4组输入权重(均为n维向量)与x0连接,且有4组输入权重(均为m维向量)与h0连接。L1将输出一个数作为h0中的第一个元素;
将L1部分再展开:
![](http://imgsrc.baidu.com/forum/w%3D580/sign=44d201686659252da3171d0c049b032c/e3e8c8177f3e67095416a68d3dc79f3df8dc5518.jpg)
L1的输入有8个,4个来自xt,分别为xt*Wc, xt*Wi, xt*Wf, xt*Wo; 4个来自h(t-1)分别为ht-1*Uc, ht-1*Ui, ht-1*Uf, ht-1*Uo; 而L1的输出为ht 的一个元素
![](http://imgsrc.baidu.com/forum/w%3D580/sign=44d201686659252da3171d0c049b032c/e3e8c8177f3e67095416a68d3dc79f3df8dc5518.jpg)
L1的输入有8个,4个来自xt,分别为xt*Wc, xt*Wi, xt*Wf, xt*Wo; 4个来自h(t-1)分别为ht-1*Uc, ht-1*Ui, ht-1*Uf, ht-1*Uo; 而L1的输出为ht 的一个元素
![](http://imgsrc.baidu.com/forum/w%3D580/sign=836b01887dcb0a4685228b315b62f63e/5db6bd3eb13533fa0d13705caed3fd1f40345b8d.jpg)
将L1单个节点展开
其中包含6个标量,分别为 ilde{Ct}, it, Ct, ft, ot, ht
其中展开it为 sigmoid(Wixt + Uiht-1),纸面有限其他的不画了
权值更新
连接和计算方法如下![](http://imgsrc.baidu.com/forum/w%3D580/sign=267b7f353f12b31bc76ccd21b6193674/75c3caef76094b36f959f89fa5cc7cd98c109d63.jpg)
这样在每个时间点t,xt对LSTM阵列的输入权重为4个d*m的矩阵,而ht-1对LSTM阵列的输入权重为4个m*m的矩阵。经过计算后生成ht。
权值更新:
在每一个minibatch,在此例中一个minibatch是16句话(每句话小于100个词多余删掉),计算出logistic regression的cost,然后计算出h 的残差;
并计算出对应的Δh1,Δh2,... Δht
而由于ht和,ht-1存在某种函数关系,能够计算出与Δht对应的Δht-1',这一来自LSTM阵列的惨差应该与来自Δh的残差合并,并继续做误差反传;
即对于每个minibatch,权重应该更新了t次,t即是每句话词的数量;
![](http://imgsrc.baidu.com/forum/w%3D580/sign=306e9cb1e6fe9925cb0c695804a95ee4/ceecb8014a90f60379ca18333f12b31bb051ed3e.jpg)
在每一个minibatch,在此例中一个minibatch是16句话(每句话小于100个词多余删掉),计算出logistic regression的cost,然后计算出h 的残差;
并计算出对应的Δh1,Δh2,... Δht
而由于ht和,ht-1存在某种函数关系,能够计算出与Δht对应的Δht-1',这一来自LSTM阵列的惨差应该与来自Δh的残差合并,并继续做误差反传;
即对于每个minibatch,权重应该更新了t次,t即是每句话词的数量;
![](http://imgsrc.baidu.com/forum/w%3D580/sign=306e9cb1e6fe9925cb0c695804a95ee4/ceecb8014a90f60379ca18333f12b31bb051ed3e.jpg)
我double check了一下,理解是正确的;reference:
DLBOOK(2015)page 315
http://www.iro.umontreal.ca/~bengioy/DLbook/rnn.html
Theano中权值更新通过theano.scan实现参考
http://deeplearning.net/software/theano/library/scan.html
http://deeplearning.net/software/theano/library/scan.html
keras包
然而keras包(基于theano)搞同样的东西只要30行代码
https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py
https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py
测试:
![](http://imgsrc.baidu.com/forum/w%3D580/sign=0cbf60cf053b5bb5bed720f606d2d523/34a13ac79f3df8dcf58beef5cb11728b46102889.jpg)