在参加了一系列在线类(class)并阅读了许多论文之后,我开始使用神经网络,但令我惊讶的是它无法推广简单的按位与运算。
输入:
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 并使用 fanntool for gui。
有什么想法吗?如果有特别兴趣可以上传数据集。
最佳答案
如果我理解你的设置,你可以尝试执行以下操作:
- 拥有一个架构为 2-X-X-X-1 的网络(其中 X - 隐藏单元) - 因此有 2 个输入,1 个输出
- 对输入进行按位函数建模
如果这是真的,那么这是一个极其特殊的问题,并且是一个非常糟糕的架构选择。神经网络并不是神奇的帽子,它们是一个非常大的模型家族。你尝试做的事情没有特征,这是神经网络从函数到模型所期望的。它的输入完全不平滑,有很多不连续性,它实际上是一堆 if-else 子句。
你应该做什么?您应该将输入表示为位,因此您应该有 32 个输入,每个数字 16 个二进制输入,然后它将毫无问题地学习您的函数。您以非常具体的方式对输入进行编码(通过采用十进制表示形式),并期望您的网络将模型分解为二进制,然后在其之上进行操作。 NN 会学习它,但你可能需要相当复杂的网络来实现这样的操作 - 同样,整个原因是你为网络提供了次优的表示并构建了一个非常简单的网络,该网络最初是为了近似平滑函数而设计的。
关于machine-learning - 神经网络无法推广简单的按位与,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37290169/