【问题标题】:Can a Neural Network Find the i-th Permutation of a fixed size list?神经网络可以找到固定大小列表的第 i 个排列吗?
【发布时间】:2014-04-12 13:59:56
【问题描述】:

简述

神经网络能否模拟阶乘分解(或其他一些方法)以在给定排列唯一索引的情况下提供列表排列?

应用

我有一个包含 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 ]

神经网络解决方案?

任何神经网络架构和训练组合都可以在给定 i 的情况下模拟这个函数吗?因为它只有输入神经元和 n 个输出神经元代表排列的每个元素?

【问题讨论】:

  • 非常好的和明确的问题。
  • 假设正确答案是肯定的,而合理的答案是否定的,那么一个很好的后续问题将是:NN 需要多少层才能完成此任务以及训练它的最佳方法是什么。
  • @Peter Micheal Lacey-Bordeaux 使用 NN 解决这个问题与正常使用 NN 完全不同。执行此操作的“算法”方法是将许多神经元用作逻辑门,因此现在您将神经元与非门/触发器等用作加法器/乘法器/锁存器等,直到您基本上在高水平上构建了图灵机。它绝不会像普通的神经网络,因为它们被人工智能世界的大多数人使用。此外,您面前已经有一台非常好的图灵机。
  • @andrelucas 如果你可以在你的回答中加入并扩展它,我会选择它作为获胜者
  • @Peter 你找不到这样的正式证明。仅仅是因为,如果您将我在下面显示的简单 NN AND 门视为实际的工作 NN,那么根据该定义,实际的硬件 AND 门也是 NN。所以现在任何由普通硬件逻辑门组合而成的东西都是NN(包括普通计算机)。因此,在过程逻辑中实现的阶乘分解的性能/效率将与 NN 实现相同 - 如果您使用该术语的最宽松的定义。但在人工智能世界中,没有人会指着一个硬件与门说,“是的,那是一个神经网络”。

标签: algorithm machine-learning neural-network


【解决方案1】:

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

一般来说,神经网络适用于“真实”或“自然”数据。它们通常也使用浮点数,而不是整数。因此,如果要学习一种模式,NN 可能会学习它,但您将得到的输出答案将是例如 0.783267。然后您可以将其非规范化为 89743,但它不太可能完全正确。根据您的要求,正确答案的一个整数是完全错误的。

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

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

关于使用 NN 实现算法:
您可以将许多神经元用作逻辑门,因此现在您可以将神经元与非门/触发器等用作加法器/乘法器/锁存器等,直到您基本上构建了图灵机,但明确使用了高级代码。它绝不会像普通的神经网络,因为它们被人工智能世界的大多数人使用。此外,您面前已经有了一台非常出色的图灵机。

这是 Matlab 中神经网络与门的代码。无需培训。我使用了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

【讨论】:

  • 只是快速思考一下,概率分布/范围可能会限制需要分析的问题空间。例如。计算机 0 正在搜索 [0, 7257],如果 NN 可以将该空间缩小到 [500, 600] 之类的东西,会大大减少解决问题的计算需求。希望同一个神经网络也可以减少其他计算机的空间,有效地使整个搜索更快。当然,为了有用,NN 必须比直接的程序解决方案更快地收敛到某个解决方案。
  • 不适用于这个特殊问题。我们正在寻找固定列表的第 i 个排列。您如何知道 NN 是否正确地缩小了范围?您必须使用程序算法来证明它。到那个阶段,你已经解决了最初的问题。
  • @SlaterTyranus 是否愿意对此进行扩展?
  • @andrelucas 实际答案将花费大量时间,但这里有几点: 1. 神经网络对使用浮点数或整数没有要求,并且可以互换使用,具体取决于关于您使用的激活功能。 1. 标准神经网络不是静态的。 3. 输入和输出节点的数量完全无关,为了计算复杂性,神经网络实际上更喜欢较小的输入。 4.函数和算法是等价的(参见:图灵完备性)。 5. 结果是算法的相关部分。
  • 好吧,这样看。给我一个any计算范式的例子,它至少包括两个数字(选择任何数据类型)和一个你不考虑考虑的处理单元(加法器或任何类型)成为NN。不管你说什么,我都会说你的建议实际上也是一个NN,根据你自己的定义。从简单的加法器到 cray 超级计算机的 任何 计算范式的定义是 NN。它不是一个有用的定义。您如何将其与遗传算法或 Web 服务器区分开来?根据您的定义,这两个都是 NN。
【解决方案2】:

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

这既不意味着 (a) 您可以通过学习算法轻松找到必要的权重,也不意味着 (b) 正如您可能正在研究的那样,前馈网络可以做到。

不过,这似乎是您不想使用神经网络完成的任务。

【讨论】:

    【解决方案3】:

    一般来说,神经网络是通用函数逼近器,所以理论上是的。

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

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

    无论如何,虽然解决方案肯定存在,但更好的问题是这是否是解决问题的好方法。如果问题归结为一些简单的伪代码,我会避免使用神经网络实现,除非是出于学术目的。

    【讨论】:

    • 一个NN给了所有10个! encodings 将模拟算法的结果,而不是算法本身。因子分解是一种算法,而不是函数。
    • 为了帮助解决任何混淆,我并不是建议全部 10 个!可能的结果是输入到网络中,而是隐藏层足够大,可以独立解决所有 10 个问题!同时产生结果,最后一层简单地对与基于 i 输入的正确排序相对应的集合进行高度加权。这将是一个巨大的网络,并且永远不会正确训练,但它确实表明存在一个可以解决问题的网络。
    • 查看我对上述 Peter Micheal Lacey-Bordeaux 评论的 NN 算法/逻辑门的回复。
    【解决方案4】:

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

    递归神经网络将是理想的。但我仍然不确定是否可以有效地学习或近似底层函数。我觉得应该可以。

    【讨论】:

      猜你喜欢
      • 2019-07-02
      • 1970-01-01
      • 2016-12-02
      • 2010-10-13
      • 2021-08-24
      • 2016-11-20
      • 2020-08-30
      • 2018-07-10
      • 1970-01-01
      相关资源
      最近更新 更多