2、 RNNLM
RNNLM模型的设计思想比较简单,主要是对NNLM中的前馈神经网络进行改进,其主要的结构图如下图2所示:
图2. RNNLM结构
NNLM的一个主要缺陷是,前馈网络必须使用固定长度的上下文,而这个长度需要在训练前临时指定。通常情况下,这意味着神经网络在预测下一个词时只能看到五到十个前面的词。众所周知,人类可以利用更长的上下文,而且非常成功。另外,缓存模型为神经网络模型提供了补充信息,因此很自然地想到是否可以设计一个模型,它可以为任意长度的上下文隐含地编码时间信息。
项目 | SOTA!平台项目详情页 |
RNNLM | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/rnnlm-2 |
3、 LSTM-RNNLM
前馈网络仅利用固定的上下文长度来预测下一个序列词,且训练难度大。LSTM-RNNLM引入长期短期记忆神经网络架构解决了这些问题:修改了网络结构,以避免梯度消失问题,而令训练算法保持不变。具体的,重新设计了神经网络的单元,使其相应的缩放系数固定为1。从这个设计目标中得到的新单元类型在学习能力上相当有限。进一步,引入门控单元以提升其学习能力。最终得到的神经单元如图3所示。
图3. 带有门控单元的LSTM记忆单元
一个标准的神经网络单元i只由输入激活a_i和输出激活b_i组成,当使用tanh激活函数时,它们之间的关系为:
门控单元将先前隐藏层、前一时间步长的当前层以及LSTM单元的内部激活,再利用logistic函数压缩处理激活后得到的值,然后分别将其设置为b_1、b_φ、b_ω。
图4. 神经网络LM架构
最终的神经网络语言模型架构如图4所示,将LSTM单元插入第二个递归层,并将其与标准神经网络单元的不同投影层相结合。对于大词汇量的语言建模,训练在很大程度上是由softmax输出层的输入激活a_i的计算主导的,与输入层相比,输出层不是稀疏的:
为了减少计算的工作量,将单词分成一组不相干的单词类别。然后,将概率p(w_m|(w_1)^(m-1))分解如下:
项目 | SOTA!平台项目详情页 |
LSTM-RNNLM |
前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/lstm-rnnlm |
4、 Bi-LSTM
给定一个输入序列x = (x_1, ... , x_T),一个标准的RNN通过从t = 1到T迭代以下方程来计算隐藏向量序列h = (h_1, ... , h_T)和输出向量序列y =(y_1, ... , y_T):
通常,H是一个sigmoid函数的element-wise应用。LSTM架构使用专门的记忆单元来存储信息,在寻找和利用长距离背景方面更有优势。图5展示了一个单一的LSTM存储单元。H由以下复合函数实现:
图5. LSTM存储单元
传统的RNNs的一个缺点是,它们只能利用以前的上下文。在语音识别中,整个语料被一次性转录,因此,需要考虑利用未来的上下文信息。双向RNN(BRNN)通过用两个独立的隐藏层来处理两个方向的数据来做到这一点,然后再将这些数据反馈给同一个输出层。如图6所示,BRNN通过迭代后向层从t=T到1,前向层从t=1到T,然后更新输出层来计算前向隐藏序列→h,后向隐藏序列←h和输出序列y:
将BRNN与LSTM结合起来就得到了双向LSTM,它可以在两个输入方向上获取长距离的上下文,如图6所示。
图6. 双向RNN
可以通过将多个RNN隐藏层相互堆叠来创建深度RNN,一个层的输出序列形成下一个层的输入序列,如图7所示。假设堆栈中的所有N层都使用相同的隐层函数,那么隐层向量序列h^n从n=1到N、t=1到T,都是反复计算的:
网络输出y_t为:
深度双向RNN可以通过用前向和后向序列→h^n和←h^n替换每个隐藏序列h^n来实现,并确保每个隐藏层都能收到来自下面一层的前向和后向层的输入。如果隐藏层使用LSTM,我们就可以得到深度双向LSTM( Deep Bidirectional Long Short-Term Memory Network,DBLSTM),如图8所示。
图7. 深度RNN
图8. 深度双向长短期记忆网络(DBLSTM)
当前 SOTA!平台收录 Bi-lstm 共 3 个模型实现资源,支持的主流框架包含 PyTorch、TensorFlow 。
项目 | SOTA!平台项目详情页 |
Bi-lstm | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/bi-lstm-7 |
5、 BiRNN+Attention
BiRNN+Attention使用了典型的编码器-解码器结构,编码器部分使用BiRNN,解码器部分使用Attention机制。对于普通的RNN模型,输入(x_1,x_2,...,x_T) 在经过 T 个时刻之后,可以得到 T 个正向隐藏层状态(h→,...,h→T) ;之后将输入序列单词的顺序颠倒之后得到(x_T,...,x_2,x_1) ,然后再次经过RNN,就可以得到反向的隐藏层状态(h←1,...,h←T) 。最后,我们要得到单词x_j 的向量表示,只需要将正向的隐藏状态h→j 跟反向的隐藏状态h←j 进行连接即可,例如:hj=[h→j;h←j] 。
解码器
在解码器中,作者引入注意力机制。解码器通过如下方式输出目标序列:
对于RNN模型,每一个条件概率通过下式进行建模:
该模型使用的条件概率如下:
需要注意的是,对于每一个目标单词y_i,用来计算其条件概率的上下文向量c_i都是不一样的。这跟传统的编码器-解码器模型是不一样的。c_i 指的就是中间语义变量,作者在论文中称为上下文变量。首先,c_i 依赖于编码器所有的隐藏状态(h_1,...,h_T) ,其次,在双向循环神经网络中,h_i 是包含整个输入序列的信息的,但是其包含的信息更集中在输入序列第 i 个单词位置附近。最后,在翻译输出单词的时候,不同的隐藏状态h_i 对输出序列的贡献是不一样的。
图9. 模型图示,在源句(x_1, x_2, ..., x_T)的基础上生成第t个目标词y_t
编码器( BIDIRECTIONAL RNN FOR ANNOTATING SEQUENCES
一个BiRNN由前向和后向RNN组成。前向RNN→f按顺序读取输入序列(从x_1到x_Tx),并计算出前向隐藏状态的序列(→h_1,..., →h_Tx)。后向RNN←f以相反的顺序读取序列(从x_Tx到x_1),生成一个后向隐藏状态的序列(←h_1, ...,←h_Tx)。我们通过连接前向隐藏状态→h_j和后向隐藏状态←h_j 得到每个词x_j的注释。这样一来,注释h_j就包含了前面的词和后面的词的摘要。由于RNNs倾向于更好地代表最近的输入,注释h_j将集中在x_j周围的词。这一连串的注释被解码器和对齐模型用来计算上下文向量。完整的模型图示见图9。
项目 | SOTA!平台项目详情页 |
Bi-RNN+Attention | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/bi-rnn-attention-2 |