Может ли нейронная сеть найти i-ю перестановку списка фиксированных размеров?

Коротко

Может ли нейронная сеть эмулировать факториальное декомпозицию (или какой-либо другой метод), чтобы обеспечить перестановку списка с учетом уникального индекса перестановок?

Применение

У меня есть список из 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 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.

Тот же процесс может быть использован для решения практически любой поверхности с неограниченной ошибкой, которая часто дает гораздо большую, чем возможно, вычислительную мощность.

Рекурсивное алгоритмическое решение

Мы можем вычислить N-ю перестановку любого фиксированного списка (при условии, что нам понадобится большая поддержка целого числа для более крупных списков) с использованием факториальной декомпозиции (указанной здесь в php), и для ясности приведена здесь в 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 выходные нейроны, представляющие каждый элемент перестановки?

Ответ 1

A нейрон может работать как логический диск, и, таким образом, нейронная сеть может выполнять любые вычисления, которые могут использовать компьютер. Однако в этом смысле он просто эмулирует логические ворота неэффективно, используя код высокого уровня, поэтому не является хорошим решением для этой проблемы.

В общем, нейронные сети хороши с "реальными" или "естественными" данными. Они также обычно работают с поплавками, а не целыми числами. Поэтому, если есть образец, который нужно изучить, NN может изучить его, но выходный ответ, который вы получите, будет, например, 0.783267. Тогда вы могли бы денормализовать это до 89743, но вряд ли это будет правильно. Для вашего требования одно целое справа от правильного ответа совершенно неверно.

В отличие от этого, для распознавания лица NN, возвращающего 0,787 или 0,786 для конкретного изображения, оба могут считаться правильными.

Ваша проблема лучше подходит для традиционного, процедурного решения кода, и только один правильный ответ для каждого входа. Обычно в ИИ вы ищете правильный ответ в определенном диапазоне или распределении вероятности.

Относительно реализации алгоритмов с NNs:
У вас может быть много нейронов, действующих как логические ворота, так что теперь у вас есть нейронные затворы/флипфлопы и т.д., Действующие как сумматоры/множители/затворы и т.д., Пока вы по существу не построите машину turing, но явно используете код высокого уровня. Он никоим образом не будет похож на нормальный NN, поскольку они используются большинством мира AI. Кроме того, у вас уже есть отлично подходящая машина для тренировки прямо перед вами.

Вот код для нейронной сети AND gate в Matlab. Обучение не требуется. Я использовал configure вместо train и просто устанавливал вес вручную. Таким образом, создавая другие логические типы, вы могли бы построить целую машину turing.

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

Ответ 2

Малоизвестный факт состоит в том, что рекуррентные нейронные сети являются полным Turing и могут таким образом выполнять любые вычисления, которые компьютер может (см. результат Siegelmann).

Это не означает, что (а) вы можете легко найти необходимые веса с помощью алгоритма обучения или (б), что он может сделать это, как вы, вероятно, смотрите.

Тем не менее, это похоже на задачу, которую вы не хотите делать с нейронной сетью.

Ответ 3

Как правило, нейронные сети являются универсальными аппроксиматорами функций, поэтому теоретически да.

Более конкретно, обратите внимание, что для определенного (фиксированного) значения я нейронная сеть, которая его решает, тривиальна (и на самом деле не требует скрытых узлов или функций активации. Это линейная проблема).

Как грубая сила, наивное решение, для общей проблемы с незафиксированной i: нейронной сетью, достаточно большой для кодирования всех 10! возможные линейные кодировки со скрытым уровнем, по существу действующим как мультиплексор, основанный на вводе i, решают проблему. Возможно, существуют более эффективные сети, и было бы интересно попробовать рекуррентную архитектуру для этой проблемы.

В любом случае, хотя решение, безусловно, существует, лучший вопрос заключается в том, является ли это хорошим способом его решения. Если проблема сводится к некоторому простому psuedocode, я бы избегал реализации нейронной сети, если это не для академических целей.

Ответ 4

Я думаю, это возможно. Введите данные и один номер (начиная с 0 или 1). Попросите его создать одно число, обозначающее номер элемента (вокруг него). Добавьте этот номер в свой список. Затем сделайте это снова, за исключением увеличения числа, которое вы подаете в нейронную сеть, на 1 (т.е. Число, которое представляет элемент в списке, который вы хотите найти.)

Рекурсивная нейронная сеть была бы идеальной. Но я все еще не уверен, что базовая функция может быть изучена или аппроксимирована эффективно. Я думаю, что это может быть.