-
前面的所有模型,思考角度都是从当前全连接的神经网络架构下的,最大的局限就是n,即只能根据,且仅仅是n个词,来预测下一个词的功能。随着RNN的普及,通过输入词序列的方式来“动态”输出下一个词得以实现。RNN的具体概念可以查看之前的RNN草图,这里只是再做一个比方来辅助记忆,RNN看似是时间序列的叠加,最终形成的结果,就像开发一个软件一样,不断的进行迭代。但是,如果从观察者的角度,总有一天,整个软件是开发完毕了。如果在那一天,将所有的迭代过程“平铺”开来看的话,其实RNN也就是一个深n层的深度全连接神经网络(当然RNN的变体会稍微有一些其他部分的功能,和全连接略有区别)。所以,RNN就是一个深度为n的神经网络,而这个n随着输入进行动态变化,就好像一个用static变量记忆的函数,函数内部会记忆一个值,看似每次调用一个函数,其实每次的函数输出,不仅仅和输入值有关,还和之前的所有调用导致的记忆有关,其实RNN利用的就是这个原理来进行实现的(将RNN的整个处理过程看成是一个函数的输入和输出的话,就是这样的。我们输入的特征值就是函数的入参,我们RNN的隐藏层的输出再函数的内部会自己保存一份static变量,同时输出出来(对于RNN来说,隐藏层的输出如果要用就用不用就不用。当然,RNN也有问题,就是随着序列的增加,深度增加太多,容易在反向传播算法进行参数优化的时候,出现梯度弥散和消失的情况。这个就需要修改参数优化的算法来实现功能了。这里的RNNLM模型其实实现的方式和之前的RNN没有区别,对于RNN而言输入的单词只需要是one hot编码的简单的词向量即可,可以看出用入参x和矩阵相乘,其实就是从权重矩阵中获取一列数据,那一列数据就可以理解成国内学习的词向量。
-
RNN做个比喻的话,就像是烧一个菜,可以回顾一下烧菜的过程:就拿烧油爆虾来说,首先会放入葱姜蒜和油一起煸炒,炒出香味。然后放入虾等原料,混合后进行一定程度的煸炒后放入料酒、酱油等再次煸炒上色。接着会放入一些辅料,比如黄瓜等再次焖一会儿,最后放入盐、味精、鸡精等调料才炒出一份菜。即最终的结果是前面所有的”在正确的时间,放入正确的物品“的综合结果,最终的这道菜是对前面所有的按照时间序列排列的过程的最终结果,所以说烧菜是一个消耗时间的体力活是有道理的。这里的最终结果可以理解成是网络的输出,而中间的各个过程可理解成RNN网络在按照时间序列上面的输入的过程。所以RNN网络的输出是对所有的之前的输入的总结:即记忆,如果将整个RNN平铺开来,其实就是一个深度全连接的神经网络,只不过每一层都有一个新的输入和原来的输入混合而已(会加入新的菜或者调料)。
来源:CSDN
作者:XiaoH0_0
链接:https://blog.csdn.net/XiaoH0_0/article/details/103773745