目的:让计算机处理或“理解”自然语言,以执行语言翻译和问题回答等任务;最终
来讲就是构建机器语言和人类语言之间的沟通桥梁,实现人机交流为最终目的。
常见应用:
从另外一个角度来看,NLP分为NLU和NLG两个子任务:
我们已经学习了前馈网络的两种结构——BP神经网络和卷积神经网络,这
两种结构有一个特点,就是假设输入是一个独立的没有上下文联系的单位,
比如输入是一张图片,网络识别是狗还是猫。但是对于一些有明显的上下文
特征的序列化输入,比如预测视频中下一帧的播放内容,那么很明显这样的
输出必须依赖以前的输入, 也就是说网络必须拥有一定的”记忆能力”。
为了赋予网络这样的记忆力,一种特殊结构的神经网络——递归神经网络
(Recurrent Neural Network)便应运而生了。
在t=1的时刻,U,V,W都被随机初始化好,h0通常初始化为0,然后进行如
下计算:
时间就向前推进,此时的状态h1作为时刻1的记忆状态将参与下一次的预测
活动,也就是:
以此类推,可得
![在这里插入图片描述](https://img-blog.csdnimg.cn/a2796e其中f可以是tanh,relu,sigmoid等激活函数,g通常是softmax也可以是其他。
值得注意的是,我们说递归神经网络拥有记忆能力,而这种能力就是通过W将以往的输入状态
进行总结,而作为下次输入的辅助。可以这样理解隐藏状态:h=f(现有的输入+过去记忆总结)
举个对于时刻t+1产生的误差et+1,我们想计算它对于W1,W2,…,Wt,Wt+1的梯度,可以如下计算
反复运用链式法则,我们可以求出每一个∇W1
,∇W2
,…,∇Wt,∇Wt+1,在
不同时刻都是共享同样的参数,这样可以大大减少训练参数,和CNN的共
享权重类似。对于共享参数的RNN,我们只需将上述的一系列式子抹去标
签并求和,就可以得到推导出来的公式为:
其中 表示不利用链式法则直接求导,也就是假如对于函数f(h(x)),对
其直接求导结果如下:∂f(h(x))/∂x=f′(h(x)),也就是求导函数可以写成x的
表达式,也就是将h(x)看成常数了。
在Yoshua Bengio 论文中( http://proceedings.mlr.press/v28/pascanu
13.pdf )证明了, 从而说明了这是梯度求导的一部分环节是
一个指数模型,当η<1时,就会出现梯度消失问题,而当η>1时,梯度爆炸
也就产生了。
为了克服梯度消失的问题,LSTM和GRU模型便后续被推出了,为什么
LSTM和GRU可以克服梯度消失问题呢?由于它们都有特殊的方式存储”记
忆”
,那么以前梯度比较大的”记忆”不会像简单的RNN一样马上被抹除,
因此可以一定程度上克服梯度消失问题。(问题描述:在普通RNN中对于
长序列而言,很早之前时刻输入的信息,对于当前时刻是不会产生影响
的。)
另一个简单的技巧可以用来克服梯度爆炸的问题就是gradient clipping,
也就是当你计算的梯度超过阈值c的或者小于阈值−c时候,便把此时的梯度
设置成c或−c
下图所示是RNN的误差平面,可以看到RNN的误差平面要么非常陡峭,要
么非常平坦,如果不采取任何措施,当你的参数在某一次更新之后,刚好碰
到陡峭的地方,此时梯度变得非常大,那么你的参数更新也会非常大,很容
易导致震荡问题。而如果你采取了gradient clipping这个技巧,那么即使
你不幸碰到陡峭的地方,梯度也不会爆炸,因为梯度被限制在某个阈值c。
双向循环神经网络(Bidirectional RNN)是一种循环神经网络(RNN)的变体,它在每个时间步同时考虑当前时刻之前和之后的输入信息。
传统的循环神经网络只能向前传递信息,即当前时刻的状态只依赖于之前的状态和当前时刻的输入。而双向循环神经网络则通过增加一个反向的循环结构,在当前时刻之后的时间步也能够传递信息,这样可以更好地捕捉序列数据中的上下文信息,提高模型的性能。
双向循环神经网络的结构如下图所示:
其中,正向循环神经网络和反向循环神经网络的输出会分别输入到一个全连接层(或其他层)中进行后续的处理。最终,两个方向的输出会进行拼接,形成一个维度为2h的输出向量。
双向循环神经网络在自然语言处理、语音识别、图像处理等领域广泛应用,例如在机器翻译中,双向循环神经网络可以同时考虑源语言和目标语言的上下文信息,从而提高翻译质量。
Bidirectional RNN(双向RNN)假设当前t的输出不仅仅和之前的序列有关,并且还与之后的序列有关,例如:预测一个语句中缺失的词语那么需要根据上下文进行预测;Bidirectional RNN是一个相对简单的RNNs,由两个RNNs上下叠加在一起组成。输出由这两个RNNs的隐藏层的状态决定。
Deep Bidirectional RNN(深度双向循环神经网络)是一种深度学习模型,它将多层双向循环神经网络(Bidirectional RNN)叠加在一起,用于处理序列数据,如文本、语音、视频等。
在传统的循环神经网络(RNN)中,每个时间步的输出只依赖于当前时间步的输入和上一个时间步的状态。而在双向循环神经网络中,每个时间步的输出不仅依赖于当前时间步的输入和上一个时间步的状态,还依赖于后面时间步的输入和状态。这种双向的信息流可以更好地捕捉序列数据中的上下文信息,提高模型的性能。
在深度双向循环神经网络中,我们将多个双向循环神经网络叠加在一起,形成一个深度的神经网络结构。每个双向循环神经网络的输出作为下一层双向循环神经网络的输入,逐层传递信息,从而更好地捕捉序列数据中的复杂关系。
深度双向循环神经网络在自然语言处理、语音识别、视频分析等领域得到了广泛应用,并取得了很好的效果。
Deep Bidirectional RNN(深度双向RNN)类似Bidirectional RNN,区别在于每个每一步的输入有多层网络,这样的话该网络便具有更加强大的表达能力和学习能力,但是复杂性也提高了,同时需要训练更多的数据。
循环神经网络(Recurrent Neural Network,RNN)是一种能够处理序列数据的神经网络模型,它通过在网络中引入循环连接来处理序列数据中的时序信息。
在训练RNN模型时,通常使用反向传播算法(Backpropagation Through Time,BPTT)来计算模型参数的梯度。BPTT算法是将时间展开的RNN看作一个有向无环图(DAG),按照时间顺序对每个时间步进行前向传播和反向传播,从而计算出每个时间步的参数梯度。
BPTT算法的具体流程如下:
需要注意的是,由于RNN在时间维度上的循环结构,BPTT算法在反向传播时需要将梯度沿时间维度进行传递,这样会导致梯度消失或爆炸的问题。为了解决这个问题,可以采用一些技巧,如梯度裁剪、LSTM、GRU等。
RNN的训练和CNN/ANN训练一样,同样适用BP算法误差反向传播算法。
区别在于:RNN中的参数U\V\W是共享的,并且在随机梯度下降算法中,
每一步的输出不仅仅依赖当前步的网络,并且还需要前若干步网络的状态,
那么这种BP改版的算法叫做Backpropagation Through Time(BPTT);
BPTT算法和BP算法一样,在多层(多个输入时刻)训练过程中(长时依赖<即
当前的输出和前面很长的一段序列有关,一般超过10步>),可能产生梯度
消失和梯度爆炸的问题。
BPTT和BP算法思路一样,都是求偏导,区别在于需要考虑时间对step的影
响
LSTM(Long Short-Term Memory)是一种特殊的循环神经网络(RNN),通过引入记忆单元(memory cell)和门控机制(gate mechanism),可以有效地解决传统RNN模型中存在的梯度消失和梯度爆炸问题,以及长序列建模中的记忆衰减问题。
LSTM的主要组成部分包括:输入门(input gate)、遗忘门(forget gate)、输出门(output gate)和记忆单元(memory cell)。其中,输入门用于控制新输入的重要性,遗忘门用于控制前一时刻的记忆是否需要被遗忘,输出门用于控制当前时刻的输出是否需要被输出,记忆单元用于存储并传递信息。
LSTM的计算过程如下:
LSTM在自然语言处理、语音识别、图像处理等领域得到了广泛应用,例如在机器翻译中,LSTM可以有效地处理长序列数据,并且能够捕捉跨语言的语法和语义信息,从而提高翻译质量。
在RNN计算中,介绍到对于长期/长时依赖的问题,没法进行解决,可能产生梯度消失和梯度爆炸的问题;LSTM特别适合解决这类需要长时间依赖的问题。
LSTM是RNN的一种变种,大体结构一致,区别在于:
第一个“门”==>“忘记门”/“遗忘门”:决定从“细胞状态”中丢弃什么信息;比如在语言模型中,细胞状态可能包含了性别信息(“他”或者“她”),当我们看到新的代名词的时候,可以考虑忘记旧的数据.
"Peephole connections"是一种用于改进LSTM模型的技术,它引入了额外的连接来允许LSTM单元访问记忆单元中的信息。在传统的LSTM模型中,输入门、遗忘门和输出门只能访问输入和前一时刻的状态,而不能直接访问记忆单元中的信息。"Peephole connections"通过添加额外的连接,允许门控单元直接访问记忆单元中的信息,从而提高模型的表达能力和记忆能力。
具体来说,"Peephole connections"将LSTM模型中的三个门(输入门、遗忘门和输出门)与记忆单元中的状态相连接。这些连接允许门控单元直接访问记忆单元中的信息,并将这些信息纳入到门控单元的计算中。这样,LSTM模型就能够更好地利用先前的信息来控制当前时刻的输入和输出。
使用"Peephole connections"层的LSTM模型的计算流程与传统的LSTM模型类似,只是在输入门、遗忘门和输出门的计算中,额外考虑了记忆单元中的状态。通过引入"Peephole connections"层,LSTM模型可以更好地处理长序列数据,并且能够更好地捕捉序列中的长期依赖关系,从而提高模型的性能。
具体来说,耦合遗忘门和更新输入门的方法是将遗忘门和更新门中的参数结合在一起,形成一个统一的门控单元。这个门控单元同时控制着前一时刻的记忆和当前时刻的输入的更新,从而可以更好地处理序列中的长期依赖关系。
通过耦合遗忘门和更新输入门,可以减少LSTM和GRU中的参数数量,并且可以提高模型的表达能力和记忆能力。此外,由于耦合遗忘门和更新输入门可以更好地控制信息的流动,因此也可以减少模型的过拟合。
值得注意的是,耦合遗忘门和更新输入门的方法并不适用于所有的序列建模任务。在某些任务中,遗忘门和更新门的独立控制可以更好地适应任务的特性。因此,在实际应用中,需要根据具体任务的特点来选择合适的门控机制。
GRU(Gated Recurrent Unit)是一种循环神经网络(RNN)的变种,类似于LSTM,它也使用了门控机制来解决传统RNN模型中存在的梯度消失和梯度爆炸问题,以及长序列建模中的记忆衰减问题。
GRU的主要组成部分包括:重置门(reset gate)和更新门(update gate)。其中,重置门用于控制前一时刻的状态在当前时刻是否需要被重置,更新门用于控制当前时刻的输入和前一时刻的状态在当前时刻是否需要被更新。
GRU的计算过程如下:
重置门:对于当前时刻的输入和前一时刻的状态,计算重置门的输出,表示前一时刻的状态在当前时刻是否需要被重置。
更新门:对于当前时刻的输入和前一时刻的状态,计算更新门的输出,表示当前时刻的输入和前一时刻的状态在当前时刻是否需要被更新。
计算当前时刻的状态:对于当前时刻的输入、重置门和更新门的输出,计算当前时刻的状态。
GRU相对于LSTM来说,参数更少,计算速度更快,且能够取得与LSTM相当的性能。在自然语言处理、语音识别、图像处理等领域得到了广泛应用,例如在机器翻译中,GRU可以有效地处理长序列数据,并具有更好的训练速度和模型压缩性能。