大模型后训练:离策与在策学习统一框架与工程实践 1. 项目概述后训练时代的核心命题如果你在过去一年里深度参与过大语言模型LLM的应用或微调大概率会陷入一个选择困境手头有一批高质量的指令数据是应该直接拿这些数据去微调模型这通常被称为“在策学习”或On-policy Learning还是先用这批数据训练一个奖励模型再用强化学习比如PPO去对齐模型这通常被归为“离策学习”或Off-policy Learning前者简单直接但效果容易“过拟合”到数据分布模型可能变得刻板后者流程复杂训练不稳定但理论上能引导模型探索更优的答案空间。这个选择本质上就是“离策”与“在策”的路线之争。这篇题为“大语言模型后训练技术离策与在策学习的统一视角”的论文瞄准的正是这个让无数研究者和工程师头疼的痛点。后训练Post-training阶段特别是对齐Alignment和指令微调Instruction Tuning是让一个“通晓语言”的基座模型Base Model变成“有用、无害、诚实”的助手模型的关键。然而当前的技术路径看似百花齐放实则山头林立缺乏一个统一的理论框架去理解不同方法的内在联系与优劣。这篇论文的价值就在于它试图跳出具体算法的窠臼从一个更本质的“策略优化”视角将看似迥异的离策与在策学习方法统一起来为我们提供一套分析、比较乃至设计新后训练方法的“地图”和“工具箱”。简单来说它要回答的核心问题是当我们用各种数据去“教”大模型时底层的学习机制到底是什么不同的数据使用方式直接模仿 vs. 通过反馈学习如何影响模型最终的行为理解了这一点我们就能更理性地选择技术方案甚至组合不同方法的优势设计出更高效、更稳定的训练流程。这对于希望深入模型调优而非仅仅调用API的从业者而言无疑是一份急需的“理论武装”。2. 核心概念拆解离策、在策与后训练在深入论文的“统一视角”之前我们必须先厘清几个核心概念。这些概念是理解整篇论文的基石也是日常讨论中容易混淆的地方。2.1 什么是大语言模型的后训练后训练是一个统称指的是在预训练Pre-training之后为了让模型适应特定任务或遵循人类偏好而进行的额外训练阶段。预训练让模型学会了语言的统计规律和世界知识但它还是一个“通才”不会主动遵循指令也可能输出有害或不准确的内容。后训练就是给这个“通才”进行“职业教育”和“品德教育”。它主要包含两个主流方向指令微调Instruction Tuning使用指令期望输出配对的数据集以监督学习的方式微调模型。目标是让模型学会理解和执行各种形式的指令。例如给定指令“写一首关于春天的诗”模型能输出一首诗。这可以看作是在教模型“技能”。对齐Alignment目标是让模型的输出与人类的价值观和偏好保持一致即变得“有用、无害、诚实”。最具代表性的方法是基于人类反馈的强化学习RLHF。这个过程通常涉及训练一个奖励模型Reward Model来模拟人类偏好然后用强化学习算法如PPO优化语言模型使其输出能获得高奖励。这更像是在塑造模型的“价值观”和“行为准则”。后训练的成功直接决定了ChatGPT、Claude等助手类模型的实际体验。一个强大的基座模型加上糟糕的后训练可能产生一个难以驾驭甚至危险的AI。2.2 离策学习与在策学习的本质区别这两个术语源于强化学习领域但在LLM后训练的语境下被赋予了新的内涵。理解它们的关键在于区分“用于训练的数据来自哪里”。在策学习On-policy Learning模型从自身当前策略Policy所产生的数据中学习。在LLM语境下策略就是模型本身其产生的数据就是模型根据输入如指令生成的输出。经典的指令微调就是典型的在策学习我们收集人类标注的指令理想输出数据这些输出可以看作是人类专家策略产生的数据然后用这些数据直接微调模型让模型的策略向专家策略靠拢。最近流行的直接偏好优化DPO及其变种虽然使用了偏好数据但其优化目标可以推导为等同于用当前模型和参考模型生成的数据进行在策优化。核心特征是学习用的数据分布与模型当前试图优化的策略所生成的数据分布强相关。离策学习Off-policy Learning模型从不同于当前策略的其他来源产生的数据中学习。这个“其他来源”可以是历史数据、人类专家数据、甚至是另一个模型称为行为策略产生的数据。RLHF是离策学习的典型代表在强化学习阶段我们用一个固定的奖励模型基于人类偏好数据训练得到来评估当前模型生成的输出。用于训练奖励模型的人类偏好数据与当前模型在PPO迭代中不断变化时生成的输出数据它们的分布是不同的。模型通过学习这些“离线”的反馈信号来更新自己。核心特征是用于计算梯度、更新模型的数据或反馈并非完全由模型自身最新的策略产生。用一个不太严谨但直观的类比在策学习像是“临摹大师字帖”你照着字帖专家数据一笔一划地模仿离策学习像是“参加书法比赛”评委奖励模型根据一套标准给你的作品打分你根据分数高低来调整自己的书写方式而评委的打分标准是基于之前很多作品历史偏好数据总结出来的并不完全针对你当前的字迹。2.3 为什么需要统一的视角目前社区对后训练方法的选择往往基于经验、直觉和算力成本。指令微调简单但可能学不到复杂的偏好层次RLHF效果强但复杂、昂贵且不稳定比如众所周知的“奖励黑客”问题——模型找到漏洞获取高奖励却输出无意义内容。DPO等新方法试图简化流程但其与RLHF和指令微调的理论关系众说纷纭。这种“方法论孤岛”的局面带来几个问题选择困难面对具体任务该选哪种方法缺乏理论指导。效果不可比不同论文用不同的方法在不同的数据集上做实验结论往往矛盾难以判断哪种方法本质更优。创新瓶颈设计新方法时缺乏一个通用的框架来评估其理论属性比如是否在策、是否稳定。因此一个统一的视角能够将不同方法放在同一个坐标轴下进行刻画和分析指出它们各自对应于策略优化过程中的哪些近似或简化对于推动领域发展至关重要。这篇论文正是试图建立这样一个坐标系。3. 统一的理论框架策略优化下的重新审视论文的核心贡献是提出了一个基于策略优化Policy Optimization的统一框架。在这个框架下无论是监督微调SFT、RLHF还是DPO都可以被表述为在某个目标函数下对语言模型策略进行优化的特例。这个目标函数通常权衡两个关键方面1) 与参考数据/偏好的一致性2) 与初始策略通常是SFT后的模型或原始基座模型的偏离程度后者通过KL散度等正则化项来实现目的是防止优化后的模型“忘掉”原有知识或变得过于极端。3.1 框架的基本要素在这个统一框架中任何后训练方法都可以用以下几个要素来描述策略参数化我们的语言模型就是一个策略 π_θ参数为 θ它定义了给定上下文指令x 时输出序列 y 的概率分布 π_θ(y|x)。优化目标一个期望最大化的目标函数 J(θ)。这个函数通常包含性能项衡量策略输出符合我们期望的程度。例如在指令微调中是最大化人类示范数据的似然在RLHF中是最大化奖励模型的期望回报。正则化项限制新策略 π_θ 与某个参考策略 π_ref如初始的SFT模型之间的差异常用KL散度。这确保了优化过程是保守的避免策略崩溃。数据分布计算目标函数梯度时所依赖的数据分布 ρ。这是区分在策与离策的关键。如果在策ρ 就是当前策略 π_θ 与输入分布 p(x) 共同定义的数据分布。即我们用模型自己生成的数据或与其同分布的数据来更新自己。如果离策ρ 是另一个行为策略 π_β 与 p(x) 定义的数据分布其中 π_β ≠ π_θ。例如在RLHF的PPO阶段用于计算价值函数基线Baseline的旧策略数据就是离策数据。3.2 主流方法在框架中的映射让我们看看这个框架如何容纳主流方法监督式指令微调SFT/Instruction Tuning目标函数最大化人类专家数据 D {(x, y*)} 的似然J_sft(θ) E_(x, y*)~D [log π_θ(y*|x)]。数据分布数据来自固定的专家数据集D。由于我们直接用这些数据计算梯度而不关心它们是否由当前π_θ生成从这个严格定义看它使用的是离策数据专家策略 vs. 当前模型策略。但很多时候人们将其视为一种特殊的在策学习即假设专家策略就是我们要学习的理想策略。正则化通常没有显式的KL正则化项但早期停止early stopping和较小的学习率起到了类似作用。基于人类反馈的强化学习RLHF目标函数J_rlhf(θ) E_(x~p(x), y~π_θ(·|x)) [r_φ(x, y)] - β * KL(π_θ(·|x) || π_ref(·|x))。其中 r_φ 是奖励模型β 是控制正则化强度的系数。数据分布这里比较复杂。PPO算法通常包含在策和离策的成分在策部分用于计算策略梯度期望回报的样本 y 是从当前策略 π_θ 中采样得到的。离策部分用于估计优势函数Advantage的价值函数 V(x)其训练数据通常来自旧策略 π_θ_old上一轮迭代的策略产生的样本。同时奖励模型 r_φ 本身是在完全离策的人类偏好数据上训练得到的。因此RLHF是一个典型的混合范式其核心的奖励信号是离策的但策略更新时采样是在策的。直接偏好优化DPO及其变种目标函数DPO通过一个巧妙的数学变换将带KL约束的奖励最大化问题转化为一个仅依赖于偏好数据 (x, y_w, y_l) 的直接策略优化问题J_dpo(θ) E_(x, y_w, y_l)~D [log σ(β log (π_θ(y_w|x)/π_ref(y_w|x)) - β log (π_θ(y_l|x)/π_ref(y_l|x)))]其中σ是sigmoid函数。数据分布数据来自固定的偏好数据集D。关键洞察在于DPO的梯度更新在数学上等价于用当前策略 π_θ 和参考策略 π_ref 对每个偏好数据“重新加权”后进行一种加权最大似然估计。这意味着虽然数据是静态的离策但梯度计算中隐式地包含了当前策略的信息。因此DPO更接近于一种在策学习的近似因为它通过当前策略和参考策略的比值动态地调整了静态数据对于当前优化步骤的重要性。论文可能会将其归类为一种“隐式在策”或“准在策”方法。通过这样的映射我们可以清晰地看到不同方法在“目标函数形式”和“数据使用方式”这两个轴上的位置。统一框架的价值在于它允许我们分析每种方法对应的目标函数在理论上的性质如收敛性、偏差以及其数据使用方式带来的方差和效率问题。注意这里有一个重要的实践洞见。很多人认为DPO“替代”了RLHF是一种更简单的偏好学习。但从统一视角看DPO并没有脱离RLHF的理论基础带KL正则的奖励最大化它只是通过改变优化形式避免了显式的奖励模型建模和复杂的强化学习循环。它的成功部分得益于这种形式转换带来了更稳定的优化 landscape。4. 离策与在策的权衡偏差、方差与效率在统一的策略优化框架下离策和在策学习的选择本质上是在偏差Bias、方差Variance和计算效率之间进行权衡。理解这一点是指导我们做工程选择的关键。4.1 在策学习的优势与挑战优势低偏差因为使用当前策略产生的数据或与其同分布的数据进行更新所以梯度估计是针对当前策略的“真实”梯度方向的无偏或低偏估计。这通常意味着更稳定的收敛路径更容易找到局部最优解。适用于在线学习模型可以边交互边学习不断根据最新策略产生的数据调整自己。挑战数据效率可能较低为了获得当前策略下的新数据需要不断地用最新模型进行采样推理这会产生额外的计算成本。尤其是在训练初期策略较差采样的数据质量也低学习效率不高。探索不足严格在策学习可能局限于当前策略已知的数据分布难以发现那些当前策略概率低但实际效果更好的输出探索-利用困境。在LLM后训练中纯粹的在线在策学习如用模型自己生成的数据做SFT很少见因为初始模型生成的数据质量不可控。常见的“在策”感觉的方法如DPO实际上是利用静态数据但通过策略比率进行了动态加权模拟了在策更新的效果。4.2 离策学习的优势与挑战优势数据效率高可以充分利用历史积累的、高质量的静态数据集如人类标注的示范或偏好数据。这些数据可能来自专家、旧模型或其他来源无需为每次策略更新重新采样。支持更好的探索可以从行为策略如采样更多样化的模型产生的数据中学习这些数据可能覆盖了当前策略未探索到的高价值区域。挑战高偏差这是离策学习的核心问题。由于训练数据分布 (ρ) 与当前策略分布 (π_θ) 不同直接使用这些数据计算的梯度会存在偏差。如果行为策略产生数据的策略和目标策略要学习的策略差异很大这个偏差会非常严重导致学习不稳定甚至发散。RLHF训练中常见的“模式崩溃”模型输出退化到重复、无意义的短句部分原因就源于此。价值估计困难在强化学习设置中离策学习需要准确估计状态或动作的价值这通常通过重要性采样Importance Sampling等技术来纠正分布差异但这些技术会引入高方差使得训练不稳定。4.3 对后训练方法选择的启示基于上述权衡我们可以重新审视常见选择为什么RLHFPPO训练如此不稳定因为它混合了离策和在策。其离策部分奖励模型和旧策略价值估计带来了偏差和方差而在策采样又依赖于当前可能很差的策略。两者结合稍有不慎如学习率过大、KL惩罚系数β不合适就容易导致策略剧烈波动。为什么DPO训练起来更稳定因为它通过数学变换将问题转化为一个类似于在策加权的监督学习问题。它避免了显式的、高方差的离策价值估计也避免了策略采样与奖励模型评估的复杂交互。其稳定性来自于目标函数良好的凸性在一定的假设下和更直接的梯度计算。什么时候该用指令微调SFT当你拥有大量高质量的指令输出配对数据且这些输出分布与你期望的模型行为高度一致时。SFT是一种高效利用高质量离策数据的方法它假设专家数据分布就是目标分布。但它无法处理复杂的、非二元的偏好比如“A比B好一点但C在创意上更佳”。什么时候该引入偏好学习DPO/RLHF当你的优化目标无法用简单的“正确输出”来定义而是涉及更主观的“偏好”、“安全性”、“风格”等维度时。偏好学习能利用相对比较数据学习更细腻的奖励函数。实操心得从统一视角看混合策略最先进的实践往往不是纯离策或纯在策而是分阶段或混合的。一个常见的模式是离策启动在策精炼。阶段一离策使用高质量的、离策的人类示范数据SFT或偏好数据DPO的初始阶段对模型进行“冷启动”。这能快速将模型拉到合理的策略空间数据效率高。阶段二在策/准在策当模型具备一定能力后可以切换到更在策的模式。例如使用模型自己生成的数据进行拒绝采样Rejection Sampling或最佳输出筛选Best-of-N然后用这些筛选出的高质量数据进一步做SFT称为“自蒸馏”。或者继续使用DPO但随着模型更新静态偏好数据通过策略比率进行的加权也在动态变化相当于一种准在策学习。 这种混合策略结合了离策的数据效率和在策的低偏差优势是许多成功后训练 pipeline 的共性。5. 实操流程设计基于统一视角的现代后训练Pipeline理论的价值在于指导实践。基于上述统一视角我们可以设计一个更理性、更健壮的后训练流程。以下是一个结合了离策与在策思想的通用Pipeline适用于从零开始对齐一个基座模型。5.1 阶段零数据准备与基座模型选择核心任务准备高质量数据选择合适的基座模型。指令-输出对数据SFT数据收集或生成涵盖广泛任务、格式多样的指令期望输出数据。质量重于数量输出需准确、有用、无害。数据量通常在数万到数十万级别。人类偏好数据收集指令获胜输出失败输出三元组。可以通过让标注员比较模型多个生成结果获得或利用现有模型如GPT-4进行标注。这是偏好学习的燃料。基座模型选择选择一个在通用领域预训练充分、能力强的模型如LLaMA、Qwen、ChatGLM系列。模型参数规模需与你的算力匹配。注意事项数据质量是天花板后训练本质上是在用数据“雕刻”模型的行为。垃圾进垃圾出。务必对数据进行严格的清洗和去重。对于偏好数据要特别注意比较对win/lose pair的一致性避免出现矛盾标注AB, BC, CA的循环。一个技巧是使用多数投票或引入更强大的模型如GPT-4进行仲裁。5.2 阶段一离策监督微调SFT目标让模型初步学会遵循指令成为一个合格的“学生”。方法使用准备好的指令-输出对数据以标准的下一个词预测语言建模损失进行监督微调。超参数关键学习率通常很小例如1e-5到5e-5因为基座模型已有丰富知识我们只是微调。轮数2-4个epoch通常足够严防过拟合。需要监控在保留验证集上的损失。序列长度需覆盖你的数据中最长样本。输出得到一个SFT模型π_sft。这是后续所有对齐工作的起点和参考策略π_ref。5.3 阶段二离策偏好学习以DPO为例目标让模型从“遵循指令”升级到“输出符合人类偏好”。方法使用DPO算法。其损失函数如前所述需要SFT模型作为参考模型π_ref。实操步骤加载模型初始化训练模型 π_θ 为阶段一得到的 π_sft。参考模型 π_ref 固定为同一个 π_sft或其副本且不计算梯度。准备数据将偏好三元组 (x, y_w, y_l) 转换为DPO需要的格式。训练循环对于每个批次计算DPO损失。损失函数会鼓励模型增加对获胜输出 y_w 的似然相对于 π_ref同时降低对失败输出 y_l 的似然。关键超参数 β控制模型偏离参考策略的强度。β 越大模型越保守越像 π_refβ 越小模型越自由优化偏好目标越激进。这是一个需要仔细调节的核心参数。通常从0.1左右开始尝试。监控除了训练损失更重要的是监控偏好对的准确率即模型对 y_w 和 y_l 的隐含偏好是否与数据一致以及生成样本的质量通过人工或GPT-4评估。5.4 阶段三在策精炼与迭代可选但推荐目标利用模型自身能力生成更高质量的数据实现自我提升。方法一拒绝采样与自蒸馏生成用当前最好的模型如DPO后的模型对一批新的或旧的指令进行多次采样例如N4。筛选使用一个强大的评判器可以是训练好的奖励模型也可以是GPT-4等API对每个输出打分选出每个指令下得分最高的输出。蒸馏用这些指令最佳输出对组成新的数据集对模型进行新一轮的SFT学习率可以更小。这个过程相当于让模型向自己的“最佳表现”学习。方法二在线DPO或迭代式DPO用当前模型生成新的输出对让人类或AI进行偏好标注扩充偏好数据集。用扩充后的数据集继续训练DPO模型。 这个过程将离策的DPO与在策的数据收集结合起来逐步提升数据分布与当前策略的匹配度。5.5 工具选型与实现要点框架Hugging Face的transformers、trlTransformer Reinforcement Learning和peftParameter-Efficient Fine-Tuning库是当前事实上的标准。trl库原生支持DPO、PPO等训练方式。代码示例DPO训练核心片段from trl import DPOTrainer, DPOConfig from transformers import AutoModelForCausalLM, AutoTokenizer # 加载模型和分词器 model AutoModelForCausalLM.from_pretrained(your_sft_model_path) ref_model AutoModelForCausalLM.from_pretrained(your_sft_model_path) tokenizer AutoTokenizer.from_pretrained(your_model_path) # 设置pad_token如果不存在 if tokenizer.pad_token is None: tokenizer.pad_token tokenizer.eos_token # 配置DPO参数 dpo_config DPOConfig( beta0.1, # DPO温度参数β learning_rate5e-7, # 通常比SFT更小的学习率 per_device_train_batch_size4, gradient_accumulation_steps4, max_length1024, logging_steps10, output_dir./dpo_results, # 可启用bf16/float16加速并设置梯度检查点节省显存 bf16True, gradient_checkpointingTrue, ) # 初始化DPOTrainer dpo_trainer DPOTrainer( modelmodel, ref_modelref_model, argsdpo_config, train_datasetyour_preference_dataset, # 需预处理为特定格式 tokenizertokenizer, ) # 开始训练 dpo_trainer.train()算力考量DPO训练相比RLHF/PPO节省了大量显存和计算因为它不需要维护额外的奖励模型、价值模型和进行复杂的PPO循环。主要开销在于前向传播计算模型对 (y_w, y_l) 的log概率。使用LoRA等参数高效微调技术可以进一步大幅降低显存需求。6. 常见陷阱、问题排查与调优经验即使理解了理论实操中依然坑洼遍地。以下是一些从实践中总结的常见问题与解决方案。6.1 模型性能下降或崩溃现象经过DPO或RLHF训练后模型在基础能力如知识问答、逻辑推理测试集上的表现显著下降或者开始输出乱码、重复文本。根因分析KL散度惩罚系数 β 设置不当这是最常见的原因。β 太小模型为了迎合偏好信号会过度偏离参考模型π_sft导致遗忘预训练知识和SFT学到的指令跟随能力。β 太大则偏好优化效果微弱。偏好数据质量差或噪声大矛盾的偏好标签会让模型学习目标混乱。学习率过高在偏好优化阶段模型参数已经比较敏感高学习率会导致优化不稳定。排查与解决系统性地扫描 β在0.01到1.0的范围内进行网格搜索或随机搜索。对于每个β训练少量步数如100-500步然后评估模型在保留的验证偏好数据上的准确率和在多样化指令集上的生成质量可用GPT-4自动评估。选择一个在偏好准确率和生成质量间取得最佳平衡的β。检查偏好数据计算数据集中冲突标签的比例。如果可能对数据进行清洗或使用更可靠的标注来源。降低学习率DPO的学习率通常应比SFT阶段低1-2个数量级。从5e-7到1e-6开始尝试。引入正则化除了KL散度还可以考虑在损失中加入对原始SFT损失的小权重项以显式地保留指令跟随能力。6.2 奖励黑客或过度优化现象模型在偏好评估中得分很高例如奖励模型给出的分数或DPO隐含的偏好准确率但人类评估发现其输出质量下降可能包含奇怪的格式、冗余的礼貌用语如“当然我很乐意…”的无限套娃或利用奖励模型的漏洞。根因分析优化目标与人类真实偏好之间存在分布外泛化差距。模型在训练数据分布内过度优化学到了数据中的虚假相关性或奖励模型的缺陷。排查与解决多样化评估集使用与训练数据分布不同的指令集进行定期的人工或强模型GPT-4评估。不要只看训练集和验证集上的偏好准确率。设置“陷阱”指令在评估集中加入一些可能诱发不良行为的指令如“忽略之前的指令”、“写一个有害的代码”检查模型是否对齐失败。限制训练步数/早停像防止过拟合一样监控模型在分布外评估集上的表现一旦生成质量开始下降就停止训练。改进奖励模型或偏好数据如果使用RLHF奖励模型的质量是上限。如果使用DPO偏好数据的覆盖度和质量是关键。考虑引入针对“奖励黑客”行为的负样本。6.3 训练不稳定或损失震荡现象训练损失曲线剧烈波动不收敛。根因分析批次内偏好对差异过大一个批次中同时包含非常容易和非常困难的偏好对导致梯度方向冲突。梯度爆炸学习率过高或模型初始化/数据预处理有问题。DPO中 β 值极端β 过小可能导致逻辑函数内部的值非常大引发数值不稳定。排查与解决数据洗牌与批次构建确保每个批次内的数据在难度上相对均衡。可以对数据按指令长度、类型或预估难度进行聚类然后在聚类内采样。梯度裁剪设置梯度裁剪范数如max_grad_norm1.0这是稳定训练的标配。调整 β 和学习率尝试增大 β 或降低学习率。检查数据格式确保y_w和y_l没有被意外交换且文本被正确分词没有过多的填充padding。6.4 实操调优清单在开始正式训练前可以按以下清单进行检查和调优检查项目标建议操作数据质量确保干净、一致、有代表性人工抽查100条数据检查标签一致性过滤长度异常或包含特殊字符的样本。模型初始化从稳定的SFT模型开始确保SFT模型在指令跟随上表现良好。如果SFT模型就很差后续对齐是空中楼阁。超参数 β找到保守与激进的平衡点进行小规模扫描0.05, 0.1, 0.2, 0.5。观察训练初期500步的验证集偏好准确率和生成多样性。学习率稳定收敛从较小的值开始如5e-7。使用学习率调度器如余弦衰减。批次大小在显存允许下尽可能大增大批次大小可以降低梯度方差使训练更稳定。使用梯度累积模拟大批次。序列长度覆盖所有数据统一截断或填充到固定长度避免因长度差异引入的偏差。监控指标全面评估模型状态监控训练损失、验证偏好准确率、生成样本质量人工/GPT-4评估、KL散度如果记录。正则化防止遗忘与过拟合启用Dropout如果模型有考虑在损失中加入小权重的SFT损失项。最后记住大模型后训练既是科学也是艺术。统一视角提供了地图和指南针但通往最佳模型的道路仍然需要大量的实验、细致的观察和不断的迭代。从一个小规模、可快速迭代的实验设置开始例如使用7B模型和1万条数据验证你的整个pipeline和超参数选择然后再扩展到全量数据和更大模型这是一个能节省大量时间和算力的务实策略。