zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Seq2Seq2四个实验进行对比学习

学习 进行 对比 实验 四个
2023-09-11 14:20:00 时间

0 前言:

四个实验对比分析,第一个实验Encoder+LSTM(多层)+Decoder(最普通),Seq2Seq(Encoder+GRU(单层)+Decoder) 上下文向量仍然需要包含有关源句子的所有信息,共同学习(Decoder+Attention+Decoder) ,Packed Padded Sequences, Masking, Inference and BLEU

1 Seq2Seq(Encoder+LSTM(多层)+Decoder)

2 Seq2Seq(Encoder+GRU(单层)+Decoder)

即第二个实验使我们减少了一些压缩,我们的上下文向量仍然需要包含有关源句子的所有信息。

3 共同学习(Decoder+Attention+Decoder)

此实验实现的模型通过允许解码器在每个解码步骤中查看整个源句子(通过其隐藏状态)来避免这种压缩!它是如何做到的?它使用Attention。

注意首先通过计算注意向量𝑎(即源句子的长度)来进行。注意向量具有以下属性:每个元素在0和1之间,并且整个向量之和为1。然后,我们计算源句子隐藏状态𝐻的加权和,以获得加权的源向量𝑤。

w = \sum_{i}a_ih_i

3.1 Seq2Seq模型建立

首先,我们将构建编码器。与以前的模型类似,我们仅使用单层GRU,但是现在使用双向RNN。对于双向RNN,我们在每个层中都有两个RNN。前向RNN从左到右遍历嵌入的句子(下面以绿色显示),而后向RNN从右到左遍历嵌入的句子(深青色)。我们需要在代码中做的所有事情都是将bidirectional = True设置为“ true”,然后像以前一样将嵌入的句子传递给RNN

hidden的大小为[n层* num个方向,批处理大小,隐藏的昏暗],其中[-2,:,:]在最后的时间步长后(即在看到最后一个单词之后)给出顶层正向RNN隐藏状态在句子中)和[-1,:,:]在最后的时间步之后(即在看到句子中的第一个单词之后)给出顶层后向RNN隐藏状态。

由于解码器不是双向的,因此只需要一个上下文向量𝑧即可将其用作初始隐藏状态𝑠0,而我们目前有两个,向前和向后一个(𝑧→=ℎ→𝑇和𝑧←= ℎ←𝑇)。我们通过将两个上下文向量串联在一起,将它们穿过线性层and并应用tanh激活函数来解决此问题。

z=\tanh(g(h_T^\rightarrow, h_T^\leftarrow)) = \tanh(g(z^\rightarrow, z^\leftarrow)) = s_0

 

当我们希望模型回顾整个源语句时,我们返回输出,源语句中每个标记的堆叠的向前和向后隐藏状态。我们还返回了hidden,这是我们在解码器中的初始隐藏状态。

3.1.1 Encoder

3.1.2Attention:

接下来是Attention层。这将采用解码器的先前隐藏状态𝑠𝑡−1,以及来自编码器all的所有堆叠的向前和向后隐藏状态。该层将输出一个注意向量𝑎𝑡,即源句子的长度,每个元素在0到1之间,并且整个向量之和为1。

直观地讲,该层采用到目前为止已解码的𝑠𝑡−1以及所有已编码的𝑠𝑡−1来产生向量𝑎𝑡,该向量表示源句中我们应按顺序注意最多的单词正确预测下一个要解码的字𝑡+ 1。

首先,计算先前解码器隐藏状态和编码器状态之间的能量

E_t = \tanh(\text{attn}(s_{t-1}, H))

可以将其视为计算每个编码器隐藏状态与先前解码器隐藏状态“匹配”的程度。

\hat{a}_t = v E_t

将v视为所有编码器隐藏状态下能量的加权总和的权重。

最后,我们确保注意力向量符合使所有元素在0到1之间且向量通过softmax层求和为1的约束。

a_t = \text{softmax}(\hat{a_t})

如下所示。这是用于计算第一关注向量,其中St-1 =𝑠0=𝑧。绿色/茶色块代表前向和后向RNN的隐藏状态,注意力计算全部在粉红色块内完成。

代码实现

偏置实际上是对神经元激活状态的控制,本实验不进行偏置

关于偏置,请点击这里

3.1.3 Decode

解码器中包含Attention层, 含关注层注意,该关注层采取先前的隐藏状态𝑠𝑡−1,所有编码器隐藏状态𝐻并返回关注向量

然后,我们使用此注意力向量创建一个加权源向量,用weighted表示,它是使用hidden作为权重的编码器隐藏状态𝐻的加权和。

w_t = a_t H

然后将嵌入的输入字𝑑(𝑦𝑡),加权源向量𝑤𝑡和先前的解码器隐藏状态𝑠𝑡-1传递到解码器RNN中,并将𝑦𝑡(and)和𝑤𝑡连接在一起

s_t = \text{DecoderGRU}(d(y_t), w_t, s_{t-1})

\hat{y}_{t+1} = f(d(y_t), w_t, s_t)

然后,我们将𝑑(𝑦𝑡),𝑤𝑡和𝑠𝑡穿过线性层𝑓,以预测目标句子𝑦̂ +1中的下一个单词。这是通过将它们全部串联在一起来完成的。

 

 3.2 Seq2Seq

这是第一个不需要编码器RNN和解码器RNN具有相同隐藏尺寸的模型,但是编码器必须是双向的。

初始化权重

结果分析

计算参数数量,与上一个模型相比,参数数量增加了近50%

详细的实验讲解见这里

4.Packed Padded Sequences, Masking, Inference and BLEU

我们将为之前几个实验的模型添加一些改进-填充填充序列和遮罩。

Packed填充序列用于告诉我们的RNN跳过编码器中的填充令牌

屏蔽明确地迫使模型忽略某些值,例如对填充元素的关注。这两种技术通常都在NLP中使用

我们还将研究如何使用我们的模型进行推理,方法是给它一个句子,看看它将其翻译为什么,以及在翻译每个单词时确切注意的地方。

最后,我们将使用BLEU度量标准来衡量翻译质量

实验代码出处:

https://github.com/bentrevett/pytorch-seq2seq