读懂Transformer(Attention Is All You Need)

Transformer 模型是一种自然语言处理模型,它通过在序列上进行转换来完成任务,例如翻译、问答、摘要、分类等。这类模型通常使用注意力机制来聚焦输入序列中的特定单词或短语,从而更好地理解和处理文本。

Transformer模型在《Attention is all you need》论文中提出这篇论文主要亮点在于:

  • 1、不同于以往主流机器翻译使用基于RNN的seq2seq模型框架,该论文用attention机制代替了RNN搭建了整个模型框架。
  • 2、提出了多头注意力(Multi-headed attention)机制方法,在编码器和解码器中大量的使用了多头自注意力机制(Multi-headed self-attention)。
  • 3、在WMT2014语料中的英德和英法任务上取得了先进结果,并且训练速度比主流模型更快。

我们先把Transformer想象成一个黑匣子,在机器翻译的领域中,这个黑匣子的功能就是输入一种语言然后将它翻译成其他语言。如下图:

实际上Transformer是由两部分构成分别是编码器和解码器,在整个模型中,编码器由6个block组成,解码器由6个block组成。编码器的输出则作为解码器的输入。

Transformer结构

Transformer的整体结构

Attention

Attention模型并不只是盲目地将输出的第一个单词与输入的第一个词对齐。Attention机制的本质来自于人类视觉注意力机制。人们在看东西的时候一般不会从到头看到尾全部都看,往往只会根据需求观察注意特定的一部分,就是一种权重参数的分配机制,目标是协助模型捕捉重要信息。即给定一组<key,value>,以及一个目标(查询)向量query,attention机制就是通过计算query与每一组key的相似性,得到每个key的权重系数,再通过对value加权求和,得到最终attention数值。

Self-Attention

Self-Attention,这是Transformer的核心内容,主要目的是计算query与Key之间的相似度,为每个输入的向量学习一个权重。具体流程如下图所示:

  1. 如上文,将输入单词转化成嵌入向量;

  2. 根据嵌入向量得到 q ,k,v 三个向量;

  3. 为每个向量计算一个score: score=q*k ;

  4. 为了梯度的稳定,Transformer使用了score归一化,即除以 sqrt(dk)=8 (论文中使用key向量的维度是64维,其平方根=8,这样可以使得训练过程中具有更稳定的梯度。);

  5. 对score施以softmax激活函数,使得最后的列表和为1;这个softmax的分数决定了当前单词在每个句子中每个单词位置的表示程度。很明显,当前单词对应句子中此单词所在位置的softmax的分数最高,但是,有时候attention机制也能关注到此单词外的其他单词,这很有用。

  6. softmax点乘Value值 v ,得到加权的每个输入向量的评分 v ;相当于保存对当前词的关注度不变的情况下,降低对不相关词的关注。

  7. 相加之后得到最终的输出结果;这会在此位置产生self-attention层的输出(对于第一个单词)。

<math xmlns="http://www.w3.org/1998/Math/MathML"> A t t e n t i o n = s o f t m a x ( Q ∗ K / D k ½) ∗ V Attention = softmax(Q * K /Dk ½) * V </math>Attention=softmax(Q∗K/Dk½)∗V

Muti-Attention

Multi-Head Attention相当于 h 个不同的self-attention的集成(ensemble)。结构如下图所示:

唯一需要注意的是,由于残差链接的特殊需要,这里的输出要保持与输入一样的维度,所以将每个Self-Attention得到的结果按列进行拼接,得到W0。最后进行一层全连接层,将其映射为最终的输出结果Z。

Positional Enconding

在Attention中,对于一个句子中各个词语的顺序不改变计算结果,具体来说,就是词语的顺序并不能影响Attention的计算结果,这与我们所理解的翻译不符,所以需要一个绝对的位置信息,来表示单词在句子中的位置,其具体计算公式如下:

...未完待续

相关推荐
秋说1 小时前
【PTA数据结构 | C语言版】一元多项式求导
c语言·数据结构·算法
Maybyy1 小时前
力扣61.旋转链表
算法·leetcode·链表
卡卡卡卡罗特3 小时前
每日mysql
数据结构·算法
chao_7894 小时前
二分查找篇——搜索旋转排序数组【LeetCode】一次二分查找
数据结构·python·算法·leetcode·二分查找
lifallen5 小时前
Paimon 原子提交实现
java·大数据·数据结构·数据库·后端·算法
lixzest5 小时前
C++ Lambda 表达式详解
服务器·开发语言·c++·算法
EndingCoder5 小时前
搜索算法在前端的实践
前端·算法·性能优化·状态模式·搜索算法
丶小鱼丶5 小时前
链表算法之【合并两个有序链表】
java·算法·链表
不吃洋葱.5 小时前
前缀和|差分
数据结构·算法
jz_ddk8 小时前
[实战]调频(FM)和调幅(AM)信号生成(完整C语言实现)
c语言·算法·信号处理