Transformer(Attention机制)论文阅读-1
业界典中典之《Attention Is All You Need》,影响世界格局的注意力机制,和“Transformer”。你甚至可以在 维基百科的transformer 页面看到它的大名。
论文原链接为https://arxiv.org/abs/1706.03762 和 https://arxiv.org/pdf/1706.03762.pdf。
方便起见,我在文末会嵌入论文pdf页面。
首先问问new bing怎么说:
1 |
|
总结一下,新提出的有以下:
- 神经网络架构
- Transformer,核心是注意力机制
- 由一个编码器和一个解码器组成
- 每个编码器和解码器都包含若干层,每层都由多头注意力、前馈神经网络、残差连接和层归一化组成
- 注意力函数
- 名为缩放点积注意力(Scaled Dot-Product Attention)
- 计算一个查询向量和一组键值对之间的相关性,并输出相应的值向量的加权和
- 注意力模块
- 多头注意力(Multi-Head Attention)
- 将输入向量分成多个子空间,并在每个子空间上分别进行缩放点积注意力,然后将结果拼接起来
- 位置编码方式
- 正弦余弦位置编码(Sinusoidal Positional Encoding)
- 给输入序列中的每个位置添加一个固定的向量,用来表示位置信息
总之就是注意力,围绕注意力机制展开的一系列工作。
论文摘要为:
1 |
|
(其实什么都没说,就是效果好,好的离谱。)
根据搜索结果,本文Transformer中的各个组成模块分别是:
• 缩放点积注意力(Scaled Dot-Product Attention):这是一种注意力函数,它计算一个查询向量和一组键值对之间的相关性,并输出相应的值向量的加权和。它的公式是:
其中,$Q$是查询矩阵,$K$是键矩阵,$V$是值矩阵,$d_k$是键向量的维度。分母上的$\sqrt{d_k}$是为了缩放点积的结果,避免过大或过小的数值影响梯度传播。
• 多头注意力(Multi-Head Attention):这是一种注意力模块,它将输入向量分成多个子空间,并在每个子空间上分别进行缩放点积注意力,然后将结果拼接起来。它的公式是:
其中,$\text{head}_i=\text{Attention}(QW_i^Q,KW_i^K,VW_i^V)$,$W_i^Q,W_i^K,W_i^V,W^O$都是可学习的参数矩阵。多头注意力可以让模型同时关注不同的表示子空间和不同的位置信息。
• 正弦余弦位置编码(Sinusoidal Positional Encoding):这是一种位置编码方式,它给输入序列中的每个位置添加一个固定的向量,用来表示位置信息。它的公式是:
其中,$pos$是位置索引,$i$是维度索引,$d_{\text{model}}$是模型维度。正弦余弦位置编码可以让模型捕捉到相对位置和绝对位置的信息,并且具有平移不变性。
• Transformer:这是一种网络结构,它由一个编码器和一个解码器组成,每个编码器和解码器都包含若干层,每层都由多头注意力、前馈神经网络、残差连接和层归一化组成。编码器用来将输入序列编码成一个高维向量表示,解码器用来根据编码器的输出和自身的输入生成目标序列。
以上就是本文Transformer中各个组成模块的简要解释。如果你想了解更多细节,请参考原文 https://www.electricalclassroom.com/parts-of-a-transformer/ 或其他相关资料。
也就是
• 缩放点积注意力(Scaled Dot-Product Attention):注意力函数
计算一个查询向量和一组键值对之间的相关性,并输出相应的值向量的加权和
• 多头注意力(Multi-Head Attention):注意力模块
将输入向量分成多个子空间,并在每个子空间上分别进行缩放点积注意力,然后将结果拼接起来
• 正弦余弦位置编码(Sinusoidal Positional Encoding):位置编码方式
给输入序列中的每个位置添加一个固定的向量,用来表示位置信息
• Transformer:网络结构
由一个编码器和一个解码器组成,每个编码器和解码器都包含若干层,每层都由多头注意力、前馈神经网络、残差连接和层归一化组成。编码器用来将输入序列编码成一个高维向量表示,解码器用来根据编码器的输出和自身的输入生成目标序列。
- 神经网络架构
- Transformer
- 编码器
- 将输入序列编码成一个高维向量表示
- 若干层
- 多头注意力
- 前馈神经网络
- 残差连接
- 层归一化
- 解码器
- 根据编码器的输出和自身的输入生成目标序列
- 若干层
- 多头注意力
- 前馈神经网络
- 残差连接
- 层归一化
- 注意力函数
- 缩放点积注意力(Scaled Dot-Product Attention)
- 计算一个查询向量和一组键值对之间的相关性
- 输出相应的值向量的加权和
- 注意力模块
- 多头注意力(Multi-Head Attention)
- 将输入向量分成多个子空间
- 在每个子空间上分别进行缩放点积注意力
- 然后将结果拼接起来
- 在每个子空间上分别进行缩放点积注意力
- 位置编码方式
- 正弦余弦位置编码(Sinusoidal Positional Encoding)
- 给输入序列中的每个位置添加一个固定的向量,用来表示位置信息
transformer 是一个网络结构,它包含了缩放点积注意力、多头注意力和正弦余弦位置编码等部分。
自注意力机制(Self-Attention Mechanism)是一种注意力机制,它计算一个序列中不同位置的元素之间的相关性,并输出相应的元素的加权和。它的公式是:
其中,$Q$是查询矩阵,$K$是键矩阵,$V$是值矩阵,$d_k$是键向量的维度。分母上的$\sqrt{d_k}$是为了缩放点积的结果,避免过大或过小的数值影响梯度传播。
自注意力机制的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射,其中查询和键值对都来自于同一个序列。
自注意力机制可以让序列中的每个元素都与其他元素进行交互,从而捕捉序列内部的结构和依赖关系。
自注意力机制有多种变体,例如多头注意力(Multi-Head Attention),它将输入向量分成多个子空间,并在每个子空间上分别进行自注意力,然后将结果拼接起来。
自注意力机制被广泛应用于基于深度学习的自然语言处理任务中,例如机器翻译、文本摘要、语义分析等。
如果你想了解更多关于自注意力机制的原理和应用,请参考以下资源:
• 《Attention Is All You Need》 :这是一篇经典的论文,提出了基于自注意力机制的Transformer网络结构,在机器翻译任务上取得了显著的效果。
• 《Illustrated: Self-Attention》 :这是一篇通俗易懂的博客文章,用图解的方式介绍了自注意力机制的计算过程和意义。
• 《The Transformer Attention Mechanism》 :这是一篇详细的教程文章,介绍了Transformer中使用的不同类型的自注意力机制,以及如何用Python实现它们。
《Attention Is All You Need》是一篇于2017年发表在NIPS会议上的论文,由Google Brain和Google Research的研究人员合作撰写。
该论文提出了一种新的神经网络架构,称为Transformer,它完全基于注意力机制(attention mechanism),摒弃了循环(recurrence)和卷积(convolution)。
注意力机制是一种将一个查询(query)和一组键值对(key-value pairs)映射到一个输出(output)的函数,其中查询、键、值和输出都是向量。
Transformer利用了两种注意力机制:自注意力(self-attention)和编码器-解码器注意力(encoder-decoder attention)。
自注意力允许模型在同一个序列中的不同位置之间建立联系,编码器-解码器注意力允许模型在不同序列之间建立联系。
Transformer由一个编码器(encoder)和一个解码器(decoder)组成,每个部分都包含多个相同的层(layer)。
每个层都有两个子层(sub-layer),一个是多头注意力(multi-head attention),另一个是前馈神经网络(feed-forward neural network)。
此外,每个子层都有残差连接(residual connection)和层归一化(layer normalization)。
Transformer在机器翻译任务上取得了优异的性能,超过了当时的最佳模型,包括集成模型。它在WMT 2014英德翻译任务上达到了28.4 BLEU,比最佳结果提高了2 BLEU以上。它在WMT 2014英法翻译任务上达到了41.8 BLEU,创造了新的单模型最高纪录。Transformer还能很好地泛化到其他任务,例如英语成分句法分析(English constituency parsing)。
捋清思路
注意力的本质是处理“查询”和“键值对”并输出的函数。操作对象都是向量。
多头注意力,包含两种注意力机制,一种是自注意力,另一种是编码器-解码器注意力。
自注意力用于在同一序列、不同位置之间建立联系。可以让模型学习到序列内部的依赖关系,无论他们相隔多远。
编码器-解码器注意力用于在不同序列之间建立联系。可以让模型关注到编码器输出中和当前解码器输入相关的部分。
Transformer架构如下:
- transformer
- 编码器:包含多个相同的层,每层包含两个子层。
- 层:包含两个子层
- 多头注意力
- 残差连接
- 层归一化
- 前馈神经网络
- 残差连接
- 层归一化
- 多头注意力
- 层:包含两个子层
- 解码器:包含多个相同的层,每层包含两个子层。
- 层:包含两个子层
- 多头注意力
- 残差连接
- 层归一化
- 前馈神经网络
- 残差连接
- 层归一化
- 多头注意力
- 层:包含两个子层
- 编码器:包含多个相同的层,每层包含两个子层。
自然语言处理中:
- 序列(sequence):句子
- 序列中的不同位置(position):单词,或者子词。
Transformer网络的目标是解决序列到序列(sequence-to-sequence)的任务,例如机器翻译(machine translation),即将一个源语言序列转换为一个目标语言序列。
Transformer网络的工作过程可以分为以下几个步骤:
首先,将源语言序列和目标语言序列都进行编码(encoding),即将每个单词或子词转换为一个固定长度的向量(vector),通常使用词嵌入(word embedding)或者位置编码(position encoding)来实现。
然后,将源语言序列的向量输入到编码器(encoder)中,编码器由多个层(layer)组成,每个层都包含一个多头自注意力(multi-head self-attention)子层和一个前馈神经网络(feed-forward neural network)子层。多头自注意力子层可以让每个位置的输出都包含了输入序列中所有位置的信息,从而捕捉到序列中的依赖关系。前馈神经网络子层可以对每个位置的输出进行非线性变换,从而增加模型的表达能力。
接着,将目标语言序列的向量输入到解码器(decoder)中,解码器也由多个层组成,每个层都包含一个多头自注意力子层、一个多头编码器-解码器注意力(multi-head encoder-decoder attention)子层和一个前馈神经网络子层。多头自注意力子层可以让每个位置的输出都包含了目标语言序列中所有位置的信息,从而捕捉到序列中的依赖关系。多头编码器-解码器注意力子层可以让每个位置的输出都包含了编码器输出序列中所有位置的信息,从而实现了源语言序列和目标语言序列之间的对齐。前馈神经网络子层可以对每个位置的输出进行非线性变换,从而增加模型的表达能力。
最后,将解码器输出的向量进行解码(decoding),即将每个向量转换为一个单词或子词,通常使用线性变换(linear transformation)和softmax函数来实现。这样就得到了最终的目标语言序列。
多头注意力层:
可以将输入序列分成多个子序列,然后对每个子序列应用不同的注意力函数,最后将各个子序列的输出拼接起来。这样可以让模型同时关注到不同的特征和信息。自注意力和编码器-解码器注意力都是一种注意力函数,只是应用的对象不同。自注意力是在同一个序列中的不同位置之间进行计算,编码器-解码器注意力是在不同序列之间进行计算。
在编码器自注意力中,查询(query)和键(key)、值(value)都来自于输入序列;
在编码器-解码器注意力中,查询(query)来自于解码器的输出序列,而键(key)和值(value)来自于编码器的输出序列。
编码器自注意力和编码器-解码器注意力的主要区别在于它们的查询(query)来源。
编码器-解码器注意力是一种注意力机制,它用于编码器-解码器模型中。
在这种模型中,编码器将输入序列编码为一个固定长度的向量,然后解码器使用这个向量来生成输出序列。编码器-解码器注意力允许解码器在生成输出序列时直接访问编码器的输出。
在编码器-解码器注意力中,查询(query)来自于解码器的输出序列,而键(key)和值(value)来自于编码器的输出序列。这种机制允许解码器根据输入序列中不同位置的相关性来分配不同的权重,从而更好地捕捉序列中不同位置之间的关系。
自注意力(Self-Attention)是一种注意力机制,它用于捕捉序列中不同位置之间的关系。
与传统的注意力机制不同,自注意力减少了对外部信息的依赖,更擅长捕捉数据或特征的内部相关性。
在自注意力中,查询(query)、键(key)和值(value)都来自于输入序列。这种机制允许模型根据输入序列中不同位置的相关性来分配不同的权重,从而更好地捕捉序列中不同位置之间的关系。
在自注意力机制中,查询(query)、键(key)和值(value)都来自于输入序列。查询(query)表示请求的内容,键(key)表示被请求的内容,值(value)表示被请求内容的实际值。通过计算查询(query)和键(key)之间的点积来确定每个值(value)的权重,然后对所有值(value)进行加权求和来得到输出。
在编码器-解码器注意力机制中,查询(query)来自于解码器的输出序列,而键(key)和值(value)来自于编码器的输出序列。查询(query)表示请求的内容,键(key)表示被请求的内容,值(value)表示被请求内容的实际值。
与自注意力机制类似,编码器-解码器注意力机制通过计算查询(query)和键(key)之间的点积来确定每个值(value)的权重,然后对所有值(value)进行加权求和来得到输出。不同之处在于,查询(query)来自于解码器的输出序列,而键(key)和值(value)来自于编码器的输出序列。
自注意力机制中,Transformer首先将输入序列转化为查询(query)、键(key)和值(value),然后通过自注意力机制进行处理并输出。
编码器-解码器注意力机制中,编码器首先将输入序列编码为一个固定长度的向量,然后解码器使用这个向量来生成输出序列。在生成输出序列时,解码器会根据输入序列中不同位置的相关性来分配不同的权重,从而更好地捕捉序列中不同位置之间的关系。
在Transformer网络中,编码器和解码器是两个分开的部分,它们之间通过编码器-解码器注意力机制进行交互。
编码器将输入序列编码为一个固定长度的向量,然后解码器使用这个向量来生成输出序列。在生成输出序列时,解码器会使用编码器-解码器注意力机制来直接访问编码器的输出。这种机制允许解码器根据输入序列中不同位置的相关性来分配不同的权重,从而更好地捕捉序列中不同位置之间的关系。
多头注意力是Transformer网络中编码器和解码器共有的子层。它允许模型同时关注多个位置,从而更好地捕捉序列中不同位置之间的关系。在多头注意力中,查询(query)、键(key)和值(value)被分成多个头,每个头分别进行自注意力或编码器-解码器注意力计算,然后将所有头的结果拼接起来作为最终输出。
Q:在运行过程中,编码器和解码器的层是同一层吗?换句话说,能不能认为,transformer是一个大型网络,不存在编码器解码器的分别,只是transformer网络中的每一层,可以看出有两个部分,一部分负责编码一部分负责解码?
A:在Transformer网络中,编码器和解码器是两个分开的部分,它们由多个层组成。编码器和解码器的层数可以相同,也可以不同。
编码器将输入序列编码为一个固定长度的向量,然后解码器使用这个向量来生成输出序列。编码器和解码器都由多个层组成,每个层都包含多头注意力子层和前馈神经网络子层。在编码器中,多头注意力子层使用自注意力机制来捕捉输入序列中不同位置之间的关系。在解码器中,多头注意力子层既使用自注意力机制来捕捉输出序列中不同位置之间的关系,也使用编码器-解码器注意力机制来直接访问编码器的输出。
因此,Transformer网络可以看作是一个大型网络,它由编码器和解码器两个部分组成。每个部分都由多个层组成,每个层都包含多头注意力子层和前馈神经网络子层。编码器和解码器之间通过编码器-解码器注意力机制进行交互。
亦即是说解码器和编码器确实是分开的,两个网络,毕竟层数都可以不一样。
但也没有分那么开,联系相当紧密。
Q:我复述一遍,你看看对不对。序列进入transformer时,首先是进入编码器,通过所有层,而不是只通过某一层,最终生成的是编码后的向量。这个向量再被放入解码器,得到输出序列。那么,我有一个问题。编码器输出的向量,是query、key和value中的哪一个?解码器的各个层中的编码器-解码器注意力,使用的query、key和value是解码器的前一层的输出,还是编码器的输出?
A:您的理解是正确的。序列进入Transformer时,首先进入编码器,通过所有层,最终生成编码后的向量。这个向量再被放入解码器,得到输出序列。
编码器输出的向量不是查询(query)、键(key)或值(value),而是编码后的向量,它表示输入序列的固定长度表示。在解码器中,每个层的编码器-解码器注意力子层使用的查询(query)来自于解码器的前一层的输出,而键(key)和值(value)来自于编码器的输出。
Q:你说解码器的键(key)和值(value)来自于编码器的输出,又说编码器输出的向量不是查询(query)、键(key)或值(value),而是编码后的向量。编码后的向量和键(key)、值(value)有什么关系?请详细介绍。
A:编码器输出的向量是输入序列的固定长度表示,它由编码器的最后一层输出。在解码器中,每个层的编码器-解码器注意力子层使用的键(key)和值(value)来自于编码器的输出,也就是说,它们来自于编码器的最后一层输出的编码后的向量。
在编码器-解码器注意力子层中,查询(query)、键(key)和值(value)都是通过将输入序列中的每个元素与不同的权重矩阵相乘来计算得到的。查询(query)来自于解码器的前一层的输出,而键(key)和值(value)来自于编码器的最后一层输出的编码后的向量。
因此,编码后的向量和键(key)、值(value)之间的关系是:编码后的向量是输入序列的固定长度表示,它由编码器的最后一层输出;而键(key)和值(value)则是通过将编码后的向量与不同的权重矩阵相乘来计算得到的。
亦即是说,编码器确实是执行完所有层,才会输出句子对应的向量。
这个向量经过与不同的权重矩阵相乘来计算,得到键(key)和值(value)。
键(key)和值(value)会传递给解码器,解码器第一层会将目标序列转化为查询(query)向量,传递给下一层;之后的每一层会输出向量,作为下一层的查询(query)输入。
Q:解码器的输入是“目标序列”,那么,这个“目标序列”是怎么转化为查询(query)的?
A:在解码器中,每个层的编码器-解码器注意力子层使用的查询(query)来自于解码器的前一层的输出。在解码器的第一层中,查询(query)来自于目标序列。
目标序列首先被转化为嵌入表示,然后与位置编码相加来表示序列中每个元素的位置信息。这个嵌入表示就是解码器第一层的输入,也就是查询(query)。
在解码器的每个层中,查询(query)都是通过将输入序列中的每个元素与权重矩阵相乘来计算得到的。在解码器的第一层中,输入序列就是目标序列的嵌入表示。
Q:详细解释权重矩阵是哪里来的。是transformer神经网络自带的吗?键(key)和值(value)在解码器的每一层中是如何处理的?
A:权重矩阵是Transformer网络的参数之一,它们在训练过程中被学习得到。查询(query)、键(key)和值(value)都是通过将输入序列中的每个元素与不同的权重矩阵相乘来计算得到的。
在解码器的每一层中,查询(query)来自于解码器的前一层的输出,而键(key)和值(value)来自于编码器的输出。多头注意力子层将查询(query)、键(key)和值(value)分成多个头,每个头分别进行自注意力或编码器-解码器注意力计算,然后将所有头的结果拼接起来作为最终输出。
在编码器-解码器注意力计算中,首先计算查询(query)和键(key)之间的点积来确定每个值(value)的权重,然后对所有值(value)进行加权求和来得到输出。这样,解码器就可以根据输入序列中不同位置的相关性来分配不同的权重,从而更好地捕捉序列中不同位置之间的关系。
因此,在解码器的每一层中,键(key)和值(value)都是通过编码器-解码器注意力计算来处理的。它们用于确定每个值(value)的权重,并对所有值(value)进行加权求和来得到输出。
transformer的训练产物是权重矩阵。