注意力机制-深度学习中的一个关键技术

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

—起源

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

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

—原理

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

计算注意力分数

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

s i = f ( q , x i ) s_i = f(q, x_i) si=f(q,xi)

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

对注意力分数进行归一化

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

a i = e s i ∑ j = 1 n e s j a_i = \frac{e^{s_i}}{\sum_{j=1}^{n}e^{s_j}} ai=j=1nesjesi

其中,softmax函数的定义为:

s o f t m a x ( x ) = e x ∑ j = 1 n e x j softmax(x) = \frac{e^x}{\sum_{j=1}^{n}e^{x_j}} softmax(x)=j=1nexjex

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

计算加权后的向量表示

注意力机制的第三步是将输入序列中的每个元素 x i x_i xi乘以对应的注意力权重 a i a_i ai,并将它们相加,得到加权后的向量表示 c c c,即:

c = ∑ i = 1 n a i x i c = \sum_{i=1}^{n} a_i x_i c=i=1naixi

一个例子

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

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

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

然后,我们使用每个目标隐藏状态 u i u_i ui作为查询向量 q q q,使用每个输入隐藏状态 h j h_j hj作为输入序列中的元素 x i x_i xi,计算每个输入隐藏状态 h j h_j hj和目标隐藏状态 u i u_i ui之间的相似度,得到一个注意力分数 s i , j s_{i,j} si,j

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

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

f ( u i , h j ) = u i T W h j f(u_i, h_j) = u_i^T W h_j f(ui,hj)=uiTWhj

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

接着,我们对每个目标单词 y i y_i yi对应的注意力分数 s i , j s_{i,j} si,j进行归一化,得到每个输入单词 h j h_j hj对于目标单词 y i y_i yi的注意力权重 a i , j a_{i,j} ai,j

a i , j = e s i , j ∑ k = 1 n e s i , k a_{i,j} = \frac{e^{s_{i,j}}}{\sum_{k=1}^{n}e^{s_{i,k}}} ai,j=k=1nesi,kesi,j

最后,我们将每个输入单词 h j h_j hj乘以对应的注意力权重 a i , j a_{i,j} ai,j,并将它们相加,得到加权后的向量表示 c i c_i ci

c i = ∑ j = 1 n a i , j h j c_i = \sum_{j=1}^{n} a_{i,j} h_j ci=j=1nai,jhj

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

z i = tanh ⁡ ( W c [ c i ; u i ] + b c ) z_i = \tanh(W_c[c_i;u_i]+b_c) zi=tanh(Wc[ci;ui]+bc)

p ( y i ∣ x , y < i ) = s o f t m a x ( W s z i + b s ) p(y_i|x,y_{<i}) = softmax(W_s z_i + b_s) p(yix,y<i)=softmax(Wszi+bs)

其中, W c W_c Wc b c b_c bc W s W_s Ws b s b_s bs都是可学习的参数。

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

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

自注意力机制

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

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

输入表示

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

注意力权重计算

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

s i , j = q i T k j s_{i,j} = q_i^T k_j si,j=qiTkj

其中, q i q_i qi 表示词语 i i i 的查询向量, k j k_j kj 表示词语 j j j 的键向量。这个相似度可以看作是词语 i i i 对词语 j j j 的注意力权重。

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

α i , j = exp ⁡ ( s i , j ) ∑ k = 1 n exp ⁡ ( s i , 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)

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

上下文表示

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

c i = ∑ j = 1 n α i , j v j c_i = \sum_{j=1}^{n} \alpha_{i,j} v_j ci=j=1nαi,jvj

其中, v j v_j vj 表示词语 j j j 的词向量表示。

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

多头注意力机制

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

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

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

输入表示

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

多头注意力

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

拼接

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

线性变换

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

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

其中, W O W^O WO b O b^O bO 都是需要学习的参数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值