【机器学习】【seq2seq模型与attention机制,Beam Search】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mystery_guest/article/details/82119527

Beam Search一张图来表示

贪心的做法:每次选择输出概率最大的那个单词,但是这样无法保证最终整体概率最大;而集束搜索每次会选择Beam个概率最大的单词(Beam表示每次选择单词数,本例中为3),然后进行下一步...直到最后会得到Beam个句子,挑出概率最大的那句就可以了。

seq2seq模型依赖于encode和decode两个模块。encoder用于对输入序列编码,decorder则是解码。

以一个翻译系统为例,将how are you翻译成法语中的comment vas tu。

encoder

输入序列是how are you.每个单词都是一个vector,每个vector维度为d,,因此,输入矩阵就是一个d*3的维度。然后通过LSTM来存信息:每个隐藏层的输出为[e0,e1,e2](e=e2)

decoder

因此,我们就有了向量e,代表输入的句子的意思。我们接下来用e翻译成目标句子。我们将e作为隐藏状态和输入序列句末的SOS向量作为输入,输入到decorder的第一层。经过第一层LSTM计算出需要输出的隐藏状态,然后我们通过一个能够转化的函数g:,所以,所以s0是一个和词汇表维度相同的向量。

将s0通过一个softmax得到p0,获得概率向量,因此"comment"单词就有了最高的概率(,i0就代表了"comment"的位置)。得到一个相关的向量,重复这个过程:下一层LSTM将h0和w_comment作为输入,输出概率向量p1,计算出第二个单词。

当预测到句子末尾时decording过程结束。

因此,上述方法生成下一个单词就是根据之前的信息:

通过之前计算得出的ht,yt,e

Seq2Seq2 with Attention

但是,当处理很长的句子时,上面的模型就很不好。句子过长,要想用e来存下前面整个句子,往往效果很差。就类似于人一样,对于一大段话,不可能一直读到最后才翻译,肯定是读一句,翻译一句。为此引入了attention机制。

Attention机制强调了模型的每个输出单词分配在输入单词的权值或者称注意力,并不仅依赖于decorder中LSTM输出的隐藏向量。我们重写一下上面的公式,添加一个新的向量c_t。

c_t就是注意力向量(或者称为上下文向量)。如何计算这个c_t呢?

首先,存在一个函数,对于encorder阶段的每个e_t'都计算着的函数,会得到输入单词数量个a_t'向量,然后用对每个通过softmax得到,然后与每个e_t'做点积相加,作为平均权重,即得到c_t。

其中f函数有多种,但通常取如下函数:

我们的目标是将how are you翻译成法语中的comment vas tu。因此,我们想要在生成'vas'的时候,能尽量接近1,而其他单词概率接近0()。

Training

在训练的过程中,如果我们使用目标输出作为下一时间步的输入,那么误差会累积,模型也很难接近正确结果,训练速度与收敛速度也会变慢。所以,为了加快收敛速度一种方法就是将实际预测的输出作为decorder阶段下一个时间步的输入,来预测下一个时间步的输出。

decoder中每一个时间步的输出是一个概率向量,给定一个目标输出序列后,通过一次正向传播,就可以 得出预测的目标序列的概率:

式中,代表在decoder第i个时间步中,输出第yi个单词的概率。因此,根据公式即可得到目标序列的概率了。我们想训练最大化这个概率。就需要最小化以下式子:

在我们的例子中,就相当于

定义交叉熵作为损失函数:我们就要最小化目标输出概率与预测输出概率的差值。

Beam Search在Decoder测试中的作用

我们之前讲过,将当前时间步概率最大结果作为下一个时间步的输入,这是一种贪心的算法。

但是,这样的做法并不好,比如,生成单词a的概率最大,然后作为下一个时间步的输入再生成b,如此直到eos.但我们需要的是一个序列概率的最大值。

因此,就需要用到Beam Search算法。束搜索相当于优化版的贪心,它每次并不是只取最大的一个,而是取最大的k个(我们把这里的k称为beam size)每一步都选择概率最大的k个。例如词汇表有a,b,c,d,e,f,g,h这9个单词,设置k=2,第一个时间步选择概率最大的两个词,假设为a,b,那么下一个时间步,则有aa,ab,ac,ad...ah,ba,bb,bc...bh这18中可能,总共即k*V种可能(k表示beam size,V表示词汇表中词数),然后,再挑选出2个概率最大的组合,假设为ab,bd,如此反复。

我们定义Ht存了t时间步个的输出序列集合

在之前的例子中,如果k=2,那么H2可能为:

我们假设最后一步的结果,为,即最终可能的序列的情况,那么

最后总共有k*V种,继续挑选出k个最高得分。

最终,选出一个概率最高的序列,作为最终输出序列。但是Beam Search也并不是全局最优,而是一种优化的局部最优。由于处理效率原因,Beam Search也为一种比较好的算法。

猜你喜欢

转载自blog.csdn.net/mystery_guest/article/details/82119527