新闻详情

新闻详情

首页 / 资讯中心 / 详情

MiniMind 学习笔记(十三):SFT 导言——从“续写文本“到“回答用户“

发布时间:2026/10/1 8:25:38来源:尧图网络
MiniMind 学习笔记(十三):SFT 导言——从“续写文本“到“回答用户“
MiniMind 学习笔记(十三):SFT 导言——从续写文本到回答用户SFT 是 Supervised Fine-Tuning(监督微调),通常接在 Pretrain 之后:用整理好的指令、问答或多轮对话数据,让一个主要学会续写文本的基座模型,进一步学会按照用户输入给出回答。有了 Pretrain 的基础,SFT 的训练形式会简单很多——它并没有发明一个全新的 loss,仍然是 next token prediction。真正变化的是训练数据的组织方式,以及哪些 token 会参与 loss。文章目录MiniMind 学习笔记(十三):SFT 导言——从续写文本到回答用户前言:训练链路走到哪一步了一、SFT 要解决什么问题?1.1 更一般的视角:分布迁移二、SFT 的基本样本三、MiniMind 中的 SFT 入口四、本章结构总结参考前言:训练链路走到哪一步了在前面的 Pretrain 篇章(笔记 #8-#12)里,我们从 loss 推导、优化器一路讲到 8GB 显卡上的实操。现在模型已经是一个语言规律学得不错、能流畅续写的 base 模型,但它还不是一个助手。SFT 就是补上这一步:Pretrain全 token 参与lossSFT指令/问答/多轮对话只监督回答部分后续: DPO/RLHF大规模无标注文本Base 模型会续写、有知识但不懂被提问对话模型按对话模板回答学工具调用格式偏好对齐模型一、SFT 要解决什么问题?Pretrain 阶段的模型主要学习语言规律、事实知识和上下文统计关系。它看到的是大规模普通文本,训练目标是把每个位置的下一个 token 预测对。但一个完成 Pretrain 的模型并不天然知道用户问一句,我应该以助手身份回答一句。如果输入是:什么是 SFT?预训练模型可能会继续补全文档、百科、论坛帖子,也可能输出另一个问题——它的目标只是像训练文本一样续写,而不是作为助手完成用户请求。这正是笔记 #12 末尾初步 Eval 里看到的:问你有什么特长,pretrain 模型会接我正在想如何开始一个新项目,而不是回答问题。SFT 的作用,就是把训练分布改成更接近真实交互的形式:用户提出问题 - 助手给出回答经过这样的训练后,模型仍然在做 next token prediction,但它预测的对象变成了在当前对话模板下,assistant 接下来应该说什么。1.1 更一般的视角:分布迁移对话式案例只是 SFT 的一种形式。由于训练目标没有变化,如果从似然损失函数的角度理解,SFT 更像是在把模型的输出分布推向某个特定的数据分布。这个过程通常体现在风格迁移和输出结构上:SFT 数据包含模型学到什么对话数据一问一答的结构数学/推理任务按步骤输出的模式代码任务代码块的组织方式Tool Call 样本工具调用的格式约定这就是常说的行为对齐和分布迁移。沿着这个角度,更容易理解 SFT 在整个训练链路中的位置:Pretrain 决定模型知道什么,SFT 决定模型以什么方式表达和使用这些知识。同一个基座模型SFT 对话数据(问答/多轮)SFT 结构化任务(数学/代码/推理)SFT Tool Call 数据学出一问一答风格学出按步骤输出模式学出工具调用格式本质: 输出分布向目标数据分布迁移(训练目标本身没变)二、SFT 的基本样本参考 MiniMind,一个最小的 Chat SFT 样本可以抽象成两部分:prompt:用户问题、系统提示、历史对话、工具说明等上下文;response:希望模型学习生成的 assistant 回答。把 prompt token 记为x 1 , x 2 , ⋯ , x m x_1, x_2, \cdots, x_mx1​,x2​,⋯,xm​,assistant 回答 token 记为y 1 , y 2 , ⋯ , y n y_1, y_2, \cdots, y_ny1​,y2​,⋯,yn​,完整输入序列:s [ x 1 , x 2 , ⋯ , x m , y 1 , y 2 , ⋯ , y n ] s [x_1, x_2, \cdots, x_m, y_1, y_2, \cdots, y_n]s[x1​,x2​,⋯,xm​,y1​,y2​,⋯,yn​]SFT 通常只希望模型学习回答部分,因此 loss 写成:L SFT − ∑ t 1 n log ⁡ p θ ( y t ∣ x 1 , ⋯ , x m , y 1 , ⋯ , y t − 1 ) \mathcal{L}_{\text{SFT}} - \sum_{t1}^{n} \log p_\theta(y_t \mid x_1,\cdots,x_m,y_1,\cdots,y_{t-1})LSFT​−t1∑n​logpθ​(yt​∣x1​,⋯,xm​,y1​,⋯,yt−1​)这个公式表达的含义是:prompt 只是条件,真正被监督学习的是 assistant 的回答 token。完整输入序列loss mask 0不参与损失loss mask 1参与损失prompt 部分x₁ ... xₘ(系统提示用户问题历史)response 部分y₁ ... yₙ(assistant 回答)SFT Loss对比 Pretrain 的 loss(笔记 #8):L pretrain − ∑ t 1 T log ⁡ p θ ( s t ∣ s t ) \mathcal{L}_{\text{pretrain}} - \sum_{t1}^{T} \log p_\theta(s_t \mid s_{t})Lpretrain​−t1∑T​logpθ​(st​∣st​)区别一目了然:Pretrain 对序列中所有位置计算 loss,SFT 只对 response 位置计算。具体实现中,通常在 prompt 部分的 token 上设置 loss mask(机制同笔记 #8 的loss_mask/ignore_index-100),让它们不参与损失计算。除此之外,SFT 的 loss 和 Pretrain 的语言模型 loss 是同一种东西。三、MiniMind 中的 SFT 入口当前主线 SFT 数据(与笔记 #12 的数据配置表呼应):sft_t2t_mini.jsonl:适合快速训练对话模型;sft_t2t.jsonl:适合完整复现主线版本。README 还特别强调,当前版本的 SFT 数据统一使用多轮对话格式,并且 Tool Calling 能力已经混入主线 SFT 数据。这意味着 SFT 不只是普通问答微调,还承担了让模型学习对话模板、思考标签和工具调用格式的职责。MiniMind 中和本章关系最密切的文件:文件职责minimind_upstream/minimind/README.mdSFT 数据来源、格式和训练入口src/minimind_learning/dataset/lm_dataset.py实现SFTDataset,把对话数据转换成input_ids和labelssrc/minimind_learning/trainer/train_full_sft.py全参数 SFT 训练脚本src/minimind_learning/trainer/train_pretrain.py用于和 SFT 脚本对比四、本章结构这一组 SFT 笔记按下面的顺序展开:① SFT 数据和 Chat Template一条样本如何从 JSONL变成训练张量② Full SFT vs Pretrain 脚本只关注不同的地方跳过重复训练细节③ SFT 和 Pretrain 的异同目标/数据/loss mask/能力变化几个角度对比④ SFT Evalloss eval、生成式评估、任务评估各自看什么⑤ SFT 常见问题容易混淆的点SFT 数据和 Chat Template:一条 SFT 样本如何从 JSONL 变成训练张量;Full SFT 和 Pretrain 脚本的区别:只关注和 Pretrain 不同的地方,跳过重复训练细节(训练基建部分见笔记 #11);SFT 和 Pretrain 的异同:从目标、数据、loss mask、能力变化几个角度对比;SFT Eval 应该怎么做:SFT loss eval、生成式评估和任务评估各自该看什么;SFT 常见问题:整理 SFT 中容易混淆的点。总结问题核心答案SFT 是什么Supervised Fine-Tuning,接在 Pretrain 后,用指令/问答/多轮对话数据微调解决什么问题Base 模型只会像训练文本一样续写,不会作为助手完成用户请求loss 变了吗没变,仍是 NTP;L SFT \mathcal{L}_{\text{SFT}}LSFT​只对 response token 求和,prompt 部分设 loss mask更深的视角SFT 把模型输出分布推向特定数据分布(行为对齐/分布迁移)MiniMind 数据sft_t2t_mini(快速)/sft_t2t(主线);多轮对话格式,Tool Calling 已混入关键代码SFTDataset(数据转换)train_full_sft.py(训练脚本)SFT 篇章共 5 个小节,后续将逐一展开——首先是数据和 Chat Template:一条 SFT 样本从 JSONL 到训练张量的完整旅程。参考llm-notes-all-in-one: SFT 目标和操作llm-notes-all-in-one 仓库MiniMind 上游仓库
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

基于Next.js与LangGraph.js的AI简历优化Agent实战 2026/10/1 9:24:25

基于Next.js与LangGraph.js的AI简历优化Agent实战

简历工具这个赛道,看起来已经被各种模板站和在线编辑器做烂了,但真正动手做一个能"读懂"简历、能给出针对性修改建议的 AI Agent,和套一个模板生成器完全是两码事。我最近用 Next.js 搭配 LangGraph.js 完整落地了一个简历优化 Age…

阅读更多 →
RAG数据预处理全解析:Document Loader与Text Splitter的实战指南 2026/10/1 9:24:25

RAG数据预处理全解析:Document Loader与Text Splitter的实战指南

做RAG项目,很多人一上来就盯向量库、调Embedding模型、比检索召回率,真到代码跑起来才发现,脏活累活全堆在数据预处理上。我经手过好几个RAG知识库项目,从早期demo到能顶住线上检索压力,最终复盘结论都出奇一致&#x…

阅读更多 →
Wine+FEX-Emu+DXMT:ARM设备运行Windows程序的跨平台兼容层技术解析 2026/10/1 9:24:19

Wine+FEX-Emu+DXMT:ARM设备运行Windows程序的跨平台兼容层技术解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
病毒应急实战全流程:从异常发现、取证分析到清除加固 2026/10/1 9:24:18

病毒应急实战全流程:从异常发现、取证分析到清除加固

1. 病毒应急的练习,到底在练什么前两天我在虚拟机里花了一整个下午,把一台已经被勒索病毒“光顾”过的Win7测试机从头到尾做了一遍病毒应急的处置,顺手把整个过程记录了下来。之所以想做这次练习,是因为我发现身边很多朋友的电脑一…

阅读更多 →
Ornith-1.5-35B-A3B-GGUF如何开启推理链与工具调用:reasoning_content与OpenAI兼容接口实战指南 2026/10/1 9:24:18

Ornith-1.5-35B-A3B-GGUF如何开启推理链与工具调用:reasoning_content与OpenAI兼容接口实战指南

Ornith-1.5-35B-A3B-GGUF如何开启推理链与工具调用:reasoning_content与OpenAI兼容接口实战指南 【免费下载链接】Ornith-1.5-35B-A3B-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/ornith-ai/Ornith-1.5-35B-A3B-GGUF Ornith-1.5-35B-A3B-GGUF 是开源…

阅读更多 →
基于SAM-DINO-CLIP的全景图零样本地物分类与实例分割实战 2026/10/1 9:24:12

基于SAM-DINO-CLIP的全景图零样本地物分类与实例分割实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉