ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

LLM基础6:大模型如何逐token生成文本?(train-llm-from-scratch)

LLM基础6:大模型如何逐token生成文本?(train-llm-from-scratch) LLM基础6大模型如何逐token生成文本train-llm-from-scratch【免费下载链接】train-llm-from-scratchA straightforward method for training your LLM, from downloading data to generating text.项目地址: https://gitcode.com/GitHub_Trending/tr/train-llm-from-scratchtrain-llm-from-scratch是一个把 LLM 完整训练链路做「透明化」的开源项目从数据下载、预训练一直做到文本生成。这一篇带你彻底看懂大模型逐 token 生成文本的核心机制自回归循环、为什么只看最后一个位置的 logits、以及温度 / top-k / top-p 这些采样旋钮到底怎么调。一、训练时预测下一个词生成时让模型喂自己大模型decoder-only Transformer训练时做的事情只有一件给定前文预测下一个 token的概率分布。经过海量文本训练后模型内部压入了语法、事实、格式和推理习惯。但生成时玩法完全不同——训练阶段的每个前缀都来自数据集teacher forcing而生成阶段的前缀是模型自己上一步采样出来的 token。这个反馈闭环正是生成式 AI 的魔力所在训练前文 → 预测下一个词生成前文 自己刚生成的词 → 再预测下一个词循环往复一句完整的话就这样被续了出来。⚡二、自回归循环6行代码看懂逐token生成整个生成过程就是一个for循环。src/models/transformer.py 中的核心逻辑极其精炼for _ in range(max_new_tokens): idx_cond idx[:, -self.context_length:] # 裁剪到上下文窗口 logits, _ self(idx_cond) # 前向一次 logits logits[:, -1, :] # 只取最后一个位置 probs F.softmax(logits, dim-1) # 转成概率分布 idx_next torch.multinomial(probs, 1) # 采样一个token idx torch.cat((idx, idx_next), dim1) # 拼回序列四步循环裁剪上下文——只保留最近context_length个 token超出的老内容直接丢弃前向推理——整段序列过一遍 Transformer得到每个位置对整个词表的打分logits只取最后一个位置——因为只有它看过全部前文采样并拼回——按概率抽出一个 token 接到队尾进入下一轮。 本项目为了教学清晰每一步都重跑整个前缀没有 KV cache。生产系统会用 KV cache 缓存已算过的中间结果这是 LLM 推理优化的核心方向之一。三、为什么只取最后一个位置的 logits关键在于因果注意力causal attention每个 token 只能关注它自己及之前的 token看不到未来。于是序列第i个位置的输出本质上是基于前 i 个 token 预测第 i1 个。而最后一个位置的关注范围覆盖了整段当前文本它的 logits 就是下一个词该是什么的完整答案——前面的位置虽然也算了但在生成时没有用武之地。掩码与多头注意力的实现细节见 src/models/attention.py。四、采样策略温度、top-k、top-p 到底怎么调拿到概率分布后选哪个 token有多种策略这是解码策略独立于模型架构本身策略行为适用场景贪心解码永远选概率最大的 token确定性结果、数学评测采样按概率随机抽取多样化创作温度 τ 1分布更尖锐安全但少变化温度 τ 1分布更平坦更有创意但更易出错top-k只在概率最高的 k 个里抽砍掉长尾乱码top-p核采样累计概率达到 p 的最小候选集自适应候选范围⚠️ 注意温度作用在logits 而非概率上先缩放再 softmax。src/post_training/rollout.py 中的filter_logits完整实现了这套流程温度缩放 → top-k 截断 → top-p 核采样。经验值开放式对话用温度 0.7~1.0 top-p ≈ 0.95评测/数学题用贪心解码src/post_training/evaluation.py 中的batched_generate就是这样保证各阶段结果可比的。五、何时停笔停止 token 与上下文窗口两个刹车机制停止 tokenEOT本项目使用50256作为结束符。生成时一旦采到 EOT 就停笔并截断输出。如果模型从没学过明确的停止信号解码器就只能猜什么时候该停——这也是模型会无限重复输出的常见原因之一上下文窗口prompt 长度 生成长度 ≤ context_length。窗口是产品约束而不只是训练超参数长对话超出后最老的 token 会被悄悄丢弃。常见问题速查摘自 docs/foundations/generation.md症状可能原因无限重复分布过尖 / 没学会停止行为答非所问基础模型没经过足够的 SFT输出像乱码训练不足或温度过高长 prompt 崩溃超出上下文窗口六、上手体验一行命令与你的模型对话训练完成后用 scripts/chat.py 加载任意阶段base / SFT / DPO / PPO / GRPO的 checkpoint 直接对话# 指令模型自动套用 chat template PYTHONPATH. python scripts/chat.py --ckpt ckpts/sft.pt --prompt What is 13 29? # 基础模型裸续写模式 PYTHONPATH. python scripts/chat.py --ckpt ckpts/base_pretrained.pt --raw --prompt Once upon a time # 不传 --prompt 进入交互式对话 PYTHONPATH. python scripts/chat.py --ckpt ckpts/sft.pt底层由 src/post_training/inference.py 的generate_reply统一调度chat 模式套聊天模板、raw 模式裸前缀续写采样参数--temperature/--top_p/--top_k/--greedy与本文第四节一一对应。完整推理链路文档见 docs/09_inference.md。小结大模型逐 token 生成文本 自回归循环 最后位置的 logits 采样策略 停止条件四者缺一不可训练学的是下一个词分布生成把这个能力循环外推因果掩码让最后位置成为唯一有效的预测位温度 / top-k / top-p 决定了稳还是有创意EOT 和上下文窗口决定了什么时候停、能记住多少。理解了这套机制再看后训练SFT / DPO / PPO / GRPO就顺理成章了——它们本质上都是在优化这个逐 token 生成循环中的概率分布。这正是 docs/foundations/ 系列教程第六篇的内容下一篇将进入数据管线的细节。【免费下载链接】train-llm-from-scratchA straightforward method for training your LLM, from downloading data to generating text.项目地址: https://gitcode.com/GitHub_Trending/tr/train-llm-from-scratch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表