高斯过程回归超参数优化结果不一致:自实现与Scikit-Learn差异
GPR超参数优化结果差异的核心原因
- 优化空间的坐标系根本不统一
scikit-learn 的GPR实现全程在超参数的对数空间执行L-BFGS-B求解:对v * RBF() + WhiteKernel()这类核组合,实际待优化的变量是[log(信号方差v), log(RBF长度尺度), log(WhiteKernel噪声水平)],所有参数的默认边界也会自动映射到对数域。而自行实现的流程是直接在原始物理参数空间设置[0.0005, 100]的边界做优化,两者的搜索域完全不在同一坐标系下,优化得到的参数自然无法直接对标。你自行实现得到的结果里,长度尺度卡在99.99的上边界、噪声水平卡在0.0005的下边界,就是因为原始空间的优化容易被边界约束卡死,根本到不了真正的最优极值点。 - 初始搜索策略的广度不一样
scikit-learn 设置的50次重启,本质是在对数空间内多次随机生成初始值,逐次用L-BFGS-B求解对应的局部极值,最终选择边缘似然最高的结果作为全局最优。而自行实现的流程仅用固定初始值[1.1, 1.6, 0.05]做单起点优化,单起点的L-BFGS-B非常容易陷在离初始点最近的局部最优里,根本遍历不到和sklearn一致的全局解。 - 似然计算的细节存在偏差
sklearn 计算对数边缘似然时,会自动给协方差矩阵加入1e-10量级的微小数值抖动,避免矩阵奇异导致的求逆、行列式计算误差;如果自行实现的似然函数没加这层数值稳定处理,或者参数顺序和核组件的对应关系错配,都会进一步放大结果的差异。
实现两类流程结果对齐的调整方法
- 把搜索域统一到对数空间
将所有待优化超参数转换为对数形式作为优化变量,即theta = [log(v), log(l), log(noise)],对应的物理边界[0.0005, 100]同步换算为对数边界[log(0.0005), log(100)],完全匹配sklearn的优化空间定义。 - 对齐对数边缘似然的计算逻辑
严格按照标准公式实现计算:
其中I为单位矩阵,slogdet用来计算协方差矩阵的对数行列式,避免大数值带来的精度损失。LML = -0.5 * y.T @ inv(K + 1e-10*I) @ y - 0.5 * slogdet(K)[1] - 0.5 * n * log(2*pi) - 对齐初始搜索策略
参考sklearn的多重启逻辑,不要只用单个固定初始点求解,按相同的分布在对数空间边界内随机生成多组初始点逐次优化,保留似然值最优的参数结果;如果需要完全复现sklearn的结果,可以固定sklearn内部生成初始点的随机种子,排除随机采样带来的差异。 - 校准参数的对应顺序
确认目标函数接收的参数顺序和核组件的顺序完全对应:第一个优化值对应核的信号方差、第二个对应RBF长度尺度、第三个对应WhiteKernel的噪声水平,避免参数错位带来的结果误判。
内容的提问来源于stack exchange,提问作者Pasquale Russo
相关产品推荐
相关产品推荐

