seq2seq and Attention(一)

seq2seq and Attention(一)

声明:本文为学习https://lenavoita.github.io/nlp_course/seq2seq_and_attention.html 的笔记。喜欢阅读英文原文的请自行跳转。

最流行的sequence-to-sequence(序列到序列) 任务是翻译:也就是说从一个自然语言到另一个自然语言。如下图所示:
翻译
在过去的几年中,商业系统在机器翻译方面变得出乎意料的出色,例如Google TranslateYandex TranslateDeep Translate等。今天我们将学习这些系统的核心部分。

除了流行的在自然语言中的机器翻译,也可以对编程语言进行翻译,或者对任何的token序列你可以想到的。从现在开始,对于机器翻译,我们指的就是任何的sequence-to-sequence任务,也就是说在任何的tokens中进行翻译。

##基础的 sequence to sequence

一般的,在机器翻译任务中,我们有一个输入序列x1,x2,…,xm,一个输出序列y1,y2,…,yn(输入与输出序列的长度可能不同)。翻译可以认为是寻找与输入序列最接近的目标序列。目标序列可以看做最大化条件概率p(y|x):y*=argmax p(y|x)。

如果你掌握了另一门的语言,并且可以可以很好的在两个语言进行翻译,你就会有一个关于p(y|x)的直觉,你或许这样形容这个直觉“emmm…,这个句子这样翻译会更自然一些”。但是在机器翻译中,我们学习一个函数p(y|x,theta) 带有一些参数,theta,然后找到基于输入序列的最大的y:y*=argmax p(y|x,theta).
在这里插入图片描述
定义一个机器翻译系统,我们需要回答下边这三个问题:

model----这个模型p(y|x,theta)是怎样的?
learning----如何找到参数theta?
inference----如何找到最好的y?

在本节中我们将会在最简单的model下回答第二和第三个问题,更“真实”的模型会在Aattention 和Transformer中讨论。

编码解码框架(Encoder-Decoder Framework)

编码-解码是标准的sequence-to-sequence 任务的标配。这个框架包含两个部分:
编码器:读取原序列产生源输入的表示
解码器:使用从编码器来的表示产生目标序列

编码器-解码器

在这个文章里,我们可能会看到不同的模型,但他们都有encoder-decoder结构。

条件语言模型

语言模型的文章中,我们学习了去估计一个序列是y1,y2,…,yn的p(y)的概率。语言模型估计的是关于一个序列的y的非条件概率p(y),而sequence-to-sequence任务可以被认为是条件语言模型(CLM)-他的操作与语言模型很像,但是额外接收了源信息x。
CLM
注:条件语言模型不仅可以被认为是sequence-to-sequence任务的解决方案。更一般的说,x除了输入序列也可以是其他的东西。例如在“图像字幕”任务中,x就可以认为是图片,y是对图片的描述。

由于sequence-to-sequence与LM唯一的不同就是输入x的出现,模型和训练都与language model 即语言模型很相似。一般情况下,大致的训练流程如下所示:
将源序列和已经产生的目标序列输入到一个神经网络中。
从网络编码器中得到刚刚输入的向量表示(包括源输入和已经产生的目标序列)
从向量表示中预测下一个文本的概率分布。

在这里插入图片描述
和神经网络分类器一样和语言模型一样,我们可以用一个很简单的角度来认为分类部分(例如:如何得到一个token的概率分布从一个文本的向量表示中?)向量表示文本可能是d维的,而最后,我们需要一个|V|维的向量(V个tokens 或者类的概率分布)。为了从d维的向量得到一个|V|大小的向量,我们可以使用一个线性层,一旦有了|V|大小的向量,剩下的事情就是使用softmax函数将每一行的值变为概率分布。

最简单的模型:两个RNN分别是encoder和decoder

两个RNN
最简单的encoder-decoder模型由两个RNN(LSTM)组成:一个用作编码器另一个用作解码器。编码器读入源序列,最后的状态用作解码器的初始状态。我们的希望是最后的编码器状态“编码”了所有的输入序列的信息,并且解码器可以根据这个表示产生目标序列。

模型可以有不同的修改:例如:解码器和编码器可以有很多层。在论文Sequence to Sequence Learning with Neural Networks 中就实现了多层的编码器和解码器。这个论文是首先尝试使用神经网络解决sequence-to-sequence任务的论文之一。

也是在这个论文中,作者查看了最后的编码状态,并对几个例子做了可视化。有趣的是,有着相似意思但是结构不同的向量表示离得很近。
在这里插入图片描述

训练:交叉损失

注:这部分与语言模型的损失部分是一致的,如果你了解了语言模型的损失函数,你可以跳过此部分或者很快的浏览这部分。

与语言模型相似,神经seq2seq模型是被训练去预测下一个token的概率分布在给定的前文的基础上(源序列和已知的目的序列)。自然的,在每一步,我们都最大化模型标定正确序列的概率。

一般的,我们假设我们在源序列x=(x1,x2,…,xm),以及目标序列是y=(y1,y2,…yn)上左训练。在每一步t中,模型预测的是:
在这里插入图片描述
这一步的目标是:p*=one-hot(yt).也就是说,我们想要模型将正确的token概率预测为1,剩下的错误的都为0。

标准损失函数是交叉熵损失函数。

在这里插入图片描述
因为每一步中只有一个Pi*不是0,所以我们得到:
在这里插入图片描述
每一步中,我们都最大化正确的token的概率。
在这里插入图片描述

推断:贪婪解码(Greedy Decoding)和波束搜索(Beam Search)

现在我们已经知道了模型看起来是什么样的并且如何去训练模型。现在,让我们来思考一下如何使用这个模型进行翻译。模型计算一个句子的概率使用如下的公式:
在这里插入图片描述
现在主要问题变为了如何去找到argmax?

需要注意我们并不能找到确切的答案,我们需要检查的假设的数量是|V|的n次方,在实际操作中是不可行的。因此,我们需要找到一个一个近似解。

注:在实践中,采用精确解法比使用近似解法会更差

直接的解码策略是贪心解码----在每一步,采用概率最大的token。这可以是一个好的基准,但是这种方法有固有的缺陷:在当前步骤最好的token并不一定会带来最好的序列。

在这里插入图片描述
波束搜索:追踪最有可能的几个假设
如果我们在每一步保持几个假设。每一步中,我们将继续每一个假设选择他们之前的前N个,这就叫做波束搜索
通常,波束的大小是4-10。增加波束的大小事效率低的,更重要的,会导致更坏的结果出现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值