当前位置: 首页 > news >正文

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:

相关文章:

  • Linux CGroup资源限制(概念限制进程CPU使用)
  • JavaScript——ES6
  • spring框架限制接口是否要登录过才能访问
  • python-Bert(谷歌非官方产品)模型基础笔记0.1.096
  • 【react】react项目支持鼠标拖拽的边框改变元素宽度的组件
  • 纳什均衡:博弈论中的运作方式、示例以及囚徒困境
  • 如何将AndroidStudio和IDEA的包名改为分层级目录
  • python --监听鼠标事件
  • k8s——安全机制
  • 【机器学习】我们该如何评价GPT-4o?GPT-4o的技术能力分析以及前言探索
  • DevOps入门
  • Tomcat相关概述和部署
  • 力扣第417题测试程序
  • Java微服务实战:使用Spring Boot构建高效服务
  • kv视频如何转码mp4格式,kv转换mp4最简单方法
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 30天自制操作系统-2
  • hadoop集群管理系统搭建规划说明
  • java多线程
  • leetcode46 Permutation 排列组合
  • nodejs实现webservice问题总结
  • Python进阶细节
  • 计算机在识别图像时“看到”了什么?
  • 看域名解析域名安全对SEO的影响
  • 每天一个设计模式之命令模式
  • 批量截取pdf文件
  • 前端学习笔记之观察者模式
  • 智能网联汽车信息安全
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Java基础复习笔记 第16章:网络编程
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (状压dp)uva 10817 Headmaster's Headache
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .vimrc 配置项
  • @Autowired和@Resource的区别
  • @我的前任是个极品 微博分析
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [20170705]diff比较执行结果的内容.txt
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [C++]指针与结构体
  • [codeforces]Checkpoints
  • [GN] 设计模式——面向对象设计原则概述