Transformer pytorch 代码解读(3)Decoder

目录

0.总览整个Decoder

1.词编码和位置编码

 2.各种atten矩阵

3.进入DecoderLayer层


0.总览整个Decoder

decoder需要用到的参数是

1.dec_inputs(2,6)

2.enc_inputs(2,5)

3.enc_outputs(2,5,512)

 decoder也有词编码和位置编码,这里的词编码和位置编码是复用的encoder的所以重点应该是放在decoder层的特有的东西。

 

1.词编码和位置编码

红色部分执行的就是对目标输入的词编码和位置编码,在这里采用的目标的数据的维度是(2,6),所以在进行词编码和位置编码后的维度是(2,6,512)

 2.各种atten矩阵

在这一部分主要是得到了两个东西。

1.dec_self_attn_mask:是一个上三角的矩阵,也就是说在进行自回归的时候防止后面信息进行传递来使用的。

2.dec_enc_attn_mask:是由(dec_inputs, enc_inputs)做相乘得到的。

 

1.经过这一步dec_self_attn_pad_mask = get_attn_pad_mask(dec_inputs, dec_inputs).cuda(),得到的是如下的矩阵。
abcP
aFFFT
bFFFT
cFFFT
PFFFT

2.经过这一步得到的是掩盖的矩阵,也就是为了防止之后信息造成影响的矩阵。如下图所示dec_self_attn_subsequence_mask = get_attn_subsequence_mask(dec_inputs).cuda()
abcP
a0111
b0011
c0001
P0000

3.dec_self_attn_mask = torch.gt((dec_self_attn_pad_mask + dec_self_attn_subsequence_mask), 0).cuda()

先变成这样 

abcP
a0112
b0012
c0002
P0002

再变成这样

abcP
a0111
b0011
c0001
P0001

这样既消除了pad的影响,又消除了某个单词之后的单词对预测这个单词的影响。 

4.dec_enc_attn_mask = get_attn_pad_mask(dec_inputs, enc_inputs),这个矩阵dec_inputs是(2,5),enc_inputs是(2,6),最终的dec_enc_attn_mask是(2,6,5)

3.进入DecoderLayer层

 

dec_outputs, dec_self_attn, dec_enc_attn = 
layer(dec_outputs, enc_outputs, dec_self_attn_mask, dec_enc_attn_mask)

这一层用到了

1.dec_outputs:这是经过词编码和位置编码的输出,维度是(2,6,512)。

2.enc_outputs:这是经过层层encoder进行的输出是源数据的编码,维度是(2,5,512)

3.dec_self_attn_mask:是消除了后续影响的矩阵,维度是(2,6,6)

4.dec_enc_attn_mask:是两个inputs做的矩阵,维度是(2,6,5)也就是(2,6)和(2,5)的相乘。

将layer和里面的参数对一下

 发现进入decoder层的输入就是

1.dec_inputs = decoder_outputs里面的经过词编码和位置编码的输出,是(2,6,512)维度的数据,

2.enc_outputs是(2,5,512)的数据,其他两个是:

3.dec_self_attn_mask:是消除了后续影响的矩阵,维度是(2,6,6)

4.dec_enc_attn_mask:是两个inputs做的矩阵,维度是(2,6,5)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Transformer是一种用于序列到序列(seq2seq)模型的神经网络架构,最初用于机器翻译任务。它由Google在2017年提出并被广泛应用于自然语言处理任务中,如文本分类、机器翻译、对话生成等。PyTorch是一种基于Python的开源机器学习框架,因其易用性和灵活性而备受欢迎。 在PyTorch中,可以使用torch.nn.Transformer模块实现Transformer模型,具体代码实现可以参考以下步骤: 1. 安装PyTorch库 ```python pip install torch ``` 2. 导入相关库和模块 ```python import torch import torch.nn as nn from torch.nn import TransformerEncoder, TransformerEncoderLayer ``` 3. 构建TransformerEncoderLayerTransformerEncoder ```python class TransformerModel(nn.Module): def __init__(self, ntoken, ninp, nhead, nhid, nlayers, dropout=0.5): super(TransformerModel, self).__init__() self.model_type = 'Transformer' self.src_mask = None self.pos_encoder = PositionalEncoding(ninp, dropout) encoder_layers = TransformerEncoderLayer(ninp, nhead, nhid, dropout) self.transformer_encoder = TransformerEncoder(encoder_layers, nlayers) self.encoder = nn.Embedding(ntoken, ninp) self.ninp = ninp self.decoder = nn.Linear(ninp, ntoken) def _generate_square_subsequent_mask(self, sz): mask = (torch.triu(torch.ones(sz, sz)) == 1).transpose(0, 1) mask = mask.float().masked_fill(mask == 0, float('-inf')).masked_fill(mask == 1, float(0.0)) return mask def forward(self, src): if self.src_mask is None or self.src_mask.size(0) != len(src): device = src.device mask = self._generate_square_subsequent_mask(len(src)).to(device) self.src_mask = mask src = self.encoder(src) * math.sqrt(self.ninp) src = self.pos_encoder(src) output = self.transformer_encoder(src, self.src_mask) output = self.decoder(output) return output ``` 以上是一个简单的Transformer模型的实现,其中包括了多个层。 TransformerEncoderLayerTransformerEncoder是其中两个主要的层。 TransformerEncoderLayer使用多头注意力机制和前馈网络来处理输入序列。 TransformerEncoder将多个TransformerEncoderLayer层堆叠在一起来增加模型的深度。 以上就是一个简单的Transformer模型的PyTorch代码实现,如果有任何疑问或需要进一步了解,欢迎继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值