深度讲解AI大模型原理,它到底是如何工作的
深度讲解AI大模型原理,它到底是如何工作的
AI大模型是当前科技领域的热门话题,从ChatGPT到Claude、Gemini等,各种大模型层出不穷。但是,你真的了解这些大模型是如何工作的吗?本文将从文本生成原理、模型结构解析到实际推理实验等多个维度,深入浅出地为你揭示AI大模型的工作机制。
文本生成的原理
你是否困惑过,无论向ChatGPT输入什么样的问题,它都能准确地回复。并且,ChatGPT还能参考过去的对话内容,生成符合历史对话的新回复。不仅如此,如果我们觉得ChatGPT回复效果不够好;还可以让它重新生成一个、不同于之前的回复。
这究竟是什么样的原理呢?
实际上,我们看似是与ChatGPT进行问答式的沟通与对话交流;但对于GPT来说,它做的事情,仍然是文本生成。也就是基于过去的数据,预测出下一个最有可能出现的单词。
下面我举两个例子,来说明这个问题。
1)到底什么是文本生成?
假如我们有一个AI大模型,比如GPT2。此时我们向模型输入,“[cls]、今、天、天、气、真”,一共6个字(单词)。我们希望模型基于这6个字,生成第7个字。此时,模型会输出第7个字,是“的”字。
这里要需要特殊说明:最开始的[cls],是一个特殊标记;它用于标记句子的起始位置;模型需要基于一些特殊的标记来进行计算。现在不太理解也没关系,可以暂时忽略这个cls标记。
接着,我们要生成第8个字。对于第8个字的生成,就会依赖初始输入的6个字,与刚刚生成的第7个“的”字。基于这7个字,模型会继续生成“很”字。接着,我们可以再基于这8个字,再向后生成一个字;也就是第9个字,模型会输出“好”字。
以此类推,接着往后生成“,我们一行人去吃的,我们点了一个牛肉锅”。
总结来说:文本生成,就是使用前面的字作为输入,生成新的字。而到底要生成多少内容,取决于我们希望生成多少内容。也就是,只要你愿意,大语言模型可以生成无穷无尽的文本。
2)ChatGPT和文本生成又有什么关系?
ChatGPT就是对话形式的文本生成。假如此时,我们有一个经过对话数据微调的、中文GPT2大语言模型。同样向这个模型输入“[cls]、今、天、天、气、真”,一共6个字。这一次我们会发现,生成的下一个字是“好”;然后是“[SEP]”;接着是“是的,你最近怎么样[SEP]挺好的,你呢[SEP]”。
这又代表什么意思呢?
SEP分隔符
实际上,SEP就像一开始的[cls],是一种预定义的特殊字符;SEP用于表示对话的分隔符。我们可以将SEP看做是两个人对话的分隔标记。模型专门输出这个特殊字符[SEP],来指示对话的结构。例如,如果以SEP分割模型生成的文本,就会模拟出两个人的对话。
例如,我们可以将:
第1句“今天天气真好”看做是A说的;
第2句“是的,你最近怎么样”看做是B说的;
第3句“挺好的,你呢”,又是A说的;
第4句“我也是,还在上班”,又是B说的。
这样就得到了,对话形式的生成结果。我们在使用模型的输出时,也就是ChatGPT在展示结果的时候:只需要展示、输出第1个SEP后与第2个SEP前的文本就可以了。也就是说,ChatGPT会回复:“是的,你最近怎么样”,这样就可以了。这之后的输出,对于此时的对话是没有意义的。当看到SEP后,就代表了本次的回复结束了。
综合上面这两个例子:我们就会发现:ChatGPT的本质,就是文本生成。模型本身,并没有试图去理解对话本身的意义。ChatGPT仅仅是通过文本生成,模拟出对话的效果而已。
所以,大家会不会觉得:AI大模型也不过如此呢?
如何推理计算出下一个字
如何基于已有的文本,计算出下一个字呢?也就是:到底如何基于“[cls]、今、天、天、气、真、”;计算出下一个单词是“的”;再下一个字是“很”;再下一个是“好”呢?
下面我基于llama3模型,来说明这个问题。
简单介绍Llama3,它是Meta的开源AI大模型;效果先放一边,最关键的是它的资料非常全面;对于学习者来说,是难得的学习资源。
Llama3基于Transformer架构。如果真想搞懂llama,肯定需要先理解Transformer。下面我会基于Transformer和llama的模型结构图;来解释大语言模型的推理过程。大家即使看着似懂非懂也没关系,关键是感受一下大模型是如何工作的。
1)模型的结构:
左图是Transformer结构图,右图是llama结构图。Transformer中的左侧结构是编码器,右侧是解码器。对比观察这两个结构图可以看到,llama模型借鉴了Transformer的解码器。实际上,生成式的AI大模型,都依赖Transformer的解码器架构。如果深入来看模型方框中的结构;Transformer的解码器和llama模型,同时都包括了:
- 红色的embedding层
- 绿色的标准化层
- 橙色的自注意力机制
- 蓝色的前馈神经网络
在模型的输出位置,又同时都有:
- 一个灰色linear线性层
- 一个绿色的softmax层
2)数据流的计算
输入数据Input标记为1,会从下方输入。首先经过2号embedding,进行词嵌入,将单词序列转为向量序列。接着进入N个transformer块,进行特征提取。虚线框中的结构,编号3到10,都是Transformer块中的内容。我们只需要知道,它们会将Input,转换为一个固定长度的向量。
接着,这个向量会被11号RMS-norm和12号Linear层处理。
3)预测下一个字
预测下一个字,就是使用Linear层+softmax层。Linear层用于将特征向量的维度数,转换为字典中字的数量。softmax层用于计算下一个字出现的概率,也就是预测下一个字。这实际上是一个分类的过程!
假如在中文词汇表中,有1000个字:那么它就是一个1000个类别的多分类任务。具体来说:给定的输入文本会被Transformer转为固定长度的向量:图中标记的4096,就是输入文本转换后的维度。这个4096的向量会输入到Linear线性层:
通过Linear线性层:我们可以将这个4096维的向量,转换为字典中字的个数的维度的向量;比如字典中有1000个字,那么就被转为1000维的向量。从而进行1000个类别的分类。分类的结果,就是具体的某一个字。
将1000维的向量,继续输入到softmax层:softmax层会给出1000个字,每个字可能的概率。例如,对输入文本“今天天气真”进行“分类”,就得到“好”字。
4)如何选择输出结果
贪心方式选择:如果我们选择概率最大的字作为下一个字,进行输出;这是贪心的方式来选择结果。例如,1000个字:“好”字的概率是0.67;“糟”字的概率是0.32;其他所有加一起是“0.01”。这时我们可以直接输出“好”字。这种选择结果的方式,虽然简单,但也存在弊端:因为直接输出概率最大的字,输出结果总是固定的。ChatGPT的回复就没有多样性了。
基于概率分布选择:我们可以基于概率分布,随机的取出下一个字作为输出。就像从一个黑箱中有放回的摸球,摸到哪个字,就输出哪个字;我们也不用担心摸到不常用的字;因为我们可以将概率过低的字进行丢弃。这时我们就会选择“好”字,或者“糟”字;从而生成出两不同的结果了。这就是为什么,ChatGPT可以生成不同结果的原理。
GPT2模型的推理实验
最后我们在本地电脑,进行大模型的推理实验。这里选择GPT2进行实验。
简单介绍GPT2:它是GPT4的前身,是OpenAI的最后一个开源版本。之所选择GPT2进行推理实验,是因为它所依赖的资源很少;单机环境就可以运行大模型推理;并且对于初学者,如果你想学大语言模型;GPT2就是最合适的!因为它的资料,真的很多!
1)模型下载
GPT2的中文模型,可以从huggingface上下载。我们选择其中的clue-corpus-small,这个版本。为了部署模型,需要下载其中的3个关键文件:
- 模型的配置:config.json
- 模型本身:pytorch_model.bin
- 切词字典:vocab.txt
2)实验代码1
使用这个模型需要基于Transformer库。主要需要使用Transformer库的切词组件与GPT2模型组件。下面在讲解代码时,我会基于代码的调试信息来说明。实验整体包括两个部分,分词部分和推理部分。
分词部分:首先定义设备变量device,打印后会看到我们当前的设备是cuda,GPU设备。定义分词器,BertTokenizerFast。使用分词器的encode函数,可以将句子分词,并将中文词语转为数字索引的形式。例如,输入句子“[CLS]今天天气真”;它就会被转换为6个整数索引,分别是101、791等等。我们可以在字典vacab.txt中,找到这些词和对应的索引。
打开vacab.txt文件观察:找到字典的第102行,就是[CLS]这个词。找到字典的第792行,就是“今”这个字。
推理部分:接着,我们使用接口from_pretrained,加载预训练模型。定义max_len=20,表示向后生成20个字。在循环中,每循环一次,就生成一个字。将输入序列input_ids输入到模型model后,会计算出推理结果output。这里我们直接选择概率最大的字,作为下一个字。也就是使用softmax函数,计算出所有字出现的概率后;使用torch.max,贪心的选择最大概率的字。将这个字作为下一个生成结果,添加到response中。然后更新输入序列input_ids,把新生成的next_token,cat到input_ids中。接着我们将input_ids的整数索引与文本形式打印出来。
输出结果:这时会看到,每一轮循环,都会生成一个字。i=0时,生成了“的”字;i=1时,生成了“很”字;i=2时,生成了“好”字;…i=19时,就基于前面的19个字,就会生成最后一个“锅”字。这样我们就基于“[CLS]今天天气真”;生成了“的很好,我们一行人去吃的,点了一个牛肉锅”。
3)实验代码2:
实验代码1,是普通的文本生成;实验代码2,是对话形式的文本生成。这两个代码,只是加载的模型不同:左侧是基础中文GPT2模型,右侧是中文对话微调的GPT2模型。我们会发现,使用对话文本微调的GPT2模型,输出的结果包括了SEP分隔符。如果输入“[CLS]今天天气真”;就会输出“好[SEP]是的,你最近怎么样”等等。通过SEP分隔符,我们就可以模拟出对话的效果了。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。但是具体到个人,只能说是:“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。