机器学习系列:递归神经网络
thre1233
8年前
<h3>前言</h3> <p>BP神经网络,训练的时候,给定一组输入和输出,不断的对权值进行训练,使得输出达到稳定。但BP神经网络并不是适合所有的场景,并不真正的体现出某些场景的真正特点。回到经典的概率论问题,抛硬币问题,假设你已经抛了100次的,90次是正面的,10次是反面的,问现在继续在抛一次,出现正面的概率是多少?如果没有前面几次的经验,很正常的会认为再次出现正面的概率是50%,但由于我们之前有对这个进行了实验,即有了经验了,按照贝叶斯定律,出现正面的概率肯定会大于50%。BP神经网络也少了对前面结果的一种反馈。</p> <p>常见,易懂的受到前位影响的算法,加法算法。十位的结果,所到个位结果的影响,因为可能有进位,同样,百位的结果所到十位的影响。</p> <p>这种受到前位影响的算法非常的常见,而经典BP神经网络并不能很好的反映这种算法的特性,需要就经典的BP神经网络进行优化和改造,也就是引进前位,历史数据对网络的影响,使其具备时序性。通过历史数据的关联来推测后续的事情。</p> <h3>递归神经网络RNN</h3> <p>从前面加法算法的动态图中,对现有的 BP 神经网络进行改造,也就是加入前位的结果对于后续网络的影响。</p> <p style="text-align: center;"><img src="https://simg.open-open.com/show/eb2d716b811be39a4d8673e4f86472d5.png"></p> <p>这里把 BP 神经网络设计成上图的形式,很形象的揭示了递归神经网络的特点,前向的结果,作为下一个输入,影响下一个网络的结果。递归神经网络,在很多方向已经取得了很好的成果。而一种特殊的递归神经网络 Long Short Term 网络(LSTM),取到的结果最为璀璨,是这个方向的明星。</p> <p>来看看LSTM的实现。</p> <h3>LSTM 网络</h3> <p>1997年 Hochreiter & Schmidhuber 提出了Long Short Term 网络,它是一种 RNN 的实现形式,在很多问题上,LSTM 取得了相当大的成功,在许多的领域上都有很好的成果。</p> <p>最简单的 LSTM 网络:</p> <p style="text-align: center;"><img src="https://simg.open-open.com/show/7a84c64219078abbf827ddea6bdebcf8.png"></p> <p>把前位的输出结果当成后位的输入,经过 tanh 层,相当于扩充了原来BP神经网络的另一个输入。这样一次的进行训练。</p> <p>在简化一点的方式如下图:</p> <p style="text-align: center;"><img src="https://simg.open-open.com/show/e9134a9e4e3481cad04fe9d3afacd7b5.png"></p> <p>如果去掉 layer1 层,那么就是一个最简单的 BP神经网络了。这里引入了 layer1 层,使得经典的 BP 神经网络多了一个输入,layer_1 层在加法算法中,表示的是前一个输入就可以反映出加法算法的特性,从结构来看,这个 LSTM 的变形并不是非常的复杂,但现在就重要的就是如何计算出各个层次的增量,然后进行迭代了。</p> <p>这里主要需要解决导数问题 python 的代码实现:</p> <p><img src="https://simg.open-open.com/show/abe56d93356b85f9ae65b5f7bb358839.png"></p> <p>变量的更新:</p> <p><img src="https://simg.open-open.com/show/38490cefa9114576d9c528172b90577b.png"></p> <p>其中 layer1delta 变量为两个变量的和:</p> <p><img src="https://simg.open-open.com/show/2f06e96e07c1bc91a65475aba081d685.png"></p> <p>完整的迭代过程在:</p> <p><a href="/misc/goto?guid=4959746011264889418" rel="nofollow,noindex">https://iamtrask.github.io/2015/11/15/anyone-can-code-lstm/</a></p> <p>在递归神经网络中,跟经典的BP神经网络在结构上并没有太多的不同,最关键的点,还是在求解增量,进行迭代。</p> <p>回头再想,如果仅仅用BP神经网络的算法能不能实现出加法算法,我觉得是可以的,但是速度和准确性不会有LSTM高。因此,LSTM的结构也是可以改进算法,不同的结构方式可以避免算法的很多缺陷。</p> <p>更一般的LSTM结构:</p> <p style="text-align: center;"><img src="https://simg.open-open.com/show/114220393a2ed65c76fd71ff8c60ddbf.png"></p> <p>算法的迭代过程在:</p> <p><a href="/misc/goto?guid=4959746011357575964" rel="nofollow,noindex">http://nicodjimenez.github.io/2014/08/08/lstm.html</a></p> <p><a href="/misc/goto?guid=4959746011442400751" rel="nofollow,noindex">https://github.com/nicodjimenez/lstm</a></p> <p>算法跟BP神经网络没有太大的不同,但要注意的还是各个变量的增量和迭代问题。</p> <h3>递归神经网络的应用</h3> <p>递归神经网络跟BP神经网络,最大的不同是引进了时序,可以根据以往的数据来推测未来的事件。这是现在比较热门的一个方向。比较多的应用实在语音和文本的处理上,网上有相当多的关于递归神经网络的应用,比如写出像汪峰一样的歌词,默写唐诗,写冷段子等。但要写出像样的歌词和诗词,还需要做很多的处理,如果把递归神经网络应用在推荐系统里,也会得到不错的效果。</p> <h3>参考</h3> <p><a href="/misc/goto?guid=4959746011526072984" rel="nofollow,noindex">http://blog.csdn.net/zzukun/article/details/49968129</a></p> <p><a href="/misc/goto?guid=4959642620166210301" rel="nofollow,noindex">http://www.jianshu.com/p/9dc9f41f0b29</a></p> <p><a href="/misc/goto?guid=4959746011357575964" rel="nofollow,noindex">http://nicodjimenez.github.io/2014/08/08/lstm.html</a></p> <p><a href="/misc/goto?guid=4959746011442400751" rel="nofollow,noindex">https://github.com/nicodjimenez/lstm</a></p> <p><a href="/misc/goto?guid=4959746011671220934" rel="nofollow,noindex">http://blog.csdn.net/longxinchen_ml/article/details/51253526</a></p> <p><a href="/misc/goto?guid=4959648871689316154" rel="nofollow,noindex">https://github.com/karpathy/char-rnn</a></p> <p><a href="/misc/goto?guid=4959746011780609844" rel="nofollow,noindex">http://blog.csdn.net/v_july_v/article/details/52796239</a></p> <p></p> <p> </p> <p>来自:http://datartisan.com/article/detail/218.html</p> <p> </p>