seq2seq and attention

生成式任务

输出Y没有预设的范围,受输入X的影响
在人工智能的各个领域都有,包括很多跨领域任务
图像领域:图像/视频生成,图像补全等
语言领域:语言合成等
文本领域:机器翻译等

什么是Encoder-Decoder

Encoder-Decoder 模型主要是NLP领域里的概念。它并不特指某种具体的算法,而是一类算法的统称。Encoder-Decoder算式一个通用的框架,在这个框架下可以使用不同的算法来解决不同的任务。

Encoder-Decoder这个框架很好的诠释了机器学习的核心思路:将现实问题转化为数学问题,通过求解数学问题,从而解决现实问题。

Encoder又称为编码器。它的作用就是【将现实问题转化为数学问题】

\[\left.\begin{matrix} 文字\\ 图片\\ 音频\\ \end{matrix}\right\} \to Encoder编码器 \to 向量 \]

Decoder又称为解码器,他的作用是【求解数学问题,并转化为现实世界的解决方案】

\[向量 \to Decoder解码器 \to \left\{\begin{matrix} 文字\\ 图片\\ 音频\\ \end{matrix}\right. \]

将两个环节链接起来,用通用的图来表达则是:

\[\left.\begin{matrix} X_1\\ X_2\\ X_3\\ X_4\\ X_5 \end{matrix}\right\} \to {\color{Green} Encoder} \to 向量C \to {\color{Green} Decoder} \to \left\{\begin{matrix} Y_1\\ Y_2\\ Y_3 \end{matrix}\right. \]

关于Encoder-Decoder,有两点需要说明:

  1. 不论输入和输出的长度是什么,中间的【向量C】长度是固定的(这也是它的缺陷)
  2. 根据不同的任务可以选择不同的编码器和解码器(可以使一个RNN,但通常是其变种LSTM或者GRU)

只要是符合上面的框架,都统称为Encoder-Decoder模型。说到Encoder-Decoder就经常提到一个名词——seq2seq。

什么是seq2seq

seq2seq(sequence to sequence),如字面意思,输入一个序列,输出一个序列。这种结构最重要的地方在于输入序列和输出序列的长度是可变的。如下图:
image

如图上所示,输入了6个汉字,输出了3个英文单词。输入和输出的长度不同。

seq2seq的由来

在seq2seq框架提出之前,深度神经网络在图像分类等问题上取得了非常好的效果。在其擅长解决的问题中,输入和输出通常都可以表示为固定长度的向量,如果长度稍微有变化,会使用补零等操作。

然而许多重要的问题,例如机器翻译、语音识别、自动对话等,表示成序列后,其长度实现并不知道,因此如何突破先前深度神经网络的局限,使其可以适应这些场景,成为了13年以来的研究热点,seq2seq框架应运而生。

seq2seq和Encoder-Decoder的关系

seq2seq(强调目的)不特指具体方法,满足【输入序列、输出序列】的目的,都可以统称为seq2seq模型。
而seq2seq使用的具体方法基本都属于Encoder-Decoder模型(强调方法)的范畴。
总结一下的话:

  • seq2seq属于Encoder-Decoder的大范畴
  • seq2seq更强调目的,Encoder-Decoder更强调方法。

Encoder-Decoder的应用:

image

机器翻译、对话机器人、文章摘要、代码补全、文章摘要

【文本-文本】是最典型的应用,其输入序列和输出序列的长度可能会有较大的差异。
Google发表的用seq2seq做机器翻译的论文:《Sequence to Sequence Learning with Neural Networks》

【音频-文本】语言识别也有很强的序列特征,比较适合Encoder-Decoder模型。
Google发表的使用seq2seq做语言识别的论文《A Comparison of Sequence-to-Sequence Models for Speech Recognition》

【图片-文本】通俗的讲就是:看图说话。机器提取图片特征,然后用文字表达出来。这个应用是计算机视觉和NLP的结合。图像描述生成的论文:《Sequence to Sequence – Video to Text》

Encoder-Decoder的缺陷

Encoder和Decoder之间只有一个【向量C】来传递信息,且C的长度固定。为了便于理解,我们类比【压缩-解压】的过程:
将一张800x800,像素的图片压缩成100KB,看上去还比较清晰。再将一张3000x3000像素的图片也压缩到100KB,看上去就模糊了。
Encoder-Decoder就是类似的问题:当输入信息太长时,会丢掉一些信息。

Attention解决信息丢失问题

Attention机制就是为了解决【信息过长,信息丢失】的问题。

Attention模型的特点就是Encoder不再将整个输入序列编码为固定长度的【中间向量C】,而是编码成一个向量的序列。引入了Attention的Encoder-Decoder模型如下图:

image

这样,在产生每一个输出的时候,都能够做到充分利用输入序列携带的信息。而且这种方法在翻译任务中取得了得长不错的结果。

以上知识点来自EasyAI

Attention的本质是什么

Attention(注意力)机制如果浅层的理解,跟他的名字非常匹配。它的核心逻辑是【从关注全部到关注重点】。

Attention机制很像人类看图片的逻辑,当我们看一张图片时,我们并没有看清图片的全部内容,而是将注意力集中在了图片的焦点上。

我们的视觉系统就是一种Attention机制,将有限的注意力集中在重点信息上,从而节省资源,快速获得最有效的信息。

Attention机制在NLP领域的位置:
image

Attention的三大优点

  1. 参数少
    模型复杂度跟CNN、RNN相比,复杂度更小,参数也更少。所以对算力的要求夜更小。
  2. 速度快
    Attention解决了RNN不能并行计算的问题。Attention机制每一步计算并不依赖于上一步的计算结果,因此可以和CNN一样并行处理。
  3. 效果好
    在Attention机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情一样。
    Attention是挑重点,就算文本比较长,也能从中间抓住重点,不丢失重要的信息。

Attention的原理

Attention经常会和Encoder-Decoder一起说,上面也提到了Attention。
下面演示了attention引入Encoder-Decoder框架下,完成机器翻译任务的大致流程。

image

但是,Attention并不一定在Encoder-Decoder框架下使用的,他是可以脱离Encoder-Decoder框架的。

脱离Encoder-Decoder框架后的原理图解:
image

图书管(source)里有很多书(value),为了方便查找,我们给书做了编号(key)。当我们想要了解漫威(query)的时候,我们就可以看看那些动漫、电影、甚至二战(美国队长)相关的书籍。

为了提高效率,并不是所有的书都会仔细看,针对漫威来说,动漫、电影相关的会看仔细一些(权重高),但是二战的就只需要简单扫一下即可(权重低)。

当我们全部看完后就对漫威有了一个全面的了解了。

Attention原理的3步分解:

image

query和key进行相似度计算,得到权值——>将权值进行归一化,得到直接可用的权重——>将权重和value进行加权求和

从上面的建模,我们可以大致感受到 Attention 的思路简单,四个字“带权求和”就可以高度概括,大道至简。做个不太恰当的类比,人类学习一门新语言基本经历四个阶段:

  1. 死记硬背(通过阅读背诵学习语法练习语感)
  2. 提纲挈领(简单对话靠听懂句子中的关键词汇准确理解核心意思)
  3. 融会贯通(复杂对话懂得上下文指代、语言背后的联系,具备了举一反三的学习能力)
  4. 登峰造极(沉浸地大量练习)
    这也如同attention的发展脉络,RNN 时代是死记硬背的时期,attention 的模型学会了提纲挈领,进化到 transformer,融汇贯通,具备优秀的表达学习能力,再到 GPT、BERT,通过多任务大规模学习积累实战经验,战斗力爆棚。
    要回答为什么 attention 这么优秀?是因为它让模型开窍了,懂得了提纲挈领,学会了融会贯通。

Attention理论推导

1. 注意力

《Attention is all you need》

\[\left\{\begin{matrix} self-attention\\ multi-head attention \end{matrix}\right. \]

2. seq2seq模型

\[I \to y_1 = f(c,h_1) \\ am \to y_2 = f(c,h_2,y_1) \\ chinese \to y_3 = f(c,h_3,y_2) \\ I \to 我 \\ am \to 是 \\ chinese \to 中国人 \\ \]

3. 存在问题

  1. 遗忘问题
    当数据太长时,神经网络容易遗忘其中的信息
  2. 对齐问题
    每个输出的单词都应该有对应的输入词

注意力机制的直观理解

在编码和解码的过程中,如何避免遗忘,储存的内容又是什么?

\[\left\{\begin{matrix} y_1 = f(c)\\ y_2 = f(c,y_1)\\ y_3 = f(c,y_2,y_1) \end{matrix}\right. \to \left\{\begin{matrix} y_1 = f(c_1)\\ y_2 = f(c_2,y_1)\\ y_3 = f(c_3,y_2,y_1) \end{matrix}\right. \]

通过与意向了加权求和\(c_1 = 0.6\times V_1 + 0.3\times V_2 + 0.06\times V_3 + 0.04\times V_4\),对每个词分配一个语义向量,而不是之前同一个C。

权重系数法

对于\(y_i\)的输出概率,我们定义

\[p(y_i|y_1,y_2,...,y_{i-1},X) = g(y_{i-1},s_i,c_i) \]

,其中\(s_i\)是第i时刻RNN的隐藏层状态,其计算公式为

\[s_i = f(s_{i-1},y_{i-1},c_i) \]

\(c_i\)作为一个动态变化的向量,由原句经过Encoder得到的向量\(h_i\)的加权和得出:

\[c_i = \sum_{j=1}^{Tx}\alpha_{ij}h_j \]

其中权重经过softmax层进行归一化

\[\alpha_{ij} = \frac{ exp(e_{ij}) }{\sum exp(e_{ij})} \]

\[e_{ij} = a(s_{i-1},h_j) \]

其中a是一个前馈神经网络,\(a_{ij}\)或者\(e_{ij}\)可以看做是各个词对\(h_j\)的重要性。

Attention的种类

  1. soft attention
    比较常见的attention方式,对所有key求权重概率,每个key都有一个对应的权重,是一种全局的计算方式(也可以叫Global Attention)。这种方式比较理性,参考了所有key的内容,在进行加权。但是计算量可能比较大。
  2. hard attention
    Hard Attention是一个随机的过程。Hard Attention不会选择整个encoder的隐层输出做为其输入,Hard Attention会依概率Si来采样输入端的隐状态一部分来进行计算,而不是整个encoder的隐状态。为了实现梯度的反向传播,需要采用蒙特卡洛采样的方法来估计模块的梯度。
  3. local attention
    local attention 整体流程和 global attention一样,只不过相比之下,local attention只关注一部分encoder hidden states
    文中作者说道,local attention 来自于 soft attention 和 hard attention ,local attention 机制选择性地关注一个小的上下文窗口,并且是可微分的。该方法的优点是避免了soft attention 的计算开销,同时比hard attention方法更易于训练。

Teacher Forcing

训练过程:

  • s1: x1, x2, x3, ..., xn, -> y1
  • s2: x1, x2, x3, ..., xn, , y1 -> y2
  • s2: x1, x2, x3, ..., xn, , y1, y2 -> y3

其中标黄部分使用真实值,称作teacher forcing。

解码方式

此处文章来源 1
此处文章来源 2

在seq2seq模型生成文本你的decoder端,当前字到底生成候选词典(vocab)中的哪一个,需要一定的策略,显然遍历的复杂度较高,如何选取也会影响生成文本的质量,一些常见的方法如下:

1. 贪心搜索

即第t+1时间步取一个词使得第1步到第t+1步的概率最大,然后依次进行递进搜索。每一个时间步都取出对应使得概率最大的词。

又称集束搜索,Beam Search是一种启发式图搜索算法,通常在图的解空间比较大的情况下,为了减少搜索所占用的空间和时间,在每一步深度扩展的时候,剪掉一些质量比较差的节点,保留下一些质量比较高的节点。这样减少了空间消耗,并提高了时间效率,但缺点就是很可能存在潜在的最佳方案被丢弃,因此Beam Search算法并不完全,一般用于解空间较大的系统中。
相对于贪心策略大的搜索空间,我们每次选择制定的个数:num_beams。num_beams=1时集束搜索就退化为了贪心搜索;num_beams=2时,每个时间步都会保留当前步为止条件概率最优的2个序列。

image

3. 随机采样

虽然Beam Search优化了空间效率,高效的选取了一些节点,但还是容易生成重复、无意义的文本,这点在实践时非常容易遇到。目前提出的随机采样(sampling)的做法对Beam Search做出了一些改动;候选字有一定的概率分布,通过一些策略提高生成文本的质量。

1. Temperature Sampling

在softmax计算过程中引入温度参数t来改变vocabulary probability distribution,使其更偏向high probability words。

\[P(x_t|x_{t-1},...,x_1) = \frac{exp(u_t/temperature)}{\sum exp(u_t/temperature)}, temperature \in [0, 1) \]

当temperature$\longrightarrow\(0,就变成了贪婪算法;当temperature\)\longrightarrow \infty$,就变成均匀采样。

2. Top-k采样

在的decoding过程中,从\(P(x_t|x_{t-1},...,x_1)\)中选取概率最高的k个tokens,把它们的概率加总得到\(p' = \sum P(x_t|x_{t-1},...,x_1)\),然后将\(P(x_t|x_{t-1},...,x_1)\)调整为\(P'(x_t|x_{t-1},...,x_1) = P(x_t|x_{t-1},...,x_1)/p'\),其中\(x\in V^{(k)}\),最后从P'(x_t|x_{t-1},...,x_1)中抽取一个token作为输出。
Top-k Sampling存在的问题是,常数k是给定的值,k设置过小则会容易生成更平淡或泛的句子。当k很大的时候,候选集合会包含一些不合适的token

3. Nucleus Sampling方法,或者记为Top-p方法

通过对概率分布进行累加,然后当累加的值超过设定的阈值p,则对之后的概率进行置0。
基于Top-k Sampling,他将\(p' = \sum P(x_t|x_{t-1},...,x_1)\)设为一个提前定义好的常数\(p'\in [0, 1)\)

随机采样存在的问题

  • 生成的句子容易不连贯,上下文比较矛盾
  • 容易生成奇怪的句子,出现罕见词

生成式任务的评价指标

以下知识点来源:CSDN博主「林楚海」

生成式任务的评价指标大致分为三类:

  1. 基于词重叠率的方法:该方法主要是计算生成文本与参考文本之间的词重叠率来作为模型质量的评估标准,比较经典的有:BLEU, ROUGE, METEOR等
  2. 基于词向量的方法:该方法基于词向量的方法,通过不同形式来计算生成文本和参考文本的相似度,从而比较模型质量的好坏
  3. 基于其他深度学习的方法:该方法则主要通过监督学习的方法,通过模型来模拟人的评估过程,比如:GAN,ADEM等

基于词重叠率的方法

基于词重叠率的方法是指基于词汇级别计算模型的生成文本和人工的参考文本之间的相似性,其中BLEU和METEOR常用于机器翻译任务,ROUGE常用于自动文本摘要。

BLEU

该指标认为机器翻译的效果越好,那么翻译出来的文本应该与人工给定的参考翻译有比较多的重叠之处,因此,通过计算生成文本与参考文本中共同出现的n-gram来计算两者的相似度。

修正的n-gram精确度

在介绍BLEU指标的计算公式前,先介绍一个指标,即修正的n-gram精确度(Modified n-gram precision),我们知道,在考察模型生成的文本的质量时,我们习惯会将模型生成的文本与人工的参考文本进行对比,如果生成的文本与人工的参考文本有比较多的重复片段时,则认为两者越相似。因此,按照这种思想,我们会想到用n-gram精确度来计算两个文本之间的相似性,即生成的文本中出现在参考文本中的n-gram的次数总和在生成文本中所有n-gram次数总和的占比,这个占比越高,则说明相似性越高,但是,如果直接采用这样的计算方式,会出现一个问题,可以看下面一个机器翻译中极端的场景:

  • Candidate: the the the the the the the.
  • Reference 1: The cat is on the mat.
  • Reference 2: There is a cat on the mat.

给定一个模型生成的翻译文本和两个参考翻译文本,此时,模型生成的文本全是“the”,如果采用1-gram精确度计算的话,则此时计算出来的精确度为7/7,但是这时生成的文本质量其实是不好的,因此,BLEU提出了一种修正的方式,即修正的n-gram精确度:

\[P_n = \frac{\sum_{ngram\in C}Count_{clip}(ngram)}{\sum_{ngram\in C}Count(ngram)} \]

其中,\(Count_{clip}(ngram) = min(Count,Max refrence count)\),即对于分子的计算,这时会对那些出现在参考文本中的n-gram,只取生成文本中出现的次数和参考文本中出现的最大次数两者之间的最小值,即对于上面的案例,采用修正的1-gram精确度计算的值应该是2/7,这样一来,那些重复出现的n-gram也会得到一个相对比较低的精确度。通过上面的公式,可以推广到2-gram、3-gram、4-gram等,作者在实验中一般会计算到4-gram,然后对四者得到的精确度进行加权平均,但是我们知道,随着n nn的增大,计算得到的精确度肯定越来越小,如果直接对它们进行加权平均可能会导致后面的n-gram的贡献值会比较小,因此,作者对他们先取了对数,然后再进行平均,即:

\[exp(\sum^{N}_{n=1}w_n logp_n) \]

简短惩罚(Brevity Benalty,BP)

不过,单独采用上面修正的n-gram精确度进行计算还是会有问题,我们可以看下面一个案例:

  • Candidate: of the
  • Reference 1: It is a guide to action that ensures that the military will forever heed Party commands.
  • Reference 2: It is the guiding principle which guarantees the military forces always being under the command of the Party.
  • Reference 3: It is the practical guide for the army always to heed the directions of the party.

此时,模型生成的文本非常短,只有两个词汇,并且在参考文本中都包括这两个词汇,因此,采用上面的计算公式得到的精确度还是1,但是这显然是不合理的,因此,对于这种太短的文本,需要对他们施加一些惩罚,作者提出了如下的惩罚机制:

\[BP = \left\{\begin{matrix} 1, c>r\\ e^{(1-\frac{r}{c})}, c \le r \end{matrix}\right. \]

通过上面的的公式,我们在生成文本太短时对其进行惩罚;而当生成文本过长时,因为在ngram时就已经惩罚过了,所以这一步就不用考虑了。

BLEU的计算

计算公式如下:

\[BLEU = BP.exp(\sum^{N}_{n=1}w_nlog p_n) \]

可以发现,BLEU的取值范围为[0,1],当其取值越高时,表示生成文本的质量越好。

需要注意的是,BLEU由于只计算精确率,因此,要求生成的文本与真实文本之间有较多的重叠,比较适合于机器翻译任务中,但是对于其他任务,比如闲聊对话任务,由于回答有比较广的开放性,因此,很难要求生成文本与真实文本之间必须有重叠,此时采用BLEU就不见得是一种好的选择。

指针网络:pointer-network

指针网络多用于提炼摘要


传统的attention在seq2seq中的应用。


指针网络通过添加\(P_{gen}\)来改进网络。

posted @ 2022-03-18 23:04  蒋古诚  阅读(211)  评论(0)    收藏  举报