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)。每个词都对应一列,这些列决定了第一步中,每个单词对应的向量,将其记为W_E。跟其他矩阵一样,它的初始值随机,但将根据数据进行学习。

在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。 

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

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

相关文章

MySQL之索引(1)(索引概念与作用、红黑树、b树、b+树)(面试高频)

目录 一、索引的概念、作用。 (1)介绍。 (2)为啥索引能优化sql查询? 1、某张表(emp)结构以及数据如下。 2、假如执行的SQL语句为:select * from emp where empno7844; 3、对比与总结。 (3&#…

pytest+request+allure接口自动化框架搭建分享

介绍分享一个接口自动化框架搭建方法 (pytestrequestallure),这个方案是由 xpcs 同学在TesterHome社区网站的分享。 写在前面 去年11月被裁,到现在还没上岸,gap 半年了。上岸无望,专业技能不能落下,花了两三天时间&…

Linux之gdb的收尾部分

Linux之gdb的收尾部分 gbc常见指令的使用 gdb的调试

数据冒险-add x1, x1, x2 add x1, x1, x3 add x1, x1, x4

第一张图没有传递机制 竞争情况分析 读后写(RAW)竞争:当某条指令需要读取一个寄存器的值,而该寄存器的值尚未被前面的指令写入时,就会发生这种竞争。 指令2(dadd r1, r1, r3)依赖于指令1&#…

[产品管理-61]:马斯洛需求层次与产品的情感化设计

目录 一、概述 1、马斯洛需求层次理论概述 2、产品情感化设计与马斯洛需求层次的关系 3、产品情感化设计的实践案例 二、马斯洛需求层次与用户情感程度(本能、行为、反思)的关系 1、马斯洛需求层次与用户情感程度概述 2、马斯洛需求层次与用户情感…

浮动路由:实现出口线路的负载均衡冗余备份。

浮动路由 Tip:浮动路由指在多条默认路由基础上加入优先级参数,实现出口线路冗余备份。 ip routing-table //查看路由表命令 路由优先级参数:越小越优 本次实验测试两条默认路由,其中一条默认路由添加优先级参数,设置…

一阶 RC 低通滤波器实验方案

一阶 RC 低通滤波电路采用 RC 串联电路,把 R 或 C 做为负载端,对负载端与输入端的信 号做比较得到电路的特性曲线。图 1 所示 RC 串联电路构成一个双口网络, 根据图 1,其负载端开路时电容电压对输入电压的转移电压比为 这是一个…

华为私有接口类型hybrid

华为私有接口类型hybrid Tip&#xff1a;hybrid类型&#xff0c;简称混合型接口。 本次实验模拟2层网络下 vlan10 vlan20 不能互访&#xff0c;vlan10 vlan20 同时可以访问vlan100 sw1配置如下&#xff1a; <Huawei>sy [Huawei]sys sw1 [sw1]vl ba 10 20 100 [sw1]int…

006— 爬取第一考试网试题

import requests import logging import parsel import re import os#京东异步加载的反爬要求提供origin的信息 headers {user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0}lo…

【分布式】分布式锁设计与Redisson源码解析

分布式锁 分布式锁是一种在分布式计算环境中用于控制多个节点&#xff08;或多个进程&#xff09;对共享资源的访问的机制。在分布式系统中&#xff0c;多个节点可能需要协调对共享资源的访问&#xff0c;以防止数据的不一致性或冲突。分布式锁允许多个节点在竞争访问共享资源…

【架构设计常见技术】

EJB EJB是服务器端的组件模型&#xff0c;使开发者能够构建可扩展、分布式的业务逻辑组件。这些组件运行在EJB容器中&#xff0c;EJB将各功能模块封装成独立的组件&#xff0c;能够被不同的客户端应用程序调用&#xff0c;简化开发过程&#xff0c;支持分布式应用开发。 IOC …

万字长文深度解读Movie Gen技术原理(5部曲):图像视频联合生成模型 (2)

​引言 简介 图像和视频基础模型 时间自编码器(TAE) 训练目标 骨干架构 文本嵌入和视觉-文本生成 空间上采样 模型扩展和训练效率 预训练 预训练数据 训练 微调STF 微调数据集创建 监督微调&模型平均 推理 推理提示重写 提高推理效率 评估 评估维度 评估基准…

基于MATLAB的农业病虫害识别研究

matlab有处理语音信号的函数wavread&#xff0c;不过已经过时了&#xff0c;现在处理语音信号的函数名称是audioread选取4.wav进行处理&#xff08;只有4的通道数为1&#xff09; 利用hamming窗设计滤波器 Ham.m function [N,h,H,w] Ham(fp,fs,fc)wp 2*pi*fp/fc;ws 2*pi*…

KEIL编译后直接生成bin文件

KEIL编译后直接生成bin文件 fromelf --bin -o "$LL.bin" "$LL.axf"表示在“与axf相同的文件夹”下生成bin文件。

解析广告联盟的玩法、功能及注意事项

广告联盟是一种商业模式&#xff0c;通过联合多个站点或平台&#xff0c;共同向广告商提供广告展示和推广服务。在这篇文章中&#xff0c;我将重点介绍什么是广告联盟&#xff0c;广告联盟的玩法、功能及注意事项&#xff0c;帮助商业模式策划师更好地了解和应用该模式。 一、…

GitHub中搜索项目方法

0 Preface/Foreword 1 搜索方法 1.1 项目介绍 如上截图&#xff0c;一个项目包含的基本信息&#xff1a; 项目名项目简介项目介绍Watch数量&#xff0c;接收邮件提醒Star数量&#xff0c;关注&#xff0c;subscribeFork数量&#xff0c;在repo中创建分支 1.2 限定项目名查找…

基于java+SpringBoot+Vue的洗衣店订单管理系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

简述kafka集群中的Leader选举机制

Kafka 集群中有一个 broker 的 Controller 会被选举为 Controller Leader&#xff0c;负责管理集群broker 的上下线&#xff0c;所有 topic 的分区副本分配和 Leader 选举等工作。 Controller 的信息同步工作是依赖于 Zookeeper 的。 &#xff08;1&#xff09;创建一个新的 t…

OpenGl绘制了一个雪人

#include <GL/glut.h> #include <math.h>const int n 1000; int q; //圆的半径 int m, p;//圆心 const GLfloat R 0.5f; const GLfloat Pi 3.1415926536f;//初始化OpenGL void init(void) {glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色glShadeModel(G…

Golang进阶

1.面向对象 1.1.golang语言面向对象编程说明 Golang 也支持面向对象编程(OOP)&#xff0c;但是和传统的面向对象编程有区别&#xff0c;并不是纯粹的面向对象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。Golang 没有类(class)&#xff0c;Go 语言的结构体(st…