现在,让我们打造属于你自己的人工智能吧。
不使用或外部 ,在此中亲手输入一个小型 ,再用自己做的 和 对话。先了解整个开发过程。
XSLM概述
意为Extra Small Language Model,是SONUB为学习开发自创的术语。 thruthesky.github.io/xslm
只在网页浏览器中开发人工智能
在本课程中开发 XSLM 时,必须 100% 只使用网页。不能使用其他,例如自己电脑上的程序或其他终端,一切都在网页浏览器里完成。
XSLM 的开发从头到尾都只在 sonub.com 人工智能页面里的这个终端中完成。这里做的非常小,用手机也能只靠网页浏览器开发。
了解更多
-
XSLM 可以用多种方式构建,也可以在自己的电脑上开发。
-
但 SONUB 最初构想 XSLM 时,是为学习而设计的:只用网页浏览器中的 就能开发全部内容。
-
为了让任何人都能轻松亲手做出人工智能,整个学习过程只在网页浏览器中进行。
-
终端是在网页浏览器中运行的 Linux(v86),所以在电脑、平板和手机上用的都是同一个终端。手机屏幕键盘上没有的 Tab、 等键,用终端上方的按键栏来按。
你在网页浏览器中亲手打造的 XSLM ,将通过 公开,让全世界的人都能使用。 发布我的模型
只是更小——与构建 SLM、LLM 的步骤相同
XSLM 只是语言模型的规模非常小,它的开发步骤与开发人工智能的 或 非常相似。所以学会开发 XSLM,就能很好地理解人工智能。
- 相同之处
- 顺序和原理都一样:收集文本并切分成, 模型去,再用这些生成文本,并作为提供服务。
- 不同之处
- 的数量、数量、训练所需的计算机和时间都大得多。大模型还要经过额外的训练(如),让它更擅长对话。
从零开始完成一个语言模型,并理解从准备、训练到生成文本、连接自己的聊天机器人的每个阶段。这是非常小的学习用模型,最初的回答会乱七八糟,但你会弄懂每个部件如何运转。
文本变成,学习预测下一个编号,加载权重,发送问题。每个部分都由你编写;提供计算和文件功能。
什么是 XSLM——比 LLM、SLM 再小一级的语言模型
XSLM(Extra Small Language Model,超小型语言模型)比大型语言模型(LLM)和小型语言模型(SLM)再小一级,指参数只有几百万到几亿个的非常小的人工智能模型。这是 sonub.com 自己提出的名称。
- LLM:参数几百亿到几千亿个。在的 上运行。
- SLM:参数几十亿个左右。在性能好的电脑或一张 GPU 上运行。
- XSLM:参数几百万到几亿个。在智能手机这样的小设备上也能运行。
XSLM 有三个核心特点。
- 为端侧()优化:模型非常轻,即使在智能手机、可穿戴设备、(IoT)设备这类计算能力很有限的设备上,也能不连网独立运行。
- 成本很低:一般的 SLM 光是加载模型就需要几 的 ,而 XSLM 只用几百 MB 以下的就能运行。所以和运营几乎不花钱。
- 只做一件事的专家(Specialized Worker):和像百科全书一样什么都懂的 LLM 不同,XSLM 只为把一件事做好而做,比如句子摘要、文本分类、函数()、为 AI 分配去向(Router)。
本课程里你亲手做的 XSLM 比这些还要小得多,是只有 1,248 个参数的学习用模型。为了能用眼睛跟着看懂原理,才把它缩到最小,但零件是一样的。把同样的结构做大,再用某一件事的数据来训练,就成了上面说的实用 XSLM。
什么是语言模型——给出下一个词元概率的函数
语言模型是一个函数:看前面的文字,给接下来可能出现的每个片段(词元)打上。在 "the sun is" 之后,例如它可能给 warm 0.6、hot 0.2、blue 0.01,再把剩下的 0.19 分给里的其他词元。整个词表的概率加起来等于 1。
写文章就是反复调用这个函数。
- 把目前为止的文字变成词元编号。
- 模型计算下一个词元的概率。
- 按概率选出一个词元。
- 把选出的词元接到文字后面,回到第一步。
、 这样的巨大模型,基础也一样。不同的是规模(数千亿个权重)、训练资料的数量,以及为了擅长对话而加的额外训练。XSLM 用最小的规模从零做出这个基础,亲眼确认每个部件的作用。
从零开始——从随机数字出发
从零开始(from scratch)是指不拿别人训练好的。XSLM 的 1,248 个权重全部从 random.gauss(0, 0.1) 抽出的小随机数开始。这时模型什么都不懂,所以给词表 40 个词元几乎相同的概率。
训练只做一件事:一点点修改数字,让资料里真正出现的下一个词元概率变高。仅凭这种下一个词元预测(next-token prediction),语法、格式和常见内容就会积累到数字里。不需要另外标注答案。文字本身既是题目也是答案。
所以模型会擅长什么,由资料的格式决定,而不是。XSLM 资料的每一行都是 Q: 问题后接 A: 答案的格式,所以模型学会在 A: 后面接上像答案的文字。没有专门加入对话能力的。
亲手用 Python 来做
你将亲自编写 Python 程序来开发人工智能。
因此你也会学一点 Python 编程。
运行 Python 程序只需一条。在 后面写上文件名,就会运行该文件中的代码。
python3 [文件名.py]
动手实践
在终端里写第一个 Python 程序
请按顺序把下面的命令亲手输入终端。每条命令后按 Enter。
-
查看版本
在终端输入这条命令。如果出现以 Python 3 开头的号,就准备好了。
python3 --version -
打开 Python
只输入 python3。出现 >>> 时,说明 Python 正在等待你的命令。
python3 -
输入第一条命令
在 >>> 后面输入这条命令并按 Enter。屏幕上会显示 Hello。
print("Hello")Hello
-
退出 Python
输入这条命令即可关闭 Python,回到终端。
exit() -
创建文件
是在终端里使用的,会给 Python 代码加上颜色。这条命令会创建并打开 hello.py。
micro hello.py -
输入代码
照原样输入这四行。最后一行开头的四个空格表示这一行由 for 重复执行,一定要保留。按 Tab 也会生成四个空格。
name = "XSLM" print("Hello,", name) for step in range(1, 4): print("Step", step) -
保存并关闭
按 +S 保存。按 Ctrl+Q 关闭 micro。
Ctrl+S Ctrl+Q
-
运行程序
回到终端后,用这条命令运行。看到下面的结果就成功了。
python3 hello.pyHello, XSLM Step 1 Step 2 Step 3
-
自己改一改
用 micro hello.py 重新打开,把 XSLM 改成你的名字,保存后再运行一次。屏幕上会显示你的名字。
整体流程——程序之间传递文件
XSLM 是一条链:每个程序读取前一个程序生成的文件,再生成下一个文件。
- prepare.py —— 读取 data/raw.txt,生成 data/train.txt 和 data/val.txt。
- tokenizer.py —— 用 train.txt 学习,生成 data/tokenizer.json。
- engine.py、model.py —— 计算工具和 GPT 结构。自己不生成文件,由其他程序导入使用。
- train.py —— 用资料和训练 GPT,生成 checkpoints/model.json。
- generate.py —— 读取 model.json,接着写文字。
- runner.py —— 把 generate 开放为 。
- xchat.py —— 向 Runner 发送问题并显示回答。
前面的文件变了,后面的都要重新生成。比如修改了 raw.txt,就要依次重新运行 prepare → tokenizer → train。
-
raw.txt 原始问答
-
prepare.py 整理并分成训练与验证
-
tokenizer.py 把文字变成词元编号的规则
-
train.py 学习预测下一个词元
-
model.json 保存学到的
-
runner.py 通过 HTTP 提供生成
-
xchat.py 终端对话界面
有多小——规模比较
模型的大小用要学习的数字(参数)的个数来算。
- XSLM:1,248 个——词表 40,宽度 8,1 个块,1 个头。
- 小型练习用 GPT(示例):约 2,800 万个——词表 24,000,宽度 384,6 个块,6 个头。
- Small(2019):约 1.2 亿个。
- GPT-3(2020):约 1,750 亿个。
XSLM 这么小是有原因的。所有数字都作为一个 (Value)来处理,并且在浏览器里的虚拟 上计算。把规模调大,一次训练就要几分钟。作为交换,可以亲自读到每一个数字的计算。结构和 GPT 一样,只有规模和计算方式不同。
用同样的方法做大,就成了 SLM
学会 XSLM 并不是终点。只要用同样的方法不断扩大规模即可。
-
在 sonub.com 学习 XSLM 在网页浏览器里
-
在自己的电脑上做更大的 XSLM 同样的方法,更大的规模
-
再做大就是 SLM 同样的方法,继续做大
制作步骤是一样的。规模越大,就需要越多的训练数据、更好的电脑和更长的时间,计算则交给 这样的工具。
实际在用的 XSLM——公开的模型和缩小模型的方法
这种大小的模型已经公开,并且正在被使用。
- SmolLM2-135M(Hugging Face,2024 年):参数约 1.35 亿个。是接着往下写文字的 GPT 型模型,在智能手机上也能运行。
- MobileBERT(Google,2020 年):参数约 2,500 万个。它不是用来写文字的,而是理解句子后做分类,或在一段文字里找出问题的答案。
把大模型缩小到 XSLM 大小,主要有两种方法。
- (Knowledge Distillation):小模型(学生)跟着大模型(老师)给出的概率学习。比只看一个正确答案学得更多。
- (Quantization):每个参数不再用 小数保存,而是用 8bit 或 4bit 数字保存。内存缩小到四分之一到八分之一,准确度会稍微下降。
这两种方法都建立在本课程里做的训练(第6阶段)和权重保存(检查点)之上。学完课程,你就能读懂这些方法的文档和代码了。
九个核心概念——各用一句话
先用一句话看看课程中会遇到的概念。每个阶段会详细讲解。
- 数据格式:决定模型要做什么(第3阶段)。
- 分词器:把文字变成词元编号,再还原(第4阶段)。
- :把词元编号变成数字向量的表(第5阶段)。
- :告诉模型是第几个位置的向量(第5阶段)。
- :决定看前面哪些位置、看多少,并混合信息(第5阶段)。
- ():在每个位置再加工混合后的信息(第5阶段)。
- 、:保留原始信息,稳定数字大小(第5阶段)。
- 下一个词元预测、:用正确词元的概率衡量做得多好(第6阶段)。
- :从概率中选出实际的词元(第7阶段)。
四个常见误解
先纠正初次制作时常有的误解。
- 模型里存着句子?不是。知识分散在所有权重的数字模式里。打开任何一个数字,都找不到句子。
- 从里查下一个词?不是。模型每次都通过计算给出整个词表的分数,不做检索。
- 损失低就会说事实?不是。只是说生成与训练资料相似文字的概率高。
- 小模型原理不同?不是。XSLM 和巨大模型用的是相同的部件,只是规模、资料和额外训练不同。
还有一点。学到的内容在训练结束那一刻就固定了。想知道新消息,要么重新训练,要么像真实服务那样在提问时找来最新文档一起放进去(,第9阶段)。
动手输入并实验
打开终端输入命令,说明五个部分的作用。短英文示例以后可换成自己的语言。
python3 -c "print('XSLM: text -> tokens -> GPT -> Runner -> XChat')"
在终端中练习
检查理解
自己训练、保存、重新加载权重并用于XChat,就完成了整个链路。
遇到问题时
初学者可先复习Python、、循环、、类,或做热身。
常见问题
做这么小的模型有什么用?
本课程里做的 1,248 个参数的模型几乎没有实用价值。目的是亲手组装一次引擎。把分词器、嵌入、注意力、损失、、采样、服务器都亲手做一遍,就会明白大模型的文档、论文、代码里那些名称指的是什么。转到 PyTorch 后,概念也完全一样。把同样的零件做大到几百万到几亿个参数,再用某一件事的数据来训练,就成了用于摘要、分类、分配去向(Router)的实用 XSLM。
回答很离谱,是失败了吗?
不是。默认训练 20 次,只是用来确认所有部件真的连起来运转。这点训练下概率几乎平均分布,文字会乱七八糟。只要训练损失比初始值(约 3.7)低,并且读取检查点的 Runner 能把真实的生成结果返回给 XChat,整个过程就完成了。提高质量的实验在第6、7阶段做。
不能下载预训练好的模型来用吗?
本课程不下载。下载的权重是已经算好的结果,看不到训练如何改变数字。实际开发中,常常下载公开模型,再用自己的资料多训练一点,这叫微调(fine-tuning)。在 XSLM 学到的训练循环也直接用于微调。
可选热身:用二元模型数词
通向亲手开发的计划
一开始像玩具一样做得小小的,理解原理之后再逐步做大。
收集句子
收集你想学习的主题的句子。一开始只有 10 个句子也可以。
统计下一个词的次数
制作一张表,记录某个词后面各个词出现了多少次。
计算概率分数
数一数选中的词后面紧跟着的每个词各出现了几次——句子结束也算一次。然后用每个次数除以总次数。如果“天空是”后面跟着“蓝色的”三次、“灰色的”一次,那么“蓝色的”就是 3 ÷ 4 = 75%,“灰色的”是 25%。
比较两种选择方法
每次都选分数最高的候选(),或者按比例抽签()——抽签也可能再次抽到同一个词。抽到句子结束,就停下来。这一步里,没有任何地方会检查这句话是不是真的。
按自己的标准改进
加入更好的句子、更多的和不同的选择规则,把它培养成属于自己的。
第一次来?请按这些步骤做
这个实验会做一个非常小的,它只看前面一个词。它统计哪个词后面跟着哪个词,把这些次数变成,再掷一颗按次数加权的骰子来选下一个词。
- 训练句子保持不变,点击“再次生成”。会出现一个新句子,里面只有训练文本中的词。
- 看概率公式:下一个词跟在前一个词后面的次数,除以前一个词出现的次数,就是概率。
- 在计数表里,每一行是前一个词,每一列是下一个词。格子颜色越深,这一对出现得越多。
- 把选择方式换成,再点一次:每次都会得到同样的句子。换回并调高——句子会变得越来越奇怪。
- 在文本里加一句你自己的句子。表格和概率马上就会变,因为这个就只是这些次数。
想更进一步? 用 Python 亲手做一个(AI 课程) 下一个词是怎么选出来的
小小的概率计算器
起始句子最后一个词后面还没有候选词。
| 前一个词下一个词 | |
|---|---|
词太多了,只显示最先出现的 8 个
核心概念
思路很简单。读很多句子,数一数哪个词后面紧跟着哪个词——句子在哪里结束,也一起算上。这些次数就成了一张小表,光靠这张表,就已经能猜出下一个词。你在这一页要做的模型,就是这个。
真正的也靠同样的思路运转,只是规模大得多。它不用一张小小的次数表,而是从例子中学会几十亿到几千亿个数字,这些数字叫作。它看的也不只是前面那一个词,而是你的整个问题和到目前为止的对话。它也不是去查一句存好的句子。不过,最后一步和你做的一样——给每个候选打分,然后选一个。
本实验与真正的语言模型对比
| 本实验() | 神经 | |
|---|---|---|
| 看的范围 | 只看前一个词 | 给定的长 |
| 学的是什么 | 接续次数表 | 数值 |
| 与 | 否 | 是 |
| 自己核实事实 | 否 | 否 |