李宏毅老师-self-attention笔记

2024-04-12 04:38

本文主要是介绍李宏毅老师-self-attention笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文部分内容参考于以下博客:
自注意力机制

文章目录

  • 自注意力输入和输出
  • 自注意力机制函数
  • self_attention的计算过程
  • self_attention的矩阵表示方法:
  • 多头注意力机制
  • 位置编码

自注意力输入和输出

1.自注意力模型
输入的序列是变长的序列,输出的是一个标量
在这里插入图片描述
2.输入和输出都是序列,而且输入和输出的长度相等,输入的每一个元素对应输出的一个label。

在这里插入图片描述
3.输出序列的长度是不定的,这种情况其实也就是Seq2Seq模型,比如机器翻译。如下图所示:
在这里插入图片描述
4.输出序列的长度为1,此时相当于一个分类人物,比如像对正面/负面评论的分析
在这里插入图片描述

自注意力机制函数

由于需要建立输入向量序列的依赖关系,因此模型要考虑整个输入序列的信息,之后将输出向量输入到full-connected,做后续处理。
在这里插入图片描述
之前提到过,self_attention研究的是target或者source元素之间的相关性,假设此时的被查询的元素是 a 1 a^1 a1,我们计算 a 1 和 a 1 , a 2 , a 3 , a 4 a^1和a^1,a^2,a^3,a^4 a1a1,a2,a3,a4之间的相关性,这样做的好处是不需要把所有的信息都输入到神经网络中,只需要从X中选择和任务相关的信息即可。
在这里插入图片描述
计算相关度的函数有以下2种:
在这里插入图片描述
输入的两个向量,通过和权重矩阵 W q 和 W k 相 乘 得 到 q 和 k , q 和 k W^q和W^k相乘得到q和k,q和k WqWkqk,qk进行内积(对应元素相乘并相加的方式)从而求相关性 α \alpha α.
另外的方式:
在这里插入图片描述
输入的两个向量,通过和权重矩阵 W q 和 W k W^q和W^k WqWk相乘得到 q q q k k k,之后将 q q q k k k串联输入到一个激活函数( t a n h tanh tanh)中,通过一个transform得到 α \alpha α

self_attention的计算过程

一般来说,我们通过(key,value)的方式来表示输入信息,其中key用来计算注意力分布 α n \alpha_n αn,而value用来计算聚合信息,通常情况下:key值和value值是一样的。query代表的是被查询的向量。
如下图所示:a1为被查询向量,计算 a 1 与 [ a 2 , a 3 , a 4 ] a1与[a2,a3,a4] a1[a2,a3,a4]的关联性α(实践时一般也会计算与a1自己的相关性)。以Dot-product为例,我们分别将 [ a 1 , a 2 ] , [ a 1 , a 3 ] , [ a 1 , a 4 ] [a1,a2],[a1,a3],[a1,a4] [a1,a2],[a1,a3],[a1,a4]作为Dot-product的输入,求得对应的相关性 [ α 11 , α 12 , α 13 , α 14 ] [\alpha11,α12,α13,α14] [α11,α12,α13,α14]

在这里插入图片描述
2.计算出来a1跟每一个向量的关联性之后,将得到的关联性输入的softmax中,这个softmax和分类使用的softmax时一样的,得到对应数量的α′。
在这里插入图片描述
3.将a1,a2,a3,a4乘以权重矩阵 W v W^v Wv得到对应的value值,之后对应的 v i v^i vi和之前计算出来的 α 1 , i ′ \alpha'_{1,i} α1,i对应相乘再相加,即可得到注意力分数。

在这里插入图片描述

self_attention的矩阵表示方法:

这里输入的向量依旧是[a1,a2,a3,a4],对应的输入向量[a1,a2,a3,a4]拼接到一起组成I数组,对应的 [ q 1 = W q a 1 , q 2 = W q a 2 , q 3 = W q a 3 , q 4 = W q a 4 ] [q1=W^qa^1,q2=W^qa^2,q3=W^qa^3,q4=W^qa^4] [q1=Wqa1,q2=Wqa2,q3=Wqa3,q4=Wqa4]拼接在一起,得到Q矩阵。同理K和V矩阵也是同样获得的。
在这里插入图片描述
2.得到Q,K,V矩阵之后,下一步由Q和K计算相关性,以计算q1为例子,使用q1和[k1,k2,k3,k4]分别相乘得到了[ α 11 , α 12 , α 13 , α 14 \alpha_{11},\alpha_{12},\alpha_{13},\alpha_{14} α11,α12,α13,α14],为了使用矩阵的乘法运算,对[k1,k2,k3,k4]进行转置,再和q1相乘。转置之后: K T K^T KT的矩阵是 4 ∗ 1 4*1 41的, q 1 q^1 q1 1 ∗ 1 1*1 11可以直接相乘。

在这里插入图片描述
3.将第一步得到的K矩阵进行转置,得到 K T K^T KT。K和Q相乘,得到相关矩阵A,A再经过softmax函数,得到归一化的矩阵 A ′ A' A
如下图所示: K T K^T KT是一个 4 ∗ 1 4*1 41的矩阵,而Q矩阵是一个 1 ∗ 4 1*4 14的矩阵,可以进行矩阵的运算。
在这里插入图片描述
在这里插入图片描述

我们将矩阵V依次乘以矩阵A′中的每一列得到输出[b1,b2,b3,b4]
在这里插入图片描述在这里插入图片描述
综上所述:计算过程如下所示

  1. 计算Q,K,V三个矩阵。
    Q = W q I , K = W k I , V = W v I Q=W^qI,K=W^kI,V=W^vI Q=WqI,K=WkI,V=WvI
  2. 计算Q和V的相似度,经过softmax函数进行归一化得到注意力矩阵 A ′ A' A
    A = K T Q , A ′ = s o f t m a x ( A ) A=K^TQ,A'=softmax(A) A=KTQ,A=softmax(A)
  3. 计算输出矩阵: O = V A ′ O=VA' O=VA
    注意,一般情况下,V的取值等于K等于输入向量,故而 V ∗ A ′ 计 算 的 V*A'计算的 VA是输入信息的加权平均值。

多头注意力机制

多头注意力(Multi-Head Attention)是利用多个查询 Q = [ q 1 , q 2 , . . . , q m ] Q=[q1,q2,...,qm] Q=[q1,q2,...,qm]来并行地从输入信息中选取多组信息.每个注意力关注输入信息的不同部分。

在Self-Attention中,我们是使用q去寻找与之相关的k,但是这个相关性并不一定有一种。那多种相关性体现到计算方式上就是有多个矩阵q,不同的q负责代表不同的相关性。
这里展现的是两个head的,首先利用a和 W q W^q Wq相乘得到了 q i q^i qi,之后 q i q^i qi再乘以两个权重矩阵得到qi,1和qi,2。

在这里插入图片描述
在后续的计算中,我们将属于相同相关性的矩阵进行运算。
在这里插入图片描述

1. q i 1 只 和 k i 1 , k j 1 qi1只和ki1,kj1 qi1ki1,kj1进行相似度运算得到 α i 1 和 α j 1 \alpha{i1}和\alpha{j1} αi1αj1,而不需要和 k i 2 和 k j 2 ki2和kj2 ki2kj2进行相似度的计算。
2.得到的结果再和 v i , 1 和 v j , 1 v^{i,1}和v^{j,1} vi,1vj,1进行相乘再相加,从而可以得到 b i , 1 b^{i,1} bi,1。相同的方法可以得到 b i , 2 b^{i,2} bi,2
3.将 b i , 1 和 b i , 2 b^{i,1}和b^{i,2} bi,1bi,2拼接起来,乘以一个权重矩阵 W O W^O WO,得到最终的输出 b i b^i bi
在这里插入图片描述

位置编码

我们可以发现对于每一个input是出现在sequence的最前面,还是最后面这样的位置信息,Self-Attention是无法获取到的。这样子可能会出现一些问题,比如在做词性标记(POS tagging)的时候,像动词一般不会出现在句首的位置这样的位置信息还是非常重要的。
我们可以使用positional encoding的技术,将位置信息加入到Self-Attention中。
在这里插入图片描述
如上图所示,我们可以为每个位置设定一个专属的positional vector,用ei表示,上标i代表位置。我们先将ei和ai相加,然后再进行后续的计算就可以了。ei向量既可以人工设置,也可以通过某些function或model来生成。

这篇关于李宏毅老师-self-attention笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/896129

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

什么是 Flash Attention

Flash Attention 是 由 Tri Dao 和 Dan Fu 等人在2022年的论文 FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 中 提出的, 论文可以从 https://arxiv.org/abs/2205.14135 页面下载,点击 View PDF 就可以下载。 下面我

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi