
什么是大语言模型

简单来说就是基于深度学习技术建构的超大规模自然语言处理模型,其通常包含数十亿至数万亿参数,并且使用TB级文本数据
如何构建像ChatGPT这样的工具
预训练阶段
Step1. 下载和处理互联网数据
在这篇博客中,HuggingFace公司详细解释了它们如何去构建FineWeb数据集huggingface.co/spaces/Hugg...
所有主要的LLM提供商如OpenAI,都有类似的内部数据集
为了获取高质量、多样化的文本数据,需要以下步骤(以FineWeb数据集整合为例):

FineWeb数据集大约有44TB的磁盘空间(尽管互联网非常庞大,我们把这些文本进行处理和过滤后,得到了大约44TB的数据)
基础数据基本上都来自于Common Crawl(一个自2007年以来基本在互联网上进行搜索的组织),截至2024年,Common Crawl索引了27亿个网页(先选取几个种子网页,然后跟随所有的链接,持续爬取索引所有信息),但是Common Crawl爬取的数据相当原始,并以多种方式进行了过滤
1、URL过滤
有一些域名黑名单,我们不希望获取这些域名下的相关数据,如:种族主义网站、邪教组织网站等
2、文本提取
提取到的所有的网页信息都是HTML,但是我们只想要网页的文本,而不需要网页的CSS样式,标签导航事件等信息
3、语言过滤
例如,FineWeb使用语言分类器进行过滤,它们会尝试判断每个网页使用的语言,它们只保留超过65%英语的网页
所以不同的公司或组织可以决定,在我们的数据集中,需要多少种不同类型的语言?如果我们过滤掉所有的中文页面,那显而易见的是,我们的模型在中文问答方面的表现会比较差(因为没有数据支撑)
4、进行其它的类似过滤以及去重
例如最后的PII removal,这是指移除页面中的个人隐私/可识别信息,如个人住址,身份证号码
通过这些步骤,会得到FineWeb数据集 huggingface.co/datasets/Hu...
Step2. Tokenization
把数据集中的文本整合(简单拼接在一起),可以组成一幅巨大的文本数据挂毯,然后用这个文本数据挂毯来训练神经网络,但是我们得先把这个文本数据挂毯转换成神经网络需要的一个一维符号序列(这个序列得包含有限的符号)
所以我们得确定用什么符号,怎么将文本转化成这些符号,并且表示成一维序列
一维很好理解,我们的文本数据挂毯本身就是一维序列,但其在计算机中的存储形式本质上是一个超级超级长的01序列,但是序列长度实际上在我们的神经网络中是一种有限且珍贵的资源,所以我们要尽可能的去缩减其序列长度,即更多的符号和更短的序列
将原始文本(Text)转化为符号(Token)的过程称为Tokenization(分词)
1、将连续的01序列表达成一个符号 -> 8个01bit组成一个字节(将这个序列缩短8倍)(0~255)

2、但是我们还是想进一步对序列进行缩短,这个时候会用到byte pair encoding algorithm(字节对编码算法)
这个算法的原理就是寻找常见的连续字节或符号,比如(116 32)这个字节对出现的很频繁,那我们可以把(116 32)这个字节对判定成一个新的符号(256),并用(256)替换文本中出现的所有(116 32)字节对。重复使用上述方法,每次铸造新符号的时候,我们都在减少序列长度,同时增加符号数量
在实践中,一个序列大概会包含100,000个符号(Token),例如GPT 4,其输入序列使用了100,277个符号(Token)

而在FineWeb数据集中,这44TB的数据,大约可以表示为一个包含15万亿token的序列
所以Token只是代表每一个词的Unique ID
Step3. 神经网络训练
简单来说,就是记录Token在序列中如何相互跟随,统计它们之间的跟随概率
1、我们首先会从Step 2中获取的数据中随机提取一个Token窗口,窗口的长度可以在0个Token和我们所决定的最大大小之间变化,如:我们先随机选取一个包含4Tokens的窗口(这4Tokens窗口就作为初始上下文,所以对Token窗口大小的限制,也反应了该模型的最大上下文长度)
由此可见,神经网络的输入是长度可变的Token序列,输出则是对下一个内容的预测

2、然后将其放入神经网络中,神经网络会预测下一个Token是什么

在开始时,神经网络是随机初始化的,所以在训练的最开始,预测的下一个Token的概率也是随机的
但是由于这个Token窗口是我们从Step 2的数据中随机挑选的一个窗口,所以我们知道它的下一个Token是什么(也就是说我们知道正确值(label),假设正确值是3962),我们会利用这个标签值与预估值之间的误差,去更新神经网络,最终使得3962的预估概率增高,其它Token的预估概率减少
上述过程不仅发生在一个Token中,这一过程同时发生在整个数据集中的所有Token上
神经网络的内部构造

通过预估值与label值之间的误差,来反向调整w以及b的值,从而提高模型的预测率
可以把上述w和b看成是DJ台上的不同旋钮,当转动这些旋钮的时候,我们的输出会有很大的不同
所以,训练一个神经网络就是说发现一组参数设置,使得模型预测的数据与训练集的数据一致
实际生产中的神经网络非常庞大以及复杂,其中包含大量的转换以及数学公式计算,如:bbycroft.net/llm
大模型推理
在推理中,我们不断的从模型中生成新的数据

推理中,我们并没有完全重现训练数据中看到的序列,大部分时候,我们可能会得到从训练中看到的数据的混合。从统计学上讲,它们有相同的属性,但与训练数据并不完全相同,这种更像是收到了训练数据的启发
训练过程中,研究人员会搭配推理来看下模型的训练程度,以此来判定是否需要进一步的训练或者是否有部分需要调整的地方
(我们平时使用LLM也只使用了其推理步骤)
但是上述模型只是基础模型(本质上是一个互联网文档模拟器,它可以生成与互联网文档具有相同统计特征的token序列),它没有办法被称为一个助手(无记忆,只是单纯的token推测,而且对于相同的Token前缀,总是会得到不同的答案)
后训练阶段(监督微调阶段)
2022年,OpenAI发表论文第一次谈论了如何微调模型来让其适应对话
后训练可以将大语言模型转化成助手(其在回答时,不去采样互联网文档,而是给出问题的答案)

助手需要的特性:
1、可以回答问题
2、可以有自己独特的个性
3、能拒绝回答问题
使用预训练阶段产生的基础模型 -> 丢弃这份互联网文档的数据集 -> 替换一个新的数据集(对话数据集)-> 在对话数据集上训练模型
后训练阶段要比预训练阶段要快速很多,预训练阶段要花上大概3个月的话,后训练阶段则只需要3h(因为手动创建的对话数据集要远小于互联网上的文本数据集)
Step1. Create Conversation dataSet
有人工标注员来专业的创建这些对话,自己想Prompt,自己想response
那么,人工标注员是怎么知道理想的助手应该回应什么呢?
每个大模型公司有自己的不同的标准(长达数百页,需要标注员们专业的去学习)(如尽量提供帮助,尽量真实,不要回答我们不希望模型处理的问题)
这些对话就成了label,帮助我们去训练模型
现在人类不再单独承担所有的重担,LLM可以帮助我们创建数据集和对话。因此,人们不会从0开始写出回应,它们更可能使用现有的LLM来生成答案,再在LLM生成的答案上进行修改。
Step2. Tokenization Of Conversation

不同的LLM会有稍微不同的格式或协议,像上述图片,chatgpt-4o会在每个角色开始对话前包含一个<|im_start|>的特殊Token(im(imaginary monologue 假想独白开始) underscore start)
对话被认为是一个结构化对象,最终通过某种编码变成一维的Token序列
那当我们在输入框中输入一个问题时,具体的Token序列会表现成什么样呢?


Step3... 重复预训练中的训练过程
所以和模型对话,更像是和统计概率对话,就像是在询问一个人类labeler
如果我们的Prompt不在对话训练集中,那我们得到的结果就是结合了预训练知识和后续训练数据集所产生的模仿
此时我们生成了SFT Model(监督微调模型)
使用LLM时需要注意的缺陷
幻觉
LLM存在捏造信息的情况
因为LLM没有访问互联网的权限,也不会做任何研究,它只能根据预先给定的训练集,在训练集中找答案,拼接答案(它不会去查找信息,它只是在模仿答案)。比如说让大模型写论文,它有非常非常大的可能自己去编造文献,并给出假数据和文献参考
确定模型不知道的事情
通过审问模型来确定其不知道的事情
Meta是如何处理Lama 3系列模型的幻觉问题的?
确定模型不知道的东西,给这些Prompt设定其response就是不知道,并将其加入到训练集中,以此来解决幻觉问题
在训练集中随机选取一段文本,然后使用LLM构造有关该段落的问题和答案,因为具体的信息就在上下文窗口中,所以它可以以相当高的准确性重新构建这些信息

将上述LLM构建出来的问题放到我们需要训练的model中,重复几次,看answer和LLM提取出来的answer是否一致,如果出现不一致现象,则说明model不知道这个东西。所以我们要在训练集中添加一个新的对话,并将这个不知道的question的answer定为"对不起,我不知道"或"我不记得了"
设置足够多的这样的例子,模型将会知道,并且有机会学习这种基础知识的拒绝,从而减轻幻觉现象
Tool Use
如果我问你一个问题,你不知道,那你会怎么做,来回答这个问题?(到互联网上去搜索?)
模型也可以做完全相同的事情,我们可以创建一个机制,使其可以生成特殊的token,并引入模型如何使用这些token的格式或协议
例如,当模型不知道答案时,不是简单地说"我不知道,对不起",而是选择生成特殊token <SEARCH_START>,然后调用譬如MCP server,function calling,从浏览器中获取对应问题的答案,并复制粘贴到上下文窗口中。因此,当它在sample新token的时候,它可以轻松引用已复制粘贴的数据

如何教模型正确使用工具
通过训练集来实现,比如通过一系列对话以及实例,展示模型如何使用网络搜索,就像上述那个示例一样
如果在训练集中有几千个这样的示例,那么模型能很好地理解这个工具的工作原理,并且知道如何构建查询
神经网络中的参数是一种模糊记忆,而构成上下文窗口的知识和Token则是工作记忆,大致上讲,它的工作原理类似于我们大脑的工作方式,我们原有记住的东西就是参数,而我们刚刚经历的东西就是上下文窗口(从这个角度来看,更好的prompt是将大模型要回忆的东西直接放在上下文窗口中,比如:"为我总结《红楼梦》第一章的内容。【红楼梦第一章所有内容】",避免模型去回忆推理,提高回答质量。
虚假自我认知
1、根据训练集中的数据进行概率预测回答,硬编码写死回答加入到训练集中
2、设置新Token,使其在碰到问"你是谁?"之类的问题时,直接获取系统信息中保存的数据去回答
Models need tokens to think
在创建对话数据集时,要注意response的准确性

这两个回答中,哪个是更好的回答?(右边更好)
如果直接给出答案,那就是在训练模型去尝试猜测答案,而非真正的模拟计算。而右边具有完整的推倒过程,等于是模型拿着推导的中间过程去推导下一步,再最终拿到答案(多次前向传播后再拿到最终的正确答案,提高准确率)
但是数学计算建议use tool,即只需要模型去推理计算公式,真正的计算则调用相关代码去执行,防止模型"心算"

而之所以"计数"这一操作会不准确(例如,"strawberry中有几个r"),其原因是:
1、其没有中间过程,这个question只会进行单次前向传播(误差偏大)
2、strawberry会装换成一系列的token,譬如(3056, 7890),则模型是在计算这些token中有几个r
目前为止,为了解决譬如"strawberry有几个r"这种问题的回答,大部分大模型都是通过对这类问题硬编码(提前写好答案)来解决
对拼写相关的任务并不擅长
因为大模型感知不到具体的字符,它能感知到的只有Token,所以往往非常简单的字符操作都会出错。但是也可以通过使用工具来改善这一情况。

强化学习(RL)
强化学习也被认为是后训练阶段的一部分,但是它是一种不同的训练语言模型的方法
所以在大模型公司中,往往存在预训练团队、对话数据集生成团队、监督微调团队以及强化学习团队


大模型需要自己找出在这个prompt下,哪个Token序列可以可靠地给出答案,它需要通过强化学习和反复实验去探索这一点

然后一旦进行参数更新,模型在这种设置中就会更倾向于选择top solution(猜测 & 检查)
如何挑选最佳方案? & 如何在这些方案上进行训练?& 如何设置训练过程以确保有效?
目前OpenAI等公司并没有公开讨论关于强化学习微调的这些细节,但是DeepSeek非常公开的讨论了强化学习微调的过程,以及强化学习在大语言模型中的重要性,以及强化学习如何激发了模型中的推理能力
到此我们可以获得一个thinking model

在进行强化学习时,模型被允许偏离人类设定的规则与范围中,就像AlphaGo的围棋比赛那样,ai当时在比赛中基本上走了一步没有人类专家会走的棋(第37步),当时看的时候很不可思议,但是现在回过头来看是非常精彩的一步
但是强化学习依赖于我们是否有大量多样的问题集,所以目前我们的LLM主要在研究如何创造大型的,多样的prompt
在不可验证领域的学习
到目前为止,我们看过的所有问题都在所谓的可验证领域。也就是说,对于任何一个候选解来说,我们都可以很容易地对其进行评分。例如:写一首诗,在这些领域,给不同的解决方案评分变得非常困难。如果人为去判断,比如每个人给模型生出来的所有诗点赞或点踩,以此来判定这首诗写的好不好,这将耗费大量的人力。所以,我们需要某种自动化策略来实现这一点 -> Reinforcement Learning from Human Feedback(基于人类反馈对语言模型进行强化学习)
简单来说,就是先让人类参与一点点,然后训练一个我们称之为奖励模型的单独的神经网络。这个神经网络会模拟人类对结果进行评分。因此,我们不再请求真实的人类,而是请求一个模拟的人类来进行具体评分

多种策略产生样本并收集人类反馈 -> 训练奖励模型 -> 训练强化学习策略,微调LLM

1、要求一个人将这些笑话从最好到最差进行排序(之所以让其排序是因为排序比给出一个具体的评分要简单许多)
2、将Prompt和answer放到奖励模型中,奖励模型会给这个answer一个0~1之间的评分
3、将奖励模型给出的分数与人类给出的顺序进行比较,根据具体的Loss Function,并在此基础上计算对应关系并更新此奖励模型
RLHF upside & downside
upside
1、这允许我们运行强化学习,并且允许我们在任意领域运行(包括那些不可验证的领域)
2、在大部分情况下,对人类来说,区分比生成更容易。如,当我们进行监督微调时,我们要求人类去生成理想的助手回应,如碰到"写一首诗歌"这样的问题时,人类很难去生成一个理想的回应。RLHF则把这个问题变成了一个更简单的问题,它没有要求人类去直接写诗,而是给模型生成的诗排序
downside
1、我们进行的强化学习并不是基于实际的人类的判断,而是基于一个lossy simulation of humans,这个lossy simulation可能会造成某些误导
2、模型中总是会有无数个荒谬的对抗性例子隐藏,这些对抗性例子往往能得到很高的分数。在RLHF进行几百次更新后,奖励模型会变得更好,然后我们就必须停止更新。我们不能对奖励模型进行过多的更新,否则对抗性例子会显现出来
LLM的未来
1、模型将会迅速变得多模态(同时能够处理音频、视频、图像的大语言模型)
2、目前大语言模型无法连贯的串联任务以执行一些较长的工作(目前已经小有成效 -> agent(对LLM进行扩展))(人类将成为更多agent task的监督者)
3、AI会被整合到工具中,并且无处不在。人类可以将控制权交给模型,比如替我们执行键盘和鼠标的操作
4、推理模型
参考资料
-reference beta.lmarena.ai/
-subscribe to buttondown.com/ainews
-X/Twitter