Transformer介绍(一)
Transformer是一种特殊的神经网络,一种机器学习模型。
谷歌在2017年推出的原版Transformer,论文《Attention Is All You Need》,专注于将一种语言的文本翻译成另一种。
而我们要关注的Transformer变种,即构建ChatGPT等工具的模型,则是输入一段文本、图像或音频,预测文本接下来的内容,并将结果展现为,接下来不同文本片段的概率分布。
你可能觉得预测下一个词与生成新文本的目标截然不同,但有了这样的预测模型后,要让它生成更长的文本,一个简单的方法是,给它一个初始片段,然后从它给出的概率分布中取一个片段,追加到文本末尾,再用所有文本包括追加的内容,进行新一轮的预测。
这个重复预测和抽样的过程,正是你与GPT或其他大语言模型,进行交互时所遇到的一个一个打印出来的词。它的展现过程,也是它的原理。
数据如何在Transformer里流动?
聊天机器人生成特定单词时,背后实际在做的事情,主要分5步。①分词 ②变id ③变向量 ④加位置编码 ⑤计算attention。
1、分词。将输入内容切分为多个小片段,每个小片段称为tokens;在文本中,token往往是单词、单词片段或其他字符组合。
对于图像或声音而言,token则可能代表小块图像或声音片段。
每个token对应一个向量,即一组数字。目的是编码该片段的含义。
如果将向量看作高维空间中的坐标,那么意思相近的词,对应的向量也相近。
这些向量随后经过attention block处理,使得向量能够相互交流。通过相互传递信息,来更新自己的值。
例如机器学习中的model和时尚中的model含义不同,attention block就是找出上下文中哪些词会改变哪些词的含义,以及这些词应该更新为何种含义。
之后,这些向量会经过另一种处理,取决于不同的资料,有的叫多层感知机(multi-layer perceptron),有的叫前馈层(feed-forward layer)。此阶段,向量不再相互交流,而是并行经历相同的处理。
对每个向量提出一系列问题,然后根据这些问题的答案来更新向量。
这里的所有处理,本质都是大量的矩阵乘法。而我们的主要目的是弄懂如何解读这些底层矩阵。
之后,基本是重复这个过程,attention blocks 和 multi-layer perceptron blocks 层层堆叠。
最后的目标是能将整段文字的所有关键含义,以某种方式融入到序列的最后一个向量,然后对这最后一个向量进行某种操作,得出所有token可能的概率分布,即各小块文本接下来出现的概率。
前面提到的,只要能够根据给定的文本,预测下一个词,你能给它喂一点初始文本,然后反复进行预测、抽样、追加,这一过程。
在GPT出现之前,GPT-3的早期演示,根据初始文本自动补全故事和文章,把这样的工具做成聊天机器人,最基础简单的方法是,准备一段文本,设定用户与AI助手互动的场景,即系统提示词(system prompt),然后将用户的初始问题或提示词作为第一段对话,让模型预测AI助手会如何回应。要做好这一步,还需要额外的训练步骤。
神经网络的开始端和结尾端是怎样的?
深度学习是机器学习中的一种方法。
机器学习采用数据驱动,反馈到模型参数,指导模型行为。
比如:输入图像,经过模型处理后,能够输出对应的描述标签。或是,给定一段文本,预测下一个单词。
机器学习的理念是,不要在代码中明确定义如何执行一个任务,而是去构建一个具有可调参数的灵活架构。机器学习最简单的形式,可能是线性回归。
这条线受2个参数影响,即斜率slope和截距intercept。y=wx+b。线性回归的目标是确定这些参数,以尽可能拟合数据。
深度学习就比较复杂了,比如GPT-3的参数不止2个,而是有1750亿个,但问题是,并不是直接扩大模型参数量就可以。发现有时数据严重过拟合,有时完全训练不出来。
深度学习描述的一类模型,在过去几十年中,这类模型展现了出色的规模化能力,它们的共同点是都使用相同的训练算法,即反向传播(Backpropagation)。要让这种训练算法,在大规模应用中有效运行,模型必须遵循某种特定的结构,对这种结构有所了解后,就能更好理解transformer对语言处理的许多选择,否则有些选择可能会显得没道理。
首先,无论你在构建何种模型,输入的格式必须为实数数组,可以是一维数列、二维数组或是更高维的数组,也就是所谓的张量。输入数据通常被逐步转换成多个不同的层,同样,每一层的结构都是实数数组,到了最后一层,就看作输出。
例如,文本处理的最后一层,是一个数列,表示接下来所有可能token的概率分布。在深度学习中,这些模型的参数被称为权重(weight)。
这些模型的关键特征是参数与待处理数据之间的唯一交互方式,就是通过加权和。虽然模型中也有一些非线性函数,但它们并不依赖于参数。通常情况下,加权和不会直接这样写出来,而是打包成矩阵向量相乘的形式。
例如,GPT-3有1750亿个weights,组成了约28000个矩阵,这些矩阵分为8类,我们需要逐一了解各个类别的作用。
虽说现在有更大更强的模型,但GPT-3作为第一个真正从机器学习破圈,爆火全球的大语言模型,仍具有其独特的魅力。对于更先进的模型,公司往往对其具体数据保密。
当你研究ChatGPT这种工具的内部原理时,几乎所有的计算过程,都体现为矩阵向量乘法。
图里模型的权重用蓝色或红色标注,待处理数据用灰色标注。
权重相当于模型的大脑,是在训练过程中学习的,决定了模型的行为模式。待处理数据,则仅编码了某次运行模型时的输入,比如一段示例文本。
有了以上这些基础,我们来对该示例文本进行第一步的处理。
即把输入切分成小块(这些小块被称为token),然后转化成向量。
模型有预设的词汇库,包含所有可能的词汇,假设有5万个,我们将遇到的第一个矩阵,被称为嵌入矩阵(embedding matrix)。每个词都对应一列,这些列决定了第一步中,每个单词对应的向量,将其记为。跟其他矩阵一样,它的初始值随机,但将根据数据进行学习。
在transformer出现之前,将单词转化为向量就是机器学习的常见做法,但对于初次接触的人,可能略显奇怪。但它为接下来的一切,奠定了基础,所以我们花点时间来熟悉一下。
我们通常称其为词嵌入(embedding a word),从几何角度来理解这些向量,将它们视为高维空间中的点。
将3个数字视为三维空间坐标很简单,但词嵌入的维度往往高的多。GPT-3有12288个维度。
在三维空间中,取一个二维切片,并将所有点投射到该切片上。
当模型在训练阶段调整权重,以确定不同单词将如何被嵌入向量时,它们最终的嵌入向量,在空间中方向,往往具有某种语义意义。
嵌入矩阵,一列对应一个单词,是我们模型中的第一组权重,根据GPT-3的数据,词汇库里有50257个词,即50257个token,每个嵌入有12288维,两者相乘,得到权重数约为6.17亿。将该数字记入统计表,要记得最后,总权重数加起来应该是1750亿。
就transformer而言,嵌入空间的向量,不能仅视为代表单个单词,它们还编码了单词的位置信息。值得关注的是,这些向量能结合上下文语境。例如,一个词嵌入向量国王(King),可能会被网络中各个模块逐渐拉扯,最终指向一个更具体细致的方向。比如说居住在苏格兰(lived in Scotland),它通过弑君上位(murdered predecessor),且用莎士比亚文风描述(in Shakespearean language)。
思考一下,你如何理解某个词。它的词义显然会受到上下文语境的影响。有时甚至来自很远的上下文,因此,构建能够预测下一个单词的模型时,目标就是使其能有效结合上下文信息。
在第一步,即根据输入文本创建向量数组时,每个向量都是直接从嵌入矩阵中拉出来的。所以最开始,每个向量只能编码单个单词的含义。
没有上下文信息,而流经这个网络的主要目标是使这些向量能获得 比单个词更丰富更具体的含义。这种网络一次只能处理特定数量的向量,称作它的上下文长度(context size)。
GPT-3的上下文长度为2048,因此流经网络的数据有2048列,每列12000维。上下文长度限制了transformer在预测下一个词时能结合的文本量。这就是为什么有些聊天机器人,如chatgpt早期版本,在进行长对话时,时常会感觉健忘。
请注意,目标输出是下一个可能token的概率分布。例如,如果最后一个词是Professor,而上下文包含Harry Potter这样的词,紧接着前面的又是least favourite teacher,如果将token视为完整单词的话,那么一个训练良好的网络,在叠加了Harry Potter有关知识后,大概率会给Snape一词打高分。
这包含两个步骤,首先,用另一个矩阵将上下文中的最后一个向量,映射到一个包含50000个值的列表,每个值对应词库里的一个token,然后用Softmax函数将其归一化为概率分布。
你可能会疑问,只用最后一个嵌入来做预测,有点奇怪。毕竟在最后一层中,还有成千上万其他的向量,都蕴含着丰富的上下文信息。这是因为在训练过程中,效率更高的方法是,利用最终层的每一个向量,同时对紧随着这个向量的词进行预测,后面再单独详述更多关于训练的细节。
若想将一串数字作为概率分布,比如所有可能下一个词的概率分布,那么每个值都必须介于0到1,并且总和为1。但对于深度学习,每一步都像是矩阵向量乘法,那么默认输出完全不满足要求,经常会有负值,或远大于1,而且几乎肯定总和不会为1。
要把任意数列转换为合理概率分布,标准方法是使用softmax,它使最大值最接近1,而最小值接近0。softmax是对每一项取以e为底的指数函数,使得数列中全是正数,然后求和。并将每一项除以该总和。得到归一化后的数列,它的总和为1.
如果输入中某一项显著突出,那么输出中,对应项就会占绝对主导,这样从中抽样,也只会选到最大的输入值,但它比只选取最大值要柔和,即当有值靠近最大值时,概率分布中也会获得相当大的权重,随着输入的连续变化,输出也连续变化。
在某些情况下,如ChatGPT利用该分布生成下一词时,可以给这个函数加入一点趣味性,给指数加个分母,常量T,它被称为温度,因为它与某些热力学方程中温度的作用有些相似,其效果是,当T较大时,会给低值赋予更多权重,使得分布更均匀一些。当T很小时,则较大的数值更占优势。极端情况下,将T设为0,意味着所有权重都给到最大值。
例如,让GPT-3生成一个故事,初始文本为:“one upon a time there was a ",每轮测试采用不同的温度,温度为0表示模型总是选择最可能的词。得到的结果有点像金发姑娘的老套改编。温度越高,模型就越可能选择可能性较低的词,但风险也更大。
严格来说,API不允许你选择大于2的温度,这没有数学依据,只是人为的限制,可能是为了避免工具产生过于荒诞离谱的内容。
大家通常将Softmax函数的输出作为概率,输入则称为logits。
相关文章:

Transformer介绍(一)
Transformer是一种特殊的神经网络,一种机器学习模型。 谷歌在2017年推出的原版Transformer,论文《Attention Is All You Need》,专注于将一种语言的文本翻译成另一种。 而我们要关注的Transformer变种,即构建ChatGPT等工具的模型…...

[CKS] TLS Secrets创建与挂载
目前的所有题目为2024年10月后更新的最新题库,考试的k8s版本为1.31.1 BackGround 您必须使用存储在TLS Secret中的SSL文件,来保护Web 服务器的安全访问。 Task 在clever-cactus namespace中为名为clever-cactus的现有Deployment创建名为clever-cactu…...

java双向链表解析实现双向链表的创建含代码
双向链表 一.双向链表二.创建MyListCode类实现双向链表创建一.AddFirst创建(头插法)二.AddLast创建(尾叉法)三.size四.remove(指定任意节点的首位删除)五.removeAll(包含任意属性值的所有删除)六.AddIndex(给任意位置添加一个节点…...
【Kafka-go】golang的kafka应用
网络上关于go的Kafka还是比较少的今天就先出一篇入门级别的,之后再看看能能出一个公司业务场景中的消息流。 一、下载github.com/segmentio/kafka-go包 go get github.com/segmentio/kafka-go二、建立kafka连接 正常来说下面的配置host topic partition 应该写在…...

redis:set集合命令,内部编码,使用场景
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言命令SADDSMEMBERSSISMEMBERSCARDSPOPSMOVESREM集合间操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 内部编码使用场景总结 前言…...
45期代码随想录算法营总结
代码随想录训练营总结与收获 在为期60天的代码随想录训练营结束后,我感慨良多。这段时间不仅让我在编程技能上有了明显的提升,更让我在学习习惯和时间管理上有了深刻的反思和改变。 报名参加这个训练营对我来说是一个重要的监督机制。之前我总是拖延&a…...
深入理解Java中的instanceof关键字及接口新特性:方法实现的可能性
目录 引言 1. 什么是instanceof关键字? 1.1 语法结构 1.2 instanceof的用法示例 1.3 instanceof的应用场景 2. Java中的接口能包含方法实现吗? 2.1 默认方法(Default Method) 2.2 静态方法(Static Method&…...
【python中如果class没有self会怎行】
python中如果class没有self会怎样TOC 在Python中,self是一个约定俗成的名称,用于表示类的实例。如果没有使用self,会导致以下问题: 1、无法访问实例属性: 在类的方法中,如果没有self,方法将无…...

【算法】(Python)动态规划
动态规划: dynamic programming。"programming"指的是一种表格法,而非编写计算机程序。通常解决最优化问题(optimization problem)。将问题拆分成若干个子问题,求解各子问题来得到原问题的解。适用于多阶段…...
EasyExcel 学习之 导出 “提示问题”
EasyExcel 学习之 导出 “提示问题” 现象分析解决(伪代码)前端 POST 实现后端实现 现象 EasyExcel 支持导出 xlsx、xls、csv 三种文件格式。在导出过程中可能发生各种异常,当发生异常时应该提示错误信息而非导出一个错误的文件。 分析 首…...
应用系统开发(3)低功耗四运算放大器LM324N
LM324N 是一种广泛使用的 低功耗四运算放大器,由德州仪器(Texas Instruments)和其他制造商生产。它具有四个独立的运算放大器,能够在单电源或双电源模式下运行,适合多种模拟电路应用。以下是详细信息: 芯片基本信息 型号:LM324N封装类型:常见 DIP(双列直插封装)或 SO…...

基于微信小程序的电商平台+LW示例参考
1.项目介绍 系统角色:管理员、普通用户功能模块:管理员(用户管理、商品分类、商品管理、订单管理、系统管理等),普通用户(个人中心、收藏、我的订单、查看商品等)技术选型:SpringBo…...
[Android] Graphic Buffer 的申请
前言: MediaCodec 支持 texture mode,即MediaCodec解码video完毕后把 yuv 数据填入 GPU 共享出来的 graphic buffer 里面,app 会把 video 的 yuv数据 和 ui 的数据通过通过软件渲染组件(opengl等)发送给GPU 进行一并渲染。这样做的效率较低&…...

【大数据学习 | HBASE高级】storeFile文件的合并
Compaction 操作分成下面两种: Minor Compaction:是选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile,对于删除、过期、多余版本的数据不进行清除。 Major Compaction:是指将所有的StoreFile合并成一个StoreFile&am…...
多平台编包动态引入依赖的解决方案
最近开发时遇到了这样的需求,A 平台需要引入一个 video.js,B 平台却是不需要的,那么面向 B 平台打包的时候把依赖装进去自然就不大合适。最好的方法是动态引入依赖,根据平台来判断要不要引入 动态引入依赖 很快啊,动…...

[单例模式]
目录 [设计模式] 单例模式 1. 饿汉模式 2. 懒汉模式 3. 单例模式的线程安全问题 [设计模式] 设计模式是软件工程中的一种常见做法, 它可以理解为"模板", 是针对一些常见的特定场景, 给出的一些比较好的固定的解决方案. 不同语言适用的设计模式是不一样的. 这里…...
速盾:游戏盾的功能和原理详解
速盾有一款专注于网络游戏安全的防护系统,它通过实时监测游戏网络流量和玩家行为,以及使用先进的算法和技术进行分析和识别,检测出各种外挂、作弊行为和恶意攻击,从而保障游戏的公平性和玩家的安全性。 速盾游戏盾的主要功能包括…...
Spleeter:音频分离的革命性工具
目录 什么是Spleeter?Spleeter的工作原理Spleeter的应用场景Spleeter的技术优势Spleeter的挑战与局限性结论 什么是Spleeter? Spleeter 是一个由 Deezer 开发的开源音频源分离工具。它基于深度学习技术,尤其是卷积神经网络(CNN&a…...

【笔记】自动驾驶预测与决策规划_Part6_不确定性感知的决策过程
文章目录 0. 前言1. 部分观测的马尔可夫决策过程1.1 POMDP的思想以及与MDP的联系1.1.1 MDP的过程回顾1.1.2 POMDP定义1.1.3 与MDP的联系及区别POMDP 视角MDP 视角决策次数对最优解的影响 1.2 POMDP的3种常规解法1.2.1 连续状态的“Belief MDP”方法1. 信念状态的定义2. Belief …...
openresty入门教程:access_by_lua_block
在OpenResty中,access_by_lua_block 是一个功能强大的指令,它允许你在Nginx的访问控制阶段执行Lua脚本。这个阶段发生在Nginx处理请求的过程中,紧接在rewrite阶段之后,但在请求被传递到后端服务器(如PHP、Node.js等&am…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
统计学(第8版)——统计抽样学习笔记(考试用)
一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征(均值、比率、总量)控制抽样误差与非抽样误差 解决的核心问题 在成本约束下,用少量样本准确推断总体特征量化估计结果的可靠性(置…...

Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...
mcts蒙特卡洛模拟树思想
您这个观察非常敏锐,而且在很大程度上是正确的!您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些,您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”,这个观察非…...

循环语句之while
While语句包括一个循环条件和一段代码块,只要条件为真,就不断 循环执行代码块。 1 2 3 while (条件) { 语句 ; } var i 0; while (i < 100) {console.log(i 当前为: i); i i 1; } 下面的例子是一个无限循环,因…...

7种分类数据编码技术详解:从原理到实战
在数据分析和机器学习领域,分类数据(Categorical Data)的处理是一个基础但至关重要的环节。分类数据指的是由有限数量的离散值组成的数据类型,如性别(男/女)、颜色(红/绿/蓝)或产品类…...