注意力机制(Attention Mechanism)是一种在深度学习领域中被广泛应用的技术,它源于神经科学领域对人类注意力分配方式的研究,用于模拟人类对于不同信息的关注程度和分配方式。

—起源

注意力机制最早是在神经科学领域被提出的,用来描述人类在执行某项任务时,对于不同信息的关注程度和分配方式。例如,当我们在听一个人说话时,我们会将注意力集中在说话人的声音上,忽略其他的干扰声音。这种注意力分配方式可以帮助我们更好地理解说话人的意思,从而更好地完成听取任务。

在计算机领域中,注意力机制的应用可以追溯到20世纪80年代。当时,科学家们开始尝试将注意力机制应用于机器翻译任务中,用于对输入序列中不同位置的单词进行加权,从而更好地捕捉输入序列中的信息。

—原理

注意力机制的核心思想是将需要关注的信息进行加权处理,使得模型可以更好地捕捉输入序列中的重要信息。具体来说,注意力机制可以分为三个步骤:计算注意力分数、对注意力分数进行归一化、计算加权后的向量表示。

计算注意力分数

假设我们有一个输入序列x=[x1,x2,…,xn]x=[x_1,x_2,…,x_n]x=[x1,x2,,xn]和一个查询向量qqq。注意力机制的第一步是计算每个输入序列中的元素xix_ixi和查询向量qqq之间的相似度,得到一个注意力分数sis_isi,即:

si=f(q,xi)s_i = f(q, x_i)si=f(q,xi)

其中,fff是一个函数,用来计算查询向量qqq和输入序列中的元素xix_ixi之间的相似度。常用的函数有点积函数、双线性函数和多层感知机等。

对注意力分数进行归一化

注意力机制的第二步是对注意力分数进行归一化,使得它们的和等于1。具体来说,我们可以使用softmax函数将每个注意力分数sis_isi转化为一个概率值aia_iai,即:

ai=esi∑j=1nesja_i = \frac{e^{s_i}}{\sum_{j=1}^{n}e^{s_j}}ai=j=1nesjesi

其中,softmax函数的定义为:

softmax(x)=ex∑j=1nexjsoftmax(x) = \frac{e^x}{\sum_{j=1}^{n}e^{x_j}}softmax(x)=j=1nexjex

其中,eee是自然常数,∑j=1nexj\sum_{j=1}^{n}e^{x_j}j=1nexj是对所有元素的指数函数求和。

计算加权后的向量表示

注意力机制的第三步是将输入序列中的每个元素xix_ixi乘以对应的注意力权重aia_iai,并将它们相加,得到加权后的向量表示ccc,即:

c=∑i=1naixic = \sum_{i=1}^{n} a_i x_ic=i=1naixi

一个例子

假设我们有一个机器翻译模型,用于将英文翻译成法语。输入序列为英文单词序列x=[x1,x2,…,xn]x=[x_1,x_2,…,x_n]x=[x1,x2,,xn],目标序列为法语单词序列y=[y1,y2,…,ym]y=[y_1,y_2,…,y_m]y=[y1,y2,,ym]。我们希望使用注意力机制来加强模型对输入序列中不同位置单词的关注程度。

首先,我们将输入序列xxx通过一个嵌入层(Embedding Layer)转化为每个单词的向量表示xemb=[xemb,1,xemb,2,…,xemb,n]x_{emb}=[x_{emb,1},x_{emb,2},…,x_{emb,n}]xemb=[xemb,1,xemb,2,,xemb,n]。同时,我们也将目标序列yyy通过嵌入层转化为每个单词的向量表示yemb=[yemb,1,yemb,2,…,yemb,m]y_{emb}=[y_{emb,1},y_{emb,2},…,y_{emb,m}]yemb=[yemb,1,yemb,2,,yemb,m]

接下来,我们使用循环神经网络(Recurrent Neural Network,RNN)对输入序列xembx_{emb}xemb进行编码,得到一个隐藏状态序列h=[h1,h2,…,hn]h=[h_1,h_2,…,h_n]h=[h1,h2,,hn]。同时,我们也使用循环神经网络对目标序列yemby_{emb}yemb进行编码,得到一个目标隐藏状态序列u=[u1,u2,…,um]u=[u_1,u_2,…,u_m]u=[u1,u2,,um]

然后,我们使用每个目标隐藏状态uiu_iui作为查询向量qqq,使用每个输入隐藏状态hjh_jhj作为输入序列中的元素xix_ixi,计算每个输入隐藏状态hjh_jhj和目标隐藏状态uiu_iui之间的相似度,得到一个注意力分数si,js_{i,j}si,j

si,j=f(ui,hj)s_{i,j} = f(u_i, h_j)si,j=f(ui,hj)

其中,fff是一个函数,用来计算查询向量qqq和输入序列中的元素xix_ixi之间的相似度。在机器翻译任务中,常用的函数是双线性函数:

f(ui,hj)=uiTWhjf(u_i, h_j) = u_i^T W h_jf(ui,hj)=uiTWhj

其中,WWW是一个可学习的权重矩阵。

接着,我们对每个目标单词yiy_iyi对应的注意力分数si,js_{i,j}si,j进行归一化,得到每个输入单词hjh_jhj对于目标单词yiy_iyi的注意力权重ai,ja_{i,j}ai,j

ai,j=esi,j∑k=1nesi,ka_{i,j} = \frac{e^{s_{i,j}}}{\sum_{k=1}^{n}e^{s_{i,k}}}ai,j=k=1nesi,kesi,j

最后,我们将每个输入单词hjh_jhj乘以对应的注意力权重ai,ja_{i,j}ai,j,并将它们相加,得到加权后的向量表示cic_ici

ci=∑j=1nai,jhjc_i = \sum_{j=1}^{n} a_{i,j} h_jci=j=1nai,jhj

这个加权后的向量cic_ici表示了在生成目标单词yiy_iyi时,模型对于输入序列xxx中每个单词的关注程度。我们可以将cic_ici与目标隐藏状态uiu_iui进行拼接,作为一个新的目标向量ziz_izi,并送入一个线性层和softmax层中,得到对目标单词yiy_iyi的预测概率分布p(yi∣x,y<i)p(y_i|x,y_{<i})p(yix,y<i)

zi=tanh⁡(Wc[ci;ui]+bc)z_i = \tanh(W_c[c_i;u_i]+b_c)zi=tanh(Wc[ci;ui]+bc)

p(yi∣x,y<i)=softmax(Wszi+bs)p(y_i|x,y_{<i}) = softmax(W_s z_i + b_s)p(yix,y<i)=softmax(Wszi+bs)

其中,WcW_cWcbcb_cbcWsW_sWsbsb_sbs都是可学习的参数。

自注意力机制和多头注意力机制

注意力机制注根据计算方式和输入序列的拆分可以分成自注意力机制和多头注意力机制。

自注意力机制

自注意力机制是一种用于自然语言处理中的注意力机制,它可以用来处理任意长度的输入序列,并生成对应的输出序列。自注意力机制最早被引入到机器翻译领域中,用于对源语言句子和目标语言句子之间的对应关系进行建模。自注意力机制的主要思想是在输入序列中对不同位置的词语之间进行关联计算,然后根据这些关联计算生成输出序列。

自注意力机制可以分为三个步骤:输入表示、注意力权重计算和上下文表示。

输入表示

在自注意力机制中,输入序列中的每个词语都需要先转换为一个向量表示。这个向量表示可以通过将词语的词向量与位置向量相加得到。词向量表示词语的语义信息,而位置向量则表示词语在输入序列中的位置信息。将这两个向量相加可以得到一个综合的向量表示,它可以代表输入序列中的每个词语。

注意力权重计算

在自注意力机制中,我们需要计算每个词语与其他词语之间的相似度,并将这些相似度用于计算该词语的上下文表示。具体来说,我们可以使用点积注意力(dot-product attention)来计算相似度。对于输入序列中的每个词语 iii,我们可以计算它与其他词语 jjj 之间的相似度 si,js_{i,j}si,j

si,j=qiTkjs_{i,j} = q_i^T k_jsi,j=qiTkj

其中,qiq_iqi 表示词语 iii 的查询向量,kjk_jkj 表示词语 jjj 的键向量。这个相似度可以看作是词语 iii 对词语 jjj 的注意力权重。

为了使得注意力权重具有可解释性,我们可以将注意力权重标准化,并将其作为对应词语的权重。具体来说,我们可以将相似度经过 softmax 函数进行归一化,得到注意力权重 αi,j\alpha_{i,j}αi,j

αi,j=exp⁡(si,j)∑k=1nexp⁡(si,k)\alpha_{i,j} = \frac{\exp(s_{i,j})}{\sum_{k=1}^{n}\exp(s_{i,k})}αi,j=k=1nexp(si,k)exp(si,j)

其中,nnn 表示输入序列的长度。

上下文表示

有了注意力权重之后,我们就可以通过加权平均的方式将输入序列中的所有词语表示合并成一个上下文表示。具体来说,我们可以将注意力权重 αi,j\alpha_{i,j}αi,j 作为词语 jjj 的权重,将它们与对应的词语向量 vjv_jvj 相乘,然后将结果相加得到词语 iii 的上下文表示 cic_ici

ci=∑j=1nαi,jvjc_i = \sum_{j=1}^{n} \alpha_{i,j} v_jci=j=1nαi,jvj

其中,vjv_jvj 表示词语 jjj 的词向量表示。

通过这种方式,我们就可以利用自注意力机制对输入序列中的词语之间的关系进行建模,并生成对应的输出序列。需要注意的是,自注意力机制是一种无须先验知识的方法,它可以自动从数据中学习到词语之间的语义关系。

多头注意力机制

自注意力机制在处理输入序列时只考虑了一个表示空间,这可能会导致一些信息被忽略或混淆。为了解决这个问题,多头注意力机制被引入到自然语言处理任务中。多头注意力机制可以将输入序列按照不同的维度进行拆分,并在每个维度上分别执行自注意力机制,从而使模型能够在不同的表示空间中学习到不同的关系。

多头注意力机制可以被看作是对自注意力机制的扩展,它将输入序列沿着不同的维度进行拆分,每个维度都可以看作是一个不同的任务或关注点。在每个维度上,我们可以独立地执行自注意力机制,并生成对应的上下文表示。这些上下文表示可以看作是在不同的表示空间中生成的,它们可以捕捉到不同的输入序列特征。

多头注意力机制可以分为四个步骤:输入表示、多头注意力、拼接、线性变换。

输入表示

输入表示的过程与自注意力机制中的类似,对于输入序列中的每个词语,我们需要先将其转换为一个向量表示,这个向量表示可以通过将词向量和位置向量相加得到。

多头注意力

在多头注意力机制中,我们需要将输入序列沿着不同的维度进行拆分,并在每个维度上执行自注意力机制。具体来说,我们可以将输入序列拆分成 hhh 个子序列,并在每个子序列上执行自注意力机制。在每个子序列上,我们需要计算注意力权重,并将它们用于计算该子序列的上下文表示。

拼接

在执行完多头注意力之后,我们需要将每个子序列的上下文表示拼接成一个大的上下文表示。具体来说,我们可以将 hhh 个上下文表示拼接成一个矩阵 C∈Rd×nC \in \mathbb{R}^{d\times n}CRd×n,其中 ddd 表示每个上下文表示的维度,nnn 表示输入序列的长度。

线性变换

最后,我们需要通过一个线性变换对拼接后的上下文表示进行处理,从而生成最终的输出序列。具体来说,我们可以将拼接后的上下文表示 CCC 与一个权重矩阵 WO∈Rd×dW^O \in \mathbb{R}^{d\times d}WORd×d 相乘,然后加上一个偏置向量 bO∈Rdb^O \in \mathbb{R}^dbORd,再经过一个激活函数(如 ReLU)从而得到最终的输出序列 Y∈Rd×nY \in \mathbb{R}^{d\times n}YRd×n

Y=ReLU(WOC+bO)Y = \text{ReLU}(W^O C + b^O)Y=ReLU(WOC+bO)

其中,WOW^OWObOb^ObO 都是需要学习的参数。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐