Machine learning 神经网络不能推广简单的按位和

Machine learning 神经网络不能推广简单的按位和,machine-learning,neural-network,deep-learning,Machine Learning,Neural Network,Deep Learning,在参加了大量的在线课程和阅读了许多论文之后,我开始使用神经网络,但令我惊讶的是,它并没有推广出简单的按位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 =

在参加了大量的在线课程和阅读了许多论文之后,我开始使用神经网络,但令我惊讶的是,它并没有推广出简单的按位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;
数据集: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个输出
  • 输入上的按位函数模型
如果这是真的,这是一个非常特殊的问题,也是一个非常糟糕的架构选择。神经网络不是神奇的帽子,它们是非常大的模型家族。您尝试执行的操作具有无特征,这是NN从函数到模型所期望的。它在输入中是完全不光滑的,它有很多不连续性,实际上是一堆if-else子句


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

你的学习率是多少?培训过程中成本函数的值是什么?更新了描述以涵盖缺失的信息,并提供了实际的代码片段。谢谢你在做什么是一项分类任务。为什么使用-1、1输出和MSE而不是0、1和日志丢失?事实证明,这样的设置做得更好。顺便说一句,这项任务并不容易。对于神经网络来说,学习这样的操作看起来非常困难。谢谢你的反馈。我做回归的原因是,这实际上是我开始时的简化版本(inp1&inp2=out,其中都是16位)。我只是感到惊讶的是,30个乙状结肠激活的神经元完全不能按位和顺序概括。对于测试集,MSE甚至没有下降一点。这是真的吗?谢谢你的反馈。我同意,然而,采用这种方法进行实验的原因是为了看看神经网络是否能够通过使用第一/第二隐藏层而不是我手动适应给定的特定问题来获得更优的表示。我希望deep nets能够很好地取代手工挑选的功能,因为您的网络并不深。正如我所说的,你们将用当前设置来解决这个问题,但你们需要更多的容量,因为你们试图建模的函数不适用于计算模型。sigmoid的线性组合不适合表示if子句。此外,假设您在丰富的输入空间中提供了原始输入,那么将数据表示为偏差操作系统并没有engineeringDl的功能。您以高度压缩的方式提供数据。如果函数不是真正平滑的,则nns很难进行2d输入
# 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