NLP概述
Natural Language Processing(NLP, 自然语言处理)
目的:让计算机处理或“理解”自然语言,以执行语言翻译和问题回答等任务;最终
来讲就是构建机器语言和人类语言之间的沟通桥梁,实现人机交流为最终目的。
常见应用:
- 关键词提取、
- 概要抽取、
- 事件提取
- 命名实体识别(提取价格、日期、姓名、公司、地点等) 关系抽取
- 分类:文本分类、情感分析、意图识别等
- 机器翻译
- 语音文本转换、图像文本转换
- 问答系统
从另外一个角度来看,NLP分为NLU和NLG两个子任务:
- NLU(Natural Language Understanding)自然语言理解
- 含义:让计算机理解自然语言文本的意义;
- 主要任务方向:分词、词性标注、文本分类、实体识别、信息抽取等;
- NLG(Natural Language Generation)自然语言生成
- 含义:将非语言格式的数据转换成人类可理解的语言格式;
- 主要任务方向:机器翻译、问答系统、聊天机器人等;
什么是递归神经网络
- 为什么有BP神经网络、CNN,还需要RNN?
- BP神经网络和CNN的输入输出都是互相独立的;但是实际应用中有些场景输出内容 和之前的内容是有关联的。
- RNN引入“记忆”的概念;递归指其每一个元素都执行相同的任务,但是输出依赖 于输入和“记忆” 。
我们已经学习了前馈网络的两种结构——BP神经网络和卷积神经网络,这
两种结构有一个特点,就是假设输入是一个独立的没有上下文联系的单位,
比如输入是一张图片,网络识别是狗还是猫。但是对于一些有明显的上下文
特征的序列化输入,比如预测视频中下一帧的播放内容,那么很明显这样的
输出必须依赖以前的输入, 也就是说网络必须拥有一定的”记忆能力”。
为了赋予网络这样的记忆力,一种特殊结构的神经网络——递归神经网络
(Recurrent Neural Network)便应运而生了。
递归神经网络RNN-应用场景
- 自然语言处理(NLP)
- 语言模型与文本生成
- 机器翻译
- 语音识别
- 图像描述生成
- 文本相似度计算等
RNN-结构
- 网络某一时刻的输入xt,和之前介绍的bp神经网络的输入一样,xt是一个n维向量,
不同的是递归网络的输入将是一整个序列,也就是x=[x1,…,xt1,xt,xt+1,…xT],对于语
言模型,每一个xt将代表一个词向量,一整个序列就代表一句话。 - ht代表时刻t的隐藏状态
- ot代表时刻t的输出
- 输入层到隐藏层之间的权重由U表示,它将我们的原始输入进行抽象作为隐藏层的输入
- 隐藏层到隐藏层的权重W,它是网络的记忆控制者,负责调度记忆。
- 隐藏层到输出层的权重V,从隐藏层学习到的表示将通过它再一次抽象,并作为最终输出。
将序列按时间展开就可以得到RNN的结构 - Xt是时间t处的输入
- St是时间t处的“记忆”,St=f(UXt+WSt-1),f可以是非线性转换函数,比如tanh等
- Ot是时间t处的输出,比如是预测下一个词的话,可能是sigmoid/softmax输出的属于每个候选词的概率,Ot=softmax(VSt)
按照一定的时间序列规定好计算顺序,于是实际上我们会将这样带环的结
构展开成一个序列网络,也就是上图右侧被“unfold”之后的结构。
RNN正向传播阶段
在t=1的时刻,U,V,W都被随机初始化好,h0通常初始化为0,然后进行如
下计算:
时间就向前推进,此时的状态h1作为时刻1的记忆状态将参与下一次的预测
活动,也就是:
以此类推,可得
![在这里插入图片描述](https://img-blog.csdnimg.cn/a2796e其中f可以是tanh,relu,sigmoid等激活函数,g通常是softmax也可以是其他。
值得注意的是,我们说递归神经网络拥有记忆能力,而这种能力就是通过W将以往的输入状态
进行总结,而作为下次输入的辅助。可以这样理解隐藏状态:h=f(现有的输入+过去记忆总结)
RNN反向传播阶段
- bp神经网络用到的误差反向传播方法将输出层的误差总和,对各个权重的 梯度∇U,∇V,∇W,求偏导数,然后利用梯度下降法更新各个权重。
- 对于每一时刻t的RNN网络,网络的输出ot都会产生一定误差et,误差的损
失函数,可以是交叉熵也可以是平方误差等等。那么总的误差为E=∑tet,我 们的目标就是要求取
对于输出ot=g(Vst),对于任意损失函数,求取∇V将是简单的,我们可以直
接求取每个时刻的∂e t / ∂V,由于它不存在和之前的状态依赖,可以直接求
导取得,然后简单地求和即可。对于∇W,∇U的计算不能直接求导,因此需
要用链式求导法则。
为了使得误差e能够对U和W求偏导数,定义一个中δ=∂e/∂s,首先计算出
输出层的δL,再向后传播到各层δL-1,δL-2,…,那么如何计算δ呢?
关注当前层次发射出去的链接即可,也就是
只要计算出所有的δot,δht,就可以通过以下计算出∇W,∇U:
举个详细的例子计算W梯度的例子:
举个对于时刻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
双向循环神经网络(Bidirectional RNN)是一种循环神经网络(RNN)的变体,它在每个时间步同时考虑当前时刻之前和之后的输入信息。
传统的循环神经网络只能向前传递信息,即当前时刻的状态只依赖于之前的状态和当前时刻的输入。而双向循环神经网络则通过增加一个反向的循环结构,在当前时刻之后的时间步也能够传递信息,这样可以更好地捕捉序列数据中的上下文信息,提高模型的性能。
双向循环神经网络的结构如下图所示:
其中,正向循环神经网络和反向循环神经网络的输出会分别输入到一个全连接层(或其他层)中进行后续的处理。最终,两个方向的输出会进行拼接,形成一个维度为2h的输出向量。
双向循环神经网络在自然语言处理、语音识别、图像处理等领域广泛应用,例如在机器翻译中,双向循环神经网络可以同时考虑源语言和目标语言的上下文信息,从而提高翻译质量。
Bidirectional RNN(双向RNN)假设当前t的输出不仅仅和之前的序列有关,并且还与之后的序列有关,例如:预测一个语句中缺失的词语那么需要根据上下文进行预测;Bidirectional RNN是一个相对简单的RNNs,由两个RNNs上下叠加在一起组成。输出由这两个RNNs的隐藏层的状态决定。
Deep(Bidirectional) RNN-深度双向RNN
Deep Bidirectional RNN(深度双向循环神经网络)是一种深度学习模型,它将多层双向循环神经网络(Bidirectional RNN)叠加在一起,用于处理序列数据,如文本、语音、视频等。
在传统的循环神经网络(RNN)中,每个时间步的输出只依赖于当前时间步的输入和上一个时间步的状态。而在双向循环神经网络中,每个时间步的输出不仅依赖于当前时间步的输入和上一个时间步的状态,还依赖于后面时间步的输入和状态。这种双向的信息流可以更好地捕捉序列数据中的上下文信息,提高模型的性能。
在深度双向循环神经网络中,我们将多个双向循环神经网络叠加在一起,形成一个深度的神经网络结构。每个双向循环神经网络的输出作为下一层双向循环神经网络的输入,逐层传递信息,从而更好地捕捉序列数据中的复杂关系。
深度双向循环神经网络在自然语言处理、语音识别、视频分析等领域得到了广泛应用,并取得了很好的效果。
Deep Bidirectional RNN(深度双向RNN)类似Bidirectional RNN,区别在于每个每一步的输入有多层网络,这样的话该网络便具有更加强大的表达能力和学习能力,但是复杂性也提高了,同时需要训练更多的数据。
循环神经网络RNN-BPTT
循环神经网络(Recurrent Neural Network,RNN)是一种能够处理序列数据的神经网络模型,它通过在网络中引入循环连接来处理序列数据中的时序信息。
在训练RNN模型时,通常使用反向传播算法(Backpropagation Through Time,BPTT)来计算模型参数的梯度。BPTT算法是将时间展开的RNN看作一个有向无环图(DAG),按照时间顺序对每个时间步进行前向传播和反向传播,从而计算出每个时间步的参数梯度。
BPTT算法的具体流程如下:
- 前向传播:对于每个时间步,将输入数据和前一个时间步的状态输入到RNN模型中,计算当前时间步的输出和状态。
- 损失函数计算:使用当前时间步的输出和目标值计算损失函数。
- 反向传播:从当前时间步开始,将损失函数对当前时间步的输出和状态求梯度,并沿着时间维度反向传播,计算每个时间步的参数梯度。
- 参数更新:使用优化算法(如随机梯度下降)根据计算出的参数梯度来更新模型参数
。
需要注意的是,由于RNN在时间维度上的循环结构,BPTT算法在反向传播时需要将梯度沿时间维度进行传递,这样会导致梯度消失或爆炸的问题。为了解决这个问题,可以采用一些技巧,如梯度裁剪、LSTM、GRU等。
RNN的训练和CNN/ANN训练一样,同样适用BP算法误差反向传播算法。
区别在于:RNN中的参数U\V\W是共享的,并且在随机梯度下降算法中,
每一步的输出不仅仅依赖当前步的网络,并且还需要前若干步网络的状态,
那么这种BP改版的算法叫做Backpropagation Through Time(BPTT);
BPTT算法和BP算法一样,在多层(多个输入时刻)训练过程中(长时依赖<即
当前的输出和前面很长的一段序列有关,一般超过10步>),可能产生梯度
消失和梯度爆炸的问题。
BPTT和BP算法思路一样,都是求偏导,区别在于需要考虑时间对step的影
响
LSTM
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的一种变种,大体结构一致,区别在于:
- LSTM的“记忆细胞”是改造过的
- 该记录的信息会一直传递,不该记录的信息会被截断掉
- LSTM关键:“细胞状态”
- 细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在 上面流传保持不变很容易
- 细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在 上面流传保持不变很容易
- LSTM怎么控制“细胞状态”?
- LSTM可以通过gates(“门”)结构来去除或者增加“细胞状态”的信息包含一个sigmoid神经网络层次和一个pointwist乘法操作
- Sigmoid层输出一个0到1之间的概率值,描述每个部分有多少量可以通过,0表示“不允许任务变量通过”,1表示“运行所有变量通过”
- LSTM中主要有三个“门”结构来控制“细胞状态”
第一个“门”==>“忘记门”/“遗忘门”:决定从“细胞状态”中丢弃什么信息;比如在语言模型中,细胞状态可能包含了性别信息(“他”或者“她”),当我们看到新的代名词的时候,可以考虑忘记旧的数据.
- 第二个“门”==>“信息增加门”:决定放什么新信息到“细胞状态”中;
- Sigmoid层决定什么值需要更新;
- Tanh层创建一个新的候选向量Ct;
- 主要是为了状态更新做准备
- 经过第一个和第二个“门”后,可以确定传递信息的删除和增加,即可以进行“细胞状态”的更新
- 更新Ct-1为Ct;
- 将旧状态与ft相乘,丢失掉确定不要的信息;
- 加上新的候选值it*Ct得到最终更新后的“细胞状态”
- 第三个“门”==>基于“细胞状态”得到输出,也就是“输出门”;
- 首先运行一个sigmoid层来确定细胞状态的那个部分将输出
- 使用tanh处理细胞状态得到一个-1到1之间的值,再将它和sigmoid门的输出相乘, 输出程序确定输出的部分
LSTM变种
"Peephole connections"是一种用于改进LSTM模型的技术,它引入了额外的连接来允许LSTM单元访问记忆单元中的信息。在传统的LSTM模型中,输入门、遗忘门和输出门只能访问输入和前一时刻的状态,而不能直接访问记忆单元中的信息。"Peephole connections"通过添加额外的连接,允许门控单元直接访问记忆单元中的信息,从而提高模型的表达能力和记忆能力。
具体来说,"Peephole connections"将LSTM模型中的三个门(输入门、遗忘门和输出门)与记忆单元中的状态相连接。这些连接允许门控单元直接访问记忆单元中的信息,并将这些信息纳入到门控单元的计算中。这样,LSTM模型就能够更好地利用先前的信息来控制当前时刻的输入和输出。
使用"Peephole connections"层的LSTM模型的计算流程与传统的LSTM模型类似,只是在输入门、遗忘门和输出门的计算中,额外考虑了记忆单元中的状态。通过引入"Peephole connections"层,LSTM模型可以更好地处理长序列数据,并且能够更好地捕捉序列中的长期依赖关系,从而提高模型的性能。
- 变种1
- 增加“peephole connections”层
- 让门层也接受细胞状态的输入
- 变种2
- 通过耦合忘记门和更新输入门(第一个和第二个门);也就是不再单独的考虑忘记什么、
- 增加什么信息,而是一起进行考虑。
在LSTM和GRU中,遗忘门和更新门是分开的,分别控制着前一时刻的记忆是否需要被遗忘和当前时刻的输入是否需要被更新。然而,有研究表明,将遗忘门和更新门耦合起来可以提高模型的性能。
具体来说,耦合遗忘门和更新输入门的方法是将遗忘门和更新门中的参数结合在一起,形成一个统一的门控单元。这个门控单元同时控制着前一时刻的记忆和当前时刻的输入的更新,从而可以更好地处理序列中的长期依赖关系。
通过耦合遗忘门和更新输入门,可以减少LSTM和GRU中的参数数量,并且可以提高模型的表达能力和记忆能力。此外,由于耦合遗忘门和更新输入门可以更好地控制信息的流动,因此也可以减少模型的过拟合。
值得注意的是,耦合遗忘门和更新输入门的方法并不适用于所有的序列建模任务。在某些任务中,遗忘门和更新门的独立控制可以更好地适应任务的特性。因此,在实际应用中,需要根据具体任务的特点来选择合适的门控机制。
GRU
GRU(Gated Recurrent Unit)是一种循环神经网络(RNN)的变种,类似于LSTM,它也使用了门控机制来解决传统RNN模型中存在的梯度消失和梯度爆炸问题,以及长序列建模中的记忆衰减问题。
GRU的主要组成部分包括:重置门(reset gate)和更新门(update gate)。其中,重置门用于控制前一时刻的状态在当前时刻是否需要被重置,更新门用于控制当前时刻的输入和前一时刻的状态在当前时刻是否需要被更新。
GRU的计算过程如下:
重置门:对于当前时刻的输入和前一时刻的状态,计算重置门的输出,表示前一时刻的状态在当前时刻是否需要被重置。
更新门:对于当前时刻的输入和前一时刻的状态,计算更新门的输出,表示当前时刻的输入和前一时刻的状态在当前时刻是否需要被更新。
计算当前时刻的状态:对于当前时刻的输入、重置门和更新门的输出,计算当前时刻的状态。
GRU相对于LSTM来说,参数更少,计算速度更快,且能够取得与LSTM相当的性能。在自然语言处理、语音识别、图像处理等领域得到了广泛应用,例如在机器翻译中,GRU可以有效地处理长序列数据,并具有更好的训练速度和模型压缩性能。
- Gated Recurrent Unit(GRU),2014年提出
- 将忘记门和输出门合并成为一个单一的更新门
- 同时合并了数据单元状态和隐藏状态(细胞状态和输出状态) 结构比LSTM的结构更加简单