拓冰建站拓冰建站
首页 / 资讯中心 / 正文

NNI 中并行化顺序算法 TPE:Constant Liar 策略原理与工程实现解析

NNI 中并行化顺序算法 TPEConstant Liar 策略原理与工程实现解析【免费下载链接】nniAn open source AutoML toolkit for automate machine learning lifecycle, including feature engineering, neural architecture search, model compression and hyper-parameter tuning.项目地址: https://gitcode.com/gh_mirrors/nn/nni导读Tree-structured Parzen EstimatorTPE本质上是一个串行sequential的贝叶斯优化算法但在 NNI 的实验中它会被异步地并行调度以充分利用多个计算节点避免在等待 Trial 评估期间浪费时间。本文以 NNI 文档 docs/source/sharings/parallelizing_tpe_search.rst 为骨架系统讲解 TPE 背后的 SMBO 框架与 EI 准则、高并发下采样点过度集中的问题以及用于解决该问题的Constant Liar恒定欺骗者与Kriging BelieverKB等近似 q-EI 贪心策略并结合仓库中 tpe_tuner.py 与 hyperopt_tuner.py 的源码实现给出在 NNI 中开启 TPE 并行优化parallel_optimize/constant_liar_type的具体配置方法与参数语义。读完本文你将掌握 TPE 并行化的数学动机、两种主流近似策略的取舍以及如何在实际 NNI 实验配置中直接启用它们。背景为什么 TPE 会被“并行化”TPE 是 NNI 内置的默认调参器之一注册于 builtin_algorithms.yml 中的TPE对应nni.algorithms.hpo.tpe_tuner.TpeTuner也是经典贝叶斯优化算法的代表见 docs/source/hpo/tuners.rst。在原始设计中TPE 是一个顺序算法每一轮根据已有观测历史提出一个候选点等待其真实评估结果返回后再更新模型并提出下一个点。但在真实集群环境中评估fitness function往往代价高昂而算力却是充裕的。为了让多个计算节点同时工作TPE 实际上被异步运行即不等前一个 Trial 结束就继续提出新候选点。然而这带来一个隐患——TPE 本身并不知道“当前还有哪些点正在被评估”它会基于同一份历史反复提出高度相似的候选。NNI 采用的解决方案正是本文的主角Constant Liar恒定欺骗者。其核心思想是每提出一个候选点 x* 时先临时赋予它一个“虚假”的适应度评估值 y直到真实评估完成并回报 f(x*) 之后再用真实值覆盖。这样并发的每一个正在运行的点都会以“假结果”的形式进入模型历史让模型误以为这些区域已经被探索过从而促使后续采样向其它区域分散。第一部分问题溯源1.1 顺序模型基全局优化SMBOSequential Model-Based Global OptimizationSMBO被广泛用于真实适应度函数 f: X → R 评估代价高昂的场景。模型基算法用一个评估成本更低的代理模型surrogate来逼近 f其内层循环通常是对该代理模型或其某种变换进行数值优化找到使代理模型或其变换最大化的点 x*作为真实函数 f 的下一个评估提案。这种类似主动学习的算法模板如下图所示不同 SMBO 算法的差异在于在给定 f 的模型代理后它们优化何种准则来获得 x*以及如何通过观测历史 H 来建模 f。1.2 期望改进EI准则本文工作采用Expected Improvement期望改进EI作为优化准则。业界也提出过其它准则例如改进概率Probability of Improvement、最小化最小化器条件熵Conditional Entropy of the Minimizer以及基于 Bandit 的准则等。选择 EI 是因为它直观且在多种场景下都表现良好。EI 的定义是在某个模型 M 下f(x) 超过负向某个阈值 y* 的期望1.3 TPE 如何建模 p(y|x)直接计算 p(y|x) 是昂贵的因此 TPE 通过 p(x|y) 与 p(y) 来间接建模。TPE 用两个密度函数来定义 p(x|y)其中l(x)由损失 f(x⁽ⁱ⁾) 小于 y* 的观测 {x⁽ⁱ⁾} 形成的密度g(x)由剩余观测形成的密度。TPE 算法依赖于一个比当前最佳 f(x) 更大的 y*这样才能保证有足够多的点参与构成 l(x)。具体地TPE 将 y* 选为观测 y 值的某个分位数 γ即 p(y y*) γ因此并不需要对 p(y) 建立具体模型。l 与 g 的树形结构使得“从 l 中抽取大量候选、再用 g(x)/l(x) 评估它们”变得容易每一轮迭代算法返回 EI 最大的候选点 x*。下图是在二维搜索空间中 TPE 算法的仿真。背景颜色的差异代表不同的函数值可以看到 TPE 对“探索exploration”与“利用exploitation”的结合相当好黑色表示本轮采样的点黄色表示历史中已经采过的点。1.4 高并发下的痛点同一 EI 状态上的点过度集中由于 EI 是连续函数在某一个确定状态下EI 的最高点 x 是确定的。如下图所示蓝色三角形就是当前状态下最可能被采样的点——如果每次都严格取 EI 最大点采样会反复落在同一个区域。TPE 在串行使用时表现良好但如果提供更大的并发度concurrency就会在同一个 EI 状态上产生大量候选点这些过于集中的点会削弱调参器的探索能力造成资源浪费。下图是设置concurrency60时的仿真可以明显看到这一现象第二部分解决方案——近似 q-EI 最大化多点评分准则multi-points criterion理论上可以在一步之内通过求解一个优化问题一次性给出 q 个实验设计点即 q-EI然而随着 q 增大q-EI 的计算量急剧上升。经过研究业界总结了四种主流的贪心策略来逼近 q-EI 的最优解、同时规避其数值代价。其中两种与 NNI 的工程实现直接相关。2.1 方案一相信 OK 预测器——KBKriging Believer启发式策略Kriging Believer 策略的做法是把前几轮迭代中已选定位置处响应的“条件知识”替换为Kriging 预测器的期望值即确定性的预测均值。策略可以总结为下面的迭代式这是一个顺序策略每一轮仍只优化 d 维空间上解析已知的 EI因此计算上完全可以承受最终输出一个 q 点的设计方案。但它存在失败风险如果相信了一个对观测数据过度乐观overshoot的 OK 预测器序列可能被长时间困在某个非最优区域。为此需要第二种风险更低的策略。2.2 方案二CLConstant Liar启发式策略考虑一个顺序策略每一轮都用一个由用户外生地固定的值 L 来更新代理模型仍然不做超参重估这个值被称为“谎言lie”。所谓Constant Liar就是每一轮都用同一个值 L 来“撒谎”最大化 EI 得到 xₙ₊₁ → 假装 y(xₙ₊₁) L 并更新模型 → 继续循环始终使用同一个 L ∈ RL 应该合理地依据 y 在 X 上的取值来确定本文考虑了三种取值min{Y}、mean{Y}、max{Y}。这里有一个非常实用的直觉结论L 越大算法越倾向于探索explorativeL 越小算法越偏向利用exploitative。下图是对上述方法的仿真结果采用mean 值欺骗者来最大化 q-EI。可以看到采样的点已经开始变得分散第三部分NNI 中的工程实现上述 CL 策略在 NNI 中有两套实现路径分别对应新旧两代 TPE 调参器两者都注册在 builtin_algorithms.yml 中TPE→nni.algorithms.hpo.tpe_tuner.TpeTunerNNI 自研的 TPE 重实现无额外依赖TPE_legacy→nni.algorithms.hpo.hyperopt_tuner.HyperoptTuner基于 hyperopt 库algorithm_name: tpe。3.1 新一代 TPETpeTuner与TpeArguments在 tpe_tuner.py 中TpeArguments以 NamedTuple 形式定义了 TPE 算法自身的超参数为避免与“被调优的 Trial 超参数”混淆这里称为 arguments参数默认值含义constant_liar_typebestTPE 本身不支持并行调参此参数指定在trial_concurrency 1时如何优化。NoneYAML 中写null表示不优化这是 legacy 版本的默认行为。各种 liar 的机制对应论文第 6.1 节一般而言best适合 Trial 数量较少的情形worst适合 Trial 数量较多的情形n_startup_jobs20前 N 组超参完全随机生成作为预热。搜索空间很大时可调大max_trial_number较小时可调小n_ei_candidates24每轮迭代 TPE 对 N 组参数采样 EI 并从中选优linear_forgetting25TPE 会降低旧 Trial 的权重该值控制一个 Trial 开始衰减所需的迭代次数prior_weight1.0TPE 将用户提供的搜索空间视为先验。生成新 Trial 时会把搜索空间折算成一条“取各参数候选范围均值”的 Trial 配置加入历史prior_weight决定这条配置在历史中的权重。例如prior_weight1.0时normal(0, 1)等价于一条“x0 且结果良好”的 Trialgamma0.25控制多少 Trial 被视为“好”数量按min(gamma * sqrt(N), linear_forgetting)计算其中constant_liar_type的可选值best / worst / mean / None对应了 create_liar 中的三个类BestLiar假设所有正在运行的参数都取得了当前最优结果加速“收敛”WorstLiar假设所有正在运行的参数都取得了当前最差结果帮助跳出局部最优MeanLiar假设所有正在运行的参数都取得了平均结果。从源码可见其“谎言”实现非常直接BestLiar.lie()在没有任何真实结果时返回0.0避免无穷值导致的数值错误否则返回历史最优 lossWorstLiar.lie()返回历史最差 lossMeanLiar.lie()返回历史 loss 的均值tpe_tuner.py。并行谎言机制的关键在generate_parameterstpe_tuner.py当存在 liar 且_running_params已提交但尚未收到 loss 的参数集非空时它先拷贝一份历史然后对每一个并发运行的参数组合追加一条Record(value, lie)的虚假记录再基于这份“加料”的历史调用suggest提出新点而receive_trial_resulttpe_tuner.py则负责在收到真实结果后更新 liar 的统计量、并把真实记录写入历史。这就是“先撒谎占位、再真相覆盖”的完整闭环。一个可直接使用的进阶配置示例出自 tpe_tuner.py 的 docstringconfig.tuner.name TPE config.tuner.class_args { optimize_mode: maximize, seed: 12345, tpe_args: { constant_liar_type: mean, n_startup_jobs: 10, n_ei_candidates: 20, linear_forgetting: 100, prior_weight: 0, gamma: 0.5 } }3.2 旧版 TPEHyperoptTuner的parallel_optimize基于 hyperopt 的旧实现 hyperopt_tuner.py 则通过parallel_optimize与constant_liar_type两个参数直接暴露并行能力def __init__(self, algorithm_name, optimize_modeminimize, parallel_optimizeFalse, constant_liar_typemin):parallel_optimize是否启用并行优化默认Falseconstant_liar_type可选min / max / mean对应前文 L 取 min{Y}、max{Y}、mean{Y} 三种谎言取值。当启用并行后_get_suggestionhyperopt_tuner.py会做这样一件事当历史数据超过 20 条且存在正在运行的 Trial 时深拷贝当前的FMinIter对象self.rval得到self.CL_rval把 optimal_y按 liar 类型维护为均值 / 最小 / 最大作为假结果对每一个running_data中的 Trial 调用receive_trial_result(..., constant_liarTrue)写入“谎言”再基于这个加了假的模型提出新候选点。这也印证了文档中“L 由 y 在 X 上的取值决定”的设计optimal_y正是随真实结果动态维护的 min / max / meanhyperopt_tuner.py。3.3 在实验配置中启用并行 TPE无论是新版还是旧版 TPE并行化的收益都依赖 NNI 实验层的并发设置。trial_concurrency与max_trial_number定义于 nni/experiment/config/experiment_config.py并会校验trial_concurrency 0experiment_config.py。一个最小可用的 YAML 配置示例experimentName: parallel_tpe_demo trialConcurrency: 60 # 并发 Trial 数越大越需要 liar 策略 maxTrialNumber: 240 # 总 Trial 预算 tuner: name: TPE classArgs: optimize_mode: minimize tpe_args: constant_liar_type: mean # 并行优化开关None 表示关闭 trainingServicePlatform: local需要说明的是trial_concurrency1时模型历史中不存在“正在运行”的点liar 不会生效TPE 退化为纯串行行为而并发数越高同一 EI 状态上候选点过度集中的风险越大此时启用 liar尤其是mean或worst的价值越明显。第四部分实验验证4.1 Branin-Hoo 函数前文介绍的四种优化策略在Branin-Hoo 函数上进行对比这是全局优化的经典测试用例其推荐参数取值为 a 1b 5.1 ⁄ (4π²)c 5 ⁄ πr 6s 10t 1 ⁄ (8π)。该函数有三个全局最小点(-3.14, 12.27)、(3.14, 2.27)、(9.42, 2.47)。下图为 q-EI 的对比结果横轴为前 q 个点q ∈ [1,10]对比对象包括由 constant liar 策略min 与 max给出的 q 点设计每个 q 下随机均匀抽取的 2000 组 q 点设计每个 q 下随机抽取的 2000 组 LHSLatin Hypercube Sampling设计。从图中可以看出CL[max] 与 CL[min] 相比随机设计给出了非常好的 q-EI 结果尤其当 q 较小时优势明显。4.2 高斯混合模型函数另外研究还对比了“使用并行优化”与“不使用并行优化”两种情况。仿真使用二维多模态高斯混合分布结果如下表其中concurrency为并发数concurrency80concurrency60concurrency40concurrency20concurrency10无并行优化avg 0.4841var 0.1953avg 0.5155var 0.2219avg 0.5773var 0.2570avg 0.4680var 0.1994avg 0.2774var 0.1217有并行优化avg 0.2132var 0.0700avg 0.2177var 0.0796avg 0.1835var 0.0533avg 0.1671var 0.0413avg 0.1918var 0.0697注每次测试总样本数为 240保证预算相等每种形式的 Trial 重复 1000 次表中的值为 1000 次实验中最佳结果的均值avg与方差var。可以看到在从 10 到 80 的全部并发档位上启用并行优化后的最佳结果均值与方差都显著优于不启用并行优化而且方差更小意味着结果更稳定。这也解释了为什么在实际大规模并发 HPO 任务中CL 策略值得被默认启用。第五部分总结TPE 是一个串行 SMBO 算法通过 p(x|y) l(x) / g(x) 的密度比与 EI 准则来提出候选点天然具备良好的探索-利用平衡高并发下串行 TPE 会在同一 EI 状态附近产生过度集中的采样浪费计算资源解决思路是把“多点评分”q-EI 的精确优化替换为贪心近似KB 策略“相信预测器”但可能陷入非最优区域CL 策略用固定的 min / max / mean 谎言反复更新模型L 越大探索性越强NNI 在工程上完整落地了这一方案新版TpeTuner通过tpe_args.constant_liar_typebest / worst / mean / null启用旧版HyperoptTuner通过parallel_optimizeconstant_liar_typemin / max / mean启用两套实现均以“先对运行中的 Trial 注入虚假结果、再在真实结果返回时覆盖”的方式工作Branin-Hoo 与高斯混合模型的实验均表明CL 策略在 q 较小时显著优于随机/均匀设计且在 10~80 的并发范围内稳定地同时降低最佳结果的均值与方差。如果你正在 NNI 上运行高并发的 TPE 实验并且发现早期采点过于扎堆不妨检查trialConcurrency与constant_liar_type的组合通常mean是一个兼顾探索与稳定的起点。参考资料原文档还引用了以下经典文献供进一步研究相关理论也可对照 NNI 源码 tpe_tuner.py 中的实现注释阅读James Bergstra, Remi Bardenet, Yoshua Bengio, Balazs Kegl.Algorithms for Hyper-Parameter Optimization.Meng-Hiot Lim, Yew-Soon Ong.Computational Intelligence in Expensive Optimization Problems.M. Jordan, J. Kleinberg, B. Schölkopf.Pattern Recognition and Machine Learning.此外TPE 在 NNI 中的入门说明可参见 docs/source/hpo/tuners.rst它是无额外依赖、支持所有搜索空间类型的轻量级调参器适合作为起点其已知短板是无法发现不同超参数之间的相互关系。【免费下载链接】nniAn open source AutoML toolkit for automate machine learning lifecycle, including feature engineering, neural architecture search, model compression and hyper-parameter tuning.项目地址: https://gitcode.com/gh_mirrors/nn/nni创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门