Seq2Seq

1 经典RNN

在这里插入图片描述

2 Attention

2.1Soft Attention

在这里插入图片描述
其中f是Decoder的非线性变换函数。

而语义编码C是由句子Source的每个单词经过Encoder 编码产生的,这意味着不论是生成哪个单词,y1,y2还是y3,其实句子Source中任意单词对生成某个目标单词 y i yi yi 来说影响力都是相同的,这是为何说这个模型没有体现出注意力的缘由。这类似于人类看到眼前的画面,但是眼中却没有注意焦点一样。

如果拿机器翻译来解释这个注意力分配模型的Encoder-Decoder框架更好理解,比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。

在翻译“杰瑞”这个中文单词的时候,注意力分配模型里面的每个英文单词对于翻译目标单词“杰瑞”贡献是相同的,很明显这里不太合理,显然“Jerry”对于翻译成“杰瑞”更重要,但是分心模型是无法体现这一点的,这就是为何说它没有引入注意力的原因。

没有引入注意力的模型在输入句子比较短的时候问题不大,但是如果输入句子比较长,此时所有语义完全通过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息,这也是为何要引入注意力模型的重要原因。

目标句子中的每个单词都应该学会其对应的源语句子中单词的注意力分配概率信息。这意味着在生成每个单词 y i yi yi 的时候,原先都是相同的中间语义表示C会被替换成根据当前生成单词而不断变化的 C i Ci Ci由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的Ci
在这里插入图片描述
在这里插入图片描述
其中, L x L_x Lx 代表输入句子Source的长度, a i j a_{ij} aij 代表在Target输出第i个单词时Source输入句子中第j个单词的注意力分配系数,而 h j h_j hj 则是Source输入句子中第 j j j 个单词的语义编码。

还有一个问题:
生成目标句子某个单词,比如“汤姆”的时候,如何知道Attention模型所需要的输入句子单词注意力分配概率分布值呢?
在这里插入图片描述
对于采用RNN的Decoder来说,在时刻 i i i,如果要生成 y i y_i yi 单词,我们是可以知道Target在生成 Y i Y_i Yi 之前的时刻 i − 1 i-1 i1 时,隐层节点 i − 1 i-1 i1 时刻的输出值 H i − 1 H _{i-1} Hi1 的,而我们的目的是要计算生成 Y i Y_i Yi 时输入句子中的单词“Tom”、“Chase”、“Jerry”对 Y i Y_i Yi 来说的注意力分配概率分布,那么可以用Target输出句子 i − 1 i-1 i1 时刻的隐层节点状态 H i − 1 H_{i-1} Hi1 去一一和输入句子Source中每个单词对应的RNN隐层节点状态 h j h_j hj 进行对比,即通过函数 F ( h j , H i − 1 ) F(h_j,H_{i-1}) F(hj,Hi1) 来获得目标单词 y i y_i yi 和每个输入单词对应的对齐可能性,这个 F F F 函数在不同论文里可能会采取不同的方法,然后函数 F F F 的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。

绝大多数Attention模型都是采取上述的计算框架来计算注意力分配概率分布信息,区别只是在F的定义上可能有所不同。

目标句子生成的每个单词对应输入句子单词的概率分布可以理解为输入句子单词和这个目标生成单词的对齐概率,这在机器翻译语境下是非常直观的:传统的统计机器翻译一般在做的过程中会专门有一个短语对齐的步骤,而注意力模型其实起的是相同的作用。

2.2 Attention

在这里插入图片描述
将Source中的构成元素想象成是由一系列的 < K e y , V a l u e > <Key,Value> <Key,Value> 数据对构成,此时给定 Target 中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。即可以将其本质思想改写为如下公式:
在这里插入图片描述
其中, L x = ∣ ∣ S o u r c e ∣ ∣ L_x=||Source|| Lx=Source代表Source的长度,公式含义即如上所述。上文所举的机器翻译的例子里,因为在计算Attention的过程中,Source中的Key和Value合二为一,指向的是同一个东西,也即输入句子中每个单词对应的语义编码,所以可能不容易看出这种能够体现本质思想的结构。

当然,从概念上理解,把Attention仍然理解为从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息,这种思路仍然成立。聚焦的过程体现在权重系数的计算上,权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息

Attention机制的具体计算过程:
第一个过程是根据Query和Key计算权重系数;
第二个过程根据权重系数对Value进行加权求和。
而第一个过程又可以细分为两个阶段:第一个阶段根据Query和Key计算两者的相似性或者相关性;第二个阶段对第一阶段的原始分值进行归一化处理;
在这里插入图片描述
在第一个阶段,可以引入不同的函数和计算机制,根据Query和某个Key_i,计算两者的相似性或者相关性,最常见的方法包括:求两者的向量点积、求两者的向量Cosine相似性或者通过再引入额外的神经网络来求值,即如下方式:
在这里插入图片描述
第一阶段产生的分值根据具体产生的方法不同其数值取值范围也不一样,第二阶段引入类似SoftMax的计算方式对第一阶段的得分进行数值转换,一方面可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面也可以通过SoftMax的内在机制更加突出重要元素的权重。即一般采用如下公式计算:
在这里插入图片描述
第二阶段的计算结果a_i即为value_i对应的权重系数,然后进行加权求和即可得到Attention数值:
在这里插入图片描述

2.3 Self Attention

在一般任务的Encoder-Decoder框架中,输入Source和输出Target内容是不一样的,比如对于英-中机器翻译来说,Source是英文句子,Target是对应的翻译出的中文句子,Attention机制发生在Target的元素Query和Source中的所有元素之间。

而Self Attention顾名思义,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力计算机制。其具体计算过程是一样的,只是计算对象发生了变化而已。

如果是常规的Target不等于Source情形下的注意力计算,其物理含义正如上文所讲,比如对于机器翻译来说,本质上是目标语单词和源语单词之间的一种单词对齐机制。那么如果是Self Attention机制,一个很自然的问题是:通过Self Attention到底学到了哪些规律或者抽取出了哪些特征呢?或者说引入Self Attention有什么增益或者好处呢?

引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。但是Self Attention在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。除此外,Self Attention对于增加计算的并行性也有直接帮助作用。

self-attention 的本质就是从一个矩阵生成三个新的矩阵,这三个矩阵分别记作 qkv,然后将 q 乘以 k 的转置,得到的结果再与 v 相乘,再将最后得到的结果送入下游任务。因此实际上任何网络都可以融入 self-attention,生成三个新矩阵的方式也很简单,只需要调用三次 nn.Linear ()。用什么矩阵来生成三个矩阵?随意,比方说 nlp 中可以用 word2vec 的输出来作为 “母矩阵”,通过三次 nn.linear () 将 “母矩阵” 生成三个 “子矩阵”。

2.4 Attention机制的应用

**图片描述:**是一种典型的图文结合的深度学习应用,输入一张图片,人工智能系统输出一句描述句子,语义等价地描述图片所示内容。加入Attention机制能够明显改善系统输出效果,Attention模型在这里起到了类似人类视觉选择性注意的机制,在输出某个实体单词的时候会将注意力焦点聚焦在图片中相应的区域上。
**语音识别:**的任务目标是将语音流信号转换成文字,所以也是Encoder-Decoder的典型应用场景。Encoder部分的Source输入是语音流信号,Decoder部分输出语音对应的字符串流。Attention机制起到了将输出字符和输入语音信号进行对齐的功能。

3 结构

在这里插入图片描述
在Seq2Seq结构中,编码器Encoder把所有的输入序列都编码成一个统一的语义向量Context,然后再由解码器Decoder解码。在解码器Decoder解码的过程中,不断地将前一个时刻 t − 1 t-1 t1 的输出作为后一个时刻 t t t 的输入,循环解码,直到输出停止符为止。

与经典RNN结构不同的是,Seq2Seq结构不再要求输入和输出序列有相同的时间长度

机器翻译Decoder端 t t t 时刻数据流:

  • 首先对 RNN 输入大小为 [ n i , 1 ] [n_i,1] [ni,1] 的向量 x t x_t xt(红点);
  • 然后经过 RNN 输出大小为 [ n o , 1 ] [n_o,1] [no,1] 的向量 y t y_t yt(蓝点);
  • 接着使用全连接 fc 将 y t y_t yt 变为大小为 [ n c , 1 ] [n_c,1] [nc,1] 的向量 y t ′ y^{\prime}_t yt ,其中 n c n_c nc 代表类别数量;
  • y t ′ y^{\prime}_t yt 经过 softmax 和 argmax 获取类别 index,再经过 int2str 获取输出字符;
  • 最后将类别 index 输入到下一状态,直到接收到 标志符停止。
  • 在这里插入图片描述
    为解决one-hot编码进行嵌入过于稀疏,使用一种更加优雅的办法:使用embedding随机矩阵。

4 Seq2Seq训练问题

为防止某一时刻输出 y t y_t yt 错误就会导致后面全错,Google提出了大名鼎鼎的Scheduled Sampling(即在训练中 x t x_t xt 按照一定概率选择输入 y t − 1 y_{t-1} yt1 t − 1 t-1 t1 时刻对应的真实值,即标签),既能加快训练速度,也能提高训练精度。

设置一个概率p,每一步,以概率 p 靠自己上一步的输入来预测,以概率 1-p 根据老师的提示来预测,这种方法称为「计划采样」(scheduled sampling)。
在这里插入图片描述

5 seq2seq+Attention

在 Decoder 解码的过程中向量 c 都是不变的。这存在着不少缺陷:

  • 对于比较长的句子,很难用一个定长的向量 c 完全表示其意义。
  • RNN 存在长序列梯度消失的问题,只使用最后一个神经元得到的向量 c 效果不理想。
  • 与人类的注意力方式不同,即人类在阅读文章的时候,会把注意力放在当前的句子上。

所以如果要改进Seq2Seq结构,最好的切入角度就是:利用Encoder所有隐藏层状态 h t h_t ht 解决Context长度限制问题

attention model用来帮助解决机器翻译在句子过长时效果不佳的问题。(LSTM和RNN都难以解决)

基本思路
Context vector c_{i}是透过 attention score α α α 乘上 input 的序列加权求和。Attention/Alignment score是attention model中提出一个很重要的概念,可以用来衡量输入句中的每个文字对目标句中的每个文字所带来重要性的程度。

在计算score中, α α α 代表 A l i g n m e n t m o d e l Alignment model Alignmentmodel 会根据输入字位置 j j j 和输出字位置 i i i 这两者的关联程度,计算出一个score e i j e_{ij} eij。换言之, e i , j e_{i,j} eij是衡量RNN decoder中的 h i d d e n s t a t e s i − 1 hidden state s_{i-1} hiddenstatesi1 和输入句中的第 j j j 个文字hidden state h j h_{j} hj 的关系所计算出的权重。
在这里插入图片描述
注意力机制具体实现方式:

  1. 计算Decoder的 t t t 时刻隐藏层状态 h t h_{t} ht 对Encoder每一个隐藏层状态 h ˉ s \bar{h}_{s} hˉs 权重 a t ( s ) a_{t}(s) at(s) 数值:在这里插入图片描述
    这里的 s c o r e score score 可以通过以下三种方式计算:在这里插入图片描述
  2. 利用权重 a t ( s ) a_{t}(s) at(s) 计算所有隐藏层状态 h ˉ s \bar{h}_{s} hˉs 加权之和 c t c_{t} ct ,即生成新的大小为 [ n h , 1 ] [n_h,1] [nh,1] 的Context状态向量:在这里插入图片描述
  3. 将通过权重 a t ( s ) a_{t}(s) at(s) 生成的 c t c_{t} ct 与原始Decoder隐藏层 t t t 时刻状态 h t h_{t} ht 拼接在一起:
    在这里插入图片描述
    这里 c t c_{t} ct h t h_{t} ht 大小都是 [ n h , 1 ] [n_h,1] [nh,1] ,拼接后会变大。由于需要恢复为原来形状,所以乘以全连接 W c W_{c} Wc 矩阵。当然不恢复也可以,但是会造成Decoder RNN cell变大。
  4. 对加入“注意力”的Decoder状态 h ˉ t \bar{h}_{t} hˉt 乘以 W h o W_{ho} Who 矩阵即可获得输出:在这里插入图片描述
    其中 W a W_{a} Wa W c W_{c} Wc 参数需要通过学习获得。整个Attention机制通过通过 score 函数计算的注意力向量 c t c_{t} ct ,给Decoder RNN加入额外信息,提高性能。

Attention model虽然解决了输入句仅有一个context vector的缺点,但依旧存在不少问题。
Attention未解决的问题:

  1. context vector计算的是输入句、目标句间的关联,却忽略了输入句中文字间的关联,和目标句中文字间的关联性。
  2. 不管是Seq2seq或是Attention model,其中使用的都是RNN,RNN的缺点就是无法平行化处理,导致模型训练的时间很长,有些论文尝试用CNN去解决这样的问题,像是Facebook提出的Convolutional Seq2seq learning,但CNN实际上是透过大量的layer去解决局部信息的问题,在2017年,Google提出了一种叫做”The transformer”的模型,透过self attention、multi-head的概念去解决上述缺点,完全舍弃了RNN、CNN的构架。
    在这里插入图片描述
    自注意力:self-attention会丧失序列数据的位置信息,因此在使用self-attention的Transformer会在将位置信息通过位置编码(Positional Encoding)的形式融合进输入数据之中
    在这里插入图片描述

6 seq2seq+CNN

基本思想:
CNN可以并行,改善了lstm的性能瓶颈。 用CNN分别抽取原句和目标句的句向量表达,在decode的输出中利用attention机制考虑和原句的对应关系,利用attention score来动态改变输入句子的向量表达,对decode词汇相关性大的占用大的权重,最后decode的输出是综合attention后的原句的向量加上CNN抽取的decode的向量。

模型结构的具体说明如下:
上左encoder部分:通过一层卷积抽取原句子的特征,之后经过GLU激活做为encoder输出。
下左decoder部分:采用层叠卷积抽取输出目标语言的特征,经过GLU激活做为decoder输出。
中左attention部分:把decoder和encoder的输出做点乘,做为输入源语言中每个词权重。
中右Residual connection:把attention计算的权重与输入序列相乘,加入到decoder的输出中输出输出序列。
在这里插入图片描述

7 seq2seq+transformer

transformer是充分利用了attention,达到并行的目的。前后词的向量表达不再用lstm,rnn,gru等来依次输出。在encoder端采用的self attention机制,对每个词和其它词进行attention操作,每个词的向量表达能包含了其它词,相关性大的信息量大,相关性小的信息量小。

  • 编码器:编码器为相同的6个encoder堆叠得到,每个encoder参数不同;每个encoder两个子层,分别为多头的自注意力和前馈神经网络(每个位置的单词对应的前馈神经网络都完全一样,另一种解读就是一层窗口为一个单词的一维卷积神经网络),这里采用了ResNet的思想建立了一个short-cut。Encoder的输入,最底层为句子的embedding,之后每层的输入为上一层的输出。
  • 解码器:解码器同样为6个相同的decoder进行堆叠得到。和encoder不同的是,这里有两个多头注意力。masked multi-head self-attention是为了保证输出只能看到当前时刻之前的输出结果。另一个multi-head attention也叫encoder-decoder attention,是用decode当前时刻的输出作为Q,encoder的输入作为K和V,这样每次decoder的输出都携带了各个位置的输入信息,类似于传统的seq2seq的attetnion机制。每个解码器和编码器一样也都有一个前馈神经网络和layer norm;最后解码器通过softmax转换为概率分布,决定输出哪个单词。

在transformer之前,seq2seq后续的改进基本上是三个方向:

  • 魔改encoder和decoder的结构,例如encoder部分使用LSTM,双向LSTM,CNN等;
  • 在encoder或者decoder中加入各种网络组件帮助训练,例如resnet+deep lstm作为encoder来保证深层的lstm拥有更强大的抽象能力的同时,训练的效率也得到提升;
  • encoder和decoder部分的不同设计策略

8 decoder的设计模式

8.1 greedy search

greed search的思路很贪心,解码的过程中,选择一个 softmax 预测的概率输出最高的词作为当前的翻译结果,然后再将这个词作为下一个目标词的输入和上一个词的 LSTM 对应的 step 阶段的 hidden state 一起预测下一个目标词,贪心搜索的缺点比较明显,就是误差累积的问题,这个和基于 seq2seq的时间序列预测任务存在的问题也是一样,一旦某一步 decode 的预测出错,则后面所有的decode的预测都是在上一步误差的基础上进行累计,从而使得整体的误差很高。

8.2 beam search

top-k个预测概率最高的目标词同时进入下一个的decode,然后在最终的输出中才进行最终的top-1的选择。而与时间序列相关的seq2seq结构无法使用beam search,因为回归型的seq2seq的输出没有概率分布的概念而是输出一个单值,针对于这个问题实际上时间序列预测 seq2seq 舍弃了beam search的思路,使用了teacher forcing的扩展方法——curriculum learning,对应的采样方法叫做「计划采样」scheduled sampling。

9 应用领域

  1. 机器翻译。Encoder-Decoder的最经典应用,事实上这一结构就是在机器翻译领域最先提出的
  2. 文本摘要。输入是一段文本序列,输出是这段文本序列的摘要序列。
  3. 阅读理解。将输入的文章和问题分别编码,再对其进行解码得到问题的答案。
  4. 语音识别。输入是语音信号序列,输出是文字序列。

10 Seq2Seq的预处理

  1. 首先我们假设有10000个问答对,统计得到1000个互异的字以及每个字对于出现的次数。
  2. 根据统计得到的这1000个字,按照次数从多到少进行排序,序号从0开始到999结束(得到我们的字典表ids)。
  3. 对于问答对,进行One-Hot编码。
  4. 由于One-Hot编码的维度较大且0较多,因此我们进行embedding降维(具体维数自定义)得到我们的特征矩阵。

11 公式流程

https://zhuanlan.zhihu.com/p/115210317

输入: x = ( x 1 , . . . , x T x ) x= (x_1,...,x_{T_x}) x=(x1,...,xTx)
输出: y = ( y 1 , . . . , y T y ) y= (y_1,...,y_{T_y}) y=(y1,...,yTy)

  1. Encoder方面接受的是每一个单词word embedding,和上一个时间点的hidden state。输出的是这个时间点的hidden state。
    在这里插入图片描述
  2. Decoder方面接受的是目标句子里单词的word embedding,和上一个时间点的hidden state。
    在这里插入图片描述
  3. context vector是一个对于encoder输出的hidden states的一个加权平均。
    在这里插入图片描述
  4. 每一个encoder的hidden states对应的权重。
    在这里插入图片描述
  5. 通过decoder的hidden states加上encoder的hidden states来计算一个分数,用于计算权重(4)
    在这里插入图片描述
  6. 将context vector 和 decoder的hidden states 串起来。
    在这里插入图片描述
  7. 计算最后的输出概率。
    在这里插入图片描述
    详细图:
    在这里插入图片描述

12 代码解读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值