【大模型理论篇】基于3D可视化视角理解GPT

news2024/12/27 3:30:13

1. 背景介绍

        先前我们通过多篇技术文章来分析大模型的原理,包括:

  • 《Transformer原理及关键模块深入浅出》
  • 《GPT系列预训练模型原理讲解》、
  • 《大模型时代下Bert去哪啦》、
  • 《关于LLaMA 3.1 405B以及小模型的崛起》、
  • 《LLaMA3结构关键模块分析》、
  • 《强化学习RL与大模型智能体》、
  • 《Transformer KV Cache原理深入浅出》
  • 《生成式模型算法原理深入浅出》
  • 《压缩泛化-对大语言模型智能涌现的理解》

        可能有的同学接受起来,还是不够直接。刚好最近看到一个叫做《LLM Visualization》的项目【1,2】,通过3D可视化,将GPT模型的每一个流程都展现得非常直观,在这里做一下分享。

2. 可视化GPT

2.1 全局概览

        左侧是LLM的结构,包括Embedding、Layer Norm、Self Attention、Projection、MLP、Transformer、Softmax、Output等章节。右侧则是对应每一个章节的3D可视化视图。

2.2 关于模型的可视化展示

        为了展示的方便,我们以nano-gpt【3,4】来表述,该模型仅有85000左右参数,是来自Karpathy大神的项目。nano-gpt是最简单、最快速的中型GPT训练/微调仓库。它是minGPT的重写版本,更注重实用性而非教学。目前仍在积极开发中,但目前的train.py文件可以在OpenWebText上复现GPT-2(124M)的训练,使用单个8X A100 40GB节点大约需要4天的训练时间。代码本身简洁且易读:train.py是一个大约300行的基础训练循环,model.py是一个大约300行的GPT模型定义,支持从OpenAI加载GPT-2的权重。

2.2.1 Embedding

        我们之前已经了解了如何使用一个简单的查找表将标记映射到整数序列。这些整数,即标记索引,是我们在模型中唯一一次看到整数的地方。从这里开始,我们将使用浮点数(小数)。示例中使用第4个标记(索引为3)生成输入嵌入的第4列向量。使用标记索引(在这个例子中,B = 1)选择左侧标记嵌入矩阵的第2列。注意,这里使用的是从0开始的索引,因此第一列的索引为0。这会生成一个大小为C = 48的列向量,称之为标记嵌入。由于示例使用第4个位置的标记B(t = 3),因此将取位置嵌入矩阵的第4列。这同样会生成一个大小为C = 48的列向量,我们称之为位置嵌入。请注意,这些位置嵌入和标记嵌入都是在训练过程中学习到的(用蓝色表示)。现在有了这两个列向量,只需将它们相加,就可以得到另一个大小为C = 48的列向量。现在对输入序列中的所有标记运行相同的过程,创建一组同时包含标记值和它们位置的向量。可以看到,对输入序列中的所有标记运行这个过程会生成一个大小为T x C的矩阵。T代表时间,即你可以将序列中较后的标记视为时间上较晚的标记。C代表通道,也被称为“特征”或“维度”或“嵌入大小”。这个长度C是模型的几个“超参数”之一,由设计者根据模型大小和性能之间的权衡来选择。这个矩阵被称之为输入嵌入,现在准备好传递到模型中。

2.2.2 Layer Norm

        上一小节中的输入嵌入矩阵是我们第一个Transformer块的输入。Transformer块的第一步是对这个矩阵应用层归一化。层归一化是一个对矩阵中每一列的值分别进行归一化的操作。归一化是深度神经网络训练中的重要步骤,它有助于提高模型在训练过程中的稳定性。可以分别考虑每一列,示例中专注于第4列(t = 3)。归一化的目标是使该列中的平均值等于0,标准差等于1。为此,我们先找到列的平均值(μ)和标准差(σ),然后减去平均值并除以标准差。这里使用的符号是E[x]表示平均值,Var[x]表示方差(长度为C的列的方差)。ε(ε = 1×10⁻⁵)项是为了防止除以零。在聚合层中计算并存储这些值,将它们应用于该列中的所有值。最后,当得到归一化后的值时,将列中的每个元素乘以一个学习到的权重(γ),然后加上一个偏置(β)值,从而得到归一化后的最终值。对输入嵌入矩阵的每一列执行此归一化操作,结果是归一化后的输入嵌入,它将会被传递到自注意力层中。

2.2.3 Self-Attention

        自注意力层可以说是Transformer和GPT的核心阶段。在这一阶段,输入嵌入矩阵中的列“互相交互”。直到现在,以及在所有其他阶段中,这些列都可以被独立地看待。

        自注意力层由多个头组成,现在先关注其中一个头。

        第一步是为归一化后的输入嵌入矩阵中的每一列生成三个向量:Q、K 和 V 向量:

  • Q:查询向量(Query vector)
  • K:键向量(Key vector)
  • V:值向量(Value vector)

        为了生成这些向量之一,进行矩阵-向量乘法,并加上一个偏置。每个输出单元都是输入向量的某种线性组合。举例来说,Q向量的生成是通过Q权重矩阵的一行与输入矩阵的一列的点积来完成的。点积运算是将第一个向量的每个元素与第二个向量中对应的元素配对,进行乘法,然后将结果相加。这是一种通用且简单的方法,确保每个输出元素都可以受到输入向量中所有元素的影响(这种影响由权重决定)。因此,点积运算在神经网络中频繁出现。

        对Q、K、V向量中的每个输出单元重复此操作:

        接下来对于Q(查询)、K(键)和V(值)向量,“键”和“值”让人联想到软件中的字典,其中键映射到值。然后“查询”是用来查找值的东西。

Lookup table:

        table = { "key0": "value0", "key1": "value1", ... }

Query Process:

        table["key1"] => "value1"

        在自注意力的情况下,不是返回一个单独的条目,而是返回一些加权组合的条目。为了找到这种加权,对Q向量与每个K向量进行点积。对这些加权结果进行归一化,然后使用它们与对应的V向量相乘,最后将它们相加。

        举个更具体的例子,来看第6列(t = 5),将从中进行查询:

        查找表的{K, V}条目是过去的6列,而Q值是当前时间。首先计算当前列(t = 5)的Q向量与之前那些列的每个K向量之间的点积。这些结果存储在注意力矩阵的对应行(t = 5)中。这些点积是衡量两个向量相似性的一种方式。如果它们非常相似,点积会很大;如果它们非常不同,点积会很小或为负。仅使用查询对过去的键进行比较的想法使得这种自注意力成为因果自注意力。这意味着token不能“看到未来”。另一个要素是,在进行点积后,需要除以sqrt(A),其中A是Q/K/V向量的长度。进行这种缩放是为了防止在下一步的归一化(softmax)中大值占主导地位。每行都会被归一化,使其和为1。

        最后,可以生成第6列(t = 5)的输出向量。查看归一化后的自注意力矩阵的(t = 5)行,并将每个元素与其他列的V向量进行逐元素乘法。然后将这些结果相加,生成输出向量。因此,输出向量将主要受得分较高的列的V向量的影响。

        接下来可以对所有列进行这个操作了。这就是自注意力层一个头的工作过程。因此,自注意力的主要目标是每个列希望从其他列中找到相关信息并提取它们的值,这通过将其查询向量与其他列的键进行比较来实现。并且有一个额外的限制,它只能查看过去的列。

2.2.4 Projection        

        在自注意力过程结束后,得到了每个头的输出。这些输出是适当混合后的V向量,受Q和K向量的影响。为了组合每个头的输出向量,简单地将它们堆叠在一起。因此,对于时间点t = 4,从3个长度为A = 16的向量变为1个长度为C = 48的向量。值得注意的是,在GPT中,每个头内向量的长度(A = 16)等于C / num_heads。这确保了当它们堆叠在一起时,可以恢复到原始长度C。

        接下来,进行投影以获得该层的输出。这是在每一列上进行的简单矩阵-向量乘法,并加上一个偏置。现在有了自注意力层的输出。但并不是直接将这个输出传递到下一个阶段,而是将它与输入嵌入逐元素相加。这个过程,用绿色的垂直箭头表示,称为残差连接或残差路径。和层归一化一样,残差路径对于在深度神经网络中实现有效学习也非常重要。现在已经得到了自注意力的结果,可以将其传递到Transformer的下一个部分:前馈网络。

2.2.5 MLP(FFN)

        在自注意力过程之后,Transformer块的另一半是MLP(多层感知器)。在这里它只是一个包含两层的简单神经网络。与自注意力一样,在向量进入MLP之前,先进行层归一化。

        在MLP中,将每个长度为C = 48的列向量(独立地)经过以下步骤:

  1. 进行线性变换,并加上偏置,使向量扩展到长度为4 * C。
  2. 对每个元素应用GELU激活函数(逐元素操作)。
  3. 进行线性变换,并加上偏置,将向量恢复到长度C。

        跟踪其中一个向量的处理过程:

        首先,进行矩阵-向量乘法,并加上偏置,将向量扩展到长度为4 * C。

        接下来,对向量的每个元素应用GELU激活函数。这是任何神经网络的关键部分,在这里引入了一些非线性特性。使用的具体函数GELU看起来与ReLU函数(计算为max(0, x))非常相似,但它有一个平滑的曲线,而不是一个尖锐的拐角。

        然后,通过另一个矩阵-向量乘法,并加上偏置,将向量投影回长度C。与自注意力加投影部分类似,将MLP的结果与它的输入逐元素相加。现在可以对输入的所有列重复这个过程。MLP部分就此完成。现在得到了Transformer块的输出,可以传递到下一个块。

2.2.6 Output(包含Softmax)

        Softmax操作在自注意力机制中被使用,如前一部分所述,并且它也会在模型的最后阶段出现。其目标是将一个向量的值归一化,使它们的总和为1.0。然而,这并不像简单地除以总和那么简单。相反,每个输入值首先要进行指数运算。

a = \exp(x_1)

        这种操作的效果是使所有值都变为正值。一旦得到一个由这些指数化值组成的向量,就可以将每个值除以所有值的总和。这将确保这些值的总和为1.0。由于所有的指数化值都是正数,结果值将介于0.0和1.0之间,这为原始值提供了一个概率分布。

        Softmax操作的原理就是这样:只需对值进行指数运算,然后除以总和。然而,softmax操作有一个小小的复杂性。如果输入值中的某些值非常大,那么指数化后的值将会非常大。可能会把一个大数除以一个非常大的数,这可能会导致浮点运算的问题。Softmax操作的一个有用特性是,如果对所有输入值加上一个常数,结果将保持不变。因此,可以找到输入向量中的最大值,并从所有值中减去它。这确保了最大值为0.0,并且softmax操作在数值上保持稳定。

        最后,来到了模型的末尾。最终的Transformer块的输出经过层归一化处理,然后使用线性变换(矩阵乘法),这次没有加上偏置。这一最终变换将每个列向量从长度C转换为nvocab的长度。因此,它实际上为每一列的词汇表中的每个单词生成了一个分数,这些分数有一个特殊的名称:logits。“logits”这个名称来源于“对数几率”,即每个标记几率的对数。使用“对数”这个名称是因为接下来应用的softmax会通过指数运算将其转换为几率或概率。为了将这些分数转换为合适的概率,通过softmax操作处理它们。现在,对于每一列,有了模型为词汇表中的每个单词分配的概率。

        当通过时间步进模型时,使用最后一列的概率来确定下一个要添加到序列中的token。例如,如果向模型提供了六个token,将使用第六列的输出概率。这一列的输出是一系列概率,实际上需要从中选择一个作为序列中的下一个token。通过“从分布中采样”来实现这一点。也就是说,根据其概率随机选择一个token。例如,一个概率为0.9的标记将会在90%的情况下被选中。当然也可以设置始终选择概率最高的token。还可以通过使用温度参数来控制分布的“平滑度”。较高的温度会使分布更加均匀,而较低的温度会使分布更集中于概率最高的token。通过在应用softmax之前将logits(线性变换的输出)除以温度来实现这一点。由于softmax中的指数运算对较大的数值有很大的影响,使它们彼此更加接近将会减弱这种影响。

总结:上述过程我们通过3D可视化,基本完成对GPT的学习过程的讲解。这里还是强烈建议大家去实际看下3D运行的过程,可以更直观地理解算法原理。

3. 参考材料

【1】LLM Visualization

【2】Understanding GPT: The Inference Perspective

【3】The simplest, fastest repository for training/finetuning medium-sized GPTs

【4】Neural Networks: Zero to Hero

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

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

相关文章

JS基础进阶2-操作元素

目录 1.操作元素-修改DOM(文档对象模型)元素 1. 修改元素的文本内容 2. 修改元素的样式 3. 修改元素的属性 4. 修改元素的类名 5.修改body元素 2.修改自定义属性 2.1H5中设置自定义属性、 2.2使用JavaScript修改自定义属性 3.节点操作 3.1节点概…

不懂就问,换毛季猫咪疯狂掉毛怎么办?宠物浮毛该如何清理?

最近天气变热了,每天都30度以上,我家猫狂掉毛,床上、地板上堆积了不少。第一次养猫的我没见过这种阵仗,以为它生病了,连忙带它去看医生。医生告诉我,这是正常的猫咪换毛现象,我才放下心来。原来…

Python代码加密打包发布

本博客主要介绍: 1. 将python代码编译为so(win环境是pyd) 2.打包生成wheel文件,可以使用pip 进行安装 1. 项目结构 注意,__init__.py文件是必须的,内容可为空 2. example.py 里面是自己写的一些方法&am…

【hot100篇-python刷题记录】【滑动窗口最大值】

R6-子串篇 目录 Max Sort 单调队列法&#xff1a; Max 完了&#xff0c;我好像想到python的max class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:ret[]left,right0,kwhile right<len(nums):ret.append(max(nums[left:right]))ri…

聊聊 PHP 多进程模式下的孤儿进程和僵尸进程

在 PHP 的编程实践中多进程通常都是在 cli 脚本的模式下使用&#xff0c;我依稀还记得在多年以前为了实现从数据库导出千万级别的数据&#xff0c;第一次在 PHP 脚本中采用了多进程编程。在此之前我从未接触过多进程&#xff0c;只知道 PHP-FPM 进程管理器是多进程模型&#xf…

【技术方案】智慧城市大数据平台技术方案(Doc原件)

第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障体系 4.1 政策…

获发明专利加持,隆道加速推进企业级AI应用落地

近期&#xff0c;北京隆道网络科技有限公司研发的“基于供应链管理的AI采购业务分析装置及方法”获得国家发明专利授权。该项新专利的取得&#xff0c;证明了隆道在AI产业化应用中的技术前瞻性和创新性&#xff0c;也为隆道加速企业级AI应用落地提供了知识产权保障。 根据IBM发…

HTML+CSS+JavaScript制作动态七夕表白网页(含音乐+自定义文字)

源码介绍 一年一度的520情人节/七夕情人节/女朋友生日/程序员表白,是不是要给女朋友或者正在追求的妹子一点小惊喜呢&#xff0c;今天这篇博客就分享下前端代码如何实现HTMLCSSJavaScript制作七夕表白网页(含音乐自定义文字)。赶紧学会了&#xff0c;来制作属于我们程序员的浪…

【OpenCV】基础知识

目录 0 前言1 什么是OpenCV&#xff1f;1.1 OpenCV1.2 OpenCV-Python 2 在线英文文档3 新建项目4 图像读取4.1 读入图像4.2 显示图像4.3 保存图像4.4 Demo4.4.1 Demo14.4.2 Demo24.4.3 Demo3 5 ROI区域 0 前言 使用软件&#xff1a;Anaconda Pycharm VScode OpenCV环境&#…

vulmap No module named ‘thirdparty.urllib3.packages.six.moves‘

问题 今天安装vulmap是发现无论如何安装不了&#xff0c;pip那边明明已经安装好了 后来发现vulmap脚本也有这个东西&#xff0c;后面想了下 最后分析却发现不是pip那边&#xff0c;是vulmap的脚本的’thirdparty.urllib3.packages.six.moves’模块与我这边的pip有些模块冲突了…

“MongoDB AI应用计划 (MAAP)”正式全面推出

助企业弥合AI应用缺口&#xff0c;抢占创新发展制高点 在MongoDB&#xff0c;无论应用场景如何&#xff0c;出发点都是帮助客户解决应用和数据的问题。基于客户沟通与反馈&#xff0c;大多数企业和机构对生成式AI很感兴趣&#xff0c;但不确定如何将概念转化为生产力&#xff…

VSCode的markdown设置目录toc无法显示

如图我设置了目录的语法&#xff0c;但是显示出来并不是我想要的目录格式 想要显示目录&#xff0c;首先需要下载Markdown All in One插件 然后CtrlShiftV&#xff0c;就可以看到目录了

【C++题解】1053 - 求100+97+……+4+1的值。

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1053 - 求10097……41的值。 类型&#xff1a;简单循环 题目描述&#xff1a; 求 10097⋯41 的值。 输入&#xff1a; 无。 输出&#xff1a; 输出一行&#xff0c;即求到的和…

EmguCV学习笔记 C# 6.3 轮廓外接多边形

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

C++ JAVA源码 HMAC计算 openssl 消息认证码计算 https消息防篡改 通信安全

签名和验签 把所有消息按顺序合并成一条信息&#xff0c;对这个信息用密钥进行签名。 签名信息通过 HTTP 头 Sign 传递&#xff0c;没有携带签名或者签名验证不通过的请求&#xff0c;将会被认为异常请求&#xff0c;并返回相应 code 码。 校验方法&#xff1a;根据 http请求…

【嵌入式裸机开发】智能家居入门7:最新ONENET,MQTT协议接入,最全最新(微信小程序、MQTT协议、ONENET云平台、STM32)

智能家居入门7 前言一、ONENET云平台创建产品与设备二、STM32端连接服务器前的准备三、STM32端实现四、微信小程序端连接服务器前的准备五、微信小程序端实现六、最终测试 前言 本篇文章介绍最新ONENET云平台的MQTT协议接入方法&#xff0c;在STM32上实现数据上云与服务器下发…

影像组学与病理组学在鼻咽癌领域的最新研究进展|文献速递·24-08-23

小罗碎碎念 今天这期推文收纳了人工智能在鼻咽癌领域的最新研究进展&#xff0c;既涉及影像组学也涉及病理组学。 在写这期推文的时候&#xff0c;刚好看到了国自然基金放榜的消息&#xff0c;在这里也祝各位关注小罗的老师能如愿上榜&#xff01;&#xff01; 正在积极备战…

LangChain框架深度解析:对Chains组件的全方位探索与实战案例

文章目录 前言一、Chains二、LLMChain⭐1.LLMChain介绍2.LLMChain案例 三、SimpleSequentialChain⭐1.SimpleSequentialChain介绍2.SimpleSequentialChain案例 四、SequentialChain⭐1.SequentialChain介绍2.SequentialChain案例 五、RouterChain⭐1.RouterChain介绍2.RouterCh…

ArcGIS空间自相关 (Global Moran‘s I)——探究人口空间格局的20年变迁

先了解什么是莫兰指数&#xff1f; 莫兰指数&#xff08;Morans I&#xff09;是一种用于衡量空间自相关性的统计量&#xff0c;即它可以帮助我们了解一个地理区域内的观测值是否彼此相关以及这种相关性的强度和方向。 白话版&#xff1a;一句话就是判断数据在空间上有没有自…

ChatGPT3.5/新手使用手册——在线使用详细操作步骤

成长路上不孤单&#x1f60a;【14后小学生一枚&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;今日分享主题【ChatGPT新手使用手册】&#xff0c;需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&…