使用遗传算法训练神经网络时如何解决激活过大的问题?

人工智能 神经网络 遗传算法 数据预处理 权重初始化 权重归一化
2021-10-27 01:54:41

我正在尝试从头开始(使用 C#)创建一个固定拓扑 MLP,它可以解决一些简单的问题,例如 XOR 问题和MNIST分类。网络将完全使用遗传算法而不是反向传播进行训练。

以下是详细信息:

  • 人口规模:50
  • 激活函数:sigmoid
  • 固定拓扑
  • 异或:2 个输入,1 个输出。使用不同数量的隐藏层/节点进行测试。
  • MNIST:输入,将是 ON(1) 或 OFF(0)。10 个输出代表数字 0-92828=784
  • 初始种群将被赋予 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,这会破坏整个网络。此外,由于这使得群体中的所有个体都非常相似,因此遗传算法似乎不知道如何改进。交叉将产生与其父母几乎相同的后代,并且一些幸运的突变被大量其他神经元简单地忽略了!

什么是可行的解决方案?

这是我第一次学习神经网络,这真的很有挑战性。

1个回答

您的输入应保持在较低范围内。理想情况下,对于神经网络,输入被归一化为均值 0,标准差 1。我怀疑这同样适用于 GA 驱动的神经网络和梯度驱动的神经网络。

你的权重应该是正的和负的。

此外,一旦受过训练,它们往往会遵循一定的尺寸分布。如果您从该范围内的值开始,它会有所帮助。这通常称为 Xavier 或 Glorot 初始化。基本上,如果一个层的输入数量是n_inputs并且输出数量是n_outputs,那么您将拥有n_inputs * n_outputs权重,并且如果您使用随机数生成器对其进行初始化,那么您应该使用类似这样的乘数:

w = (rand() - 0.5) * sqrt(6/(n_inputs + n_outputs))

请注意,这平方根内的加法,您不需要计算权重的总数。

当您使用 GA 时,您可能希望使用某种形式的裁剪或归一化来防止突变偏离这些有用的权重太远。我不完全确定什么是最好的,因为通常我会使用反向传播来训练一个大型网络。潜在的 maxnorm 正则化会有所帮助 - 选择一个值(甚至可以通过突变使其可调整),每层中的权重矩阵的范数不应超过(分别为每一层,或一个整体值,取决于你),如果有的话学习步骤创建了一个标准太高的网络,将其缩小。L2 范数sqrt(sum_of_squared_weights)是 maxnorm 正则化的常用选择,这适用于基于反向传播的监督学习。