用MATLAB实现fmin\u l\u bfgs\u b的差异Scipy.optimiz公司

2024-06-25 06:00:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我在斯坦福UFLDL系列(http://ufldl.stanford.edu/wiki/index.php/Exercise:Sparse_Autoencoder)中学习稀疏自动编码器教程。你知道吗

我完成了MATLAB版本的实现,它运行得非常好,但是我注意到将相同的实现移植到Python(使用numpy、scipy和Matplotlib)时存在一些差异。你知道吗

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

因为这两个实现在理论上是相同的(相同的cost func,相同的gradient,相同的minFunc,LBFGS)

因为我怀疑这个问题是以代价函数和梯度计算为条件的,所以我不能在几行中重现它。但是您可以在Github(https://github.com/alanhyue/cs294a_2011-sparseAutoencoders)上找到Python和MATLAB的完整代码。你知道吗

其他细节

下面是一些可能有助于澄清问题的更多细节。你知道吗

  1. LBFGS和LBFGS-B 教程提供的启动程序代码使用LBFGS最小化thetas,而我在Scipy中没有找到完全等效的,我使用的是scipy.optimize.fmin\u l\u bfgs\u b我在维基百科上读到LBFGS-B是LBFGS的盒装版本。我想他们应该给出同样的结果?

  2. 两个实现都通过了数值梯度检查 我假设这意味着梯度计算是正确的。

  3. 结果看起来有点正确。 如课堂讲稿所示,一个正确的实现应该得到一组线检测器,这意味着每个补丁看起来就像一条直线的图片。

下面是Python的结果(代价为0.457)。 Results of Python implementation

这是MATLAB的结果(代价为0.446)。 enter image description here


Tags: 函数版本http教程scipy差异细节梯度