神经网络无法概括简单的按位与

Neural net fails to generalize a simple bitwise AND

在学习了大量的在线课程并阅读了许多论文之后,我开始使用神经网络,但令我惊讶的是它无法概括简单的按位与运算。

输入:

Inp#1 - randomly generated number between 0-15, scaled down to (0,1)
Inp#2 - 16 bit randomly generated unsigned int scaled down to (0,1)

# Code snippet
int in1 = (int)rand()%16;
int in2 = (int)rand()%(0x0010000);
in[0] = (fann_type)(in1/100.0);    // not to worry about float roundup
in[1] = (fann_type)(in2/100000.0); // not to worry about float roundup

输出:

Out#1 = -1 if the corresponding bit specified by index inp#1 in inp#2 value is 0, otherwise 1

# Code snippet
int out1 = (in2 & (1<<in1)) ? 1 : -1;
out[0] = (fann_type)out1;

网络:尝试了许多不同的变体,下面是示例

A. 1 hidden layer with 30 neurons, 
    Activation Function (hidden): sigmoid,
    Activation Function (output): sigmoid_symmetric (tanh),
    Training method: RPROP
    Learning rate: 0.7 (default)
    Momentum: 0.0 (default)
    RPROP Increase factor: 1.2 (default)
    RPROP Decrease factor: 0.5 (default)
    RPROP Minimum Step-size: 0 (default)
    RPROP Maximum Step-size: 50 (default)


B. 3 hidden layers each having 30 neurons, with the same params as in A

C. tried the same networks also with scaling inputs to (-1,1) and using tanh for also hidden layer.

数据集:5000 个训练样本,5000 个测试样本和 5000 个验证样本。尝试了更大的数据集,没有成功

# examples from training set
0.040000 0.321600 
-1 
0.140000 0.625890 
1 
0.140000 0.039210 
-1 
0.010000 0.432830 
1 
0.100000 0.102220 
1 

过程:用训练集训练的网络和并行监控测试数据的MSE以避免可能的过拟合。

库:使用了多个,但主要尝试使用 fann 并为 gui 使用 fanntool。

有什么想法吗?如果有任何特别的兴趣,可以上传数据集。

如果我了解您的设置,您可以尝试执行以下操作:

  • 有一个架构为 2-X-X-X-1 的网络(其中 X - 隐藏单元)- 因此 2 个输入,一个输出
  • 模型按位输入函数

如果这是真的,这就是非常特殊的问题,而且是一个非常糟糕的体系结构选择。神经网络不是神奇的帽子,它们是非常大的模型家族。您尝试做的事情具有 no 特征,这是 NN 从函数到模型所期望的。输入完全不平滑,有很多不连续性,实际上是一堆if-else子句。

你应该做什么?您应该将您的输入 表示为位 ,因此您应该有 32 个输入,每个数字 16 个二进制输入,然后它将毫无问题地学习您的函数。您以一种非常特定的方式(通过采用其十进制表示)对输入进行编码,并期望您的网络将模型分解为二进制,然后在其之上进行操作。 NN 会学习它,但您可能需要相当复杂的网络来实现这样的操作——同样,整个原因是您为网络提供了次优表示并构建了一个非常简单的网络,该网络最初设计用于近似平滑函数。