下面链接的示例代码只有两个文件/几百行python(包括GA库)。它使用GA在MNIST上训练三层自动编码器。
https://github.com/patniemeyer/ga-autoencoder
该代码似乎可以正常工作,但是与反向传播相比,它的运行速度慢得令人难以置信。一些论文谈论了在具有数百万个免费参数的训练网络中的成功,并在短短几代内就看到了结果,但是我的网络(相对较小的200k参数)收敛非常缓慢。我看到训练集仅限于一百张图像,在经过50k代之后,它仍继续(缓慢)进步。
我尝试过/学到的东西
我知道我可以通过并行化提高GA的运行时性能,并通过仅存储突变的种子值等来减少内存占用。现在,我只是在尝试磨练算法,并在花更多时间调整性能之前先查看一些结果。
任何建议表示赞赏。谢谢!
编辑:
我已经按照本文所述的第二种方法更新了代码:https://arxiv.org/pdf/1703.03864.pdf 与上文所述的“经典”算法相反,此版本使用了整个总体的适应度加权总和(更多地用作适应度空间中的梯度估算值)。第二种算法要快得多,但是当我增加玩具样本之外的数据量时,仍然难以收敛。欢迎提出任何改进建议。
编辑2:
增加人口规模有所帮助。我还添加了一个小的权重衰减,并且在将其添加到当前权重之前,使用了ADAM(https://arxiv.org/abs/1412.6980)来平滑渐变。当进度停滞时,我也会降低学习率。这些组合的效果要好一些。