神经网络可以找到固定大小列表的第i个排列吗?

时间:2014-03-09 14:54:09

标签: algorithm machine-learning neural-network

简言之

在给定排列唯一索引的情况下,神经网络可以模拟因子分解(或其他方法)来提供列表排列吗?

应用

我列出了10件事,他们的内容是无关紧要的。我关心的是我的10件事可以被放入3628800(或10!)个唯一的订单中,因为我可以使用无符号整数和因子分解来表达我的10件事的任何列表顺序:

Order 0: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Order 1: 0, 1, 2, 3, 4, 5, 6, 7, 9, 8
Order ....
Order 3628799: 9, 8, 7, 6, 5, 4, 3, 2, 1, 0

这允许在我的10件事的不同列表顺序上并行分析分析。

一个常见的例子是旅行商问题:

1. I give 500 different computers each a range of unsigned integers:
   0    -> 7257  for computer 0, 
   7257 -> 14516 for computer 1, 
   etc.

2. Each computer first calculates the list order from it's unsigned integer 
   index by using factorial decomposition.
   ie. Order 1 -> 0, 1, 2, 3, 4, 5, 6, 7, 9, 8

3. The distance between the cities placed in the order described is calculated.

4. The shortest distances from each computer is collected, and the shortest 
   of those is taken. Leaving us with a single unsigned integer index that 
   describes the shortest possible permutation of cities.

相同的过程可用于解决几乎任何可约束的误差表面,通常远远超过可行的计算能力。

递归算法解决方案

我们可以使用因子分解(outlined here in php)来计算任何固定大小列表的第N个排列(授予我们将需要对更大列表的大整数支持),并且为了清楚起见在此提供javascript:

function ithPermutationOfNElements (n, i)
{
   var j, k = 0;
   var fact = [];
   var perm = [];

   // compute factorial numbers
   fact[k] = 1;
   while (++k < n)
      fact[k] = fact[k - 1] * k;

   // compute factorial code
   for (k = 0; k < n; ++k)
   {
      perm[k] = Math.floor(i / fact[n - 1 - k]);
      i = i % fact[n - 1 - k];
   }

   // readjust values to obtain the permutation
   // start from the end and check if preceding values are lower
   for (k = n - 1; k > 0; --k)
      for (j = k - 1; j >= 0; --j)
         if (perm[j] <= perm[k])
            perm[k]++;

   return perm;
}
console.log(ithPermutationOfNElements(4, 23)); // [ 3, 2, 1, 0 ]

神经网络解决方案?

任何神经网络架构和训练组合模拟这个函数,因为它只输入神经元和n个输出神经元代表排列的每个元素?

4 个答案:

答案 0 :(得分:5)

A neuron can operate as a logic gate,因此神经网络可以执行计算机可以进行的任何计算。但是从这个意义上来说,它只是使用高级代码来低效地模拟逻辑门,因此不是解决这个问题的好方法。

通常,神经网络对“真实”或“自然”数据都很好。它们通常也使用浮点数运算,而不是整数运算。因此,如果有一个模式需要学习,NN可能会学习它,但你得到的输出答案将是例如0.783267。然后你可以将其归一化到89743,但它不太可能完全正确。根据您的要求,正确答案之外的一个整数是完全错误的。

相比之下,对于特定图像返回0.787或0.786的人脸识别NN,两者都可以被认为是正确的。

您的问题更适合传统的程序代码解决方案,每个输入只有一个正确的答案。通常在AI中,您正在寻找一定范围或概率分布内的正确答案。

关于使用NN实现算法:
你可以让许多神经元充当逻辑门,所以现在你有神经元nand门/触发器等作为加法器/乘法器/锁存器等,直到你基本上构建了图灵机,但明确使用高级代码。它绝不会像普通的NN那样,因为它们被大多数AI世界使用。此外,您已经拥有了一台非常好的图灵机。

这是Matlab中神经网络AND门的代码。无需培训。我使用configure代替train,只需手动设置权重。因此,制作其他逻辑类型可以构建一个完整的图灵机。

and = feedforwardnet(1);

truthTable = [0 0 1 1; 0 1 0 1];
and_out = [0 0 0 1];

and = configure(and, truthTable, and_out);

vals = [-2 -2 -1  2 0];

and.IW{1} = vals(1:2); % input1 to hidden, input2 to hidden
and.LW{2,1} = vals(3); % hidden to output
and.b{1} = vals(4);     % bias to hidden
and.b{2} = vals(5);     % bias to output

y = sim(and, truthTable)
round (y)
mse = mean ((y - and_out) .^ 2)


y =
    0.0000    0.0180    0.0180    0.9820
ans =
     0     0     0     1
mse =
   2.4263e-04

答案 1 :(得分:4)

一个鲜为人知的事实是,递归神经网络是图灵完备的,因此可以执行计算机的任何计算(见result by Siegelmann)。

这并不意味着(a)您可以通过学习算法轻松找到所需的权重,或者(b)您可能正在查看的前馈网络可以做到这一点。

然而,这似乎是你不想用神经网络做的任务。

答案 2 :(得分:3)

通常,神经网络是通用函数逼近器,所以理论上是。

更具体地说,请注意,对于特定(固定)i值,解决它的神经网络是微不足道的(实际上,不需要隐藏节点或激活函数。这是一个线性问题)。

作为一种蛮力,天真的解决方案,对于未固定的i的一般问题:一个大到足以编码所有10个的神经网络!可能的线性编码,隐藏层基本上充当基于i输入的多路复用器,将解决该问题。可能存在更高效的网络,尝试针对此问题的循环架构会很有趣。

在任何情况下,虽然解决方案确实存在,但更好的问题是这是否是解决问题的好方法。如果一个问题归结为一些简单的伪代码,我会避免神经网络实现,除非它是出于学术目的。

答案 3 :(得分:0)

我认为可能是可能的。输入您的数据和单个数字(从0或1开始)。它是否产生一个代表元素编号的数字(围绕它)。将该号码添加到您的列表中。然后再次执行此操作,除了将您提供给神经网络的数量增加1(即表示您要查找的列表中元素的数字。)

递归神经网络将是理想的。但我仍然不确定是否可以有效地学习或近似基础功能。我认为可能是。