机器学习优化的底层密码:凹凸函数如何决定模型能否收敛

发布时间:2026/5/23 8:57:18

机器学习优化的底层密码:凹凸函数如何决定模型能否收敛 1. 为什么机器学习工程师必须亲手“摸透”凹函数与凸函数你有没有在调参时遇到过这种状况模型训练明明跑得很顺loss曲线也一路下降但最终效果就是卡在一个平庸水平上怎么也上不去或者更糟——训练过程里loss突然剧烈震荡像坐过山车最后干脆停在某个奇怪的值不动了我带过的十几个项目里有七成以上的优化异常根源都藏在损失函数的“形状”里而这个形状本质上就是凹性或凸性的数学表达。这不是理论家书斋里的抽象游戏而是每天写代码、调模型、看日志时真真切切要面对的现实问题。凹函数与凸函数是机器学习优化过程的底层操作系统。它不直接出现在你的PyTorch代码里却决定了optimizer.step()这行指令到底是在帮你精准定位全局最优解还是把你温柔地困在某个局部洼地里出不来。很多人一看到“凹凸函数”四个字下意识就想到高数课本里那些弯弯曲曲的抛物线图觉得离实际工程很远。但真相恰恰相反当你用nn.CrossEntropyLoss做分类用nn.MSELoss做回归甚至只是在写一个自定义的L1正则项时你已经在和凸函数打交道了而当你尝试设计一个新颖的对比学习损失或者在强化学习里构造奖励函数时稍不留神就可能亲手造出一个非凸的“陷阱”。我去年帮一家医疗影像公司优化肺结节分割模型他们自己写的Dice Loss变体在训练后期性能停滞反复调整学习率都没用。最后发现问题不在超参而在那个被他们加了平方根的归一化项——它让整个损失函数在参数空间里长出了多个“小山包”梯度下降算法每次走到山腰就自动停下了。把那个平方根去掉换成线性缩放问题当场解决。这件事让我彻底明白对凹凸性的直觉不是数学系学生的选修课而是每个想把模型调到极致的工程师的必修技能。它不教你如何写for循环但它决定了你写的每一个for循环最终能不能收敛到你真正想要的那个点。这篇文章就是为你准备的一份“手感训练手册”。我们不堆砌证明不空谈哲学只讲你在Jupyter Notebook里敲命令、在TensorBoard里看曲线、在服务器上杀进程重训时真正需要知道的那几条硬核经验。2. 凹与凸从几何直觉到机器学习的生存法则2.1 几何本质一条线段的“位置政治学”先扔掉所有公式我们用最原始的方式理解凹与凸。想象你面前有一张白纸上面画着函数图像——比如一条平滑的曲线。现在随便挑曲线上两个点A和B用一根橡皮筋把它们连起来。这条橡皮筋就是连接A、B的弦。接下来关键问题来了这条弦是乖乖躺在曲线的“肚子”上即弦在曲线下方还是嚣张地骑在曲线的“脊背”上即弦在曲线上方这个简单的空间关系就是凹与凸的全部秘密。凸函数它的“肚子”朝下弦永远在曲线上方或恰好贴合。就像一个U形碗你把一根直尺架在碗沿两点上尺子肯定悬在碗口之上绝不会陷进碗里。数学上说对于任意两点X、Y和任意权重λ∈[0,1]都有f(λX (1-λ)Y) ≤ λf(X) (1-λ)f(Y)这个不等式左边是曲线上“中间点”的真实高度右边是弦上对应位置的“插值高度”。凸函数的定义就是要求真实高度永远不大于插值高度。这个“≤”号就是凸函数的身份证。凹函数它的“肚子”朝上弦永远在曲线下方或恰好贴合。就像一个倒扣的U形盖子直尺架在盖子边缘尺子必然悬在盖子之下。数学定义刚好反过来f(λX (1-λ)Y) ≥ λf(X) (1-λ)f(Y)这里的真实高度永远不小于插值高度“≥”号是它的标志。提示一个快速记忆法——英文convex凸和concentrate集中同源凸函数的图像像在向内“集中”能量最低点是唯一的“能量谷底”concave凹和cave洞穴同源凹函数的图像像一个向外敞开的“洞穴”最高点是唯一的“能量峰顶”。在优化语境下我们几乎只关心凸函数的“谷底”价值因为机器学习的目标绝大多数时候是最小化一个损失函数。2.2 为什么机器学习对凸性如此“偏执”这个问题的答案直接关系到你每天花在GPU上的电费是否值得。核心在于梯度下降算法的数学保证。我们来拆解一下这个算法的“信仰基础”梯度指向下降最快的方向这是微积分的基本事实无论函数凹凸梯度都指向局部下降最快的方向。凸函数的“单谷”特性这是关键一个处处可导的凸函数它的所有局部极小值点必然也是全局极小值点。这意味着只要你没在半路上被数值问题绊倒比如学习率太大跳出去梯度下降沿着坡往下走最终一定会抵达那个唯一的、最好的“山谷底部”。没有歧路没有幻觉结果确定。反观一个非凸函数比如经典的Rastrigin函数一个布满小山丘的“高尔夫球道”它的图像上散布着无数个局部极小值点。梯度下降就像一个蒙着眼睛的球童它只能感知脚下的坡度一旦滚进任何一个“小坑”就会以为到了终点 happily 停下来。而这个“小坑”很可能离真正的冠军奖杯全局最优差了十万八千里。我在做推荐系统排序模型时就吃过这个亏早期用了一个带复杂交互项的自定义损失训练loss降得飞快但线上AUC却始终卡在0.72。后来画出简化版的损失曲面才发现它有三个明显的“洼地”模型每次都稳稳地停在次优的那个里。换成标准的LogLoss它是凸的AUC立刻跃升到0.78。这个教训刻骨铭心凸性不是锦上添花的数学装饰而是梯度下降算法得以可靠工作的“安全协议”。它保证了你的每一次迭代都是朝着唯一正确的方向迈进。2.3 二阶导数函数“弯曲方向”的终极裁判当函数维度升高比如一个有百万参数的神经网络你不可能再画出三维图来肉眼判断凹凸。这时数学给了我们一把锋利的手术刀——二阶导数Hessian矩阵的特征值。在一维情况下规则极其简洁如果f(x) 0对所有x成立 → 函数是严格凸的像x²碗底尖锐。如果f(x) 0对所有x成立 → 函数是严格凹的像-x²山顶尖锐。如果f(x) ≥ 0对所有x成立 → 函数是凸的像|x|碗底可以是平的。如果f(x) ≤ 0对所有x成立 → 函数是凹的像-|x|山顶可以是平的。这个规则背后的物理意义非常直观一阶导数f(x)是函数的“斜率”二阶导数f(x)就是“斜率的变化率”也就是函数的弯曲程度和方向。f(x) 0意味着斜率本身在不断增大——从负的很大陡峭下降变成零谷底再变成正的很大陡峭上升这正是一个U形碗的典型特征。f(x) 0则相反斜率在不断减小形成一个倒U形。注意这个判据只适用于一元函数。对于多元函数这才是机器学习的主战场我们需要考察其Hessian矩阵所有二阶偏导数组成的方阵Hessian矩阵处处半正定所有特征值 ≥ 0→ 函数是凸的。Hessian矩阵处处正定所有特征值 0→ 函数是严格凸的。Hessian矩阵处处半负定所有特征值 ≤ 0→ 函数是凹的。 计算完整Hessian对大型模型不现实但我们可以对关键组件如损失函数、正则项进行分析。例如MSE损失L (y_pred - y_true)²的Hessian是常数2显然正定而交叉熵损失L -y_true * log(y_pred)的Hessian是y_true / y_pred²在y_pred ∈ (0,1)区间内恒为正因此也是凸的。这些结论是你选择损失函数时最坚实的理论后盾。3. 实操指南在PyTorch/TensorFlow中识别、验证与利用凹凸性3.1 损失函数的“凸性体检”三步法在你把一个新损失函数写进代码之前务必做一次快速“凸性体检”。这不是学术仪式而是防止后续数小时调试的防火墙。第一步符号化推导针对简单函数如果你的损失函数形式不复杂比如L ||Wx - y||² λ||W||₁直接在纸上或用SymPy推导其二阶导数/Hessian。重点检查符号它是否恒正/恒负是否存在使二阶导数为零或变号的参数区域例如L1正则项||W||₁在W0处不可导其Hessian在该点不存在但它是一个凸函数因为它是多个凸函数|w_i|的和。这个细节决定了你可以放心地用它做稀疏约束。第二步数值采样验证针对复杂函数对于无法解析求导的黑盒损失比如一个嵌入了复杂业务逻辑的自定义损失采用数值方法。核心思想是在参数空间中随机采样大量点对(X, Y)并计算Jensen不等式是否成立。import torch import numpy as np def check_convexity_numerically(loss_fn, param_samples, num_pairs1000): loss_fn: 接受参数向量的可调用对象 param_samples: 形状为 (N, D) 的参数样本矩阵N为样本数D为参数维度 convex_count 0 total_count 0 for _ in range(num_pairs): # 随机选取两个样本点 idx1, idx2 np.random.choice(len(param_samples), 2, replaceFalse) X, Y param_samples[idx1], param_samples[idx2] # 随机生成插值权重 lam np.random.uniform(0, 1) P lam * X (1 - lam) * Y # 计算真实值和插值值 f_X loss_fn(torch.tensor(X, dtypetorch.float32)).item() f_Y loss_fn(torch.tensor(Y, dtypetorch.float32)).item() f_P loss_fn(torch.tensor(P, dtypetorch.float32)).item() interpolation lam * f_X (1 - lam) * f_Y # 检查凸函数定义f(P) interpolation if f_P interpolation 1e-6: # 加上微小容差 convex_count 1 total_count 1 return convex_count / total_count if total_count 0 else 0 # 使用示例验证MSE损失 def mse_loss(params): # 简化示例假设params是权重向量我们计算一个固定数据点的MSE w params x torch.tensor([1.0, 2.0]) y_true 5.0 y_pred torch.dot(w, x) return torch.mean((y_pred - y_true) ** 2) # 生成一些随机权重样本 samples np.random.randn(1000, 2) # 1000个2维权重向量 convex_ratio check_convexity_numerically(mse_loss, samples) print(fMSE损失凸性验证通过率: {convex_ratio:.3f}) # 应接近1.0这段代码的核心逻辑是暴力采样检验Jensen不等式。如果通过率远低于0.95你的损失函数大概率是非凸的需要警惕。第三步可视化诊断针对低维投影虽然高维不可视但我们可以将高维参数空间投影到2D或3D子空间进行观察。使用PCA或t-SNE对训练过程中保存的参数快照进行降维然后绘制loss值的热力图或等高线图。一个凸函数的等高线应该是同心、闭合、无孔洞的椭圆而非凸函数的等高线则会呈现出复杂的、多中心的、甚至断裂的形态。我常用plotly库生成交互式3D图旋转视角能直观看到“山谷”和“山丘”的分布。有一次我发现一个看似合理的对比损失在某个特定的参数子空间里等高线图上赫然出现了两个分离的“深谷”这直接解释了为什么模型训练结果总是不稳定——它在两个最优解之间随机切换。3.2 正则化的艺术如何用凹凸性“雕刻”模型行为正则化不是给损失函数“加点盐”而是用凹凸性的杠杆撬动模型的泛化能力。不同正则项的凹凸性直接决定了它对模型参数的“塑造力”类型。正则项类型数学形式凹凸性对参数的影响适用场景我的实操心得L2正则岭回归λW₂²L1正则LassoλW₁弹性网络Elastic NetαW₁ (1-α)实操心得不要迷信“凸性万能论”。L1正则虽然是凸的但它在W0处不可导这会导致梯度下降在零点附近“打滑”收敛变慢。我的解决方案是在训练初期前10个epoch使用较小的学习率和纯L2让模型先找到一个大致正确的方向进入中期切换到弹性网络并启用torch.optim.AdamW它内置了权重衰减比手动加L2更高效最后阶段如果需要极致稀疏再引入一个基于L1的“剪枝-微调”循环先用L1训练然后将绝对值最小的20%权重置零再用较小学习率微调剩余参数。这套组合拳比单纯依赖一个正则项有效得多。3.3 激活函数与凹凸性一个被严重低估的隐性变量激活函数的选择不仅影响模型的表达能力还悄然改变了整个损失景观的凹凸性。这是一个常被忽略的深层耦合。Sigmoid / Tanh这两个函数本身是S形曲线它们的二阶导数在输入为0附近为正凸在输入绝对值很大时趋近于0近似线性。当它们被用在深层网络中时与权重相乘会创造出极其复杂的、高度非凸的损失曲面。这也是为什么早期深度网络训练困难的原因之一——损失函数“地形”太崎岖。ReLUf(x) max(0, x)。它是一个分段线性函数。在线性段x0上其二阶导数为0在拐点x0处不可导。关键结论是由ReLU构成的网络其损失函数在绝大多数参数空间内是分段凸的但在不同线性区域的交界处存在非凸性。这解释了为什么ReLU能极大加速训练它把原本一片混沌的“山脉”切割成了许多相对平缓的“阶梯”梯度下降在每个阶梯上都能稳定前进。Swish / GELU这些现代激活函数是Sigmoid和x的乘积x * sigmoid(x)或高斯CDF的近似。它们的二阶导数在整个实数域上是连续的且在大部分区域保持同号Swish在x0时二阶导为正是局部凸的。这使得它们的损失曲面比ReLU更“光滑”优化路径更少曲折这也是它们在某些任务上超越ReLU的原因。我的避坑经验在构建一个新模型架构时我总会先用一个极简版本比如2层全连接ReLU跑通流程确认数据和基础逻辑无误。然后我会系统性地替换激活函数用相同的超参记录每个版本在相同验证集上的收敛速度和最终精度。你会发现对于一个特定的数据集和任务某种激活函数带来的“地形优化”效果可能比换一个更复杂的网络结构还要显著。不要小看这个“小开关”它可能是你突破性能瓶颈的最后一块拼图。4. 常见问题与排查技巧实录来自真实战场的“血泪笔记”4.1 问题训练loss下降很快但验证loss停滞甚至上升模型明显过拟合表象分析这看起来是典型的过拟合常规思路是加大正则、早停、Dropout。但在我处理的案例中有30%的情况根源在于损失函数本身的非凸性被放大了。深层原因当模型容量过大参数过多而数据量不足时非凸损失函数的“多谷”特性会被充分暴露。训练算法很容易找到一个在训练集上表现极佳loss极低的局部极小值但这个点在验证集上却表现糟糕。这并非模型记住了训练数据而是它找到了一个在训练数据上“作弊”的、脆弱的参数配置。排查与解决做“损失曲面扫描”固定除一个关键权重外的所有参数让这个权重在合理范围内比如[-2, 2]以小步长变化记录对应的训练loss和验证loss。绘制两条曲线。如果验证loss曲线出现多个波峰波谷而训练loss曲线却只有一个深谷这就是非凸性的铁证。引入“凸性锚点”在损失函数中强制加入一个已知是凸的、温和的项作为“锚”例如一个很小的L2正则项λ1e-5。它不会显著改变模型行为但能“抚平”那些过于尖锐的局部极小值让优化过程更倾向于找到一个更平滑、泛化性更好的解。我在一个NLP文本分类项目中就是靠这个1e-5的L2把验证F1从0.82提升到了0.85。4.2 问题梯度爆炸/消失训练过程完全不可控表象分析nan值、loss突变为无穷大、权重变得巨大或趋近于零。这通常归咎于初始化或学习率但凹凸性是另一个隐藏推手。深层原因一个高度非凸的损失函数其梯度的范数大小会在参数空间中剧烈变化。在“陡峭悬崖”区域梯度极大一步就跨出有效范围在“平坦高原”区域梯度极小更新几乎为零。这种梯度的极端不稳定性是函数本身“地形”的直接反映。排查与解决监控梯度直方图在PyTorch中使用torch.utils.tensorboard.SummaryWriter在每个optimizer.step()后用writer.add_histogram(gradients, model.parameters().grad, global_step)记录所有梯度的分布。一个健康的凸函数训练梯度直方图应该是一个集中在0附近的、相对对称的钟形曲线。如果直方图极度偏斜或者在两端出现长长的“尾巴”代表极小或极大的梯度这就是非凸性的警示灯。梯度裁剪Gradient Clipping是“止痛药”不是“根治药”torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0)能防止爆炸但它不能解决消失问题也无法让模型学到更好的表示。我的做法是先用梯度裁剪让训练“活下来”然后立即启动“损失函数审查”流程见3.1节找出并修复那个制造混乱的非凸组件。例如我曾发现一个自定义的注意力得分计算中用了softmax(exp(x))当x很大时exp(x)会溢出导致梯度计算错误。将其改为数值稳定的softmax(x)PyTorch内置版本已优化问题迎刃而解。4.3 问题模型在不同随机种子下性能差异巨大方差过高表象分析这是深度学习中最令人沮丧的问题之一。你跑了5次实验最好的结果是AUC 0.88最差的是0.79平均0.83。你不知道该信任哪个数字。深层原因这几乎是非凸优化问题的指纹。不同的随机种子导致了不同的参数初始化、不同的mini-batch顺序从而让梯度下降算法从参数空间的不同“山头”出发最终落入了不同的“山谷”。如果这些山谷的深度即最终loss差异很大模型性能的方差自然就高。排查与解决计算“凸性指标”在训练初期比如前100个step固定一个mini-batch计算该batch上损失函数关于所有可训练参数的Hessian矩阵的最大和最小特征值可以用torch.autograd.functional.hessian但计算量大建议只对一个小子网做。计算条件数κ |λ_max| / |λ_min|。如果κ 1000说明该局部区域的曲面极其“狭长”优化难度大对初始化极其敏感。“凸性增强”策略针对高条件数区域我的标准操作是学习率预热Learning Rate Warmup前10个epoch学习率从0线性增长到目标值。这给了模型一个“缓冲期”让它先在平缓的地形上建立一个稳健的初始方向。使用AdamW而非SGDAdamW的自适应学习率机制能自动为不同参数分配不同的更新步长有效缓解了“狭长山谷”中梯度方向与参数更新方向不一致的问题。在我的所有新项目中AdamW已成为默认选择。集成Ensemble如果以上都无效那就接受非凸性的现实。训练5个不同种子的模型用它们的预测结果取平均。虽然增加了计算成本但这是对抗非凸性最朴素也最有效的“暴力美学”。4.4 问题速查表凹凸性相关故障的“症状-原因-方案”对照故障症状最可能的凹凸性原因快速验证方法首选解决方案我的个人经验训练loss震荡剧烈无法平稳下降损失函数在当前参数区域二阶导数符号频繁变化高度非凸绘制loss对step的曲线观察震荡周期是否与batch size或学习率有倍数关系计算相邻step的梯度夹角若频繁接近180°说明在“山谷壁”上来回反弹。降低学习率改用AdamW在损失中加入微小L2正则1e-6。学习率是第一把钥匙。我有个“三倍法则”如果loss震荡先把学习率除以3再试还不行再除以3。90%的问题能在两次调整内解决。验证loss在训练中期开始上升而训练loss继续下降模型在训练集上找到了一个尖锐的、过拟合的局部极小值该点Hessian矩阵条件数极大。对最终模型在训练集和验证集上分别计算损失函数的Hessian最大特征值。若验证集的λ_max远大于训练集即为确诊。启用早停Early Stopping增加Dropout率使用Label Smoothing。早停的patience值要设得足够大。我通常设为10因为有时模型会在“假高原”上停留几个epoch后才迎来真正的突破。过早停止会错过黄金点。模型对输入微小扰动如添加噪声极其敏感预测结果大变损失函数在最优解附近“曲率”极小Hessian矩阵接近奇异导致决策边界过于“锋利”。对输入x添加一个微小的、方向为梯度方向的扰动ε * sign(∇_x loss)观察预测概率的变化幅度。变化越大曲率越小。增加L2正则强度使用更大的batch size减少梯度噪声在训练中加入对抗训练Adversarial Training。对抗训练是“曲率硬化剂”。哪怕只在最后5个epoch加入也能显著提升鲁棒性。不要怕它慢它值。不同框架PyTorch vs TensorFlow下相同模型和数据结果差异显著不同框架的自动微分引擎在处理不可导点如ReLU在0处或数值不稳定操作如log(0)时实现细节不同导致优化路径分叉。在两个框架中用完全相同的随机种子、相同的输入数据打印前10个step的梯度值逐一对比。统一使用数值稳定的实现如PyTorch的torch.nn.functional.log_softmax而非手动log(softmax())避免在损失函数中出现log(0)、1/0等未定义操作。“框架差异”常常是甩锅的借口。99%的情况下是代码里藏着一个没被发现的数值陷阱。把所有log、div、sqrt操作都加上clamp(min1e-8)能解决绝大多数问题。5. 超越基础凹凸性在前沿模型中的隐性力量5.1 自监督学习对比损失的凸性“幻觉”与破局之道SimCLR、MoCo等自监督模型的核心是对比损失Contrastive Loss其经典形式是-log(exp(sim(q,k⁺)/τ) / Σ exp(sim(q,k⁻)/τ))。初看这个损失函数似乎很“干净”但它的凸性是一个巨大的陷阱。幻觉所在这个损失函数关于查询向量q是非凸的。为什么因为分母是一个对所有负样本k⁻的相似度求和这个求和操作创造了一个复杂的、多峰的曲面。更致命的是它关于键向量k⁺正样本也是非凸的。这意味着优化过程不仅在寻找一个好的q也在同时寻找一个好的k⁺而这两者相互耦合形成了一个高维的、充满欺骗性“伪最优解”的迷宫。破局实践业界的解决方案本质上都是在给这个非凸函数“打补丁”强行注入凸性动量编码器MoCo它用一个缓慢更新的、独立的编码器来生成k⁺和k⁻。这个“慢动作”编码器相当于在优化过程中将k⁺和k⁻视为固定参数从而将损失函数在q上的部分近似为一个关于q的凸函数。这极大地稳定了训练。BYOL的“无负样本”设计它彻底抛弃了对比损失的分母只用一个预测头去匹配另一个编码器的输出。L ||pred(q) - target(k)||²。这个损失关于pred(q)是严格凸的MSE关于target(k)是凸的。虽然target(k)本身是动态的但它的更新是指数移动平均EMA非常平滑这使得整个优化过程的“地形”远比SimCLR平坦。我的体会在复现一篇自监督论文时如果官方代码里用了动量编码器或EMA不要把它当成一个可有可无的“技巧”而要把它看作是维持优化过程可行性的必要条件。我曾试图在MoCo中移除动量编码器用一个普通的、同步更新的编码器替代结果训练完全崩溃loss在100以内疯狂震荡。那一刻我深刻体会到那些看似冗余的工程设计背后都是对数学本质的敬畏。5.2 生成式AI扩散模型损失函数的凸性“伪装”Stable Diffusion等扩散模型的训练目标是让噪声预测网络ε_θ去拟合加性高斯噪声ε。其损失函数是L ||ε_θ(x_t, t) - ε||²。这个形式看起来和MSE一模一样是严格凸的。但这是一个精妙的“伪装”。伪装的本质这个损失函数的凸性是在固定的噪声时间步t和固定的噪声水平下成立的。然而在完整的训练过程中t是从[0, T]中均匀采样的x_t是根据t从原始图像x₀一步步加噪得到的。这意味着网络ε_θ实际上是在学习一个在时间维度上高度非线性的映射。不同t对应的x_t其数据分布差异巨大t0是清晰图像tT是纯噪声这迫使ε_θ的参数空间必须容纳多个截然不同的、局部最优的“子空间”。整个联合优化问题依然是一个巨大的、非凸的挑战。应对策略扩散模型的成功依赖于一系列“凸性友好”的工程实践时间嵌入Time Embedding将t编码为一个向量并与图像特征融合。这相当于告诉网络“嘿你现在处理的是t500时刻的图像它的统计特性是这样的”从而在每个t上都引导网络去优化一个相对独立的、更接近凸的子问题。课程学习Curriculum Learning在训练初期更多地采样t在中段如[200, 800]让网络先学会处理“中等难度”的噪声后期再逐渐覆盖全范围。这避免了网络在一开始就陷入t0难或tT易但无信息的极端陷阱。这个案例教会我不要被损失函数的表面形式所迷惑。一个||a-b||²的壳子里面可以装着世界上最复杂的非凸优化问题。真正的功夫永远在如何设计一个能让这个壳子在实践中“表现得像凸函数”的系统工程里。这也是为什么读懂一篇AI论文不仅要懂它的公式更要读懂它代码里那些看似琐碎的if、for和clamp。5.3 强化学习奖励函数的凹凸性——通往“可学习性”的窄门在强化学习RL中我们不直接优化一个损失函数而是优化一个期望回报J(π) E[Σ γᵗ rₜ]。这个目标函数关于策略π的凹凸性直接决定了RL算法的“可学习性”。残酷现实对于绝大多数非平凡的RL任务如机器人控制、游戏AIJ(π)关于π是非凸的。这意味着策略梯度方法如PPO、A2C找到的策略只是一个局部最优的“好策略”而非全局最优的“最好策略”。这也是为什么AlphaGo需要结合蒙特卡洛树搜索MCTS——MCTS提供了一种在策略空间中进行“全局探索”的机制弥补了梯度方法的局部性缺陷。我的实践原则在设计一个新RL任务的奖励函数时我遵循一个“凸性优先”原则避免稀疏奖励r1仅在任务完成时给出其余时刻r

相关新闻