训练神经网络以区分偶数和奇数

机器算法验证 机器学习 分类 分类数据 神经网络 遗传算法
2022-01-22 02:56:51

问题:是否可以仅使用数字本身作为输入来训练 NN 来区分奇数和偶数?

我有以下数据集:

Number Target
1      0
2      1
3      0
4      1
5      0
6      1
...   ...
99     0
100    1

我使用非常简单的遗传算法训练了一个带有两个输入神经元(一个是变量 Number,另一个是偏置神经元)、隐藏层中的九个神经元和一个输出神经元的 NN:在每个时期,两组权重“战斗” "互相反对;错误最高的人输了,取而代之的是获胜者的修改版本。

该脚本可以轻松解决 AND、OR 和 XOR 运算符等简单问题,但在尝试对奇数和偶数进行分类时遇到困难。目前它所能做的最好的事情是从 100 个数字中识别出 53 个数字,这需要几个小时。我是否对输入进行规范化似乎没有任何区别。

如果我想作弊,我可以对数据进行预处理并将 % 2 作为输入提供给 NN,但我不想这样做;NN 应该能够逼近每个函数,包括模运算符(我相信)。我究竟做错了什么?

4个回答

与任何机器学习任务一样,输入的表示对于您学习和概括的能力起着至关重要的作用。

我认为,表示的问题在于函数(模)是高度非线性的,并且在您为此问题选择的输入表示中不平滑。

我会尝试以下方法:

  1. 尝试更好的学习算法(反向传播/梯度下降及其变体)。

  2. 尝试使用固定长度精度以二进制表示数字。

  3. 如果您的输入表示是 b 位数,我会确保您的训练集不会偏向于小数或大数。从范围内随机选择均匀且独立的数字[0,2b-1].

  4. 正如您所做的那样,使用多层网络(先尝试 2 层:即隐藏+输出,然后再使用更多层)。

  5. 使用单独的训练+测试集。不要评估你在训练集上的表现。

学习对奇数和偶数进行分类是一个难题。一个简单的模式不断地重复。2,4,6,8...... 1,3,5,7......

sin(x) 和 cos(x) 等非线性激活函数的行为类似。因此,如果你改变你的神经元来实现 sin 和 cos 而不是流行的激活函数,如 tanh 或 relu,我想你可以使用单个神经元相当容易地解决这个问题。

线性变换总是先于非线性变换。因此,单个神经元最终将学习 sin(ax+b),对于 a 和 b 的正确组合,它将以我们想要的频率交替输出 0 和 1,在这种情况下为 1。

我以前从未在我的神经网络中尝试过 sin 或 cos。因此,如果它最终成为一个非常糟糕的主意,请道歉。

所以我现在正在使用神经网络,我遇到了和你一样的问题。我最终做的是将输入数字表示为一个数组,其值等于数字的二进制表示。由于我们正在做的是分类我将我的输出表示为一个数组,而不是单个值。前任:

input = [
  [0, 0, 0, 1], // 1
  [0, 0, 1, 0], // 2
  [0, 0, 1, 1], // 3
  [0, 1, 0, 0]  // 4
]
output = [
  [1, 0], // odd
  [0, 1], // even
  [1, 0], // odd
  [0, 1]  // even
]

希望这可以帮助!

我来到这里,遇到了类似的问题。所以我写我管理的东西。

据我所知,一层感知器能够解决所有问题,最终可以简化为使用直线将对象划分为任何几何形状。这就是这样的问题。如果你在纸上画最后一点二进制表示,你也可以画线,所有奇数都在一边,偶数在另一边。出于同样的原因,不可能用一层网络解决异或问题。

行。这个问题看起来很简单,所以让我们把 Heaviside step 作为激活函数。在我用我的号码玩了一点之后,我意识到这里的问题是偏见。我google了一下,我发现如果你坚持几何表示,偏差使你能够改变坐标系中的激活位置。

很有教育意义的问题