LLM的基础模型8:深入注意力机制

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技(Mamba,xLSTM,KAN)则提供了大模型领域最新技术跟踪。若对于具身智能感兴趣的请移步具身智能专栏。技术宅麻烦死磕AI架构设计。

自注意力

Self-Attention

自注意力的主要功能是从输入序列本身生成上下文感知向量,而不是像基于RNN的编码器-解码器架构那样同时考虑输入和输出。在继续往下之前,还是需要帮助大家温习下之前的内容,也请各位能够认真的理解自注意力。

在例句中,“火车准时离开车站”中有 7 个Tokens,可以得到一个 7x7 的自注意力得分矩阵。根据图中描绘的自注意力得分,“火车”一词更关注“车站”一词,而不是关注其他单词。自注意力分数有助于理解给定句子中单词的上下文含义。例如,这里的“车站”一词用于火车站的上下文,而不是用于其他上下文,如加油站或公共汽车站等。

自注意力分数是通过余弦相似度计算的,即两个词向量的点积。它用于评估两个词向量之间的关系强度或比较词向量之间的相似程度。

这些自注意力分数最后会被按照权重进行加权累加,最终输出一个向量可以理解为已经将上下文进行编码。例如,当前词为“站”这个词时,与“站”密切相关的词对总和的贡献更大(包括“站”这个词本身),而不相关的词几乎不会贡献任何词。由此产生的向量作为“站”一词的新表示,并结合了周围的上下文。在理解这句话的时候,火车站的上下文信息就被编码到最后的输出。

多头注意力

Multi-Head Attention

在Transformer中,大量的使用了多头注意力的模块,它的原理和自注意力差不多。下面来解释下这个模块和自注意力机制的关系。

在刚才提到的点积注意力中,如下图所示,输入序列通过代表查询Q、键K和值V的三个矩阵进行转换然后计算自注意力。其中绿色x(2)为一个Embedding向量。

而在多头注意力的背景下,某种意义三个矩阵可以被看作是一个单独的注意力头。增加单个自注意力头的输出维度和使用多个注意力头之间的区别在于模型如何处理数据并从中学习。虽然这两种方法都增加了模型表示数据不同特征或方面的能力,但它们的方式基本不同。

上面这张图想表达的是一个输入的Embedding可以和多套的QKV协同运算。论文上描述的是多个W变换到子空间,但是实现上一般采用分段的方式。大白话说是将Embedding的长度切分为n段分别做运算。比如原来Embedding是512维,假定32头,那么Embedding 会被切分成512/32=16维,相当于多个子空间。

例如,多头注意力机制中的每个注意力头理论上可以学习集中在输入序列的不同部分,捕捉数据中的各种方面或关系。这种多样性是多头注意力成功的关键,毕竟每一个Embedding基本上都是高维度,通过多头分别捕获数据在各个层面的依赖和关系。

例如有的头专门捕获感情因子,有的头专门捕获地域特征,有的头专门捕获人物关系等等……

多头注意力也可以更高效,特别是在并行计算方面。每个头部可以独立处理,使其非常适合现代硬件加速器,如擅长并行处理的 GPU 或 TPU。简而言之,使用多个注意力头不仅仅是为了增加模型的容量,而是为了增强其学习数据中多样特征和关系的能力。

交叉注意力

Cross-Attention

除输入部分外,交叉注意力计算与自注意力相同。交叉注意力说白了就是Q来至一个序列,而KV来至另一个序列。这些序列都是相同维度的嵌入序列。相比之下,自注意力输入是单个嵌入序列。而交叉注意力则是其中一个序列用作Q输入,而另一个序列用作K和V输入。

读者可以仔细观察上图,在传统的Transformer的架构中,自注意力机制一般在Encoder(下图左),而交叉注意力机制一般在Decoder(下图右)。

其实也很好理解,对大模型的提问输入在Encoder中经过自注意力抽取出查询的上下文信息,然后输入为K和V供给给Decoder,而Decoder一方面不断地工作产生新的Token,一方面不断地将已经输出的序列嵌入输出Q,再次和Encoder的K和V做交叉注意力,供后续的组件吐出下个Token的概率分布。

因果注意力

Causal-Attention

因果自注意的起源来至序列中某个位置的输出仅仅依赖于先前位置的已知输出,而不是基于未来位置。比如说Decoder,它是按照顺序产生Token,先产生的Token肯定无法依赖后产生的Token。因此对于处理的每个Token,因果注意力机制屏蔽了未来的Token。所谓的未来,就是在当前Token之后的尚未生成的Tokens。因此原来的自注意力矩阵则成为上三角矩阵,因为有一半是不需要计算的。

例如life生成的时候只需要计算和自己,当生成到life is的时候,则只需要计算is和life,is和自己,如此类推……

值得一提的是,每次生成的注意力矩阵每一行都需要归一化。这里有个小小的技巧,可以将尚未生成的Token标记为-∞,然后在由softmax进行归一化。

附录:多头注意力的变换过程

全景图

推导步骤1:

推导步骤2:

推导步骤3:

推导步骤4:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/694617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot之静态资源

默认静态资源路径 classpath:/META-INF/resources/classpath:/resources/classpath:/static/classpath:/public/ 静态资源路径下的文件,可以通过根目录访问 resources 文件夹的文件如下图所示: 启动项目,分别访问以下路径: ht…

STM32 proteus + STM32Cubemx仿真教程(第一课LED教程)

文章目录 前言一、STM32点亮LED灯的原理1.1GPIO是什么1.2点亮LED灯的原理 二、STM32Cubemx创建工程三、proteus仿真电路图四、程序代码编写1.LED灯操作函数介绍HAL_GPIO_WritePin函数原型参数说明示例代码 HAL_GPIO_TogglePin函数原型参数说明示例代码 2.代码编写3.烧写程序 总…

微服务开发与实战Day04 - 网关路由和配置

一、网关路由 网关&#xff1a;就是网络的关口&#xff0c;负责请求的路由、转发、身份校验。 在SpringCloud中网关的实现包括两种&#xff1a; 1. 快速入门 Spring Cloud Gateway 步骤&#xff1a; ①新建hm-gateway模块 ②引入依赖pom.xml(hm-gateway) <?xml version…

在VSCode中安装python

引言 Python 是一种广泛使用的高级编程语言&#xff0c;因其易学、易用、强大而受到欢迎。它由 Guido van Rossum 于 1991 年首次发布&#xff0c;并以简洁的语法和丰富的库生态系统而著称。 以下是 Python 的一些关键特点和优势&#xff1a; 关键特点 易于学习和使用&#x…

vue28:组件化开发和根组件

简单写个点击事件 <template> <div class"app"><div class"box" click"fn"></div></div> </template><script> export default {//导出当前组件的配置项//里面可以提供 data methods computed wat…

解决PyQt5中柱状图上显示的数值为带e的科学计数法

PyQt5生成柱状图的代码参考&#xff1a;PyQt5 QtChart-柱状图 参照上述文章&#xff0c;生成柱状图后&#xff0c;数值较大或较小情况下会导致柱状图上显示数值为带e的科学计数法&#xff0c;这样会影响数值的识别&#xff1a; 经过分析QBarSet方法得到解决方法&#xff1a;需…

基于stm32最小版的超声波测距模块

目录 一、模块准备 二、HC-SR04模块原理解释 三、程序完整代码 四、烧录结果 总结 一、模块准备 STM32F103C8T6 HC-SR04 ST-Link&#xff08;其他烧录器也可以&#xff09; 0.96寸OLED屏幕&#xff08;非必须&#xff0c;仅供显示测距结果&#xff0c;可以使用串口助手代替…

【Git】详解本地仓库的创建、配置以及工作区、暂存区、版本库的认识

一、创建本地仓库 需要将本地仓库放在一个目录下&#xff0c;所以在创建本地仓库之前&#xff0c;应该先创建一个目录&#xff0c;再进入这个目录&#xff1a; 在这个目录中创建一个本地仓库&#xff1a; git init 创建完成后&#xff0c;我们就会发现当前目录下多了一个.git…

【Redis学习笔记04】Jedis客户端(上)

Java客户端操作Redis Java生态丰富&#xff0c;自定义的客户端非常多&#xff0c;常见的有Jedis、Lettuce、以及Spring整合后的RedisTemplate&#xff0c;但是对于初学者而言&#xff0c;从Jedis开始入门学习是非常容易上手的&#xff0c;因为Jedis中的API与原生Redis命令高度…

DT-MIL:用于组织病理学图像的MIL方法

学习信息表示对于组织病理学图像的分类和预测任务至关重要。由于图像大小巨大&#xff0c;通常使用多实例学习&#xff08;MIL&#xff09;方案来处理整张组织病理学图像&#xff08;whole-slide histopathological image&#xff09;。然而&#xff0c;MIL的弱监督性质导致了学…

阿里云平台产品创建过程 网页端界面 手机APP

云平台产品创建 登录后选择 产品-物联网-物联网平台&#xff1a; 进入后选择 公共示例-立即试用&#xff1a; 选择 公共示例&#xff1a; 选择 设备管理-产品-创建产品&#xff1a; 产品名称: 传感器 所属品类&#xff1a;自定义品类 节点类型&#xff1a;直连设备 联网方式…

【JsDoc】JsDoc用法 | 巧妙用法

type type {other} other 接收表达式或字符 1、数组代码提示 1、效果图 1、码 /*** type {Array.<play|paush|next>} */ let music []2、字符串提示 2、效果图 2、码 /*** type {a|b|c}*/ let str

UI学习(二)

UI学习&#xff08;二&#xff09; 文章目录 UI学习&#xff08;二&#xff09;布局子视图手动布局自动布局 导航控制器导航控制器基础导航控制器的切换导航栏工具栏 分栏控制器分栏控制器协议部分的内容UITableView基础部分相关的协议函数高级协议与单元格 多界面传值 布局子视…

零基础入门篇①⑦ Python可变序列类型--集合

Python从入门到精通系列专栏面向零基础以及需要进阶的读者倾心打造,9.9元订阅即可享受付费专栏权益,一个专栏带你吃透Python,专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇…学习不断,持续更新,火热订阅中🔥专栏限时一个月(5.8~6.8)重…

csdn上传图片失败解决办法

今天下午写笔记&#xff0c;上传图片的时候总是出现图片上传不成功。查询了下解决方案&#xff1a; C:\Windows\System32\drivers\etc &#xff0c;使用管理员打开hosts文件加入&#xff1a; 49.7.22.7 csdn-img-blog.oss-cn-beijing.aliyuncs.com保存之后&#xff0c;&#x…

C++期末复习提纲(血小板)

目录 1.this指针 2.静态成员变量 3.面向对象程序设计第一阶段 4.面向对象程序设计第二阶段 5.面向对象程序设计第三阶段 6.简答题 &#xff08;1&#xff09;拷贝构造函数执行的三种情况&#xff1a; &#xff08;2&#xff09;虚析构函数的作用&#xff1a; &#xff…

eNSP学习——RIP故障处理

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、导入设备预配置 2、排除R1与R2间的故障 3、排除R1与R3间的故障 需要eNSP各种配置命令的点击链接自取:华为eNSP各种设备配置命令大全PDF版_ensp配置命令大全资源-CSDN文库 主要命令 //检查…

Sui Generis如何为艺术家弥合Web3的鸿沟

Sui Generis是一家于3月推出的NFT拍卖行&#xff0c;其联合创始人兼CEO Gab9说其愿景是——更好、更大、更强&#xff01; 表面上看&#xff0c;Sui Generis是备受欢迎的Tombheads NFT拍卖行的重新品牌化&#xff0c;该拍卖行今年早些时候从Fantom区块链迁移出来。但它于3月31…

利用PowerQuery控制数据行数

PowerBI报表在开发的过程中&#xff0c;经常会遇到数据量非常庞大的情况&#xff0c;在这种情况下&#xff0c;本机连接数据源如果不进行特殊处理的话&#xff0c;那么刷新数据的时候可能会发生数据刷新时间过长、数据加载内存错误、开发过程中构建DAX卡顿等情况。 那么在实际开…