如何在MNIST上训练自动编码器的遗传算法的收敛性?

时间:2019-01-17 19:52:37

标签: pytorch genetic-algorithm autoencoder

下面链接的示例代码只有两个文件/几百行python(包括GA库)。它使用GA在MNIST上训练三层自动编码器。

https://github.com/patniemeyer/ga-autoencoder

该代码似乎可以正常工作,但是与反向传播相比,它的运行速度慢得令人难以置信。一些论文谈论了在具有数百万个免费参数的训练网络中的成功,并在短短几代内就看到了结果,但是我的网络(相对较小的200k参数)收敛非常缓慢。我看到训练集仅限于一百张图像,在经过50k代之后,它仍继续(缓慢)进步。

我尝试过/学到的东西

  • 交叉似乎没有帮助,所以我已经最大限度地利用了变异。
  • 我从输入批次中减去了平均MNIST图像,因为该算法似乎总是需要在区分数字之间找到平均图像(巨大的局部最小值)。
  • 我确保总是有小的单值单层突变,这样就永远不会完全“卡住”。
  • 我试图确保体重初始化的分布与最终结果一样。 (但是,即使我疯了,收敛也需要更长的时间,对吧?)
  • 我曾尝试根据输出权重相对于权重的梯度对“安全突变”进行试验,但在简单测试中我看不到任何改善,因此放弃了(也许过早地放弃了)。无论如何,我都希望不要依赖于能够计算梯度-这就是为什么我要使用GA! :)
  • 我已经尝试了pytorch的weight_norm()包装器,该包装器将权重张量的方向和大小分开,并使其成为分层参数:我的想法是,如果我在初始化过程中表现不佳,那么这可能会使GA在它。我真的非常希望这会有所帮助,但是还是再次,要么我做错了,要么没有改善。

我知道我可以通过并行化提高GA的运行时性能,并通过仅存储突变的种子值等来减少内存占用。现在,我只是在尝试磨练算法,并在花更多时间调整性能之前先查看一些结果。

任何建议表示赞赏。谢谢!

编辑:

我已经按照本文所述的第二种方法更新了代码:https://arxiv.org/pdf/1703.03864.pdf 与上文所述的“经典”算法相反,此版本使用了整个总体的适应度加权总和(更多地用作适应度空间中的梯度估算值)。第二种算法要快得多,但是当我增加玩具样本之外的数据量时,仍然难以收敛。欢迎提出任何改进建议。

编辑2:

增加人口规模有所帮助。我还添加了一个小的权重衰减,并且在将其添加到当前权重之前,使用了ADAM(https://arxiv.org/abs/1412.6980)来平滑渐变。当进度停滞时,我也会降低学习率。这些组合的效果要好一些。

0 个答案:

没有答案