首页 > 解决方案 > 在 MATLAB 和 Scipy.optimize 中实现的 fmin_l_bfgs_b 的差异

问题描述

我正在关注斯坦福 UFLDL 系列(http://ufldl.stanford.edu/wiki/index.php/Exercise:Sparse_Autoencoder)中的稀疏自动编码器教程。

我完成了 MATLAB 版本的实现,它工作得非常好,但是当将相同的实现移植到 Python(使用 numpy、scipy 和 Matplotlib)时,我注意到了一些差异。

我注意到成本函数没有最小化到相同的大小。我知道由于 thetas 是随机初始化的,每次运行都会给出不同的最终成本值,但是在重新运行两个实现 20 多次后,我总是看到 Python 实现导致f_cost = 4.57e-1而 MATLAB 版本给出围绕f_cost = 4.46e-1回答。换句话说,存在~0.01的一致差异。

因为这是两个理论上相同的实现(相同的成本函数、相同的梯度、相同的 minFunc、LBFGS)

由于我怀疑这个问题取决于成本函数和梯度计算,所以我无法用几行代码重现它。但是您可以在 Github ( https://github.com/alanhyue/cs294a_2011-sparseAutoencoders ) 上找到 Python 和 MATLAB 中的完整代码。

额外细节

以下是一些可能有助于澄清问题的更多细节。

  1. LBFGS 和 LBFGS-B 本教程提供的入门代码使用 LBFGS 来最小化 thetas,虽然我在 Scipy 中没有找到确切的等价物,但我使用的是 scipy.optimize.fmin_l_bfgs_b。我在 Wikipedia 上读到 LBFGS-B 是 LBFGS 的盒装版本。我想他们应该给出相同的结果?

  2. 两种实现都通过了数值梯度检查,我认为这意味着梯度计算是正确的。

  3. 结果看起来有些正确。正如讲义中所指出的,一个正确的实现应该得到一个线检测器的集合,这意味着每个补丁看起来像一条直线的图片。

这是 Python 的结果(成本为 0.457)。 Python实现的结果

这是 MATLAB 的结果(成本为 0.446)。 在此处输入图像描述

标签: pythonscipyautoencoder

解决方案


推荐阅读