Attention 和 Transformer详解

Attention & Transformer

由Jay Alammar的博客总结
链接:1. seq2seq and attention 2. transformer

Attention

以下的内容都以机器翻译任务举例。

Seq2seq for translation

传统的seq2seq架构在做机器翻译任务时,encoder部分获取输入句子的embedding,也就是最后一个时间步的hidden state向量,输入到decoder中,经过多个时间步后,得到输出的序列。

但其中存在的问题是:

  • 长距离依赖难以获取
  • 并行化程度低
Attention mechanism

Attention机制可以在一定程度上解决以上两个问题,针对第一个问题,在计算attention score时,没有距离概念,也就是每一个词和当前词的attention score计算与其距离无关,所以可以避免长距离依赖难以获取的问题。针对第二个问题,attention机制不像RNN那样,每一个时刻输入依赖于上一时刻的输出,而是可以并行计算attention score,得到context vector。

context vector的计算方式(以encoder-decoder架构中decoder部分的计算为例):
比如encoder部分输入三个词,每个词经过encoder,得到的hidden state为: h 1 , h 2 , h 3 h_1, h_2, h_3 h1,h2,h3
decoder部分:

  • 首先输入一个初始化的hidden state向量和标志句子开始的token 的embedding,得到一个hidden state向量 h 4 h_4 h4
  • 利用 h 4 h_4 h4和encoder部分的3个hidden_state向量点乘,得到attention score
  • 将attention score经过softmax转化为概率值
  • 利用该概率值乘以对应的encoder部分的hidden state向量,得到一个context vector

以上过程的图示如下:
在这里插入图片描述

decoder部分各个时间步的操作图示如下:
在这里插入图片描述

Transformer

Model Architecture

在《Attention is All You Need》论文中,Transformer的设计是:编码器和解码器否分别有6个。
一个high-level的表示如下:
在这里插入图片描述

每一个encoder中又包含两个部分,一部分是self-attention,一部分是feed forward neural network。每一个decoder中包含三个部分,一部分是self-attention,一部分是encoder-decoder attention,还有一部分是feed forward neural network。图示如下:
在这里插入图片描述

Encoder部分

以机器翻译为例,encoder部分输入的是源语言的句子。每一个词转换成embedding之后,输入到self-attention layer,计算出一个基于上下文的表示,然后输入到前馈神经网络,得到这个encoder部分的输出后,作为下一个encoder部分的输入,继续以上步骤。一个简单的图示如下:
在这里插入图片描述

对于以下的句子:
”The animal didn’t cross the street because it was too tired”
我们希望在对"it"进行编码时,能使用到它指代的animal这个词的编码。可视化的结果也就是:
在这里插入图片描述

Self-attention

self-attention的意思是说,query, key, value全都来自一个相同的输入。也就是下图中的 x 1 x_1 x1 x 2 x_2 x2

self-attention的计算方法是:

  • 对于每个输入词的embedding,乘以 W Q W^Q WQ矩阵,得到每一个词对应的query的向量,同样的,分别乘以 W K W^K WK W V W^V WV矩阵,得到每个词对应的key和value的向量。其中query和key的维度相同,这里表示为 d k d_k dk,但value的维度可以不同。
    在这里插入图片描述

  • query和key向量点乘,得到attention score

  • attention score除以query和key维度的平方差

  • 对上一步得到的值进行softmax,得到对应该query值的key的attention概率。

  • 将得到的概率值与对应的value进行相乘

  • 相乘得到的值,相加,得到最终的基于attention的向量表示 z z z

整个过程的图示如下:
在这里插入图片描述

在实际操作中,一般是使用矩阵进行运算,整个过程也就变得更加简单:

  • 计算Query, Key, Value矩阵的图示
    在这里插入图片描述

  • 计算context vector的图示
    在这里插入图片描述

Multi-head self-attention

multi-head self-attention可以理解为利用多个attention矩阵,得到基于多方面特征的上下文表示。这里的multi-head在实际操作中是指有多个 W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV,分别和输入embedding点乘,得到多个Query, Key, Value的矩阵,最终得到多个基于上下文的表示 z z z
在这里插入图片描述
在这里插入图片描述

但前馈神经网络需要的是一个Z大小的输入,所以需要对多个Z进行处理。具体的方法是,将多个Z拼接起来,和一个矩阵相乘,最终得到一个Z。
在这里插入图片描述

整体过程的图示如下:
在这里插入图片描述

其他内容

因为attention 计算过程中忽视了词的位置信息,所以Transformer中在输入部分另外加入了一个position embedding。

此外,每个encoder中的两个部分都有残差连接,比如:第一个encoder的第一块Add & Norm,就是接收了两部分输入,一部分是self-attention之后的向量表示,另外一部分是输入词的embedding(包括词embedding和位置embedding)。图示如下:
在这里插入图片描述

具体一些的Transformer架构如下(这里展示的是两个encoder和两个decoder的架构):
在这里插入图片描述

Decoder部分

Decoder部分与Encoder部分的结构基本相同,self-attention部分有一些不同,具体在于decoder部分的self-attention是计算当前词的embeeding与它之前所有词的attention,而不是计算它和序列中所有词的attention。
在这里插入图片描述

Final Linear and Softmax Layer

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值