transformer的分解

本文尝试用一种通俗的语言来说明白transformer,也会加一些自己的理解。
transformer基于attention,解决的是seq2seq的问题。

0.先来回顾一下attention

如果让我用一句话来总结attetion我会说针对输入做一次矩阵运算,得到(q,k,v),k和v一般一样,然后针对q,k做矩阵乘法,再加一个softmax层之后我们就可得到权重,权重和v点乘之后就是一个输出,表示的是输入之间的相联系程度。

  • 基础的attention
    这个是图示:


    基础attention形式

    这个是计算公式:


    attention计算公式

    dk是Q的列数,除以这个是为了提高模型泛化能力。中间的QKT还有很多其他的计算方法,最终保证的出来是一个一维向量即可,计算方法有下面这几种:
    QK的不同处理方式

    最终要注意一个问题:attention的输出是什么?

    首先啊 权重是向量1维的,但是这个v不是,是和q,k一样的,因此就是响应的权重ai和vi对应相乘,然后相加,得到当前的attention输出,这个再放到decoder里边去。
    为了防止你不懂,我又去拔了一个示意图:


    attention计算过程
  • multi-head-attention
    这个是transfomer用的结构,先上图。


    多头自注意力机制

    看这个图,初始的QKV经过了线性变换,然后分成h个头,分别进行attention,然后拼接到一起,然后再输出。
    好了,疑问点就是怎么线性变换的,这可不是线形划分啊,举个栗子现在要分8个头,那么每一次线形变化都要乘上一个权重。
    我们知道输入是(m,512),而QKV的维度是一样的,都是(m,64),但是输入乘以权重计算出来的,多头就是每次乘的权重都不同,然后并行计算,算完再拼接,其实就是(m,64*8),再变化一次,乘以(512,512)最后的输出和输入维度一样了,perfect。

1.transformer整体结构

概览,其实transformer跟其他的seq2seq是一样的,怎么一样呢,都是encoder和decoder构成的。先来整体理解一下他的结构:


transfomer结构

encoder由2个单元构成,decoder由3个单元构成,其中的核心还是上文回顾的多头自注意力机制。其中encoder有6层,decoder也有6层,encoder的每一层输出都是下一层的输入,主要是多头的输出维度和输入是一样的。然后encoder最后一层的输出会分到decoder的各层中,当成输入之一。

2.encoder部分

先上图:


encoder部分
  • 首先是输入的embedding,embedding的方法很多,各个包都提供了算法。
  • 然后是加入位置编码,位置编码有个计算公式:


    位置编码计算方法

    他和wordemmbedding的size一致,pos是词的位置,dmodel是词向量的维度,奇数位置是sin,偶数位置是cos。

  • 然后是进去做一个多头自注意力
  • 再然后利用了残差网络的思想,原数+变化以后数据的相加,在做一个标准化。
  • 然后把上边的输出向前在搞一个全连接,再搞一个残差网络,最后标准化,输出给下一个encoder。

3.decoder

decoder没有encoder那么简单了,先看看啥样吧。


decoder格式

一看就是decoder要和encoder结合起来啊,

  • decoder的输出是目标序列经过embedding以后加入位置编码,这点和encoder一样。
  • decoder做self_attention的之后,做残差加和,做标准化
  • decoder独有的encoder和decoder的self attention就是encoder最后一步输出的Q和encoder做的KV再做一个attention。做完attetion再加和标准化
    只能跟他之前的词做,忽略之后的词,因此这个有两个mask机制:
    一个是padding mask这个很简单就是应对输入输出长度不一样,进行补齐的。
    一个是sequence mask就是说当前输出只能和之前几期的输出有关,不能和之后的有关。
  • 然后做前馈神经网络,然后这一层输出和enconder输出共同作用于decoder第 2部分,最后再做一个线性变化,求一个最大概率出来。

总结

基本逻辑理清了,接下来结合源码来分享一点知识点,先不更新了。

你可能感兴趣的:(transformer的分解)