python-pytorch seq2seq+luong attention笔记1.0.10

记录

  • 2024年5月14日09:27:39----0.5.10
  • 2024年5月14日11:32:47----0.5.12
  • 2024年5月14日11:51:03----1.0.0
  • 2024年5月15日13:57:25----1.0.3
  • 2024年5月19日16:21:17----1.0.10

1. LSTM模型的数据size

一定是按这个来:维度(batch_size, seq_length, embedding_dim) 是一个三维的tensor;其中,batch_size指每次输入的文本数量;seq_length指每个文本的词语数或者单字数;embedding_dim指每个词语或者每个字的向量长度。

2. 关于LSTM的输入数据包含hn和cn时,hn和cn的size

LSTM的输入数据是上个时间窗的hn和cn时,hn和cn的size要求一定是和LSTM模型参数吻合。公式是(laynum,batchsize,hidden or embeding size)或者(batchsize,hidden or embeding size)。

3. LSTM参数中默认batch_first

其实改变的是模型的hn和cn的size,不改变output的size。因为,cn和hn的size是和batch_size有关系的,是layernum、batch_size、hidden_size

4. Attention机制的三种算法

这里使用的是luong的attention,计算权重的方法有dot 、general、concat三种,常见使用general算法。

general大概思路是:
计算分数:decoder中LSTM的output和encoder的output做bmm计算
计算权重:将计算出来的分数做softmax,得到行上的概率分布或者权重
计算新向量:将权重和encoder的outpu再做bmm计算
拼接decoder的output和新向量
对新的拼接结果做tanh计算
最后全连接到vocab_size

5. decoder中使用注意力的步骤

  • 计算分数score
  • 计算权重at
  • 计算新的context向量ct
  • 拼接ct和decoder_ht
  • 做tanh计算
  • 使用tanh结果做全连接预测

6. 模型的编码器

思路很简单,就是将word2index后,通过embedding,将数据给LSTM模型就可以了,返回的是 LSTM的output、hn、cn。
当前你可以根据自己的习惯,在使用LSTM时候增加参数batch_fist或者bidirectional。

此时inputx的是word2index后的数据。

class encoder(nn.Module):
    def __init__(self):
        super(encoder, self).__init__()
        self.embedding=nn.Embedding(vocab_size,n_hidden)
        self.lstm=nn.LSTM(n_hidden,n_hidden*2,batch_first=False)
        
    def forward(self, inputx):
        embeded=self.embedding(inputx.long())
        output,(encoder_h_n, encoder_c_n)=self.lstm(embeded.permute(1,0,2))
        return output,(encoder_h_n,encoder_c_n)

7. 模型的解码器

将解码器的输入embedding后,加上编码器的outout、hn、cn,给LSTM模型输出ouput、hn、cn,做general的attention,最终返回新的LSTM的output、hn、cn。

class lstm_decoder(nn.Module):
    def __init__(self):
        super(lstm_decoder, self).__init__()
        self.embedding=nn.Embedding(vocab_size,embedding_size)
        self.decoder = nn.LSTM(embedding_size, n_hidden * 2, 1,batch_first=False)
        self.fc = nn.Linear(n_hidden * 2, num_classes)
 
    def forward(self, input_x, encoder_output, hn, cn):
        embeded=self.embedding(input_x)
        decoder_output, (decoder_h_n, decoder_c_n) = self.decoder(embeded.float().permute(1,0,2), (hn, cn))
       
        decoder_output = decoder_output.permute(1, 0, 2)
        encoder_output = encoder_output.permute(1, 0, 2)

		# 下面是实现attention编码
		
        # 计算分数score
        decoder_output_score = decoder_output.bmm(encoder_output.permute(0,2,1))
        # 计算权重at
        at = nn.functional.softmax(decoder_output_score, dim=2)
        # 计算新的context向量ct
        ct = at.bmm(encoder_output)
        # 拼接ct和decoder_ht
        ht_joint = torch.cat((ct, decoder_output), dim=2)
        # 做tanh计算
        fc_joint = torch.tanh(self.att_joint(ht_joint))
        # 全连接做预测
        fc_out = self.fc(fc_joint)
        
		# 实现attention编码结束
        return fc_out, decoder_h_n,
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一种深度学习框架,可以用于实现序列到序列(seq2seq)的机器翻译任务。在seq2seq模型中,编码器将源序列编码为一个固定长度的向量,解码器则将该向量解码为目标序列。为了提高翻译质量,可以使用注意力机制来在解码器中引入上下文信息。 在PyTorch中实现seq2seq模型,可以使用nn.Module类来定义模型架构。首先,需要定义编码器和解码器的结构。编码器通常使用循环神经网络(RNN)或卷积神经网络(CNN)进行实现,而解码器则需要使用注意力机制。注意力机制可以使解码器关注输入序列中最相关的部分并根据其进行翻译。 实现注意力机制时,需要计算每个输入序列位置和当前解码器状态之间的相似度。这可以通过计算点积或使用神经网络来实现。然后,可以将相似度作为权重,对输入序列进行加权求和,以计算上下文向量。最后,将上下文向量与当前解码器状态组合在一起,以生成下一个目标序列符号的概率分布。 在训练过程中,可以使用交叉熵损失函数来计算模型输出与正确目标序列之间的差异,并使用反向传播算法更新模型参数。在推理过程中,可以使用贪婪搜索或束搜索来生成翻译结果。 总的来说,PyTorch提供了一种灵活且高效的方式来实现seq2seq模型和注意力机制,可以用于各种自然语言处理任务,包括机器翻译、问答系统和对话生成等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值