Transformer代码阅读——手写Decoderlayer(网课)

原作者视频链接:

【研1基本功 (真的很简单)注意力机制】手写多头注意力机制_哔哩哔哩_bilibili先看文档哈 https://dwexzknzsh8.feishu.cn/docx/VkYud3H0zoDTrrxNX5lce0S4nDh?from=from_copylink慢慢更新,一周更完transformer同步更新RLHF、LoRA, 视频播放量 77272、弹幕量 52、点赞数 1996、投硬币枚数 1202、收藏人数 7088、转发人数 391, 视频作者 happy魇, 作者简介 Enjoy life | 欢迎来到我的主页!,相关视频:注意力机制的本质|Self-Attention|Transformer|QKV矩阵,【深度学习缝合模块】废材研究生自救指南!12个最新模块缝合模块创新!-CV、注意力机制、SE模块,膜拜!浙大教授竟把Transformer讲的如此简单!全套【Transformer基础】课程分享,连草履虫都能学会!再学不会UP下跪!,【可视化】Transformer中多头注意力的计算过程,24种魔改注意力机制 暴力涨点 即插即用 CNN+注意力机制,Transformer论文逐段精读【论文精读】,【官方双语】直观解释注意力机制,Transformer的核心 | 【深度学习第6章】,【研1基本功 (真的很简单)Group Query-Attention】大模型训练必备方法——bonus(位置编码讲解),视觉十分钟|通道注意力原理(SENet,CBAM,SRM,ECA,FcaNet)|计算机视觉/通道注意力/总结分享,图神经网络改进-手把手教你改代码-第1期icon-default.png?t=N7T8https://www.bilibili.com/video/BV1o2421A7Dr/

1.Decoderlayer部分

class DecoderLayer(nn.Module):
    def __init__(self, d_model, ffn_hidden, n_head, drop_prob):
        super(DecoderLayer, self).__init__()
        self.attention1 = multi_head_attention(d_model, n_head)
        self.norm1 = LayerNorm(d_model)
        self.dropout1 = nn.Dropout(drop_prob)

        # cross attention
        self.cross_attention = multi_head_attention(d_model, n_head)
        self.norm2 = LayerNorm(d_model)
        self.dropout2 = nn.Dropout(drop_prob)

        self.ffn = PositionwiseFeedForward(d_model, ffn_hidden, drop_prob)
        self.norm3 = LayerNorm(d_model)
        self.dropout3 = nn.Dropout(drop_prob)

    # dec:解码器需要的输入信息 enc:从编码器当中传过来的信息
    # 最后两个参数是两个掩码块,一个是用来对padding的掩码(用来统一句子长度),第二个掩码是对未来信息的掩码(在解码的时候肯定不能看到真实的答案再去解码)
    # t_mask 是因果掩码,不希望在做attention的时候看到未来的信息 s_mask 是位置掩码,不需要关注到padding的信息
    def forward(self, dec, enc, t_mask, s_mask):
        _x = dec
        x = self.attention1(dec, dec, dec, t_mask) # 下三角掩码

        x = self.dropout1(x)
        x = self.norm1(x + _x)

        if enc is not None:
            _x = x
            x = self.cross_attention(x, enc, enc, s_mask)  # 用s_mask掩码,不需要关注padding信息

            x = self.dropout2(x)
            x = self.norm2(x + _x)

        _x = x
        x = self.ffn(x)

        x = self.dropout3(x)
        x = self.norm3(x + _x)

2.Decoder和Encoder做个集成

2.1 Encoder部分

# 做集成(把encoder和decoder都拼到一起)
class Encoder(nn.Module):
    # env_voc_size:需要编码的vocabulary的size大小 max_len:最大给他的长度
    # n_layer: 搭几层   device:把数据存到哪里
    def __init__(self, env_voc_size, max_len, d_model, ffn_hidden, n_head, n_layer, drop_prob, device):
        super(Encoder, self).__init__()

        self.embedding = TransformerEmbedding(d_model, max_len, env_voc_size, drop_prob, device)

        self.layers = nn.Modulelist(
            [EncoderLayer(d_model, ffn_hidden, n_head, drop_prob) for _ in range(n_layer)]
        )

    def forward(self, x, s_mask):
        x = self.embedding(x)
        for layer in self.layers:
            x = layer(x, s_mask)
        return x

2.2 Decoder部分

class Decoder(nn.Module):
    def __init__(self, dec_voc_size, max_len, d_model, ffn_hidden, n_head, n_layer, drop_prob, device):
        super(Encoder, self).__init__()

        self.embedding = TransformerEmbedding(d_model, max_len, dec_voc_size, drop_prob, device)

        self.layers = nn.Modulelist(
            [DecoderLayer(d_model, ffn_hidden, n_head, drop_prob) for _ in range(n_layer)]
        )

        self.fc = nn.Linear(d_model, dec_voc_size)

    def forward(self, dec, enc, t_mask, s_mask):
        dec = self.embedding(dec)
        for layer in self.layers:
            dec = layer(dec, enc, t_mask, s_mask)

        dec = self.fc(dec)
        return dec

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值