Self-Attention 自注意力机制(二)——实例过程说明

 声明:本文章是根据网上资料,加上自己整理和理解而成,仅为记录自己学习的点点滴滴。可能有错误,欢迎大家指正。


一、自注意力机制核心过程

自注意力机制(Self-Attention Mechanism),也称为内部注意力机制,是一种在序列模型中用于捕捉序列内部不同位置之间依赖关系的技术。这种机制允许模型在处理序列时,对序列中的每个元素分配不同的权重,这些权重反映了元素之间的相互关系。自注意力机制的关键在于它不需要像循环神经网络(RNN)那样逐步处理序列,因此可以并行化计算,并且可以捕捉长距离依赖。

  • 自注意力机制的核心原理可以概括为以下几个步骤:
  1. 表示(Representation):对序列中的每个元素(例如单词、时间点等)进行表示,通常通过嵌入(Embedding)层将元素转换为固定维度的向量。

  2. 查询(Query)、键(Key)、值(Value):将每个元素的表示向量分解为三个向量:查询(Q)、键(K)、值(V)。这些向量可以是同一个表示的不同线性变换,也可以通过不同的网络层来学习。

  3. 注意力分数(Attention Scores):计算每个元素的查询向量与序列中所有键向量之间的相似度得分。这通常通过点积(Dot Product)来实现,然后通常会应用一个缩放因子(例如除以键向量的维度的平方根),以避免梯度消失或爆炸问题。

  4. 权重分配(Weighting):使用softmax函数对注意力分数进行归一化处理,得到每个元素对于序列中其他元素的权重。归一化确保了所有权重的和为1。

  5. 加权求和(Weighted Sum):将归一化的注意力权重与对应的值向量相乘,然后对所有元素的加权值向量求和,得到最终的输出向量。

  6. 输出(Output):得到的加权求和向量可以作为序列中每个元素的输出表示,它包含了序列内部的全局信息。

自注意力机制的一个关键优势是其能够捕捉序列中任意两个元素之间的依赖关系,无论它们在序列中的距离有多远。这种能力使得自注意力机制在处理长序列和复杂依赖关系时特别有效,例如在自然语言处理(NLP)中的翻译、文本摘要、问答系统等任务中。

在深度学习框架中,自注意力机制可以通过多头注意力(Multi-Head Attention)进一步扩展,其中模型并行地执行多个自注意力层,每个层学习到序列的不同表示子空间,最终将这些表示合并,以捕获更丰富的信息。这种机制在Transformer模型中得到了广泛应用。

  • 数学上,嵌入层过程可以表示为: Embedding(𝑤)=𝐸×OneHot(𝑤) 其中:

  • 𝐸 是嵌入权重矩阵。
  • 𝑤是词汇表中的单词或标记。
  • OneHot(𝑤) 是单词 𝑤 的独热编码向量。
  • Embedding(𝑤) 是单词 𝑤的嵌入向量。

详细过程通过下述例子说明。如机器翻译,有一个英文句子 "I love natural language " 需要翻译成另一种语言。在使用自注意力机制的模型中,首先会将每个单词转换为一个向量形式,这些向量是通过嵌入层得到的。

二、表示或嵌入过程:

嵌入层(Embedding Layer)是一种在深度学习和机器学习中常用的技术,特别是在处理自然语言处理(NLP)任务时。嵌入层的主要作用是将离散的输入数据(如单词、字符或其他类型的标记)转换为连续的向量表示。这些向量捕捉了输入数据的语义和语法特征。

嵌入层的数学表达通常如下: Embedding(w)=E×w 其中,𝑤 是离散的输入单词或标记,𝐸是嵌入权重矩阵,Embedding(𝑤)是单词 𝑤的连续向量表示。在实际应用中,嵌入层通常作为模型的第一层,为后续的神经网络层(如卷积层、循环层或Transformer层)提供输入。

嵌入层将离散的单词或标记转换为实数向量的过程通常涉及以下几个步骤:

  • 词汇表构建:首先,需要构建一个词汇表,其中包含所有在训练数据中出现的唯一的单词或标记。每个单词或标记在词汇表中被分配一个唯一的索引。

如:"I love natural language "只包含4个单词:["I", "love", "natural", "language"]。我们想要将这些单词嵌入到一个2维的空间中(即嵌入维度为2)。词汇表索引分配可能是这样的:

I      -> 索引 0
love   -> 索引 1
natural-> 索引 2
language-> 索引 3

  • 权重矩阵初始化:嵌入层由一个权重矩阵定义,其行数等于词汇表的大小,列数是嵌入的维度。权重矩阵最初是随机初始化的。

如:初始化一个4x2的权重矩阵 𝐸,随机分配小的实数值:

E =\begin{bmatrix} 0.2& 0.5&-0.1 &0.3 \\ 0.1 & 0.3& 0.4 & 0.7 \end{bmatrix}

  • 独热编码:输入的单词或标记首先被转换为独热编码向量。这意味着对于词汇表中的每个单词,都有一个长度等于词汇表大小的向量,其中只有一个位置是1(表示该单词),其余位置都是0。

如对于输入的单词 "love",我们创建一个独热编码向量:

OneHot("love") =\begin{bmatrix} 0\\ 1\\ 0\\ 0 \end{bmatrix}

  • 矩阵乘法:然后,独热编码向量与嵌入权重矩阵进行矩阵乘法运算。这一步将每个单词的独热编码向量映射到一个实数向量,即嵌入向量。

将独热编码向量与权重矩阵相乘,以得到 "love" 的嵌入向量:

    Embedding("love") = E \times OneHot("love") =\begin{bmatrix} 0.2& 0.5&-0.1 &0.3 \\ 0.1 & 0.3& 0.4 & 0.7 \end{bmatrix}\times\begin{bmatrix} 0\\1 \\ 0\\ 0\end{bmatrix}=\begin{bmatrix} 0.5\\ 0.3\end{bmatrix}

  • 输出嵌入向量:结果是每个单词或标记的嵌入向量,这些向量是连续的实数,并且包含了单词的语义信息。

结果 Embedding("𝑙𝑜𝑣𝑒")就是单词 "love" 的嵌入向量\begin{bmatrix} 0.5\\ 0.3\end{bmatrix}

这个嵌入向量,现在可以作为神经网络的输入,用于各种下游任务,如文本分类、情感分析或机器翻译等。

  • 位置编码

此外,有时还进行位置编码(这个可根据情况选择)。因为Transformer模型不包含递归或卷积结构,因此无法捕捉序列中单词的顺序信息。为了解决这个问题,通常会给嵌入向量加上位置编码,以提供单词在序列中的位置信息。位置编码的维度与嵌入向量的维度相同,确保可以直接相加。位置编码通常采用正弦和余弦函数的线性组合来实现,可以表示为: 

  • PE(pos,2i)=sin(pos/10000^{2i/dmodel})
  • PE(pos,2i+1)=cos(pos/10000^{2i/dmodel})

其中,𝑝𝑜𝑠 是单词的位置,𝑖是维度索引,𝑑𝑚𝑜𝑑𝑒𝑙是模型的维度。

如对于单词 "love",他的索引为1,即pos=1;维度索引i=0或1,维度dmodel=2

PE(1,0)=sin(1/10000^{2*0/2})=sin(1)

PE(1,1)=cos(1/10000^{2*0/2})=cos(1)

位置编码向量 𝑃𝐸(1)=[sin⁡(1),cos⁡(1)]

然后,每个单词的嵌入向量会加上对应位置的编码向量。这意味着每个位置将有一个唯一的位置编码向量,与该位置的单词嵌入向量相加。

即单词 "love" 的嵌入向量就变成了:E= Embedding("love") + PE(1)

这样,每个单词的嵌入向量不仅包含了自身的语义信息,还包含了其在句子中的位置信息,使得模型能够更好地理解单词之间的顺序关系。

三、查询(Query)、键(Key)、值(Value)

 (1)权重矩阵的初始化

对于自注意力机制中的每个组件(Q、K、V),模型会使用不同的线性变换。这些变换由模型的参数决定,通常是可学习的权重矩阵。给定一个嵌入向量 𝐸,这些变换可以表示为:

  • 查询(Q): Q=W_{Q}*E
  • 键(K): K=W_{k}*E
  • 值(V):V=W_{V}*E

其中,W_{Q}​,W_{K}W_{V}​ 是模型需要学习的权重矩阵,分别对应于查询、键和值的生成。

如:初始化生成 Q、K、V 的权重矩阵 W_{Q}​,W_{K}W_{V}​ ​。这些矩阵是随机初始化的。

如:对单词“love”的生成的Q、K、V的权重矩阵随机生成为:

W_Q =\begin{bmatrix} 0.1&0.3\\ 0.2&0.4\end{bmatrix} ,W_K =\begin{bmatrix} 0.4&0.6\\ 0.5&0.8\end{bmatrix} , W_V = \begin{bmatrix} 0.7&0.9\\ 0.8&1.0\end{bmatrix}

在多头注意力(Multi-Head Attention)中,通常会将嵌入向量的维dmodel​ 分割成多个头,每个头处理一部分维度。例如,如果 dmodel​=512 并且我们使用 8 个头,那么每个头将处理 512/8=64 维的数据。将每个嵌入向量 𝐸 根据头数分割成多个部分,以便每个头可以独立地处理数据。例如,如果 𝐸是一个长度为 512 的向量,我们会将其分割成 8 个长度为 64 的向量。

(2)生成Q、K、V(Generating Q, K, V):

  • 对于序列中的每个单词,使用对应的权重矩阵 𝑊𝑄​,𝑊𝐾​,和 𝑊𝑉来生成Q、K、V。
  • 每个头将独立地使用自己的权重矩阵来生成Q、K、V。

如:对单词“love”的计算如下:

Q("love") = W_Q * E("love") =\begin{bmatrix} 0.1&0.3\\ 0.2&0.4\end{bmatrix} * \begin{bmatrix} 0.5\\ 0.3\end{bmatrix} =\begin{bmatrix} 0.14\\ 0.22\end{bmatrix}K("love") = W_K * E("love") =\begin{bmatrix} 0.4&0.6\\ 0.5&0.8\end{bmatrix} * \begin{bmatrix} 0.5\\ 0.3\end{bmatrix} =\begin{bmatrix} 0.38\\ 0.49\end{bmatrix}

V("love") = W_V * E("love") =\begin{bmatrix} 0.7&0.9\\ 0.8&1.0\end{bmatrix} * \begin{bmatrix} 0.5\\ 0.3\end{bmatrix} =\begin{bmatrix} 0.62\\ 0.7\end{bmatrix}

# 以此类推,为 "l", "natural", "language" 计算 Q、K、V。

四、计算注意力得分

自注意力机制中的一个关键步骤是计算查询(Query)和键(Key)之间的相关性或相似性,以确定注意力得分或权值系数。以下是几种常见的方法:

1)点积注意力(Dot-Product Attention):

  • 点积注意力是最常见的注意力计算方式。给定查询 𝑄 和键 𝐾,计算它们的点积来衡量它们的相似性: Attention(Q,K)=Q\cdot K^{T}
  • 这种方法简单且计算效率高,但在计算点积之前通常会对键的维度进行缩放,以避免较大的数值影响softmax函数的稳定性: Attention(Q,K)=\frac{Q\cdot K^{T}}{\sqrt{d_{k}}},其中 d_{k}是键 𝐾 的维度。
  • 注意:点乘简而言之就是矩阵各对应元素相乘。要求两个矩阵的维度相容,即第一个矩阵的列数等于第二个矩阵的行数。所以将K转置,计算规则为:A\cdot B=\begin{bmatrix} a\\ b \end{bmatrix}\cdot [c \ \ d]=ac+bd

2)缩放点积注意力(Scaled Dot-Product Attention):

  • 缩放点积注意力是Transformer模型中使用的,它结合了点积和缩放操作: Attention(Q,K)=\frac{Q\cdot K^{T}}{\sqrt{d_{k}}},其中 d_{k}是键 𝐾 的维度。
  • 缩放因子\sqrt{d_{k}}确保了softmax函数在计算过程中的稳定性。

3)余弦相似度(Cosine Similarity):

  • 余弦相似度度量了两个向量在方向上的相似性,而不是大小。计算公式为: Attention(Q,K)=\frac{QK^{T}}{\parallel Q\parallel \parallel K\parallel }
  • 余弦相似度通常用于衡量两个向量的方向是否相似,但对长度不敏感。

4)多层感知器(MLP):

  • 可以使用一个小型的神经网络(通常是一个或多个全连接层)来学习查询和键之间的复杂关系:Attention(Q,K)=MLP(Q,K)
  • 这种方法可以捕捉非线性关系,但计算成本更高,且不如点积注意力直观。

5)加性注意力(Additive Attention):

  • 加性注意力通过一个线性层和激活函数来计算查询和键之间的相似性: Attention(Q,K)=Vtanh(W_{Q}Q+W_{K}K)
  • 其中 W_{Q}和 W_{K}​ 是可学习的权重矩阵,V是另一个可学习的权重向量。

如对单词 "love" 采用缩放点积法计算查询向量 𝑄("𝐼")和键向量 𝐾("𝑙𝑜𝑣𝑒")的相似度得分,假设已求出Q("I")=\begin{bmatrix} 0.12\\ 0.20 \end{bmatrix}:即

Similarity("I","love")=\frac{Q("I") K("love")^{T}}{\sqrt{d_{k}}}=\begin{bmatrix} 0.12\\ 0.20 \end{bmatrix}[0.14,0.22]/\sqrt{2}=(0.12\times 0.14+0.20\times 0.22)/\sqrt{2}\approx 0.043

即:I和love的相似度得分约为0.043

五、权重分配:应用Softmax函数

计算得到的注意力得分随后会通过一个softmax函数进行归一化,以生成权重系数,这些权重系数表示在生成输出时对值(Value)向量进行加权的强度。归一化后的权重系数之和为1,确保了模型在所有可能的输入上都有一个有效的概率分布。

Weights = softmax(Attention(Q,K))

  • softmax函数含义

Softmax函数是一种在机器学习和深度学习中常用的激活函数,特别是在处理概率分布时。它将一个向量或一组数值转换成概率分布,使得所有输出值的和为1。在自注意力机制中,Softmax函数用于对相似度得分进行归一化,从而得到每个元素的注意力权重。

Softmax函数定义为:Softmax(s_{i})=e^{s_{i}}/\sum_{j}e^{s_{j}} 其中,s_{i} 是第 𝑖个元素的相似度得分,而 𝑗 遍历所有元素。

使用softmax函数对所有单词(在这个例子中是 "I" 和 "love")的相似度得分进行归一化,得到单词 "I" 对 "love" 的注意力权重 𝑤:

w("I","love")=softmax(Similarity("I","love")) =\frac{\exp(\text{Similarity}("I", "love"))}{\sum_{j}\exp(\text{Similarity}("I", w_j))}

这里 𝑤𝑗​ 表示序列中的第 𝑗个单词。

如假设I love natural language 中其他单词与“I”和“love”的相似度得分分别为:“s_{I - natural} = 0.033),“s_{I - language} = 0.022),“s_{love - natural} = 0.053),“s_{love - language} = 0.043)。其中s_{I - natural}表示I和natural的相关度,则:Softmax("love")=e^{0.043}/(e^{0.043}+e^{0.033}+e^{0.022}+e^{0.043}+)\approx 0.252

因此,单词“I”对“love”的注意力权重约为0.252。

六、计算最终的注意力输出

这些权重系数随后用于对值(Value)向量进行加权求和,得到最终的输出向量。这个过程允许模型动态地聚焦于输入序列中与当前处理元素最相关的部分。

最后,使用归一化的注意力权重 𝑤 来加权单词 "love" 的值向量 V("love"),得到单词 "I" 的最终注意力输出:

Output("I")=\sum_{j}w("I",w_{j})V(W_{j})

这个输出将结合序列中所有单词的信息,根据它们与 "I" 的相关性进行加权。

  • 19
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值