【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)
  b4DDAHOVqdA1 2023年11月02日 59 0

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_权重

🤵♂️ 个人主页: @AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱🏍 🙋♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_线性变换_02

<center 【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Positional Encoding(一)


摘要: 本系列旨在普及那些深度学习路上必经的核心概念,文章内容都是博主用心学习收集所写,欢迎大家三联支持!本系列会一直更新,核心概念系列会一直更新!欢迎大家订阅

该文章收录专栏 [✨--- 《深入解析机器学习:从原理到应用的全面指南》 ---✨]

自注意力机制(Self-Attention)

Transformer 模型的核心组件之一。自注意力允许模型根据输入序列中不同位置的相关性权重来计算每个位置的表示。通过计算查询、键和值之间的相似性得分,并将这些得分应用于值来获取加权和,从而生成每个位置的输出表示。(其目的就是取代RNN要做的事情,sequence to sequence(seq2seq),同时计算)

Q、K和V是通过对输入序列进行线性变换得到的,具体来说,通过对输入序列的每个位置应用不同的权重矩阵,将输入序列映射到具有不同维度的查询(Q)、键(K)和值(V)空间。这样,我们就可以使用这些查询、键和值来计算注意力权重并生成加权表示。

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_Mask_03

值(V)代表的是确切的值(线性变换得到),一般是不变的用于求最后的输出,其次要实现求各个向量的相似性,如果只有一个k,而没有q,那k 与其他输入的 k作相似性,自己单元没有可以做相似性的地方,而再加一个q就可以实现了, 从而最后得到权重。

具体来说,给定一个输入序列X,我们可以通过线性变换得到Q、K和V:

Q = X * W_Q K = X * W_K V = X * W_V

其中W_Q、W_K和W_V是可学习的权重矩阵。

使用Q、K和V的好处是,它们允许模型根据输入的不同部分对相关信息进行加权。Q用于查询输入序列的每个位置,K用于提供关于其他位置的信息,V则提供用于计算加权表示的值。

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_权重_04

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_权重_05

q,k做一个 inner product,并除与维度长度,这是因为维度值越大,输出结果a越大,所以通过除于维度的根号来平衡,通过计算Q和K之间的相似度得到注意力权重。一种常用的计算相似度的方法是使用点积操作:

Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) * V

其中d_k是Q和K的维度。通过将Q和K进行点积操作并除以sqrt(d_k)来缩放注意力权重,这有助于减小梯度在计算注意力时的变化范围(维度越大值越大),使得训练更加稳定。

这只是一个案例,不一定要使用scaled dot-product attention, 用其他的attention方法也有很多种,只要能输入两个向量输出一个分数即可

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_线性变换_06

将注意力权重与V进行加权求和,得到最终的表示:

Output = Attention(Q, K, V)

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_权重_07

通过每个attention权重乘上v累加最终根据 【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_权重_08 数据的 【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_Mask_09 得到基于全部序列长度的attention权重下的求和值,得到对应的 【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_权重_10

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_Mask_11

通过这种方法,我产生了一个 【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_权重_10 ,看到了全部的输入序列,但是如果说不想考虑到全部的输入,比如时序预测中只想看到以前的,只需要将对应权重为0即可,即给q , v 相似度输出默认给一个非常大的负数,在经过softmax就会变成0。

以此类推切换 【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_Mask_13,输出全部输出 【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_线性变换_14 序列。该方法所实现的平行化的意思是实现矩阵运算,上面介绍的方法需要一个循环遍历所有的字 xt,我们可以把上面的向量计算变成矩阵的形式,从而一次计算出所有时刻的输出

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_权重_15

第一步就不是计算某个时刻的 qt,kt,vt 了,而是一次计算所有时刻的 Q,K 和 V。计算过程如下图所示,这里的输入是一个矩阵 X,矩阵第 t 行为第 t 个词的向量表示 xt

多头注意力机制(Multi-head Self-attention)

为了实现多个输出扑捉多种不同模式下的状态,Transformer 模型同时使用多个自注意力机制,每个注意力机制被称为一个头(head)。通过并行计算多个头,模型可以学习不同粒度和关注不同方面的特征表示。

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_Mask_16

这里以两个头为例

前面定义的一组 Q,K,V 可以让一个词 attend to 相关的词,我们可以定义多组 Q,K,V,让它们分别关注不同的上下文。计算 Q,K,V 的过程还是一样,只不过线性变换的矩阵从一组 (WQ,WK,WV) 变成了多组 (W0Q,W0K,W0V) ,(W1Q,W1K,W1V),… 如下图所示

对于输入矩阵 X,每一组 Q、K 和 V 都可以得到一个输出矩阵 Z。如下图所示

最后输出再乘以一个矩阵降维得到同样大小的输出。

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_Mask_17

Padding Mask

其中在output输入的多头注意力机制中可以看到添加了Masked(Padding Mask),

  1. 传统 Seq2Seq 中 Decoder 使用的是 RNN 模型,因此在训练过程中输入 t 时刻的词,循环神经网络是时间驱动的,只有当 t 时刻运算结束了,才能看到 t+1 时刻的词。但在使用self-attention训练过程中,整个 ground truth都暴露在 Decoder 中,这显然是不对的,我们需要对 Decoder 的输入进行一些处理,即在训练中只注意当前训练时间刻前的历史数据
  2. 句子长度不同中,根据最长句子补齐后,对不等长的句子进行mask。

为了屏蔽后续时间步,可以将Mask矩阵中对应位置的元素设置为一个很大的负数(例如-1e9),这样在经过Softmax函数后,注意力权重接近于零,相当于忽略了后续时间步的信息。

假设有一个时间序列数据,长度为10,你想要关注前6个时间步的数据,而忽略后面的时间步。

时间序列: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Mask矩阵:
[[0, -1e9, -1e9, -1e9, -1e9, -1e9, -1e9, -1e9, -1e9, -1e9],
 [0, 0, -1e9, -1e9, -1e9, -1e9, -1e9, -1e9, -1e9, -1e9],
 [0, 0, 0, -1e9, -1e9, -1e9, -1e9, -1e9, -1e9, -1e9],
 [0, 0, 0, 0, -1e9, -1e9, -1e9, -1e9, -1e9, -1e9],
 [0, 0, 0, 0, 0, -1e9, -1e9, -1e9, -1e9, -1e9],
 [0, 0, 0, 0, 0, 0, -1e9, -1e9, -1e9, -1e9]]

这样,在进行注意力计算时,将输入序列与Mask矩阵相加,之后再做 softmax,就能将 - inf 变为 0,得到的这个矩阵即为每个字之间的权重,从而达到忽略后续时间步的效果。

在不等长句子处理中则同理对无效句子进行masking操作即可

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_权重_18

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Multi-head Self-attention模块(二)_线性变换_19

🤞到这里,如果还有什么疑问🤞
					🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
					 	 🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
b4DDAHOVqdA1