我正在尝试从头开始(使用 C#)创建一个固定拓扑 MLP,它可以解决一些简单的问题,例如 XOR 问题和MNIST分类。网络将完全使用遗传算法而不是反向传播进行训练。
以下是详细信息:
- 人口规模:50
- 激活函数:sigmoid
- 固定拓扑
- 异或:2 个输入,1 个输出。使用不同数量的隐藏层/节点进行测试。
- MNIST:输入,将是 ON(1) 或 OFF(0)。10 个输出代表数字 0-9
- 初始种群将被赋予 0 到 1 之间的随机权重
- 10 个“Fittest”网络在每次迭代中存活下来,并执行交叉以繁殖 40 个后代
- 对于所有权重,发生突变以在 -1 到 1 之间添加一个随机值,有 5% 的机会
分别有 4 个和 3 个神经元的 2 个隐藏层,XOR 在大约 100 代中成功地达到了 97-99.9% 的准确率。这里没有使用偏差。
然而,尝试 MNIST 发现了一个非常明显的问题 - 784 输入;与 XOR 相比,节点的大量增加,乘以权重并加起来会产生 50 到甚至 100 的巨大值,远远超出了激活函数 (sigmoid) 的典型域范围。
这只是将所有层的输出渲染为 1 或 0.99999-something,这会破坏整个网络。此外,由于这使得群体中的所有个体都非常相似,因此遗传算法似乎不知道如何改进。交叉将产生与其父母几乎相同的后代,并且一些幸运的突变被大量其他神经元简单地忽略了!
什么是可行的解决方案?
这是我第一次学习神经网络,这真的很有挑战性。