GPT中的Transformer架构以及Transformer 中的注意力机制

目录

1 GPT中的Transformer架构

2 transformer中的注意力机制

参考文献:


看了两个比较好的视频,简单做了下笔记。

1 GPT中的Transformer架构

GPT是Generative Pre-trained Transformer单词的缩写,其中transformer是一种特定的神经网络,这里的单词是transformer不是transform.

当聊天机器人生成某个特定词汇时,首先输入内容会被拆分成许多小片段,

如果把这些向量看作是在一个高维空间中的坐标,那么含义相似的词汇倾向于彼此接近的向量上,

这些向量接下来会经过一个称为注意力块的处理过程,使得向量能够相互交流,

注意力模块的作用就是要确定上下文中哪些词对更新其他词的意义有关,以及应该如何准确地更新这些含义。

词语的所谓含义完全通过向量中的数字来表达。然后这些向量会经过另一种处理,这个过程根据资料的不同,可能被称作多层感知机或者前馈层,这个阶段向量不在互相交流,而是并行地经历同一处理。

然后对这最后一个向量进行特定操作,产生一个覆盖所有可能token的概率分布,

 然后它就可以根据一小段文本预测下一步,给他一段初始文本,然后让他不断地进行预测下一步, 从概率分布中抽样,添加到现有文本, 然后不断地重复这个过程,就能生成一段文本。

将上面的工具转化为聊天机器人的一个简单方法就是准备一段文本,设定出用户与一个有帮助的AI助手交互的场景,这就是所谓的系统提示。

文本处理示例第一步:将输入分割成小片段,并将这些片段转换成向量。

模型拥有一个预设的词汇库,包含所有可能的单词,输入首先遇到一个矩阵叫做embedding嵌入矩阵,他为每个单词都分配了一个独立的列

 这些列定义了第一部中每个单词转换成的向量。

这些嵌入空间中的向量,不仅仅代表着单个单词,他们还携带了词汇位置的信息,这些词汇能吸纳并反映语境。

2 transformer中的注意力机制

前面说过每个tokens都是一个嵌入向量,在所有可能得嵌入向量所构成的高维空间中, 不同的方向能够代表不同的语义含义 (比如有的方向对应着性别,即在这个空间中添加一定的变化可以从一个男性名词的嵌入转到对应的女性名词的嵌入) 

在这样一个复杂的空间中,有无数的方向, 每一个都可能代表词义的不同方面。

transformer的目标就是逐步调整这些嵌入,使他不仅仅编码单词本身,而是包含更丰富、更深层次的上下文含义。  

但是,在transformer的第一步中,文本被拆分,每个token都被关联到一个向量,

因为初始的token嵌入向量,本质上是一个不参考上下文的查找表,直到transformer的下一步,周围的嵌入向量才有机会向这个token传递信息, 

注意力模块不仅可以精确一个词的含义,还能将一个嵌入向量中的信息传递到另一个嵌入向量中,

例如,你输入的文字是一整部悬疑小说,到了接近尾声的部分,写着“所以,凶手是”,如果模型要准确地预测下一个词语,那么这个序列中的最后一个向量,他最初只是嵌入了单词“是”,它必须经过所有的注意力模块的更新,以包含远超过任何单个单词的信息,通过某种方式编码了所有来自完整的上下文窗口中与预测下一个词相关的信息。

 举一个简单的例子,假设输入一个句子 

假设我们现在关注的只是让形容词调整其对应名词的含义这种更新方式。

 

每个词的初始嵌入向量是一个高维向量,只编码了该特定词的含义以及词的位置,不包含任何上下文,

  我们用字母E来表示这些嵌入向量,我们的目标是,通过一系列计算,产生一组新的、更为精细的嵌入向量,这样做可以让名词的嵌入向量捕捉并融合了与他们相对应的形容词的含义。

其中的矩阵充满了可调节的权重,模型将根据数据来学习这些权重,

在这个过程的第一步,你可以想象每个名词,比如“生物”,都在问,有没有形容词在我前面,对于“毛茸茸的”和“蓝色的”这两个词,都会回答,我是一个形容词,我就在那个位置,这个问题会被编码成另一个向量,也就是一组数字,我们称之为这个词的查询向量,

计算这个查询就是取一个特定的矩阵,也就是WQ,并将其与嵌入向量相乘,简化一下,我们把查询向量记作Q,

 这里E和WQ相乘得到查询向量Q,在这种情况下,你将这个矩阵WQ和上下文中的所有嵌入向量相乘,得到的是每个token对应的一个查询向量,这个矩阵WQ由模型的参数组成,意味着它能从数据中学习到真实的行为模式。 在实际应用中,这个矩阵在特定注意力机制中的具体作用是相当复杂的, 理想的情况是,我们希望这个查询矩阵能将名词的嵌入信息映射到一个较小空间的特定方向上,

 这种映射方式能够捕捉到一种特殊的寻找前置形容词的规律,

然后还有另一个被称之为键矩阵的矩阵,同时需要与所有嵌入向量相乘,这会生成一个我们称之为键的向量序列,从概念上讲,可以把键想象成是潜在的查询回答者,

这个键矩阵也冲忙了可调整的参数,同查询矩阵一样,将嵌入向量映射到同一个较小的维度空间中,当键与查询密切对齐时,你可以将键视为与查询相匹配,

为了衡量每个键和每个查询的匹配程度,你需要计算每一对可能的键-查询组合之间的点积,我们可以将其想象为一个充满各种点的网络,其中较大的点对应着较大的点积, 即键与查询对齐的地方,就我们讨论的形容词与名词的例子而言,如果毛茸茸的和蓝色的生成的键确实与生物产生的查询非常吻合,那么这两个点的点积会是一些较大的正数,

相比之下,像the这样的词语的键,与生物的查询之间的点积会是一些较小或者负数,这反映出他们之间没有关联,

这个网格赋予了我们评估每个单词在更新其他单词含义上的相关性得分的能力,接下来我们将利用这些分数,执行一种操作:按照每个词的相关重要性,沿着每一列计算加权平均值,因此我们的目标不是让这些数据列的数值范围无线扩展,从负无穷到正无穷,相反,我们希望这些数据列中的每个数值都介于0和1之间。并且每列的数值总和为1,正如他们构成一个概率分布那样,这就需要做softmax操作,softmax之后如下

我们将这种网格称为 注意力模式。

在transformer的原始论文里面,

在这个公式中,还有个dk,为了数值稳定性,这里将所有这些值除以键-查询空间维度的平方根,

然后包含所有算式的softmax函数我们应理解为是按列应用的,然后公式中还有大写V,后面再讲。

 之前没有提到一个技术细节,在训练过程中,对给定样本进行处理时,模型会通过调整权重来奖励或惩罚预测的准确性,即根据模型对文中下一个词的预测概率的高低,有种做法能显著提高整个训练过程的效率,那就是同时让模型预测, 该段落中每个初始token子序列之后所有可能出现得下一个token,

这样一来,一个训练样本就能提供更多的学习机会,在设计注意力模式时,一个基本原则是不允许后出现得词汇影响先出现得词汇,如果不这么做,后面出现得词汇可能会提前泄露接下来内容的线索,这就要求我们在模型中设置一种机制,确保代表后续token对前面token的影响力能够被有效削弱到0,直觉上我们可能会考虑直接将这些影响力设置为0,但这样做会导致一个问题,那些影响力值的列加和不再是1,也就失去了标准化的效果,为了解决这个问题,一个常见的做法是在进行softmax归一化操作之前将这些影响力值设置为负无穷大。这样,干净过softmax处理后,这些位置的数值会变成0,同时保证了整体的归一化条件不被破坏,这就是所谓的掩蔽过程,

注意力模式的大小等于上下文大小的平方,这就解释了上下文大小可能会对大语言模型构成巨大瓶颈,

通过前面的计算,模型能够推断哪些词与其他词相关,然后就需要实际更新嵌入向量,让词语可以将信息传递给他们相关的其他词,比如说,你希望毛茸茸的嵌入向量能够使得生物发生改变,从而将它移动到这个12000维嵌入空间的另一部分,以更具体地表达一个毛茸茸的生物,

我首先向你展示的事执行这个操作的最简单方法,这个方法的核心是使用一个第三个矩阵,也就是我们所说的值矩阵Wv,你需要将它与某个单词的嵌入相乘,得到的结果我们称为值向量,

 是你要就加入到第二个单词的嵌入向量中的元素,例如在这个情境下,就是要加入到“生物”的嵌入向量中,因此这个值向量就存在于和嵌入向量一样的,给常高维的空间中,当你用这个值矩阵乘以某个单词的嵌入向量时,可以理解为你在询问:如果这个单词对于调整其他内容的含义具有相关性,那么为了反应这一点,我们需要向那个内容的嵌入中添加什么呢,

回到之前的注意力模式的图表,我们先不考虑所有的键和查询,因为一旦计算出注意力模式,这些就不再需要了,接下来,我们将使用这个值矩阵,将其与每一个嵌入向量相乘,从而生成一系列的值向量,这些值向量视作在某种程度上与他们对应的键有关。对于图表中的每一列来说,你需要将每个值向量与该列中相应的权重相乘,比如,对于代表生物的嵌入向量,你会主要假如毛茸茸的和蓝色的这两个值向量的较大比例,而其他的只向量则被减少为零,或者至少接近零,最后,为了更新这一列与之相关联的嵌入向量,原本这个向量编码了生物这一概念的某种基本含义(不考虑具体上下文),你需要将列中所有这些经过重新调整比例的值加总起来,这一步骤产生了一个我们想要引入的变化量,我将其称为delta-e。接着将这个变化量叠加到原有的嵌入向量上,希望最终得到的事一个更精细的向量,是一个更加细致和含有丰富上下文信息的向量,比如描绘了一个毛茸茸、蓝色的奇妙生物。

上面讨论的整个过程,构成了所谓的单头注意力机制。这一机制是通过三种不同的、充满可调整参数的矩阵来实现的。也就是键  查询 和 值。

另外,值矩阵,有12288行和12288列,

参考文献:

图形化的理解GPT中的Transformer架构_哔哩哔哩_bilibili

什么是GPT?通过图形化的方式来理解 Transformer 中的注意力机制_哔哩哔哩_bilibili

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

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

相关文章

如何排查k8s集群中Pod内mysqld进程占用内存消耗过高?

文章目录 1. **查看容器资源使用情况**:2. **进入容器内部**:3. **检查进程内存使用**:4. **MySQL服务器状态检查**:5. **MySQL日志分析**:6. **使用专门的MySQL监控工具**:7. **配置文件检查**&#xff1a…

Java基础07--多线程-网络编程-Java高级

一、多线程 1.认识多线程 ①线程 ②多线程 2.创建线程方式 ①方式一:继承Thread类 1.让子类继承Thread线程类 2.重写run方法,就是这个线程执行会执行的操作。 3.创建继承Thread的子类对象就代表一个线程 4.启动线程:.start()-自动执行run方法 注意&am…

全量知识系统 程序详细设计之 统一资产模型(QA-SmartChat)

Q1. 下面我们聊聊整个全知系统的设计 的矩阵和函数,矩阵表示的是“活物”,分别 类似 一个基因的活性、一个实体的辨识度和某种特征的可区分度。 函数的可微、可积和可导性 则表示 运动的控制方式 在全知系统设计中,矩阵和函数是两个核心的组…

Java中的Set、List、Map的区别及主要实现类方法

Java中的Set、List、Map的区别 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引…

Linux netstat命令教程:网络统计工具(附实例详解和注意事项)

Linux netstat命令介绍 netstat(网络统计)是一个在Linux中用于显示网络相关信息并诊断各种网络问题的命令。它可以显示你的计算机正在进行的连接、发送信息的路径,甚至一些技术细节,如正在发送或接收的数据包的数量。 Linux net…

速盾:CDN是怎么防止ddos攻击的?

CDN(内容分发网络)是一种用于提高网站性能和安全性的重要技术。它通过在全球多个位置分布节点来存储和分发网站内容,以减少用户访问网站时的延迟并提高网站的可用性。除了提供高质量的内容分发,CDN还能有效地防止DDoS攻击。 DDoS…

Frida 远程RPC 调用进阶

引言: 今天讲下Frida 远程RPC 调用,为什么要用它,方便快捷。 安卓IOS 简单适用,代码量少很多,比Xposed。 1,安卓调用: 安卓调用,一般我们使用usb,模拟器的话直接用adb 命令去直连都可以,但是我这里叫一个稳定的方法,使用wifi adb ,比较靠谱,设置模拟器的ip,然…

点亮一颗 LED: 单片机 ch32v003 (RISC-V) 使用 rust 编写固件

首发日期 2024-04-09, 以下为原文内容: 使用 rust 编写单片机的程序 ? 很新, 但没问题. 使用 RISC-V CPU 的单片机 (比如 ch32v003) ? 也没问题. 同时使用 ? 哦嚯, 问题出现了 !! ch32v003 是一款使用 rv32ec 指令集的国产单片机, 很便宜 (某宝零卖只要 0.4 元一个, 在同档…

简单了解JVM

一.JVM简介 jvm及Java virtual machineJava虚拟机,它是一个虚构出来的计算机,一种规范。其实抛开这么专业的句子不说,就知道 JVM 其实就类似于一台小电脑运行在 windows 或者 linux 这些操作系统环境下即可。它直接和操作系统进行交互&#…

Handler——小白能懂的原理,老鸟需要的面经

1.机制学习 1.1Handler定义 发送并处理 与线程的消息队列关联的Message和Runnable 1.2基本用法 1、Message.obtain() 从消息池取得Message 2、Handler().sendMessage(msg) 发送消息 3、Handler().post 将Runnable包装成Message发送 以下提供一个结构代码 import android.os.H…

VMware导出虚拟机vmkd格式转换qcow2

VMware虚拟机导出qcow2格式可以上传至云服务 1、需要导出的虚拟机 2、克隆虚拟机 3、选择克隆源 4、创建完整克隆 5、完成 6、找到VMware安装路径 7、找到vmware-vdiskmanager所在路径使用cmd或Windows PowerShell进入目录 进入vmware-vdiskmanager目录 cd F:\软件\VMware Wo…

VRTK/SteamVR手柄震动功能

VRTK/SteamVR手柄震动功能 前言代码块 前言 手柄震动功能配合虚拟仿真模块的模拟电击等功能非常方便 代码块 SteamVR_Controller.DeviceRelation.Rightmost是右侧手柄 SteamVR_Controller.DeviceRelation.Leftmost是左侧手柄 var deviceIndex2 SteamVR_Controller.GetDevic…

debian安装和基本使用

debian安装和基本使用 文章目录 debian安装和基本使用1. 为什么选择debian2. 如何下载Debian2.1 小型安装镜像2.2 完整安装镜像 3. Debian操作系统安装3.1 创建Debian虚拟机3.2 安装操作系统 4. Debian系统的初始设置4.1 桌面环境的配置4.2 配置网络4.3 生效网络配置4.4 配置de…

阿药陪你学Java(第零讲)

第零讲:基本数据类型 Java包括两种数据类型,分别是内置数据类型(基本数据类型)和引用数据类型。 内置数据类型 Java提供了8中内置类型,其中包括4种数字整型、2种数字浮点型、1中字符型、1中布尔型。下面进行详细介绍…

Python防止打包后的exe重复执行

文章目录 一、前言二、实现方法三、代码四、执行结果五、相较于其他方式的优点一、前言 pyinstaller打包的exe如果被连续点击的话,会启动多个程序,对于复杂的程序来说,同时运行可能会造成严重的后果,因此需要一个程序锁,保证单次仅启动一个exe。 二、实现方法 利用 sqli…

React 快速入门:掌握前端开发的核心技能

React 快速入门:掌握前端开发的核心技能 一、React 简介1.1 React 的历史1.2 React 的概念1.3 React 的特点1.4 React 的官网地址 二、开发环境搭建三、React 基础3.1 JSX3.2 组件3.3 Props3.4 State3.5 props 和 state 的区别3.6 Hook 四、React 生命周期五、添加样…

golang context

作用:用于在go协程中 传递上下文、超时、取消、传值 底层实现:是由互斥锁、channel、map来实现的 互斥锁:保护临界资源 channel: 用于信号通知,比如ctx.Done() map: 保存父ctx下派生的所有子ctx, 父ctx关闭,子ctx都关…

Redis Pipelining 底层原理分析及实践

作者:vivo 互联网服务器团队-Wang Fei Redis是一种基于客户端-服务端模型以及请求/响应的TCP服务。在遇到批处理命令执行时,Redis提供了Pipelining(管道)来提升批处理性能。本文结合实践分析了Spring Boot框架下Redis的Lettuce客户端和Redisson客户端对…

linux c多线程简单队列实现

编译环境:Ubuntu16.04 64位 交叉编译工具:arm-hisiv500-linux-gcc 文章目录 1. 背景2. 涉及的函数3. 头文件JList.h4. 类的实现 1. 背景 最近项目中需要用到多线程通信,自己造个轮子吧,对照上一篇linux c共享内存和信号量。 2. …

python如何学习数据分析

学习使用 Python 进行数据分析是一个循序渐进的过程,需要掌握基本的 Python 编程技能,并了解数据处理、数据可视化和常用的数据分析工具和库。以下是学习 Python 数据分析的步骤和建议: 1. 掌握 Python 编程基础 在开始学习数据分析之前&am…