在自然语言处理中会有这样一种情况:句子的前后之间有着某种关联。而有着这种关联的句子如果在适当的模型中进行训练就能够实现预测下一个词出现的可能性。但典型的CNN网络并不能通过训练获取这种前后关联的时序关系,它不能保持之前所习得的知识。而RNN就解决了这个问题,RNN(Recurrent Neural Network)时包含循环的网络,它允许了信息的持久化。
上图为一个RNN结构,可以看出,RNN可以视作时同一种神经网络的多次复制,且每一个神经网络模块都会将当前消息传递给下一个网络。
什么是LSTM?
LSTM,全称是Long Short-Term Memory,属于RNN的一种。由于其结构特点,使得LSTM非常适合用于时序数据的建模。
从自然语言处理的角度,典型的神经网络往往采用加和的方法对句子进行判断情感极性,比如"I do not love him."其中在"not"上被判作负值,"love"会被判作正值,但句子的情感极性是明显偏贬义的,而直接加和往往会失掉前后关联,比如“do not”是对于“love”的否定。但LSTM模型能够更好的捕获较长距离的依赖关系,因为LSTM可以通过训练过程学到记忆或是遗忘某些信息。
LSTM的框架:
LSTM模型是由t时刻的输入、细胞状态、临时细胞状态、隐层状态、遗忘门、记忆门、输出门组成。LSTM通过细胞状态中信息遗忘和记忆新的信息使得对后续时刻计算有用的信息得以传递,其无用的信息被丢弃。在每个单元都输出一个隐层状态,其中遗忘、记忆和输出由上个时刻的隐层状态和当前输出计算出的遗忘门、记忆门和输出门来控制。
LSTM的计算过程:
1、遗忘门:选择需要遗忘的信息
输入为前一单元的隐层状态和当前时刻的单元,通过函数计算得到遗忘门的值
2、记忆门:选择需要记忆的信息
输入为前一单元的隐层状态和当前单元的输入,通过函数输出记忆门和临时细胞状态的值
3、计算当前时刻细胞状态
输入为记忆门、遗忘门和临时细胞状态、上一单元细胞状态,通过式计算得到当前单元细胞状态的值
4、输出门和当前单元隐层状态
输入为前一单元隐层状态、当前单元输入,通过σ函数计算得到输出门的值;再由输出门和当前单元细胞状态通过式计算得到当前单元隐层状态
最终我们可以得到与输入长度相同的隐层状态序列。
但是,尽管LSTM对于语义的前后联系已经有着一定的作用,但很明显其输入和训练都是基于时序的。也就是说,它并不能编码从后到前的信息,即如果我们对某个词的形容出现在后半部分,那么LSTM并不能够准确地判断该句子。所以BiLSTM(Bi-directional Long Short-Term Memory)也就应运而生了,它是由前向LSTM和后向LSTM组合而成,能够更好地捕捉到双向的语义依赖。