【深度学习】从self-attention到transform(self-attention入坑指南)

本文详细解析了Self-Attention在序列标注任务中的应用,通过对比传统深度学习方法,阐述了Self-Attention如何考虑上下文联系,解决不同长度输入和输出的问题。讲解了Dot-Product注意力机制,展示了如何计算输入向量之间的相关度,并通过矩阵运算进一步解释Self-Attention的过程。最后,提出了Multi-head Self-Attention作为Self-Attention的升级版,为后续深入学习奠定基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.youkuaiyun.com/weixin_43414694/article/details/119058654
该教程主要参考的是台大李宏毅的网课视频,附上视频链接:台大李宏毅self-attention教程
文中图片均引自台大李宏毅的PPT,需要PPT的童鞋请戳这里:教程配套PPT
本文针对视频中的一些重点进行总结,看不懂的童鞋还请去看原视频,毕竟李宏毅yyds!!
背景什么的就不再介绍了,网上一搜一大堆,不知道背景的童鞋可以先去度娘问一下。

正文开始

self-attention主要是针对seq2seq的,根据输入和输出的向量长度的不同可以分为三种情况:

  1. 输入和输出长度相同,也就是说输入n个向量,就要输出n个对应的标签:比如给一个句子里的每个单次标注词性(动词、名词、形容词等等)
  2. 输入和输出长度不同,也就是输入n个向量,输入m个向量(n!=m):比如判断是个句子是贬义的还是褒义还是中中性的。例如You are very good,很显然这句话是褒义的,输入是四个向量,输出是两个向量
  3. 输出向量的长度未知,需要由机器自己决定需要输出的标签数量

本文以第一种情况进行展开讲解,第一种情况的英文名也叫Sequence Labeling,也就是输入的每一个向量都需要给给它一个对应的标签。

Sequence Labeling

首先给出一个句子,需要对下面这个句子的每一个单词的词性进行标注。

I saw a saw(我看到了一把锯)

这里的第一个saw意思为动词“看到”,而第二个saw的意思为名词“锯”,这对于我们来说可以很轻松的分辨出这两个saw的词性是不同的,但是机器不同。如果使用传统的深度学习方法,机器将会对每个单词进行独立分析,不考虑上下文之间的联系(此图引自台大李宏毅的ppt),那么这两个saw对于机器来说是完全一样的。因此输入的结果肯定也是一样的(要么都是名词,要么都是动词),因此在某些场合,考虑上下文联系就显得非常重要。
台大李宏毅ppt
有的人提出利用一个window将相邻单词框起来一起分析,但这种做法有几个缺点:

  • 每个句子的长度可能不同
  • 如果让window的长度等于最长的那个句子的长度,则会导致FC层的参数过多

因此,为了解决这些问题,self-attention就被提出来了。

Self-attention

在这里插入图片描述
乍一看这张图和上面那一张差别不大,也是输入四个向量,输出四个向量,但输出的这四个向量比较特殊,它们是考虑整个句子后才输出的,并不是一对一的关系。也就是说每个输出向量都是充分考虑到它和四个输入向量的关系,因此后面的FC层也不仅仅只考虑一个输入向量,而是需要考虑四个输入向量,这就把上下文联系了起来,这就是一次self-attention,而self-attention是可以叠加的,可以针对一个句子进行多次self-attention。如果读到这有点懵逼也很正常,继续往下看。

重点来了

我们设输入到self-attention的四个向量分别为 a 1 , a 2 , a 3 , a 4 a^1, a^2, a^3, a^4 a1,a2,a3,a4,经过self-attention之后的输出向量为 b 1 , b 2 , b 3 , b 4 b^1, b^2, b^3, b^4 b1,b2,b3,b4,每一个输出向量都是充分考虑所有的输入向量之后得到了的,也就是说 b 1 b^1 b1 是根据 a 1 , a 2 , a 3 , a 4 a^1, a^2, a^3, a^4 a1,a2,a3,a4得出的, b 2 b^2 b2也是根据 a 1 , a 2 , a 3 , a 4 a^1, a^2, a^3, a^4 a1,a2,a3,a4得出的。下面这张图可以很好的表示。下面以 b 1 b^1 b1为例进行说明。

在这里插入图片描述

根据 a 1 a^1 a1寻找和 a 1 a^1 a1有关的其他输入向量也就是说计算 a 2 , a 3 , a 4 a^2, a^3, a^4 a2,a3,a4这三个向量和 a 1 a^1 a1的相关度,这里用 α \alpha α来表示

在这里插入图片描述
α \alpha α的方法主要有两种:Dot-productAdditive,比较常用的是Dot-product,这里只介绍Dot-product,想了解第二种方法的童鞋可以观看原视频、

Dot-product

将输入的两个向量分别乘一个矩阵 W q W^q Wq W k W^k Wk之后得到的向量 q q q和向量 k k k,之后两个向量求点积可得到 α \alpha α.,即 α = q ⋅ k \alpha = q \centerdot k α=qk
在这里插入图片描述
那怎么将 α \alpha α用到self-attention里呢?用 a 1 a^1 a1分别与 a 2 , a 3 , a 4 a^2, a^3, a^4 a2,a3,a4相乘计算 a 1 a^1 a1 a 2 , a 3 , a 4 a^2, a^3, a^4 a2,a3,a4之间的相似度,这里我们设:
q 1 = W q α 1 q^1=W^q \alpha^1 q1=Wqα1 k 2 = W k a 2 k^2=W^k a^2 k2=Wka2 k 3 = W k a 3 k^3=W^k a^3 k3=Wka3 k 4 = W k a 4 k^4=W^k a^4 k4=Wka4

q 1 q^1 q1我们称之为query k 2 , k 3 , k 4 k^2, k^3, k^4 k2,k3,k4我们称之为key,那么 α 12 = q 1 ⋅ k 2 \alpha_{12} = q^1 \centerdot k^2 α12=q1k2 α 12 \alpha_{12} α12表示 a 1 和 a 2 a^1和a^2 a1a2的相似度,称为attention score,同理可得
α 13 = q 1 ⋅ k 3 \alpha_{13} = q^1 \centerdot k^3 α13=q1k3 α 13 = q 1 ⋅ k 4 \alpha_{13} = q^1 \centerdot k^4 α13=q1k4 α 14 = q 1 ⋅ k 4 \alpha_{14} = q^1 \centerdot k^4 α14=q1k4 除此之外,也要计算自相关性,也就是 α 11 = q 1 ⋅ k 1 \alpha_{11} = q^1 \centerdot k^1 α11=q1k1 之后进行将 α 11 , α 12 , α 13 , α 14 \alpha_{11}, \alpha_{12}, \alpha_{13}, \alpha_{14} α11,α12,α13,α14输入到softmax层(softmax不是唯一选择,也可以使用其他激活函数)得到 α 11 ′ , α 12 ′ , α 13 ′ , α 14 ′ \alpha'_{11}, \alpha'_{12}, \alpha'_{13}, \alpha'_{14} α11,α12,α13,α14,整个过程如下图所示。在这里插入图片描述

得到 α ′ \alpha' α我们就知道了 a 1 a^1 a1和其他输入向量之间的关系强弱,下面就根据这个关系从中提取重要信息。

我们设一个矩阵 W v W^v Wv和四个向量 v 1 , v 2 , v 3 , v 4 v^1, v^2, v^3, v^4 v1,v2,v3,v4,其中 v 1 = W v a 1 v^1 =W^v a^1 v1=Wva1 v 2 = W v a 2 v^2 =W^v a^2 v2=Wva2 v 3 = W v a 3 v^3 =W^v a^3 v3=Wva3 v 4 = W v a 4 v^4 =W^v a^4 v4=Wva4 之后将每一个attention score和对应的 v v v相乘后求和即可得到 b 1 b^1 b1,即 b 1 = ∑ i α 1 i ′ v i b^1=\sum_i \alpha'_{1i} v_i b1=iα1ivi在这里插入图片描述
假如 a 1 a^1 a1 a 2 a^2 a2的相关度越大,也就是 α 12 ′ \alpha'_{12} α12越大,那么 b 1 b^1 b1的值就越接近 v 2 v^2 v2,同理,若 a 1 a^1 a1 a 3 a^3 a3的相关度越大,也就是 α 13 ′ \alpha'_{13} α13越大,那么 b 1 b^1 b1的值就越接近 v 3 v^3 v3,这一点一定要想明白。
同理 a 2 a^2 a2和其他输入向量的相关度 α 21 ′ = s o f t m a x ( q 2 k 1 ) \alpha'_{21}=softmax(q^2 k^1) α21=softmax(q2k1) α 22 ′ = s o f t m a x ( q 2 k 2 ) \alpha'_{22}=softmax(q^2 k^2) α22=softmax(q2k2) α 23 ′ = s o f t m a x ( q 2 k 3 ) \alpha'_{23}=softmax(q^2 k^3) α23=softmax(q2k3) α 24 ′ = s o f t m a x ( q 2 k 4 ) \alpha'_{24}=softmax(q^2 k^4) α24=softmax(q2k4)因此 b 2 = α 21 ′ v 1 + α 22 ′ v 2 + α 23 ′ v 3 + α 24 ′ v 4 b^2=\alpha'_{21}v^1+\alpha'_{22}v^2+\alpha'_{23}v^3+\alpha'_{24}v^4 b2=α21v1+α22v2+α23v3+α24v4

下面从矩阵的角度分析self_attention

根据上面的分析可知,每一个输入向量 a i a^i ai都要有 q i , k i , v i q^i, k^i, v^i qi,ki,vi与之对应,且 q i = W q a i q^i=W_q a^i qi=Wqai,也就是说 q 1 q 2 q 3 q 4 = W q [ a 1 a 2 a 3 a 4 ] q^1q^2q^3q^4=W^q[a^ 1a^2a^3a^4] q1q2q3q4=Wq[a1a2a3a4]这里我们将 a 1 , a 2 , a 3 , a 4 a^1, a^2, a^3, a^4 a1,a2,a3,a4用一个矩阵 I I I表示,将 q 1 , q 2 , a 3 , q 4 q^1, q^2, a^3, q^4 q1,q2,a3,q4用矩阵 Q Q Q表示,因此上式可以写为 Q = W q I Q=W^qI Q=WqI同理,用矩阵 K K K表示 k 1 , k 2 , k 3 , k 4 k^1, k^2, k^3, k^4 k1,k2,k3,k4,用矩阵 V V V表示 v 1 , v 2 , v 3 , v 4 v^1, v^2, v^3, v^4 v1,v2,v3,v4,因此有 K = W k I K=W^kI K=WkI V = W v I V=W^vI V=WvI 在这里插入图片描述

从矩阵的角度求解相关度 α 1 i \alpha_{1i} α1i

根据前面的分析, a 1 和 a i 的相关度 α 1 i = q 1 k i ,携程矩阵的形式就是 α 1 i = ( k i ) T q 1 a^1和a^i的相关度\alpha_{1i}=q^1 k^i,携程矩阵的形式就是\alpha_{1i}=(k^i)^T q^1 a1ai的相关度α1i=q1ki,携程矩阵的形式就是α1i=(ki)Tq1,那么 α 11 , α 12 , α 13 , α 14 \alpha_{11}, \alpha_{12}, \alpha_{13}, \alpha_{14} α11,α12,α13,α14就可以写成 [ ( k 1 ) T , ( k 2 ) T , ( k 3 ) T , ( k 4 ) T ] ∗ q 1 [(k^1)^T, (k^2)^T, (k^3)^T, (k^4)^T] *q^1 [(k1)T,(k2)T,(k3)T,(k4)T]q1 α 2 i , α 3 i , α 4 i \alpha_{2i}, \alpha_{3i}, \alpha_{4i} α2i,α3i,α4i同理。我们将它们写到一个大矩阵中在这里插入图片描述

在这里插入图片描述

从矩阵的角度求 b b b

直接上图,如果有线性代数基础很好理解(图中的 a ^ 应该为 a ′ \hat{a}应该为a' a^应该为a在这里插入图片描述

全部过程可以总结为下面的图,其中需要学习的参数为 W q , W k , W v W^q, W^k, W^v Wq,Wk,Wv

在这里插入图片描述
以上就是self-attention的基础内容了,各位童鞋如果有不明白的地方可以去看原视频,毕竟李宏毅讲的是真的细。如果有什么疑问,欢迎留言讨论。下一篇将对self-attention的升级版
Multi-head Self-attention进行讲解

内容概要:本文档详细介绍了在三台CentOS 7服务器(IP地址分别为192.168.0.157、192.168.0.158和192.168.0.159)上安装和配置Hadoop、Flink及其他大数据组件(如Hive、MySQL、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala)的具体步骤。首先,文档说明了环境准备,包括配置主机名映射、SSH免密登录、JDK安装等。接着,详细描述了Hadoop集群的安装配置,包括SSH免密登录、JDK配置、Hadoop环境变量设置、HDFS和YARN配置文件修改、集群启动与测试。随后,依次介绍了MySQL、Hive、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala和Flink的安装配置过程,包括解压、环境变量配置、配置文件修改、服务启动等关键步骤。最后,文档提供了每个组件的基本测试方法,确保安装成功。 适合人群:具备一定Linux基础和大数据组件基础知识的运维人员、大数据开发工程师以及系统管理员。 使用场景及目标:①为大数据平台建提供详细的安装指南,确保各组件能够顺利安装和配置;②帮助技术人员快速掌握Hadoop、Flink等大数据组件的安装与配置,提升工作效率;③适用于企业级大数据平台的建与维护,确保集群稳定运行。 其他说明:本文档不仅提供了详细的安装步骤,还涵盖了常见的配置项解释和故障排查建议。建议读者在安装过程中仔细阅读每一步骤,并根据实际情况调整配置参数。此外,文档中的命令和配置文件路径均为示例,实际操作时需根据具体环境进行适当修改。
在无线通信领域,天线阵列设计对于信号传播方向和覆盖范围的优化至关重要。本题要求设计一个广播电台的天线布局,形成特定的水平面波瓣图,即在东北方向实现最大辐射强度,在正东到正北的90°范围内辐射衰减最小且无零点;而在其余270°范围内允许出现零点,且正西和西南方向必须为零。为此,设计了一个由4个铅垂铁塔组成的阵列,各铁塔上的电流幅度相等,相位关系可自由调整,几何布置和间距不受限制。设计过程如下: 第一步:构建初级波瓣图 选取南北方向上的两个点源,间距为0.2λ(λ为电磁波波长),形成一个端射阵。通过调整相位差,使正南方向的辐射为零,计算得到初始相位差δ=252°。为了满足西南方向零辐射的要求,整体相位再偏移45°,得到初级波瓣图的表达式为E1=cos(36°cos(φ+45°)+126°)。 第二步:构建次级波瓣图 再选取一个点源位于正北方向,另一个点源位于西南方向,间距为0.4λ。调整相位差使西南方向的辐射为零,计算得到相位差δ=280°。同样整体偏移45°,得到次级波瓣图的表达式为E2=cos(72°cos(φ+45°)+140°)。 最终组合: 将初级波瓣图E1和次级波瓣图E2相乘,得到总阵的波瓣图E=E1×E2=cos(36°cos(φ+45°)+126°)×cos(72°cos(φ+45°)+140°)。通过编程实现计算并绘制波瓣图,可以看到三个阶段的波瓣图分别对应初级波瓣、次级波瓣和总波瓣,最终得到满足广播电台需求的总波瓣图。实验代码使用MATLAB编写,利用polar函数在极坐标下绘制波瓣图,并通过subplot分块显示不同阶段的波瓣图。这种设计方法体现了天线阵列设计的基本原理,即通过调整天线间的相对位置和相位关系,控制电磁波的辐射方向和强度,以满足特定的覆盖需求。这种设计在雷达、卫星通信和移动通信基站等无线通信系统中得到了广泛应用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值