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

transformer和RNN、LSTM相比

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

seq2seq

在这里插入图片描述

编码器-解码器架构

一个模型可以分成两块:

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

在这里插入图片描述

  • CNN
    在这里插入图片描述
    对于CNN来说,中间的特征提取层(中间表达式)可以抽象成一个编码器;softmax回归进行分类标号可以抽象成一个解码器。
  • RNN
    在这里插入图片描述
    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
    在这里插入图片描述

给每个单词一个向量

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

在这里插入图片描述
在这里插入图片描述

What is Output?

在这里插入图片描述

  • N-N:each vector has a label
    在这里插入图片描述
  • N-1:the whole sequence has a label

在这里插入图片描述

  • 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)整体结构

在这里插入图片描述

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

在这里插入图片描述
每个b向量都是考虑过输入sequence中所有的a向量才输出的。
如何计算出两个向量之间的相关性呢?
一般有两种方法:dot-product和additive
一般情况下我们使用的都是dot-product。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
将以上过程封装成一个Self-Attention Layer,即最终transformer模型中的一个小模块。
输入 a 1 , a 2 a_1,a_2 a1,a2,输出 b 1 , b 2 b_1,b_2 b1,b2
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

  • head1
    在这里插入图片描述

  • head2
    在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述
此处的 W o W^o Wo是可训练参数。

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

将以上过程封装成一个Muti-Head Attention Layer,即最终transformer模型中的一个小模块。
在这里插入图片描述

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

在这里插入图片描述
如上图所示,如果交换 a 2 , a 3 a_2,a_3 a2,a3的位置,是不影响 b 1 b_1 b1的输出的。这显然是不合理的。
所以我们引出位置编码的概念。

在这里插入图片描述
这里的P就是我们所说的位置编码信息positional encoding

在这里插入图片描述
self-attention在语音上的应用:
在这里插入图片描述

self-attention在视觉上的应用:
图像可以看成是vector set。
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

verse_armour

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值