AGI|Transformer自注意力机制超全扫盲攻略,建议收藏!

news2024/11/19 20:25:09

一、前言

2017年,谷歌团队推出一篇神经网络的论文,首次提出将“自注意力”机制引入深度学习中,这一机制可以根据输入数据各部分重要性的不同而分配不同的权重。当ChatGPT震惊世人时,Transformer也随之进入大众视野。一夜之间,AI创业公司层出不穷,掌握算力的互联网巨头们争相推出自己的大语言模型。

这些模型都基于Transformer神经网络架构,比如ChatGPT只使用了其中的解码器,DeBERTa只使用了其编码器,Flan-UL2则编码解码全都使用。

而对于用户来说,大语言模型还是一个黑盒,用户只知道输入一些简单指令模型便会产出一些输出,这些输出可能满足用户的需求,也可能不满足,于是用户通过调整指令的方式得到不同输出的结果。从笼统、抽象的概括到指令精确的下发,这也推进了提示词工程的发展。很难评价是机器在学习人类还是人类在适应机器,亦或两者都有。

开发者的世界中可能了解得更多,比如使用LangChain或LlamaIndex构建RAG(检索增强生成)系统,使用提示词工程优化输出结果,设置temperature等各类参数控制大模型创新性等……虽然比用户更接近黑盒,但依然存在很多无法解答的问题:为什么大语言模型会有上下文的限制?为什么现阶段的模型没有长期记忆?为什么要使用Transformer作为基础?

对于科学家来说上述问题可能很好回答,但大部分表述都是一些晦涩难懂的专业名词,谈论得更多的是方向,嵌入层,层归一化,矩阵乘积……以及一堆复杂的数学公式。在学术界热热闹闹讨论AGI(通用人工智能)未来的同时,这些专业名词构建出的壁垒让普通人难以望其项背,无疑于在黑盒之上又蒙了一层神秘的面纱。

这当然不是科学家有意为之,但也从侧面反映出人工智能领域的复杂性,一个包含计算机科学、数学、认知科学、心理学等众多学科的领域要解释起来确实颇有难度。

本篇文章目的意在使用通俗语言解释这些专业名词,并通过数据流向的方式描绘“自注意力机制”在训练时的过程,但不会事无巨细地解释其中每一个细节。

二、向量

当我们谈论向量的时候,我们具体谈论的是哪一领域的‘向量’?是数学,物理学还是其他自然科学中的基本概念?

是理论数学中的定义:任何在称为向量空间的代数结构中的元素,并同时满足具有大小和方向两个性质的几何对象即可认为是向量。

还是物理领域中的定义:向量是空间中的箭头,它指向三维空间其中一点,以三元数组代表某个特定的对象,这个对象可以代表任意东西。

无论使用哪一领域的向量定义,最终都要回到一个根本性问题:如何让机器识别某一信息代表的具体意义?

对于机器而言,人类世界的语言并没有什么意义,无论是使用中文的'他',还是英文中的'he',机器能识别和处理的只能是数值,例如0,1。为了让机器更好地识别人类语言及真实世界,科学家们使用向量将文本转化为数据,使得机器可以对文本进行数学运算;向量也可以包含多种特征,如词性,上下文等,这有助于提高模型对语言的理解能力。

假设使用一个二维坐标轴将人类语言词汇分布在上面,英文的'he'和中文的'他'可能会分布在不同轴上。“番茄”和“西红柿”只是两种不同叫法,指向的是同一种植物果实,却需要占据两个向量,即使它们可能无比接近。

如果将一个二维空间升维成三维空间,'番茄'这一含义代表着三维空间的某个坐标(x,y,z),意义相近的词依旧分布在其附近。看似好像没有什么区别,但描述同一对象的方式却发生了改变。事实上向量可以是任意维度的,这取决于数据的复杂性和所需特征数量,不同维度承载的特征数量是不一样的。通俗一点讲就是:向量的维度越高,代表的含义也就越多。高维向量可以捕捉更多的细节和信息,但这也导致了计算的复杂性。

向量是一切的基础,无论是模型训练还是使用AI应用,第一步都是将输入的文本/图片/音频等信息转换为向量,一般情况下我们将这些输入/输出的向量统称 token。为了方便理解,我们暂时将一个单词对应一个向量,即一组数字。

三、嵌入矩阵

通常情况下模型会包含一个预设的词汇库,它被称为“嵌入矩阵”。以ChatGPT-3为例,这个嵌入矩阵中包含了50257个token,12288个维度,里面可以是单词或标点符号……它们的初始值随机,但将基于数据进行学习。这是故意为之,如果所有嵌入向量都初始化为相同的值,那么模型在训练时无法区分不同的输入。使用随机值可以打破均匀性,避免训练开始时的梯度相似,同时也可以避免模型陷入局部最优解。

早在Transformer出现前,将单词转化为向量已经是机器学习中常见的做法,到如今Transformer几乎成为自然语言处理,视觉处理,多模态处理的基础模型。可见将人类所有语言词汇转变为向量并不能一蹴而就,这就像拥有一座铁矿并不意味着得到好钢,但它为接下来的淬炼奠定了基础。

这非常重要,举一个3Blue1Brown提出的例子:当模型在训练阶段调整权重时,以确定不同单词将如何被嵌入向量,它们最终的嵌入向量在空间中的方向,往往具备某种语义意义。

就像在谈论向量时那样描述的,意义相近的向量会分布得较为接近。如果取[女人]和[男人]的向量之差,从一个向量的尖端指向另一个尖端,便会发现这个向量差与[父亲]和[母亲]的向量差非常相似。假设你并不知道[母亲]这一词在向量空间中的分布,但是可以通过[父亲]这一词汇加上[女人]减去[男人]的方向,然后搜寻最接近该点的词向量来找到它。

上述例子足以说明,空间中的方向能够承载语义。反复强调它的重要性,是因为嵌入矩阵中的向量不能仅仅将其视为单个单词,它编码了单词的位置信息,还结合了上下文语境。在现实世界,不同的语境下同一词也代表不同的含义,“model”这一词是指艺术领域中展示服装的人类,是指计算机领域的数据结构?还是我们现在谈论的机器学习模型?

假如对模型提出一个问题:“the greatest thinker in China is ?”

"greatest"这个词向量会被网络中各个模块拉扯,最终指向一个更具象的方向或对象。如下图中所示,上下文中的China指明了向量被拉扯的方向,最终指向的方向范围可能会包含"孔子"这一具体的向量词。

一个训练得好的注意力模块的目的就是:能计算出给初始的词向量加入什么样的向量,才能将它移动到上下文对应的具体方向上。

四、自注意力机制

本文开篇中提到过注意力机制可以按输入数据各部分重要性的不同而分配不同的权重,但在深度学习中模型的实际行为很难解释,且其多数计算都是矩阵向量乘法,注意力机制在矩阵中填满了可调的权重,这些权重由模型学习数据来进行调整,最终计算点积层归一化后得到输出的token。

自注意力的本质:

如果本文剩余篇幅只是列举公式,那么似乎很难让人理解,也违背了本文最初的承诺。这就像把向量矩阵呈现在读者面前,让读者自己计算token一样荒诞。作者将沿用上述列举的方式,尽可能避开公式的细节,抽象出机制的行为并绘制整个流程,可能尽管没有公式那么精确,但更容易帮助我们了解到底发生了什么。

在训练之初,输出文本创建向量组时,每个向量都是直接从嵌入矩阵中提取出来的。

然后这个向量组会流向三个向量矩阵:

1、Query [查询矩阵]

的维度要比嵌入矩阵小很多。它由随机向量组做初始化,具体的行为模式是从数据中习得的。从数学的角度来看它们只是在做矩阵乘积,如果抽象成一个具体的行为,这更像是对输入的单词提出一系列问题。试想一下,一个优秀的读者在读某本书籍某篇文章时,一定会对自己所读的内容提出一系列问题,这有助于快速理解内核和作者想要表达出的思想。训练也是如此,通过一系列预设的随机数值,让模型在训练中抽象出那些系统问题。

2、Key [键矩阵]

与查询矩阵相同,也会与嵌入向量相乘而产生。如果[查询矩阵]是对 token 提出一系列问题,那么[键矩阵]则代表“想要回答的结果”。衡量每个[键]与每个[查询]的匹配程度,得到的查询矩阵会与键矩阵相乘,最终得到的点积如下图所示。如果圆点越大,代表点积也就越大。用机器学习的术语来描述就是:greatest 注意到了 China 。如果按照现实意义进行概括就是:从各种问题和答案中选出匹配度最相符的。

下图源于GPT是什么?直观解释Transformer:

为了数值的稳定性,所有的点积将会除以(键-查询空间维度的平方根)得到的结果将会被softmax函数处理后乘V矩阵。

在训练过程中,示例文本经过模型处理时,模型会根据正确预测出下一次的概率高低来进行奖惩,并稍微调整各个权重。为了让训练的效率最大化,在初始化token时让它同时预测,这样一次训练样本就能提供多次训练机会。

在引入注意力机制后,这意味着不能让后词影响到前词,不能让[答案]影响到[问题],从点积矩阵中反映出来便是:左下方的数值都会影响到右上方。通常情况下,在使用softmax之前都会将左下方的数值设置为负无穷,这样通过softmax函数后它们就会都变成0,这一过程叫做"掩码"。

在注意力模式下,掩码的大小等于上下文长度的平方。扩大上下文长度则需要更多的计算资源,这就是为什么上下文长度会成为大语言模型的瓶颈所在。

如果想要将一串数字作为概率分布,那么每个值都必须介于0到1之间,并且总和为1。在深度学习中,所有的操作都是在做矩阵向量乘法,那么得出的结果并不在0到1之间,总和也不为1。Softmax 函数主要作用就是将一组任意实数转换为表示概率分布的实数据,然后让这组实数符合概率分布的特征。

“the greatest thinker in China is ?” 这个例子中最有可能输出"Confucius"一词,但人们不希望在提出同一类型问题时模型输出的都是同一结果,这可能会陷入某些局部最优解。

Temperature 参数用于控制生成文本的随机性和创造性,当该参数较大时会给低值赋予更多权重,让概率分布得更均匀一些。如果该参数较小,那么较大的数值就会更占优一些。极端情况下将该参数设置为 0,意味着所有权重都给到最大值。通过调整该参数,同一问题可能得到不同的结果,当该参数较大 时"Mencius"和"Sun Tzu"将被更容易命中。

3、Value [值矩阵]

相比查询矩阵和键矩阵,值矩阵要多个数量级。当算出点积就能让模型推断出每个词与其他哪些词有关,比如"greatest"会与"china"有关。用"chain"这个词向量乘以值矩阵便会得到一个值向量,这个向量与嵌入向量处于同一个高维空间。上文中提到过:初始的词向量加入什么样的向量,才能将它移动到上下文对应的具体方向上。

向网格中每一列中都会乘该列的对应权重 (点积*值向量),最后计算所有列的和就是那个“拉扯”向量空间中的机制,通过这个机制就能得到一个更精准的向量,编码了更丰富的上下文信息,所得到的输出 token也指向了某一范围。

五、计算过程

  1. 输入token,如单词,字符或其他类型。通过嵌入层被转换为词向量。
  2. 每个词向量分别计算查询矩阵,键矩阵和值矩阵。得到查询值,键和值向量。
  3. 向量q1分别与k1,k2,k3做点积运算,得到初始的注意力值at1。
  4. 使用softmax函数对注意力值at1进行归一化处理,得到st1。
  5. 最后将st1与值向量v1相乘,得到新的向量wt1。
  6. 将所有wt向量相加得到输出向量。

下图来源于《ChatGPT原理与架构》

自注意力机制是Transformer模型的核心组成部分,它计算输入中元素之前的权重,以捕获序列中的关键信息。通过该机制能直接对序列中任意两个元素计算出它们之间的关系,这提供了可观察性和解释性,对模型调试和优化也提供了依据。

但自注意力机制也存在局限性,如上下文问题。虽然它能有效捕捉元素之间的依赖关系,但面对极长的上下文时,计算和内存开销会变得巨大。在训练时尤其明显,通常情况下需要大量训练数据以达到最佳性能,这会增加很多成本。同时在小型数据集,比如移动端,AI嵌入式等特定领域匹配度会降低。

六、多头注意力机制

作为自注意力机制的一种扩展,多头注意力机制的主要目标是让模型能并行关注输入中多种不同类型信息。这样模型可以学习到更丰富且多元化的表达,从而提升模型能力与性能。通过增加注意力头的数量,扩大了模型的容量,使其能够处理更加复杂的任务。现在我们熟知的多模态大语言模型,既能处理图片,也能处理文本等任务。

Transformer内完整的注意力模块就是由多头注意力组成,大量并行执行这些操作,每个头都有不同的键,查询,值矩阵……虽然根据Transformer的原论文中的实验结果表明,注意力头数量为8时可以达到最佳的效果,增加到16或32时并未显著提升性能。但ChatGPT-3中每个模块内依然使用了96个注意力头,这意味着在训练过程中将会产生96种不同的注意力模式,每个注意力头都有独特的值矩阵产生不同的值向量序列……按照本文描述自注意力机制,最终会有96个向量值“拉扯”最初的嵌入向量。

多头注意力机制的参数规模较大,为了优化这些问题也提出了一系列优化策略来进行改进,比如局部多头注意力,稀疏多头注意力,分层多头注意力等。但这些不在文本讨论范围内,感兴趣的读者可以自行查阅相关资料。

注意力机制的成功的主要原因并不在于它能实现什么特定的行为,而是它的可并行性,这样使用GPU在短时间内可以进行大量计算。了解深度学习历史的读者可能会理解,仅依靠扩大模型规模就能为模型性能带来质的飞跃。

七、总结

本文详解了自注意力机制的流程,同时也对深度学习中部分专有名词进行了解释。如今Transformer模型已经在NLP领域占据了重要地位,但Transformer不仅仅只包含'注意力机制',还包含了前馈神经网络,残差连接和位置编码等。训练出一个大语言模型也不仅仅只依靠Transformer就够了,还包括了预训练,人类反馈,微调,评估等。

这也申明了人工智能领域的复杂性,虽然本篇文章不能打破黑盒一探究竟,但能掀开面纱一角也足够了。

参考资料:

1.《ChatGPT原理与架构》

2.《GPT是什么?直观解释Transformer 》

3.《直观解释注意力机制,Transformer的核心》

4.https://transformers.run/c1/transformer/

作者:王凯| 后端开发工程师

欢迎关注“神州数码云基地”公众号,回复“AI合集”领取最新整理100+AI报告合集

版权声明:文章由神州数码武汉云基地团队实践整理输出,转载请注明出处。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PMP--知识卡片--波士顿矩阵

文章目录 记忆黑话概念作用图示 记忆 一说到波士顿就联想到波士顿龙虾,所以波士顿矩阵跟动物有关,狗,牛。 黑话 你公司的现金牛业务,正在逐渐变成瘦狗,应尽快采取收割策略;问题业务的储备太少&#xff0…

测量和检测二合一的劳易测解决方案

劳易测ODT3CL系列是一款基于TOF原理的具有测量功能的传感器。它具有很好的检测性能,能够非常可靠的检测亮色、深色以及高反光的物体。ODT 3CL系列的检测距离可达2000毫米,在量程范围内对目标物体的颜色检测不敏感,检测距离稳定输出。 针对工业…

浅析基于量子成像的下一代甚高灵敏度图像传感器技术

高灵敏度探测成像是空间遥感应用中的一个重要技术领域,如全天时对地观测、空间暗弱目标跟踪识别等应用,对于甚高灵敏度图像传感器的需求日益强烈。随着固态图像传感器技术水平的不断提高,尤其背照式及埋沟道等工艺的突破,使得固态…

相机光学(二十四)——CRA角度

CRA角度 0.参考资料1.什么是CRA角度2.为什么 CRA 会导致luma shading3.为什么 CRA 会导致color shading4.CRA相差过大的具体表现5.CRA Matching6.怎样选择sensor的CRA 0.参考资料 1.芯片CRA角度与镜头的匹配关系(一)   2.芯片CRA角度与镜头选型的匹配关…

谷粒商城学习-07-虚拟机网络设置

文章目录 一,找到配置文件Vagrantfile二,查询虚拟机网卡地址1,查看虚拟机网络配置2,查看宿主机网络配置 三,修改配置文件下的IP配置四,重新启动虚拟机即可生效五,Vagrantfile 的作用1&#xff0…

护眼落地灯哪个牌子好?盘点五款必入不踩雷的护眼大路灯

护眼落地灯哪个牌子好?在这个快节奏的时代,护眼落地灯已经从一种高端选择转变为日常用眼生活中的必须品。不论是提升普通照明,还是针对孩子学习是改善光线质量环境,一款优秀的护眼落地灯都能成为我们生活中的照明神器。怎么选择一…

QT+OpenCV在Android上实现人脸实时检测与目标检测

一、功能介绍 在当今的移动应用领域,随着技术的飞速发展和智能设备的普及,将先进的计算机视觉技术集成到移动平台,特别是Android系统中,已成为提升用户体验、拓展应用功能的关键。其中,目标检测与人脸识别作为计算机视…

固相提取铕和铀

固相萃取(Solid Phase Extraction,SPE)是一种常用的化学分离技术,它利用固体吸附剂(固定相)与样品中的目标化合物(流动相)之间的相互作用力,将目标化合物从样品中分离出来…

【数据结构】(C语言):堆(二叉树的应用)

堆: 此处堆为二叉树的应用,不是计算机中用于管理动态内存的堆。形状是完全二叉树。堆分两种:最大堆,最小堆。最大堆:每个节点比子树所有节点的数值都大,根节点为最大值。最小堆:每个节点比子树…

推动高效能:东芝TB67H301FTG全桥直流电机驱动IC

在如今高度自动化的时代,电子产品的性能和效率成为了工程师们关注的焦点。东芝的TB67H301FTG全桥直流电机驱动IC应运而生,以其卓越的技术和可靠性,成为众多应用的理想选择。无论是在机器人、家用电器、工业自动化,还是在其他需要精…

面试篇-系统设计题总结

这里记录一些有趣的系统设计类的题目,一般大家比较喜欢出的设计类面试题目会和高可用系统相关比如秒杀和抢红包等。欢迎大家在评论中评论自己遇到的题目,本篇文章会持续更新。 1、设计一个抢红包系统 抢红包系统其实也是秒杀类中的一个场景&#xff0…

【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)

目录 概述: 1. 阻塞IO (Blocking IO) 2. 非阻塞IO (Non-blocking IO) 3. IO多路复用 (I/O Multiplexing) 4. 信号驱动IO (Signal-driven IO) 阻塞式IO 非阻塞式IO 信号驱动IO(Signal-driven IO) 信号IO实例: IO多路复用…

后端之路——最规范、便捷的spring boot工程配置

一、参数配置化 上一篇我们学了阿里云OSS的使用,那么我们为了方便使用OSS来上传文件,就创建了一个【util】类,里面有一个【AliOSSUtils】类,虽然本人觉得没啥不方便的,但是黑马视频又说这样还是存在不便维护和管理问题…

Java支付宝沙箱支付环境配置及简单测试

Java支付宝沙箱环境配置(测试) 1. 沙箱配置环境 沙箱应用 - 开放平台 (alipay.com) 2. 需要用到的基本信息 3. Pom文件添加依赖 <!--支付宝依赖 --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-easysdk</artifactId…

上海晋名室外危废品暂存柜第三次复购项目落地

近日又有一台SAVEST室外危废品暂存柜项目成功验收交付使用。 用户单位是一家致力于光伏电池银浆用电子级银粉的国产化&#xff0c;并开发MLCC、锂离子电池、半导体等领域使用的纳米级粉体材料的企业。 用户于2021年4月底订购1台室外危化品暂存柜和1台室外危废品暂存柜&#x…

南京,协同开展“人工智能+”行动

南京&#xff0c;作为江苏省的省会城市&#xff0c;一直以来都是科技创新和产业发展的高地。近日&#xff0c;南京市政府正式印发了《南京市进一步促进人工智能创新发展行动计划&#xff08;2024—2026 年&#xff09;》和《南京市促进人工智能创新发展若干政策措施》的“11”文…

【JNDI注入利用工具】JNDIExploit v1.1

# 简介 JNDIExploit一款用于 JNDI注入 利用的工具&#xff0c;大量参考/引用了 Rogue JNDI 项目的代码&#xff0c;集成了JDNI注入格式&#xff0c;能够更加方便的开启服务端后直接利用&#xff0c;支持反弹Shell、命令执行、直接植入内存shell等&#xff0c;并集成了常见的by…

海思SD3403/SS928V100开发(14)WIFI模块RTL8821驱动调试

1.前言 芯片平台: 海思SD3403/SS928V100 操作系统平台: Ubuntu20.04.05【自己移植】 WIFI模块: LB-LINK的RTL8821 2. 调试记录 参考供应商提供的操作手册 2.1 lsusb查看设备 2.2 编译供应商提供的驱动 2.2.1 修改Makefile 2.2.2 编译报错 解决办法: 将Makefile中arm…

并发编程工具集——读写锁-ReadWriteLock(上篇)(十六)

什么是读写锁 基本原则&#xff1a;&#xff08;读读不互斥、读写互斥、写写互斥&#xff09; 允许多个线程同时读共享变量&#xff1b;只允许一个线程写共享变量&#xff1b;如果一个写线程正在执行写操作&#xff0c;此时禁止读线程读共享变量。读写锁与互斥锁的一个重要区别…

Turborepo简易教程

参考官网&#xff1a;https://turbo.build/repo/docs 开始 安装全新的项目 pnpm dlx create-turbolatest测试应用包含&#xff1a; 两个可部署的应用三个共享库 运行&#xff1a; pnpm install pnpm dev会启动两个应用web(http://localhost:3000/)、docs(http://localhost…