CS22N 学习笔记(七)NMT seq2seq attention

Machine Translation

采用机器,将源语言翻译成目标语言。
在这里插入图片描述

Statistical Machine Translation (统计机器翻译)

翻译模型的实质是给了原语言 x x x,计算目标语言序列 y y y的概率:
在这里插入图片描述
利用贝叶斯法则可以将上述概率分解为:
在这里插入图片描述
根据课程的解释,左边 P ( x ∣ y ) P(x|y) P(xy)是一个翻译模型,将词和短语进行对照翻译,右边 P ( y ) P(y) P(y)是一个语言模型,用于生成流畅的目标语言。如图所示:
在这里插入图片描述
进行机器翻译需要大量的并行数据的语料库,之后计算 P ( x ∣ y ) P(x|y) P(xy),这里继续拆分,考虑 P ( x , a ∣ y ) P(x,a|y) P(x,ay)
a是alignment,表示目标语言y和源语言x的一种对应关系,包括一对一,多对多等很多关系。
在这里插入图片描述
在这里插入图片描述
去计算 P ( x , a ∣ y ) P(x,a|y) P(x,ay)是要考虑很多东西,如图了解一下:
在这里插入图片描述
接着需要寻找概率的最大值 a r g m a x y {argmax}_y argmaxy,用的是探索式的搜索算法(heuristic search algorithm),这一过程又叫解码(decoding),如图所示:
在这里插入图片描述
在这里插入图片描述
统计机器翻译的问题:太复杂,其中特征点特别多,还有很多的子系统,耗费大量的人力物力。(课程里面仅是介绍,所以基本也没说太明白)。

Neural MachineTranslation

NMT它由两个RNN组成,分别是encoderRNN和DecoderRNN。encoderRNN负责输入,将源语言序列分时间步输入到RNN中进行编码,最终得到一个隐藏层,作为DecoderRNN的初始状态。DecoderRNN作为解码,是一个语言模型。每一个时间步输出一个结果(概率分布),将这个结果作为下一个时间步的输入,这样直到输出完整的句子。
在这里插入图片描述
NMT采用的是seq2seq模型,许多NLP的都用到了seq2seq模型,比如:

  • 总结(长文本→短文版)
  • 对话(之前的话→之后的话)
  • parsing(输入文本→输出parse)
  • 代码生成(自然语言→python代码)

seq2seq是一种条件语言模型,因为它在之前给定了一些条件,然后输出语言序列。

NMT其实是直接计算概率 P ( y ∣ x ) P(y|x) P(yx),如图:
在这里插入图片描述
可以理解为,NMT把已知前面的词计算后面的词的条件概率求出来了,然后相乘得到总的概率。

Training a Neural MachineTranslation system

训练NMT模型是,encoder部分不变,decoder部分原来的输入由前一个时间步的输出改为固定的输入。之后一样计算代价函数 J J J,然后对反向传播求导数,更新参数,如图所示:
在这里插入图片描述

搜索最佳的输出序列

前面说到了NMT最终要求 P ( y ∣ x ) P(y|x) P(yx)的最大值,但它的输出是单个的条件概率,所以要通过这写条件概率计算 P ( y ∣ x ) P(y|x) P(yx)的最大值。
一种搜索的方法是贪婪搜索,取每一个条件概率的最大值作为输出的单词,如图:
在这里插入图片描述
这样有个问题,这个只是单步的最大值,由于每一步选择不同的词,所以总的概率不一定是最大值。
另外一个思路是穷尽的搜索方法,每个都选,最后再比较选择总概率的最大值,但是这种方法计算代价太大。

Beam search decoding

在解码的每一步,总的取k个最大的可能的选择,k成为beam size(通常大小在5-10之间)。
这里评价的得分是对数概率(其实就是原本概率相乘,取对数变成相加),得分公式如图所示:
在这里插入图片描述
得分全都是负的,并且越大越好。

以k=2为例,课程介绍了整个的decoderRNN解码的过程,如图所示:
在这里插入图片描述
这种方法也会出现问题,有的句子会输出提前结束,有的句子会拖很长都不结束,因此需要指定一个结束的标准。
在beam search 算法中,当序列的提前输出end后,我们把这个输出结束的序列给储存下来用于之后的比较。
然后指定比如搜寻时间步T步后结束搜索,或者已经得到n个完成的句子后结束搜索。
结束搜索后,把所有的句子(hypothesis)拿出来,比较
score。
这个score也有点问题,它倾向于给短的句子高评分,因此需要平均一下句子长度:
在这里插入图片描述

NMT模型的优缺点:

NMT模型相对于SMT有很多优点:

  • 更好的性能(更流程,更好的利用文本,更好的词语间的相似性)
  • 它是一种直接的,端到到的优化(没有其余的子系统)
  • 它耗费更少的人力物力(没有定义很多的预压特点,对所有的语言对通用)

NMT模型也有很多缺点:

  • 它不太可说明( less interpretable)(难以调试)
  • 它难控制(无法改变它的翻译的风格等)

How do we evaluateMachine Translation?

采用BELU((Bilingual Evaluation Understudy)得分。
现在有一个机器翻译的结果,和一个人工翻译结果。通过n-gram和惩罚较短的机器翻译,建立一个相似性的score评分。

Attention模型

常规的seq2seq模型有一个瓶颈(bottleneck problem)问题:
所有的输入的序列的信息最终都包含在一个encoderRNN中的隐藏状态,然后再由这个隐藏状态去生成输入序列。这样原语言序列会导致很久之前时间步信息无法充分提取。如图所示:
在这里插入图片描述
为了更好的解决这个问题,提出了attention模型。
模型步骤:

  • 首先,把decoderRNN的一个隐藏层和encoder的所有隐藏层做内积,得到attentionscore
  • 接着对所有attentionscore做softmax处理,得到attention的分布。
  • 接着我们将attention分布分别乘以encoder的隐藏层,并求和得到attentionoutput
  • 然后这个attentionoutput跟decoderRNN中的那个隐藏层做连接,用它作为新的decode的隐藏层输出y。
    在这里插入图片描述
    公式如图:
    在这里插入图片描述

attention 模型取得了很好的效果:

  • 它显著改善了NMT模型的表现。
  • 它解决了seq2seq模型中的瓶颈问题。
  • 它中间相当于加入了跳远连接,缓解了梯度消失问题。

Attention is a general Deep Learning technique

attention在各种深度学习模型中有着广泛的应用。
比如:如果有一个vector value得集合,有一个vector query,attention方法就是根据query计算得到一个value的和的权重。
在这里插入图片描述
如图是更通用的注意力模型的步骤:
在这里插入图片描述
对于attentionscore,有多种计算方法,如图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用seq2seq模型实现注意力机制的代码中,首先需要指定超参数,如embed_size、num_hiddens、num_layers、dropout等。然后需要实例化一个带有Bahdanau注意力的编码器和解码器,并对模型进行机器翻译训练。训练过程中,由于引入了注意力机制,训练速度可能比没有注意力机制的seq2seq模型要慢得多。 下面是代码示例: ```python import d2l # 指定超参数 embed_size, num_hiddens, num_layers, dropout = 32, 32, 2, 0.1 batch_size, num_steps = 64, 10 lr, num_epochs, device = 0.005, 250, d2l.try_gpu() # 加载数据 train_iter, src_vocab, tgt_vocab = d2l.load_data_nmt(batch_size, num_steps) # 实例化编码器和解码器 encoder = d2l.Seq2SeqEncoder(len(src_vocab), embed_size, num_hiddens, num_layers, dropout) decoder = d2l.Seq2SeqAttentionDecoder(len(tgt_vocab), embed_size, num_hiddens, num_layers, dropout) # 实例化seq2seq模型 net = d2l.EncoderDecoder(encoder, decoder) # 训练seq2seq模型 d2l.train_seq2seq(net, train_iter, lr, num_epochs, tgt_vocab, device) ``` 在这段代码中,我们使用d2l库提供的Seq2SeqEncoder和Seq2SeqAttentionDecoder类来实例化编码器和解码器,然后使用这两个实例构建一个编码器-解码器模型。最后,使用d2l库提供的train_seq2seq函数进行训练。 注意:这段代码只是一个示例,具体的实现细节可能会有所不同,需要根据具体的库和框架进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值