transformer:self-attention,muti-head attention,positional encoding

文章目录

    • transformer和RNN、LSTM相比
      • seq2seq
      • 编码器-解码器架构
    • What is Input?
    • What is Output?
    • N-N:each vector has a label
      • (1)整体结构
      • (2)如何实现self-attention模块
      • (3)从矩阵乘法的角度理解self-attention
      • (4)Muti-head Self-attention(多头注意力模块)
      • (5)Positional Encoding:位置编码为自注意力机制赋能

transformer和RNN、LSTM相比

RNN需要 t 0 t_0 t0时刻的数据才能计算出 t 1 t_1 t1时刻的数据,无法并行化计算,只具有短期记忆。
而transformer理论上的记忆长度是不受限制的,并且可以并行化计算。
transformer基于编码器-解码器来处理序列对,跟使用注意力的seq2seq不同,transformer纯基于注意力。

seq2seq

transformer:self-attention,muti-head attention,positional encoding_第1张图片

编码器-解码器架构

一个模型可以分成两块:

  • encoder,处理输入;
  • decoder,生成输出,有的时候也可以处理输入。

transformer:self-attention,muti-head attention,positional encoding_第2张图片

  • CNN
    transformer:self-attention,muti-head attention,positional encoding_第3张图片
    对于CNN来说,中间的特征提取层(中间表达式)可以抽象成一个编码器;softmax回归进行分类标号可以抽象成一个解码器。
  • RNN
    transformer:self-attention,muti-head attention,positional encoding_第4张图片
    RNN同理,最后一个时刻隐藏层的输出是编码器编码的结果,最后再通过全连接层进行解码。
  • 编码器解码器API
from torch import nn

#@save
class Encoder(nn.Module):
    """编码器-解码器架构的基本编码器接口"""
    def __init__(self, **kwargs):
        super(Encoder, self).__init__(**kwargs)

    def forward(self, X, *args):
        raise NotImplementedError

#@save
class Decoder(nn.Module):
    """编码器-解码器架构的基本解码器接口"""
    def __init__(self, **kwargs):
        super(Decoder, self).__init__(**kwargs)

    def init_state(self, enc_outputs, *args):
        raise NotImplementedError

    def forward(self, X, state):
        raise NotImplementedError

#@save
class EncoderDecoder(nn.Module):
    """编码器-解码器架构的基类"""
    def __init__(self, encoder, decoder, **kwargs):
        super(EncoderDecoder, self).__init__(**kwargs)
        self.encoder = encoder
        self.decoder = decoder

    def forward(self, enc_X, dec_X, *args):
        enc_outputs = self.encoder(enc_X, *args)
        dec_state = self.decoder.init_state(enc_outputs, *args)
        return self.decoder(dec_X, dec_state)

What is Input?

  • sentence
  • voice
  • graph
    transformer:self-attention,muti-head attention,positional encoding_第5张图片

给每个单词一个向量

  • One-hot Encoding
  • Word Embedding(包含了每个单词的语义信息)
    一个句子就是一排长度不一的向量

transformer:self-attention,muti-head attention,positional encoding_第6张图片
transformer:self-attention,muti-head attention,positional encoding_第7张图片

What is Output?

transformer:self-attention,muti-head attention,positional encoding_第8张图片

  • N-N:each vector has a label
    transformer:self-attention,muti-head attention,positional encoding_第9张图片
  • N-1:the whole sequence has a label

transformer:self-attention,muti-head attention,positional encoding_第10张图片

  • N-N’(seq2seq):model decides the number of labels itself
    比如机器翻译、语音识别。输入和输出的数量不一样。

N-N:each vector has a label

为什么出现了self-attention机制?因为如果将输入sequence中每个足够大的向量(因为我们的输入需要统一长度)放进去训练会产生巨大的参数量,不利于我们的训练。因此我们采用一种自注意力机制来对输入sequence的每个向量进行self-attention处理,考虑输入sequence中每个向量和其他输入向量之间的关系。

(1)整体结构

transformer:self-attention,muti-head attention,positional encoding_第11张图片

(2)如何实现self-attention模块

transformer:self-attention,muti-head attention,positional encoding_第12张图片
每个b向量都是考虑过输入sequence中所有的a向量才输出的。
如何计算出两个向量之间的相关性呢?
一般有两种方法:dot-product和additive
一般情况下我们使用的都是dot-product。

transformer:self-attention,muti-head attention,positional encoding_第13张图片

transformer:self-attention,muti-head attention,positional encoding_第14张图片

transformer:self-attention,muti-head attention,positional encoding_第15张图片
将以上过程封装成一个Self-Attention Layer,即最终transformer模型中的一个小模块。
输入 a 1 , a 2 a_1,a_2 a1,a2,输出 b 1 , b 2 b_1,b_2 b1,b2
transformer:self-attention,muti-head attention,positional encoding_第16张图片

(3)从矩阵乘法的角度理解self-attention

transformer:self-attention,muti-head attention,positional encoding_第17张图片
transformer:self-attention,muti-head attention,positional encoding_第18张图片
transformer:self-attention,muti-head attention,positional encoding_第19张图片
transformer:self-attention,muti-head attention,positional encoding_第20张图片

(4)Muti-head Self-attention(多头注意力模块)

  • head1
    transformer:self-attention,muti-head attention,positional encoding_第21张图片

  • head2
    transformer:self-attention,muti-head attention,positional encoding_第22张图片

transformer:self-attention,muti-head attention,positional encoding_第23张图片

用一个大矩阵生成QKV之后拆分成多个头,和用多个小矩阵,每个头生成一个 Q i 、 K i 、 V i Q_i、K_i、V_i QiKiVi,在数学上是完全等效的,因此多头自注意力机制就是采用相同结构,不同的参数,把自注意力机制重复n次

transformer:self-attention,muti-head attention,positional encoding_第24张图片

transformer:self-attention,muti-head attention,positional encoding_第25张图片
此处的 W o W^o Wo是可训练参数。

muti-head的操作类似于group convolution(组卷积)

将以上过程封装成一个Muti-Head Attention Layer,即最终transformer模型中的一个小模块。
transformer:self-attention,muti-head attention,positional encoding_第26张图片

(5)Positional Encoding:位置编码为自注意力机制赋能

transformer:self-attention,muti-head attention,positional encoding_第27张图片
如上图所示,如果交换 a 2 , a 3 a_2,a_3 a2,a3的位置,是不影响 b 1 b_1 b1的输出的。这显然是不合理的。
所以我们引出位置编码的概念。

transformer:self-attention,muti-head attention,positional encoding_第28张图片
这里的P就是我们所说的位置编码信息positional encoding

transformer:self-attention,muti-head attention,positional encoding_第29张图片
self-attention在语音上的应用:
transformer:self-attention,muti-head attention,positional encoding_第30张图片

self-attention在视觉上的应用:
图像可以看成是vector set。
transformer:self-attention,muti-head attention,positional encoding_第31张图片

transformer:self-attention,muti-head attention,positional encoding_第32张图片

你可能感兴趣的:(transformer,深度学习,python)