【问题标题】:Avoid local optima training XOR避免局部最优训练 XOR
【发布时间】:2017-08-04 16:08:40
【问题描述】:

我正在使用 Neataptic 来训练神经网络,该网络通过遗传算法解决 XOR。适应度定义如下:

// max score = 0
score -= Math.abs(0 - network.activate([0, 0])) * 5000;
score -= Math.abs(1 - network.activate([1, 0])) * 5000;
score -= Math.abs(1 - network.activate([0, 1])) * 5000;
score -= Math.abs(0 - network.activate([1, 1])) * 5000;

有时它运行得很好。但我假设它只是走运了。但很多时候,它甚至达不到-6000。它会经常在-8000 附近徘徊。

这些是我的设置:

  GNN = new Evolution({
    size: 100,
    elitism: 10,
    mutationRate: 0.3,
    networkSize : [2,3,1],
    mutationMethod: [
      Methods.Mutate.MODIFY_RANDOM_BIAS,
      Methods.Mutate.MODIFY_RANDOM_WEIGHT,
      Methods.Mutate.SWAP_BIAS,
      Methods.Mutate.SWAP_WEIGHT,
      Methods.Mutate.MODIFY_SQUASH
    ],
    crossOverMethod: [
      Methods.Crossover.UNIFORM,
      Methods.Crossover.AVERAGE,
      Methods.Crossover.SINGLE_POINT,
      Methods.Crossover.TWO_POINT
    ],
    selectionMethod: [
      Methods.Selection.FITNESS_PROPORTIONATE
    ],
    generationMethod: [
      Methods.Generation.POINTS
    ],
    fitnessFunction: function(network){
      var score = 0;

      score -= Math.abs(0 - network.activate([0, 0])) * 5000;
      score -= Math.abs(1 - network.activate([1, 0])) * 5000;
      score -= Math.abs(1 - network.activate([0, 1])) * 5000;
      score -= Math.abs(0 - network.activate([1, 1])) * 5000;

      return Math.round(score);
    }
  });

(view the JSFiddle here and press train)

您建议我更改哪些设置? (请提供证明)

附注我知道通过反向传播训练 XOR 要容易得多,但这仅用于实验目的。

【问题讨论】:

  • 我过去做过这个任务。 GA 找到“好的解决方案”。那么,网络拓扑是如何使用的呢?
  • 我不明白为什么平均身体素质会比上一代更差。你是否使用了一些超剧烈的早熟收敛限制?
  • @viceriel 它的突变率很高,没有精英主义
  • 如果你有高突变,GA 就像随机搜索一样。我理解,但选择任务是选择更合适的解决方案,所以即使没有精英主义,我也希望新一代的平均适应度更好。

标签: javascript neural-network genetic-algorithm


【解决方案1】:

我变了:

fitnessFunction: function(network){
  var score = 0;

  score -= Math.abs(0 - network.activate([0, 0])) * 5000;
  score -= Math.abs(1 - network.activate([1, 0])) * 5000;
  score -= Math.abs(1 - network.activate([0, 1])) * 5000;
  score -= Math.abs(0 - network.activate([1, 1])) * 5000;

  return Math.round(score);
}

fitnessFunction: function(network){
  var score = 0;

  score -= Methods.Cost.MSE([0], network.activate([0, 0])) * 5000;
  score -= Methods.Cost.MSE([1], network.activate([1, 0])) * 5000;
  score -= Methods.Cost.MSE([1], network.activate([0, 1])) * 5000;
  score -= Methods.Cost.MSE([0], network.activate([1, 1])) * 5000;

  return Math.round(score);
}

这是合乎逻辑的,因为平方误差有助于增加完全错误的输出发生变化的机会。 Read about it here

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 2019-05-25
    • 2016-03-04
    • 2016-03-26
    • 2022-11-04
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2019-07-17
    相关资源
    最近更新 更多