美文网首页
transformer初探

transformer初探

作者: sretik | 来源:发表于2024-04-25 23:20 被阅读0次

本文代码分析以哈佛大学NLP实验室实现的版本(https://github.com/harvardnlp/annotated-transformer)进行分析。

1.模型架构图

transformer.PNG

2.模型核心流程

2.1 模型整体流程

#模型定义
def make_model(
    src_vocab, tgt_vocab, N=6, d_model=512, d_ff=2048, h=8, dropout=0.1
):
    c = copy.deepcopy
    attn = MultiHeadedAttention(h, d_model)
    ff = PositionwiseFeedForward(d_model, d_ff, dropout)
    position = PositionalEncoding(d_model, dropout)
    model = EncoderDecoder(
        Encoder(EncoderLayer(d_model, c(attn), c(ff), dropout), N),
        Decoder(DecoderLayer(d_model, c(attn), c(attn), c(ff), dropout), N),
        nn.Sequential(Embeddings(d_model, src_vocab), c(position)),
        nn.Sequential(Embeddings(d_model, tgt_vocab), c(position)),
        Generator(d_model, tgt_vocab),
    )
    ...
    return model

 #模型使用
 model.forward(
    batch.src, batch.tgt, batch.src_mask, batch.tgt_mask
)

从上面可以看到,模型定义时主要时设置模型参数:第一个参数src_vocab是源语言词汇的个数,tgt_vocab是目标语言词汇的个数。N就是论文中说的Encoder和Decoder的个数,d_model就是embed的维度,d_ff是全连接的维度,h是Header的个数。

而模型在使用时,只需要传入4个参数:

src:待"翻译"语句,已经经过分词处理,并且每个词汇都表示为对应的数字,shape=(32,128),其中32为batch size,下同。

src_mask:因为对源语句进行了补齐(padding),此向量表示对应的padding mask,即对应的补齐位为0,shape = (32, 1, 128)

tgt:"翻译"的结果,已经经过分词处理,并且每个词汇都表示为对应的数字,shape = (32, 127)

tgt_mask:attention mask,是个下三角矩阵,shape = (32, 127, 127)

2.2 模型整体流程

transformer2.png

2.3 Embedding

代码中Embedding的定义是这样的,其中用到了两个pytorch模块:nn.Sequential和nn.Embedding。

nn.Sequential(Embeddings(d_model, src_vocab), c(position))

nn.Embedding可以生成一个简单的查找表,将对应的向量用特定的维度表示,如下图:生成一个embedding表示,用维度为3的一维向量唯一的标识0-9的所有数字。

>>> embedding = nn.Embedding(10, 3)
>>> input = torch.LongTensor([[1,2,4,5],[4,3,2,9]])
>>> embedding(input)
    tensor([[
                [-0.0251, -1.6902,  0.7172],
                [-0.6431,  0.0748,  0.6969],
                [ 1.4970,  1.3448, -0.9685],         
                [-0.3677, -2.7265, -0.1685]
            ],        
            [
                [ 1.4970,  1.3448, -0.9685],         
                [ 0.4362, -0.4004,  0.9400],         
                [-0.6431,  0.0748,  0.6969],         
                [ 0.9124, -2.3616,  1.1151]
            ]])

nn.Sequential定义一个有序容器,参数是若干个module,其按照构造函数的顺序依次添加;当Sequential接收参数时,会先传给它的第一个module,其输出作为下一个module的输入,依次链式处理。

所以,整个流程是将src中的每个词汇用维度大小为d_model(512)的一维向量表示,处理后shape=(32, 128,512),然后进行位置编码(position)处理。

2.4 Encoder流程

transformer2-encoder.png

1.输入会先经过Norm处理;

2.步骤【1】的输出与src_mask(1.2)同时传入Attention计算注意力(对应论文中的Multi-Head Attention);

3.步骤【2】的输出与步骤【1】的输入做Add运算(对应论文中的Add);

4.步骤【3】的输出再次进行Norm处理(对应论文中的Norm);

5.步骤【4】的输出经Feed Forward处理(对应论文中的Feed Forward);

6.步骤【5】的输出与步骤3的输出做Add运算,其输出作为输入重复步骤【1】(重复6次)。

2.5 Decoder流程

transformer2-decoder.png

相关文章

网友评论

      本文标题:transformer初探

      本文链接:https://www.haomeiwen.com/subject/nzanxjtx.html