当前位置:   article > 正文

NLP 《seq2seq》_seq2seq 原文

seq2seq 原文

一:RNN的种类结构
RNN:每个神经元的输入包括两个方面,一个是前一个神经元的隐藏层状态 h (用于记忆,之前的信息) ,一个是当前的输入 x (当前信息)。神经元得到输入之后经过内部结构的运算,可能是普通RNN,LSTM,GRU等单元的计算,会得到新的隐藏状态 h 和输出 y,然后再传递到下一个神经元。正是因为保存了隐藏状态 h 的计算,这才使得 RNN 具有一定的记忆功能。

我们先来回顾下之前学习的循环神经网络的一些种类。根据任务的类别不同,有一些比较常见的是many-to-many,one-to-many,many-to-one。
分别如下:
1) many-to-many
在这里插入图片描述

一般就是某个序列对某个序列的形式,比如:
词性标注,语言模型等等。

1) one-to-many
在这里插入图片描述

或者
在这里插入图片描述

这个用于一些构造类生成类的应用,比如我们之前学习的那个RNN语言模型搭建好了之后的模型探测,就是自动生成句子和文本,文章,那些。比如还有生成音乐,图片等

1) many-to-one
在这里插入图片描述

场景比如有,文本情感分析,对一些列的文本输入进行分类,看是消极还是积极情感,或者是打几颗星。

二:Seq-2-seq的种类结构,以及数学运算式。
它也是一种循环神经网络结构,只不过略微不太一样。包含了编码器encoder和解码器decoder两个部分。上述的那些模型一般是长度需要固定的,seq-2-seq可以允许输入输出的长度不一样,比如用在机器翻译和问答系统,需要翻译的句子,输出的句子,问题和答案的句子都是任意长度的。

Encoder 的 RNN 接受输入 x,最终输出一个编码所有信息的上下文向量 c,中间的神经元没有输出。Decoder 主要传入的是上下文向量 c,然后解码出需要的信息。

Seq2seq也有一些不同的种类,基本都是encoder一样,只有decoder的结构不一样,如下所示:

1:第一种模型
在这里插入图片描述

Encoder:就是标准的RNN结构,只不过是任意长度的。式子也很容易理解。encoder最后的的结果会被被映射到一个向量C,C也有很多方式得到。
在这里插入图片描述

Decoder:将C作为decoder的预置隐藏层直接输入,其他的隐藏层仅仅接受上层传入的隐藏层值。计算公式如下:
在这里插入图片描述

2:第二种模型
在这里插入图片描述

Encoder:如同第一种模型的Encoder
Decoder:Decoder 结构有了自己的初始隐藏层状态 h’0,不再把上下文向量 c 当成是 RNN 的初始隐藏状态,而是当成 RNN 每一个神经元的输入。可以看到在 Decoder 的每一个神经元都拥有相同的输入 c,计算公式如下:
在这里插入图片描述

3:第仨种模型
在这里插入图片描述

Encoder:如同第一种模型的Encoder
Decoder:Decoder 结构和第二种类似,但是在输入的部分多了上一个神经元的输出 y’。即每一个神经元的输入包括:上一个神经元的隐藏层向量 h’,上一个神经元的输出 y’,当前的输入 c (Encoder 编码的上下文向量)。对于第一个神经元的输入 y’0,通常是句子其实标志位的 embedding 向量。计算公式如下:
在这里插入图片描述

这里仅仅列举集中常见的额模型即可。

三:attention的结构
上述的seq2seq看似没有什么问题,其实有一个很大的问题就是,使用的是encoder-decoder的结构,我们希望能把不论多长的句子的信息都包含在一个固定的向量C里面去表达,这。。。。。。想想有点艰难不是么?语言那么丰富,长度还不一定,怎么包含的下呢?
1:对于较长的句子,根本没办法包含所有有用的信息。
2:序列较长的时候,梯度消失就会变得明显。

尤其是RNN机制实际中存在长程梯度消失的问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有的有效信息,所以随着所需翻译句子的长度的增加,这种结构的效果会显著下降。

如果我们想翻译一个段落,一篇文章,难道我们需要将所有段落都运行encoder到一个常量C,再去翻译这个常量?很明显不是,我们会一句句地去翻译,我们每次都是注意力集中在一部分去翻译,而且翻译每一句话,也是注意力集中在某几个词汇上的。这才符合我们人的对翻译的理解。

接下来就是大名鼎鼎的attention模型了,什么是attention?就跟人的注意力一样。
Attention机制跟人类翻译文章时候的思路有些类似,即将注意力关注于我们翻译部分对应的上下文。同样的,Attention模型中,当我们翻译当前词语时,我们会寻找源语句中相对应的几个词语,并结合之前的已经翻译的部分作出相应的翻译,如下图所示,当我们翻译“knowledge”时,只需将注意力放在源句中“知识”的部分,当翻译“power”时,只需将注意力集中在"力量“。这样,当我们decoder预测目标翻译的时候就可以看到encoder的所有信息,而不仅局限于原来模型中定长的隐藏向量,并且不会丧失长程的信息。

在这里插入图片描述

现在呢,我们来看看attention怎么计算的哈。
X是encoder的输出,h是encoder的隐层值
S是decoder的隐层值,y是decoder的输出。
是当前第 t 个输出在第 j 个输入的注意力大小的归一化权值。

1:正常的特征提取流程,得到encoder的各个单元的hidden values
在这里插入图片描述

2:假设当前decoder的hidden state 是st-1,我们可以计算每一个输入j位置hj与当前输出位置的关联性,也就是对各个注意力的大小,也就是当前输出呢我全部都去关心一下当前输入,只是有的关心在意的多,有的在意的少。
当前第 t 个输出在第 j 个输入的注意力大小形式是:
在这里插入图片描述

转成向量形式为:
在这里插入图片描述

a是关联性函数,使用h和之前的输出也是考虑到信息,目前只能到这些信息,也是比较合理的。一般取一下集中形式吧。最简单的就点积了。或者是一个小型的神经网络,进行一个线性变换啥的。比如如下形式:

在这里插入图片描述

3:利用softmax计算归一化运算,将相关程度归一化,免得出现负值,归一化也符合正常理解,注意力资源就那么点,怎么分配,概率和都是为1 的。当前第t个输出在第j个输入的注意力大小是如下,
在这里插入图片描述

4:利用对每一个encoder的输入h的注意力权值得到当前的ct值,C此时就不是固定大小的了,而是T维度的了(T是序列长度)。有多少T就多少C向量。
在这里插入图片描述

5:由此,我们可以计算decoder的下一个hidden state 和当前位置的输出。
在这里插入图片描述

关键的变化是计算encoder与decoder state之间的关联性的权重,得到Attention分布,从而对于当前输出位置得到比较重要的输入位置的权重,在预测输出时相应的会占较大的比重,这种是比较符合人类注意力的。

通过Attention机制的引入,我们不再只能利用encoder最终单一向量结果的限制,前面也说了,单一固定的向量是无法表达丰富的信息,attention可以使模型可以集中在所有对于下一个目标单词重要的输入信息上,使模型效果得到极大的改善。还有一个优点是,我们通过观察attention 权重矩阵的变化,可以更好地知道哪部分翻译对应哪部分源文字,有助于更好的理解模型工作机制,如下图所示。
在这里插入图片描述

上图展示的是,一些单词在翻译中重点关注哪些词汇,越亮就代表关注度越高。所以啊,在attention中就是关注部分有用信息。也能避免长句子由于的信息丢失。

attention解决了信息提取的问题,既关注全局信息,也正确把握关键信息。这其实也是一种方法论。对于原信息,我关注全部,但是每一部分我关注多少?

时间有限,我也懒得画图了,图都是思拼八凑的,能明白原理即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/687670
推荐阅读
相关标签
  

闽ICP备14008679号