python - 在 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 中的完整代码。
额外细节
以下是一些可能有助于澄清问题的更多细节。
LBFGS 和 LBFGS-B 本教程提供的入门代码使用 LBFGS 来最小化 thetas,虽然我在 Scipy 中没有找到确切的等价物,但我使用的是 scipy.optimize.fmin_l_bfgs_b。我在 Wikipedia 上读到 LBFGS-B 是 LBFGS 的盒装版本。我想他们应该给出相同的结果?
两种实现都通过了数值梯度检查,我认为这意味着梯度计算是正确的。
结果看起来有些正确。正如讲义中所指出的,一个正确的实现应该得到一个线检测器的集合,这意味着每个补丁看起来像一条直线的图片。
这是 Python 的结果(成本为 0.457)。 Python实现的结果
这是 MATLAB 的结果(成本为 0.446)。 在此处输入图像描述
解决方案
推荐阅读
- javascript - Vue.js - 将模板传递给孙子
- javascript - IE 缩进两个而不是一个
- php - Woocommerce cron 作业 - 单独更改订单的订单状态
- c# - Zip 文件未完全更新
- python - 使用 venv python 为 R 安装 tensorflow?
- java - 清除控制台屏幕以接受来自用户的新值
- javascript - React:尝试在 componentDidMount 之后使用 jquery
- python - 如何更改 LSTM 层的输入尺寸
- swift - GULUserDefaults.m - 109 崩溃
- python - 如何在 Python 中计算两个字节的异或?