惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
P
Palo Alto Networks Blog
C
Cisco Blogs
The Hacker News
The Hacker News
T
Threatpost
S
Schneier on Security
K
Kaspersky official blog
Spread Privacy
Spread Privacy
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
NISL@THU
NISL@THU
量子位
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Google DeepMind News
Google DeepMind News
Security Latest
Security Latest
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
博客园 - 叶小钗
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
News and Events Feed by Topic
爱范儿
爱范儿
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
Project Zero
Project Zero
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Cisco Talos Blog
Cisco Talos Blog
GbyAI
GbyAI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
T
Tenable Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Vulnerabilities – Threatpost
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News and Events Feed by Topic
V
V2EX
Webroot Blog
Webroot Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
M
MIT News - Artificial intelligence
Scott Helme
Scott Helme
Simon Willison's Weblog
Simon Willison's Weblog
L
LangChain Blog
W
WeLiveSecurity
Cloudbric
Cloudbric

StudyingLover's Blog

Diffusion Policy笔记 rwkv笔记 act笔记 nanovllm-block_manager opencode多智能体 nanobot-pre-train nanobot-rl nanobot-checkpoint_manager nanobot-gpt nanobot-mid-train Vision Mamba (Vim)笔记 BPE演示 最后一遍学习Transformer YOLOv5 目标检测笔记 下载根服务器解析记录 Dynaseal A Backend-Controlled LLM API Key Distribution Scheme with Constrained Invocation Parameters 判断链表有环 王道25数据结构勘误 关于perplexity的open-sourcing-r1-1776 AI为什么不像人类一样进行多轮对话 新博客改造日记和功能测试 linuxqq只显示登陆背景图 数字设计和计算机体系结构(机械工业出版社)勘误(自制) Dynaseal:面向未来端侧llm agent的llm api key分发机制 A Definitive Guide to Markdown Style This post is using MDX, Where you can embed JSX and Astro components RT-Patch学习 pydantic实现的LLM ReAct fastapi 和 uvicorn 设置监听 ipv6 pydantic+openai+json 控制大模型输出的最佳范式 解决 Matplotlib Scatter 不支持 Marker 列表的问题:mscatter 实现 roofline model zhipuAI接口兼容openai 在docker部署fastapi宝塔里使用nginx反代套上cloudflare获取请求的真实ip clion搭建libbpf-bootstrap开发环境 coze+coze-discord-proxy+ChatNextWebUI实现AI自由 安卓内核时间使用的是UTC时间 colab运行google最新开源模型Gemma Sora技术报告 视频生成模型作为世界模拟器 笔记 archlinux flutter开发踩坑 fastapi集成google auth登录 linux下NTFS磁盘报错输入输出错误 Venn-Abers 预测器 基于Venn-Abers预测器的系统日志异常检测方法_顾兆军 手机平板远程访问kvm虚拟机的windows phi-2弱智吧测评 poe的gemini pro或是百度开发 google gemini api使用 google gemini api申请 构建用于复杂数据处理的高效UDP服务器和客户端 matplotlib中文字体渲染 TruFor笔记和代码复现 深入分析:GitHub Trending 项目 "multipleWindow3dScene" pua大模型 ggml教程|mnist手写体识别量化推理 xgboost2.0最佳实践 xgboost使用GPU最佳实践 马踏棋盘 cloudlflare推理llama2 docker搭建elasticsearch并使用python连接 FreeU-文字生成图片的免费午餐笔记 使用xgboost的c接口推理模型 Archlinux使用CMake调用xgboost的c接口 m2cgen生成机器学习c语言推理代码 xgboost模型序列化存储并推理 speculative-sampling笔记 prompt2model笔记 RoboTAP笔记 自建obsidian同步服务 MediaPipe即将推出图像生成服务 Dual-Stream Diffusion Net for Text-to-Video Generation笔记 ViT在DDPM取代UNet(DiT) arch4edu搞崩了我的flutter LISA(推理分割)笔记 在终端绘制GPU显存使用曲线 GPTBot介绍 arch蓝牙无法连接 GPU部署llama-cpp-python(llama.cpp通用) 花式求GCD 使用llama构建一个蜜罐(前端) 使用llama构建一个蜜罐(后端) llama-cpp-python快速上手 快速上手llama2.c(更新版) Paper Gestalt笔记 DINO-v2笔记 快速上手llama2.c AnyDoor笔记 Archlinux安装scrcpy加载共享库出错 error while loading shared libraries:libusb-1.0.so.0:wrong ELF class:ELFCLASS32 npc_gzip笔记 python调用c++函数 Filesystem type ntfs3,ntfs not configured in kernel open_clip编码图像和文本 PicGo配置CloudflareR2图片储存 ArchlinuxGnome快捷键打开终端 clip-interrogator代码解析 GroundingDINO安装报错解决 2023华为鲲鹏畅想日暨西安高新国际会议中心零食午饭测评 RoboMaster开源仓库汇总(长期更新) 没有手都可以在腾讯云创建镜像 I3D笔记
nanobot-sft
About the Author StudyingLover · 2026-01-18 · via StudyingLover's Blog

nanobot

sft

supervised fine-tuning

Published on

数据构造

token生成流程

原始对话数据

conversation = {
	"messages": [
		{"role": "user", "content": "你好"},
		{"role": "assistant", "content": "我很好"}
	]
}

tokenizer.render_conversation(doc) 的输出

# 特殊token
<|bos|> = 1
<|user_start|> = 2
<|user_end|> = 3
<|assistant_start|> = 4
<|assistant_end|> = 5

# 文本token
"你" = 100
"好" = 101
"我" = 200

"很" = 201
"好" = 101

渲染逻辑(来自tokenizer.py)

# 1. BOS token (mask=0)

add_tokens(1, 0)

# 2. User消息 (全部mask=0,不参与loss计算)
add_tokens(2, 0) # <|user_start|>
add_tokens([100, 101], 0) # "你好"
add_tokens(3, 0) # <|user_end|>

# 3. Assistant消息
add_tokens(4, 0) # <|assistant_start|> mask=0
add_tokens([200, 201, 101], 1) # "我很好" mask=1 (参与loss)
add_tokens(5, 1) # <|assistant_end|> mask=1 (参与loss)

生成的ids和mask

ids =  [1, 2, 100, 101, 3, 4, 200, 201, 101, 5]
mask = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
		BOS u_s 你 好 u_e a_s 我 很 好 a_e

collate_and_yield 处理


n = 10 # len(ids)

ids_tensor = torch.tensor([1, 2, 100, 101, 3, 4, 200, 201, 101, 5])

# 构造inputs (去掉最后一个token,最后一个没有下一个可预测) - Next Token Prediction
inputs = ids_tensor[:-1]
# inputs = [1, 2, 100, 101, 3, 4, 200, 201, 101]

# 构造row_targets (去掉第一个token,第一个不能作为预测的目标)
row_targets = ids_tensor[1:]
# row_targets = [2, 100, 101, 3, 4, 200, 201, 101, 5]

# 提取对应的mask (去掉第一个mask值,因为BOS永远不是target)
mask_tensor = mask[1:]
# mask_tensor = [0, 0, 0, 0, 0, 1, 1, 1, 1]

# 应用mask:将mask=0的位置设为-1 (ignore_index)
row_targets[mask_tensor == 0] = -1
# row_targets = [-1, -1, -1, -1, -1, 200, 201, 101, 5]

row_targets[mask_tensor == 0] = -1 的意义是什么呢?在计算loss的时候,只在assistant tokens计算loss

最终batch数据(假设batch_size=1)


inputs = torch.tensor([[1, 2, 100, 101, 3, 4, 200, 201, 101]])
# 形状: (1, 9)

targets = torch.tensor([[-1, -1, -1, -1, -1, 200, 201, 101, 5]])
# 形状: (1, 9)

位置对应关系与训练监督


位置 input → target 训练?

0 1 (BOS) → -1 ✗ 忽略,BOS后的user_start不监督
1 2 (u_s) → -1 ✗ 忽略,用户消息开始标记
2 100 (你) → -1 ✗ 忽略,用户输入不监督
3 101 (好) → -1 ✗ 忽略,用户输入不监督
4 3 (u_e) → -1 ✗ 忽略,用户消息结束标记
5 4 (a_s) → 200 (我) ✓ 计算loss,学习生成"我"
6 200 (我) → 201 (很) ✓ 计算loss,学习生成"很"
7 201 (很) → 101 (好) ✓ 计算loss,学习生成"好"
8 101 (好) → 5 (a_e) ✓ 计算loss,学习生成结束标记

模型在看到<|assistant_end|>则结束输出,也就是说,模型在SFT阶段才真的学会怎么停止说话,在pre-train只是无情的吐词机器

实践经验

LR Warmup的完全移除 + 线性衰减

def get_lr_multiplier(it):
    lrm = 1.0 - it / num_iterations  # ← 直接线性衰减到0
    return lrm
  • SFT数据量小(23K rows),warmup不必要
  • 简单线性衰减 = 训练稳定性更好
  • Base model已经稳定收敛,不需要复杂的LR schedule