尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

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

ORPO详解:把SFT和对齐合并成一个阶段的train-llm-from-scratch实现

ORPO详解:把SFT和对齐合并成一个阶段的train-llm-from-scratch实现 ORPO详解把SFT和对齐合并成一个阶段的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 的开源项目覆盖数据下载、预训练、SFT到 DPO / ORPO / PPO / GRPO 对齐的完整流程。本文详解其中的ORPOOdds Ratio Preference Optimization赔率比偏好优化实现它不需要冻结的参考模型把 SFT 和偏好对齐合并成一个训练阶段一条损失函数同时完成学会回答问题和学会偏好更好的回答两件事。为什么需要 ORPO常规的 LLM 对齐路线要跑两个阶段先用 SFT监督微调教模型按指令格式回答再用 DPO 等偏好优化方法把回答对齐到人类偏好上。DPO 的代价是需要额外复制一份 SFT 模型作为冻结参考模型每步训练都要前向两次策略 参考SFT 和对齐是两次独立训练配置、超参、数据管道都要各维护一遍。在上图的项目流水线中SFT 之后的对齐分支支持三种目标函数DPO、ORPO、KTO通过一个--loss_type参数切换。其中 ORPO 是最省的一个——它把 SFT 直接折叠进了偏好损失里。ORPO 损失函数两个项的组合ORPO 的损失由两部分相加构成组成项公式含义对应的作用NLL 项对 chosen被选中回答逐 token 取平均负对数似然等价于 SFT让模型学会生成高质量回答OR 项赔率比项−log σ(log_odds(chosen) − log_odds(rejected))偏好对齐让 chosen 比 rejected 更可能被生成整体形式为L NLL(chosen) λ · OR其中log_odds mean_logp − log(1 − exp(mean_logp))使用的是逐 token 平均log-prob而非总和并用数值稳定的log1mexp实现避免下溢。权重λ即配置项orpo_lambda默认 1.0。NLL 项本质上就是训练语言模型时最常用的交叉熵损失——下图展示的就是该项目预训练阶段典型的交叉熵损失曲线ORPO 中的 NLL 项与它同源所以 ORPO 的初始 loss 比纯 DPO起点约 0.693更高一些项目中的 ORPO 实现位置核心实现非常紧凑全部关键路径如下ORPO / DPO / KTO 三个损失函数src/post_training/dpo.py其中orpo_loss只用了十几行代码序列级 log-prob 计算DPO/KTO/ORPO 共用src/post_training/rollout.py 的sequence_logprobs训练入口脚本scripts/train_dpo.py根据loss_type自动选择损失函数配置数据类loss_type、beta、orpo_lambda、学习率等config/post_training_config.py默认配置configs/dpo.json实现里最能体现无需参考模型的一行是初始化时的条件判断——只有非 ORPO 模式才创建冻结副本# scripts/train_dpo.py ref make_frozen_copy(policy, devicectx.device) if cfg.loss_type ! orpo else None跑 DPO / KTO 时参考模型每一步都要做一次前向计算ORPO 直接跳过显存和算力都更友好。上图是 DPO 的完整流程含冻结参考分支ORPO 走同一套数据与 log-prob 管道只是去掉了参考分支损失函数换成 NLL OR 的组合。快速运行 ORPO 训练项目提供了开箱即用的命令行入口一条命令即可启动# 单卡 PYTHONPATH. python scripts/train_dpo.py --loss_type orpo --orpo_lambda 1.0 # 多卡DDP PYTHONPATH. torchrun --standalone --nproc_per_node2 scripts/train_dpo.py --loss_type orpo几个实用细节策略模型默认从 SFT 检查点sft.pt初始化偏好数据来自preferences.jsonl输出保存到dpo.pt对齐阶段要用很小的学习率默认5e-7学习率过高容易让模型偏离原有能力max_len默认 768batch_size默认 8都可在 configs/dpo.json 或命令行中调整。训练日志怎么读训练过程会周期性打印三类指标对新手来说各有明确含义指标含义期望趋势lossNLL λ·OR 的总损失稳定下降ORPO 起点高于纯 DPO因为它含 NLL 项acc隐式奖励准确率模型更偏好 chosen 回答的样本占比稳步爬升到 0.5 以上r_chosen / r_rejected两条回答的平均 log-probORPO 的隐式奖励二者差距margin逐渐拉大最终的下游验证是 GSM8K dev 准确率——对齐不该以牺牲推理能力为代价。ORPO vs DPO vs KTO怎么选维度ORPODPOKTO是否需要冻结参考模型❌ 不需要✅ 需要✅ 需要数据形式chosen/rejected 成对chosen/rejected 成对可只用点赞/点踩信号训练阶段数1SFT对齐合并2SFT 后对齐2SFT 后对齐初始 loss较高含 NLL 项约 0.693约 0.693 简单结论数据是成对偏好、又想省掉一个训练阶段时选 ORPO只有零散的好/坏信号时选 KTO追求最经典的 DPO 公式时用默认 DPO。延伸阅读DPO / ORPO / KTO 阶段详解docs/05_dpo.md损失函数与序列 log-prob 的数学基础docs/foundations/objectives.md后训练全流程总览POST_TRAINING.md可视化训练界面可一键切换 loss_typeui/pages/5_DPO.py【免费下载链接】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),仅供参考
返回列表