资讯动态

tf-quant-finance 数值优化模块(tff.math.optimizer)实战指南:BFGS、L-BFGS、Nelder-Mead、差分进化与共轭梯度

发布时间:2026/10/14 16:36:56 来源:尧图企业网站定制
金融科技科学计算【免费下载链接】tf-quant-financeHigh-performance TensorFlow library for quantitative finance.项目地址https://gitcode.com/gh_mirrors/tf/tf-quant-finance点击查看免费下载tf-quant-finance下称 tff在tf_quant_finance/math/optimizer下提供了一套面向 TensorFlow 张量生态的数值优化工具集。本指南以api_docs/tf_quant_finance/math/optimizer.md模块文档为骨架逐一讲解模块公开的 10 个 APIBFGS、L-BFGS、Nelder-Mead、Differential Evolution 四大优化器以及共轭梯度算法仓库自研实现与配套的停止条件、单步迭代函数。读完本文你将掌握这些优化器的参数含义、调用方式、批量batched搜索技巧与停止条件控制并了解其底层源码实现与测试验证方式可直接用于模型校准、参数拟合、利率曲线构建等量化场景。模块总览与 API 清单tff.math.optimizer是 tff 数学子模块tf_quant_finance/math下负责数值优化方法的命名空间通过tf_quant_finance/math/__init__.py挂载为tff.math.optimizer。模块文档明确列出其包含的四大优化算法BFGS、L-BFGS、Nelder-Mead 与 Conjugate Gradient共轭梯度此外还包含差分进化Differential Evolution算法。从tf_quant_finance/math/optimizer/__init__.py的源码可以确认该模块的公开 API 由两部分构成从 TensorFlow ProbabilityTFP直接复用bfgs_minimize、lbfgs_minimize、nelder_mead_minimize、nelder_mead_one_step、differential_evolution_minimize、differential_evolution_one_step、converged_all、converged_any、linesearch均来自tensorflow_probability.python.optimizer通过from tensorflow_probability.python.optimizer import ...重导出见init.pytff 自研实现共轭梯度优化器conjugate_gradient_minimize与参数类ConjugateGradientParams定义在仓库源码conjugate_gradient.py中是本模块唯一有独立源码与测试的算法。模块通过remove_undocumented(__name__, _allowed_symbols)将公开符号白名单锁定为上述 10 个 API外加内部使用的linesearch详见 _allowed_symbols。类别API说明基于梯度的拟牛顿法bfgs_minimize完整 BFGS 算法维护稠密逆 Hessian 近似lbfgs_minimize内存受限 L-BFGS隐式维护最近若干步的修正对无导数导数无关算法nelder_mead_minimizeNelder-Mead 单纯形法支持非光滑目标differential_evolution_minimize差分进化种群进化全局优化tff 自研conjugate_gradient_minimizeHager-Zhang 共轭梯度实现CG_DESCENTConjugateGradientParams共轭梯度算法可调参数attrs 数据类单步迭代nelder_mead_one_step/differential_evolution_one_step分别执行算法单次迭代停止条件converged_all/converged_any批量搜索的全局停止策略统一的目标函数接口约定所有优化器都遵循同一套接口约定这是正确使用本模块的前提输入目标函数接收一个或一批实数Tensor形状为[..., n]其中n是解空间维度前面的...是批量batching维度输出基于梯度的优化器BFGS/L-BFGS/共轭梯度要求目标函数返回(value, gradient)二元组value形状为[...]gradient形状为[..., n]无导数优化器Nelder-Mead/差分进化只要求返回value标量Tensor。为方便构造值 梯度形式的函数tff 提供了两个辅助工具定义于tf_quant_finance/math/gradient.pytff.math.value_and_gradient(f, xs)同时计算f在xs处的函数值与梯度tff.math.make_val_and_grad_fn装饰器把只返回函数值的函数包装成返回(value, gradient)的函数其 docstring 明确说明这对构造 tff.math.optimizer 优化方法所需的函数非常有用。import tensorflow as tf import tf_quant_finance as tff minimum tf.constant([1.0, 1.0]) scales tf.constant([2.0, 3.0]) tff.math.make_val_and_grad_fn def quadratic(x): return tf.reduce_sum(scales * tf.math.squared_difference(x, minimum), axis-1)停止条件converged_all 与 converged_any批量优化时每个 batch 成员可能以不同速度收敛或失败需要统一决定何时终止整个搜索。模块提供了两个停止条件函数converged_all(converged, failed)当所有batch 成员都收敛或失败时才停止是默认行为保证每个起点都完成搜索converged_any(converged, failed)只要任一batch 成员收敛或全部失败就停止适合只关心最快找到一个可行解的场景。二者签名一致接收两个形状为[...]的布尔Tensorconverged与failed返回一个布尔标量Tensor表示是否停止。可通过stopping_condition参数传入任意自定义停止函数。在conjugate_gradient_test.py的test_himmelblau_batch_any中用converged_any对 Himmelblau 函数的 4 个起点批量搜索验证了至少一个收敛但并非全部收敛的行为同时断言迭代 7 次、共 27 次目标函数求值。BFGS 优化器bfgs_minimize功能与签名bfgs_minimize使用 BFGS 拟牛顿方案对可微函数做无约束极小化算法细节参考 Nocedal Wright (2006)该文档引用了其第 136–140 页。完整签名tf_quant_finance.math.optimizer.bfgs_minimize( value_and_gradients_function, initial_position, tolerance1e-8, x_tolerance0, f_relative_tolerance0, initial_inverse_hessian_estimateNone, max_iterations50, parallel_iterations1, stopping_conditionNone, validate_argsTrue, max_line_search_iterations50, f_absolute_tolerance0, nameNone )关键参数参数默认值含义value_and_gradients_function—返回(value, gradient)的 Python 可调用对象initial_position—实数Tensor形状[..., n]搜索起点起点处函数值与梯度范数须有限tolerance1e-8梯度容忍度梯度上确界范数低于该值即停止x_tolerance0相邻两次迭代位置绝对变化小于该值即停止0表示不启用f_relative_tolerance0相邻两次目标值相对变化小于该值即停止f_absolute_tolerance0相邻两次目标值绝对变化小于该值即停止initial_inverse_hessian_estimateNone逆 Hessian 初始估计形状须可广播到[..., n, n]必须对称正定缺省时用单位矩阵max_iterations50最大迭代次数标量正 int32parallel_iterations1允许并行运行的迭代数stopping_conditionconverged_all停止策略可换converged_anyvalidate_argsTrue是否校验优化器参数合法性False时非法输入可能静默产生错误输出max_line_search_iterations50Hager-Zhang 线搜索的最大迭代次数nameNone操作名前缀缺省为minimize用法示例来自模块文档import numpy as np import tensorflow as tf import tensorflow_probability as tfp minimum np.array([1.0, 1.0]) # 二次碗的中心 scales np.array([2.0, 3.0]) # 两个轴上的尺度 def quadratic_loss_and_gradient(x): return tfp.math.value_and_gradient( lambda x: tf.reduce_sum(scales * tf.math.squared_difference(x, minimum), axis-1), x) start tf.constant([0.6, 0.8]) # 搜索起点 optim_results tfp.optimizer.bfgs_minimize( quadratic_loss_and_gradient, initial_positionstart, tolerance1e-8) assert optim_results.converged np.testing.assert_allclose(optim_results.position, minimum) print(Function evaluations: %d % optim_results.num_objective_evaluations) # 应为 5在optimizer_test.py中test_bfgs_minimize用 BFGS 一次性从 4 个不同起点出发找到 Himmelblau 函数的全部 4 个极小点(3,2)、(-2.805118, 3.131312)、(-3.779310, -3.283186)、(3.584428, -1.848126)验证了批量搜索与converged_all停止条件的配合。返回结果bfgs_minimize返回命名元组字段包括converged形状[...]的布尔Tensor指示每个 batch 成员是否在容忍度内找到极小值failed形状[...]的布尔Tensor指示线搜索是否未能找到满足 Wolfe 条件的步长无求值次数约束时它是converged的补集若因求值次数耗尽而停止则failed与converged可能同时为Falsenum_objective_evaluations目标函数总求值次数position形状[..., n]搜索找到的最终位置收敛时即目标函数的极小点objective_valueposition处的目标函数值objective_gradientposition处的梯度inverse_hessian_estimate形状[..., n, n]的估计逆 Hessian。L-BFGS 优化器lbfgs_minimize功能与签名lbfgs_minimize是 BFGS 的低内存版本Nocedal Wright 第 176–180 页不维护稠密逆 Hessian而是用最近若干步的位置增量, 梯度增量修正对做隐式近似适合高维问题。完整签名tf_quant_finance.math.optimizer.lbfgs_minimize( value_and_gradients_function, initial_position, previous_optimizer_resultsNone, num_correction_pairs10, tolerance1e-8, x_tolerance0, f_relative_tolerance0, initial_inverse_hessian_estimateNone, max_iterations50, parallel_iterations1, stopping_conditionNone, max_line_search_iterations50, f_absolute_tolerance0, nameNone )与 BFGS 不同的关键参数参数默认值说明previous_optimizer_resultsNone传入上一次的LBfgsOptimizerResults以恢复优化状态可配合新的stopping_condition续跑与initial_position只能指定其一num_correction_pairs10保留的(position_delta, gradient_delta)修正对数量控制隐式 Hessian 近似的记忆量initial_inverse_hessian_estimateNone文档注明当前版本暂不支持该选项其余参数tolerance、x_tolerance、f_relative_tolerance、max_iterations、parallel_iterations、stopping_condition、max_line_search_iterations、f_absolute_tolerance、name含义与 BFGS 一致。用法示例高维二次函数来自模块文档ndims 60 minimum np.ones([ndims], dtypefloat64) scales np.arange(ndims, dtypefloat64) 1.0 def quadratic_loss_and_gradient(x): return tfp.math.value_and_gradient( lambda x: tf.reduce_sum(scales * tf.math.squared_difference(x, minimum), axis-1), x) start np.arange(ndims, 0, -1, dtypefloat64) optim_results tfp.optimizer.lbfgs_minimize( quadratic_loss_and_gradient, initial_positionstart, num_correction_pairs10, tolerance1e-8) assert optim_results.converged np.testing.assert_allclose(optim_results.position, minimum)返回结果在 BFGS 字段基础上多了position_deltas与gradient_deltas分别编码最近的位置变化与梯度变化。测试test_lbfgs_minimize展示了 50 个随机二次碗的批量搜索batches50, dim10配合converged_any停止条件验证了批量 L-BFGS 的行为。共轭梯度优化器conjugate_gradient_minimizetff 自研算法背景conjugate_gradient_minimize是 tff 在仓库内自研实现的共轭梯度优化器实现 Hager Zhang 的 CG_DESCENT 算法[HZ2006]搜索方向的更新公式采用其 2013 年改进版本[HZ2013]线搜索部分调用 TFP 的linesearch.hager_zhang见源码 conjugate_gradient.py。该实现支持一维批量形状1-dimensional batch shape。完整签名tf_quant_finance.math.optimizer.conjugate_gradient_minimize( value_and_gradients_function, initial_position, tolerance1e-8, x_tolerance0, f_relative_tolerance0, max_iterations50, parallel_iterations1, stopping_conditionNone, paramsNone, nameNone )关键参数参数含义与 BFGS 中同名参数一致唯一的特殊参数是paramsConjugateGradientParams对象用于调节算法内部行为缺省时使用默认参数。用法示例来自模块文档minimum np.array([1.0, 1.0]) scales np.array([2.0, 3.0]) def quadratic(x): value tf.reduce_sum(scales * (x - minimum) ** 2) return value, tf.gradients(value, x)[0] start tf.constant([0.6, 0.8]) optim_results conjugate_gradient.minimize( quadratic, initial_positionstart, tolerance1e-8) with tf.Session() as session: results session.run(optim_results) assert results.converged np.testing.assert_allclose(results.position, minimum)ConjugateGradientParams 参数类ConjugateGradientParams是基于tff_utils.dataclass的数据类见 conjugate_gradient.py各字段均与 [HZ2006] 中的符号一一对应可独立调节字段默认值对应符号取值范围作用sufficient_decrease_param0.1delta(0, 0.5)Wolfe 条件充分下降参数curvature_param0.9sigma[delta, 1)Wolfe 条件曲率参数threshold_use_approximate_wolfe_condition1e-6epsilon(0, inf)切换近似 Wolfe 条件的阈值估计shrinkage_param0.66gamma(0, 1)线搜索收缩参数direction_update_param0.4eta(0, inf)计算下一方向时beta_k的下界参数expansion_param5.0rho(1.0, inf)线搜索区间未包络极小点时扩展初始区间的参数initial_guess_small_factor0.2psi_1(0, 1)线搜索初始猜测中前一步长乘以该因子以构造二次插值右端点initial_guess_step_multiplier2.0psi_2(1, inf)二次插值失败时对前一步长的乘数quad_stepTrueQuadStep布尔是否在线搜索初始步猜测时尝试二次插值源码级的算法流程从源码minimize可以还原完整实现脉络初始化计算起点处函数值f0与梯度df0梯度 L2 范数低于tolerance即判定初始收敛初始搜索方向取-df0负梯度主循环tf.while_loop驱动循环条件为迭代数未达上限且停止条件未满足_cond源码 L327-L331初始步长猜测_init_step对应 [HZ2006] 的 I1-I2以psi_1 * prev_step试探尝试二次插值quad_stepTrue时失败则回退到psi_2 * prev_step源码 L473-L540线搜索若初始步已满足精确/近似 Wolfe 条件则跳过对应 [HZ2006] 的 T1/T2 判定源码 L366-L381否则调用linesearch.hager_zhang执行 L0-L3 流程其中参数theta固定为 0.5不可调方向更新按 [HZ2013] 公式 (2.7)-(2.11) 计算beta_k并用eta_k做下界约束b_k max(b_k, eta_k)保证充分下降源码 L409-L419收敛判定梯度无穷范数 tolerance、位置绝对变化 x_tolerance、目标相对变化 f_relative_tolerance三者满足其一即视为该 batch 成员收敛源码 L421-L427。测试验证conjugate_gradient_test.py对算法做了系统性验证可作为使用参考单变量二次函数、随机二次型2~15 维、4 阶抛物面、逻辑回归5 维 L2 正则、几何 GLM 的 MLE 数据拟合经典测试函数Rosenbrock2 维与 7 维、Himmelblau4 个不同极小点、McCormick、Beale批量行为test_himmelblau_batch_all全部收敛与test_himmelblau_batch_anyconverged_any提前停止动态形状graph 模式下未知维度占位符与float32dtype 兼容性。无导数优化器Nelder-Meadnelder_mead_minimize功能与签名nelder_mead_minimize使用 Nelder-Mead 单纯形法对可能非光滑的函数做无约束极小化算法参考 Press et al. (2007) 与 Gao Han (2012)。注意该方法不支持单变量函数解空间维度n必须大于 1。完整签名tf_quant_finance.math.optimizer.nelder_mead_minimize( objective_function, initial_simplexNone, initial_vertexNone, step_sizesNone, objective_at_initial_simplexNone, objective_at_initial_vertexNone, batch_evaluate_objectiveFalse, func_tolerance1e-8, position_tolerance1e-8, parallel_iterations1, max_iterationsNone, reflectionNone, expansionNone, contractionNone, shrinkageNone, nameNone )初始单纯形的构建算法围绕一个满秩单纯形simplex迭代初始单纯形有两种提供方式直接指定initial_simplex形状为[n1] s的Tensorn为问题维度s为单个点的形状每行是一个顶点各行必须仿射独立由顶点生成给定initial_vertex单点与step_sizes构造坐标轴对齐单纯形即顶点集合S {v0} {v0 step_i * e_i}其中e_i是第i轴单位向量step_i是沿该轴的特征长度。step_sizes不指定时每轴取单位步长也可以只给一个标量用于所有轴或为每轴分别提供步长。initial_simplex与initial_vertex必须且只能提供一个否则抛出ValueErrorstep_sizes与initial_simplex同时指定也会报错。关键参数参数默认值说明batch_evaluate_objectiveFalse为True时一次性在[n1] s打包张量上批量求值所有顶点返回[n1]可利用向量化目标函数允许时推荐开启func_tolerance1e-8单纯形顶点上最大与最小函数值绝对差低于该值即停止position_tolerance1e-8顶点坐标最大绝对差低于该阈值即终止max_iterationsNone最大迭代次数int32None表示不限reflection/expansion/contraction/shrinkageNone单纯形四种几何变换的缩放参数反射顶点缩放正数、扩展缩放须 1且 reflection、收缩缩放(0,1)、收缩比例(0,1)。均不指定时采用 Gao Han (2012) 的维度相关自适应参数方案用法示例非光滑目标来自模块文档def sqrt_quadratic(x): return tf.sqrt(tf.reduce_sum(x ** 2, axis-1)) start tf.constant([6.0, -21.0]) optim_results tfp.optimizer.nelder_mead_minimize( sqrt_quadratic, initial_vertexstart, func_tolerance1e-8, batch_evaluate_objectiveTrue) assert optim_results.converged np.testing.assert_allclose(optim_results.position, np.array([0.0, 0.0]), atol1e-7) print(Function evaluations: %d % optim_results.num_objective_evaluations)该示例的目标sqrt(x1^2 x2^2)在原点不可微正好体现 Nelder-Mead 不依赖梯度的优势。测试test_nelder_mead_minimize用 Rosenbrock 函数验证了从[-1.0, 1.0]出发收敛到[1.0, 1.0]。返回结果包含converged、num_objective_evaluations、position、objective_value、final_simplex、final_objective_values、initial_simplex、initial_objective_values、num_iterations。全局优化器差分进化differential_evolution_minimize功能与签名differential_evolution_minimize实现差分进化Differential Evolution, DE——一种基于候选解种群population的进化算法通过变异mutation与重组recombination两种遗传算子迭代改进种群。候选s_1优于s_2当且仅当f(s_1) f(s_2)。完整签名tf_quant_finance.math.optimizer.differential_evolution_minimize( objective_function, initial_populationNone, initial_positionNone, population_size50, population_stddev1.0, max_iterations100, func_tolerance0, position_tolerance1e-8, differential_weight0.5, crossover_prob0.9, seedNone, nameNone )关键参数参数默认值说明initial_populationNone实数Tensor或Tensor列表列表时各张量须秩至少为 1 且第一维种群成员索引相同。种群规模至少为 4DE 算法硬性要求initial_positionNone单个种子解用于初始化种群与initial_population二选一否则抛ValueErrorpopulation_size50种群规模int32须 4指定了initial_population时忽略population_stddev1.0从initial_position生成种群时附加的零均值正态噪声标准差指定了initial_population时忽略max_iterations100种群进化的最大代数func_tolerance0种群中最大与最小目标值的绝对差低于该值即停止position_tolerance1e-8种群成员坐标的最大绝对差低于该阈值即终止differential_weight0.5变异强度参数须为正且 2.0crossover_prob0.9每个位点的重组概率须在(0, 1)之间seedNone随机种子int或None多部件状态multi-part state支持DE 优化器的一大特色是支持多部件状态目标函数可接收多个Tensor。模块文档给出了一个完整示例——求 Easom 函数-(cos x * cos y * exp(-(x-π)^2 - (y-π)^2))在(π, π)处的全局最小值该函数在全局最小点周围有大量平坦区域是检验全局优化器的经典问题population_size 40 # 方式一指定初始种群两部件状态 initial_population (tf.random.normal([population_size]), tf.random.normal([population_size])) def easom_fn(x, y): return -(tf.math.cos(x) * tf.math.cos(y) * tf.math.exp(-(x - np.pi) ** 2 - (y - np.pi) ** 2)) optim_results tfp.optimizer.differential_evolution_minimize( easom_fn, initial_populationinitial_population, seed43210) print(optim_results.converged) print(optim_results.position) # 应接近 [pi, pi] print(optim_results.objective_value) # 应为 -1 # 方式二指定单个起点由噪声生成种群 initial_position (tf.constant(1.0), tf.constant(1.0)) optim_results tfp.optimizer.differential_evolution_minimize( easom_fn, initial_positioninitial_position, population_size40, population_stddev2.0, seed43210)测试test_differential_evolution验证了 DE 对二次函数2*(x-1)^2 3*(y-1)^2的收敛性。返回结果字段丰富converged、num_objective_evaluations、position、objective_value、final_population、final_objective_values、initial_population、initial_objective_values、num_iterations便于观察种群演化全貌。单步迭代 APIdifferential_evolution_one_step 与 nelder_mead_one_step除完整优化流程外模块还提供两个单步函数适合需要自定义循环、观察中间状态或与外部控制流集成的场景differential_evolution_one_step对当前种群执行一步 DE 变异/重组。参数objective_function、population、differential_weight0.5、crossover_prob0.9、seed、name可选population_values当前种群的目标值不传则自动计算可节省一次批量求值。返回(next_population, next_population_values)。种群同样要求至少 4 个成员nelder_mead_one_step对当前单纯形执行一步 Nelder-Mead 迭代。参数current_simplex、current_objective_values、objective_function、dim、func_tolerance、position_tolerance、batch_evaluate_objective及reflection/expansion/contraction/shrinkage。两者的参数含义与对应完整优化器完全一致可以作为构建自定义停止逻辑或嵌套优化方案的基础构件。如何在量化实践中选用优化器综合本文内容给出基于仓库能力的选择建议可微目标、维度中等n 在几十以内优先bfgs_minimize收敛快、精度高且可通过initial_inverse_hessian_estimate注入先验信息可微目标、高维如曲线校准、参数化模型拟合选lbfgs_minimize通过num_correction_pairs控制内存与收敛速度的折中还可用previous_optimizer_results续跑优化目标不可微或梯度不稳定用nelder_mead_minimize注意维度须 ≥ 2配合batch_evaluate_objectiveTrue与 Gao-Han 自适应参数获得更好性能存在多个局部极小、需要全局搜索用differential_evolution_minimize利用其种群机制与多部件状态接口可配合func_tolerance/position_tolerance控制收敛精度批量校准同一模型多个市场场景所有优化器都支持[..., n]批量输入配合converged_all全部完成或converged_any最快收敛两种停止策略以及parallel_iterations控制并行度tff 自研共轭梯度适合对存储敏感的中等规模可微问题ConjugateGradientParams提供了对线搜索与方向更新的细粒度控制是理解 Hager-Zhang 算法的最佳参考实现。进一步阅读模块入口与符号清单见tf_quant_finance/math/optimizer/__init__.py共轭梯度完整实现见conjugate_gradient.py测试用例可参考optimizer_test.py与conjugate_gradient_test.py模块构建配置见BUILD。赞分享金融科技科学计算【免费下载链接】tf-quant-financeHigh-performance TensorFlow library for quantitative finance.项目地址https://gitcode.com/gh_mirrors/tf/tf-quant-finance点击查看免费下载相关推荐tf-quant-finance 数值优化模块实战指南BFGS、L-BFGS、Nelder-Mead 与共轭梯度tf quant finance 数值优化模块实战指南BFGS、L BFGS、Nelder Mead 与共轭梯度 tf_quant_finance.math.金融科技科学计算tf-quant-finance 共轭梯度优化器conjugate_gradient_minimize 完整实战指南tf quant finance 共轭梯度优化器conjugate_gradient_minimize 完整实战指南 导读 本文围绕 tf quant fin金融科技科学计算tf-quant-finance 的 L-BFGS 无约束优化器lbfgs_minimize 使用指南与源码解读tf quant finance 的 L BFGS 无约束优化器lbfgs_minimize 使用指南与源码解读 L BFGSLimited memory金融科技科学计算上一篇如何用 FakeLocation 为每个应用独立模拟定位零 Root 的完整上手指南下一篇一个App一个位置FakeLocation免费开源虚拟定位模块上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑