问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

了解并实现一个Transformer Block

创作时间:
作者:
@小白创作中心

了解并实现一个Transformer Block

引用
CSDN
1.
https://blog.csdn.net/qq_36803941/article/details/138795224

Transformer Block是Transformer模型的核心组件之一,它包含了多头注意力机制和前馈神经网络等关键模块。本文将详细介绍Transformer Block的结构,并提供具体的代码实现,帮助读者深入理解这一重要模型组件。

1. 前言

什么是Transformer?如果希望深入理解可以参考:

  • 《NLP深入学习:大模型背后的Transformer模型究竟是什么?(一)》
  • 《NLP深入学习:大模型背后的Transformer模型究竟是什么?(二)》

本文主要介绍常常听到的Transformer Block的概念,以及如何实现一个Transformer Block。

2. Transformer Block

回顾一下Transformer的完整模型:

我们常说的Transformer Block对应图中解码器的上部分。为了具体展示流程,我们假设有一句话:“Every effort moves you”作为输入,经过蓝色框中的Transformer Block之后输出,如下图:

图中蓝色的部分就是所谓的Transformer Block。

3. 代码实现

BERT源码已经实现了Transformer的细节,完整源码参考Pytorch Bert,这里把Transformer Block实现的框架贴出来:

import torch.nn as nn
from .attention import MultiHeadedAttention
from .utils import SublayerConnection, PositionwiseFeedForward

class TransformerBlock(nn.Module):
    """
    Bidirectional Encoder = Transformer (self-attention)
    Transformer = MultiHead_Attention + Feed_Forward with sublayer connection
    """
    def __init__(self, hidden, attn_heads, feed_forward_hidden, dropout):
        """
        :param hidden: hidden size of transformer
        :param attn_heads: head sizes of multi-head attention
        :param feed_forward_hidden: feed_forward_hidden, usually 4*hidden_size
        :param dropout: dropout rate
        """
        super().__init__()
        self.attention = MultiHeadedAttention(h=attn_heads, d_model=hidden)
        self.feed_forward = PositionwiseFeedForward(d_model=hidden, d_ff=feed_forward_hidden, dropout=dropout)
        self.input_sublayer = SublayerConnection(size=hidden, dropout=dropout)
        self.output_sublayer = SublayerConnection(size=hidden, dropout=dropout)
        self.dropout = nn.Dropout(p=dropout)
    
    def forward(self, x, mask):
        x = self.input_sublayer(x, lambda _x: self.attention.forward(_x, _x, _x, mask=mask))
        x = self.output_sublayer(x, self.feed_forward)
        return self.dropout(x)

4. 参考

  • 《NLP深入学习:大模型背后的Transformer模型究竟是什么?(一)》
  • 《NLP深入学习:大模型背后的Transformer模型究竟是什么?(二)》
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号