Вопрос: можно ли обучить NN различать нечетные и четные числа, используя только в качестве входных данных сами числа?
У меня есть следующий набор данных:
Number Target
1 0
2 1
3 0
4 1
5 0
6 1
... ...
99 0
100 1
Я тренировал NN с двумя входными нейронами (один из которых был переменным числом, другой - смещающим нейроном), девятью нейронами в скрытом слое и одним выходным нейроном, используя очень простой генетический алгоритм: в каждую эпоху два набора весов "сражаются" " друг против друга; тот, у которого самая высокая ошибка, проигрывает и заменяется модифицированной версией победителя.
Сценарий легко решает простые задачи, такие как операторы AND, OR и XOR, но застревает при попытке классифицировать нечетные и четные числа. Сейчас лучшее, что удалось сделать, - это идентифицировать 53 номера из 100, и это заняло несколько часов. Неважно, нормализую я входы или нет, не имеет значения.
Если бы я хотел обмануть, я мог бы просто предварительно обработать данные и передать% 2 в NN в качестве входных данных, но я не хочу этого делать; NN должен иметь возможность аппроксимировать каждую функцию, включая оператор по модулю (я полагаю ). Что я делаю неправильно?
Ответы:
Как и в любой задаче машинного обучения, представление вашего вклада играет решающую роль в том, насколько хорошо вы учитесь и обобщаете.
Я думаю, проблема с представлением состоит в том, что функция (по модулю) сильно нелинейна и не является гладкой во входном представлении, которое вы выбрали для этой задачи.
Я бы попробовал следующее:
Попробуйте лучший алгоритм обучения (обратное распространение / градиентный спуск и его варианты).
Попробуйте представить числа в двоичном формате, используя фиксированную точность длины.
Если ваше входное представление является b-битным числом, я бы позаботился о том, чтобы ваш тренировочный набор не был смещен в сторону малых или больших чисел. Имеют числа, которые равномерно и независимо выбираются случайным образом из диапазона .[ 0 , 2б- 1 ]
Как вы уже сделали, используйте многослойную сеть (сначала попробуйте 2 слоя: то есть скрытый + выход, прежде чем использовать больше слоев).
Используйте отдельный тренинг + тестовый набор. Не оценивайте свои результаты на тренировочном наборе.
источник
Научиться классифицировать нечетные и четные числа - сложная проблема. Простой шаблон повторяется бесконечно. 2,4,6,8 ..... 1,3,5,7 .....
Нелинейные функции активации, такие как sin (x) и cos (x), ведут себя аналогично. Поэтому, если вы измените свои нейроны для реализации sin и cos вместо популярных функций активации, таких как tanh или relu, я думаю, что вы можете решить эту проблему довольно легко, используя один нейрон.
Линейные преобразования всегда предшествуют нелинейным преобразованиям. Следовательно, один нейрон в конечном итоге будет учить грех (ax + b), который для правильной комбинации a & b будет выводить 0 и 1 поочередно на желаемой частоте, которую мы хотим, которая в этом случае равна 1.
Я никогда не пробовал грешить или кос в моих нейронных сетях раньше. Так что, извините, если это окажется очень плохой идеей.
источник
Поэтому я сейчас работаю с нейронными сетями и столкнулся с той же проблемой, что и вы. В итоге я представлял входное число в виде массива со значениями, равными двоичному представлению числа. Поскольку мы занимаемся классификацией, я представлял свой вывод как массив, а не как одно значение. например:
Надеюсь это поможет!
источник
Я попал сюда, где была борьба с подобной проблемой. Поэтому я пишу, что мне удалось.
Насколько я знаю, один слой персептрона способен решить любую проблему, которая в конце может быть упрощена для разделения объектов в любой геометрии с использованием прямой линии. И это такая проблема. Если вы рисуете последний бит двоичного представления на бумаге, вы также можете нарисовать линию, и все нечетные числа находятся на одной стороне, а четные - на другой. По этой же причине невозможно решить проблему XOR с сетью одного уровня.
Ok. Эта проблема выглядит очень простой, поэтому давайте сделаем шаг Хевисайда в качестве функции активации. После того, как я немного поиграл со своим номером, я понял, что проблема здесь в предвзятости. Я немного погуглил, и обнаружил, что если вы останетесь с геометрическим представлением, смещение позволит вам изменить место активации в системе координат.
Очень образовательная проблема
источник
Хорошо известно, что логические вентили NOT, AND, OR можно выполнять с очень простыми нейронными сетями (NN) и что вы можете построить полный арифметический калькулятор с логическими вентилями, используя двоичные числа в качестве входных данных. Следовательно, вы должны иметь возможность создать NN для вычисления n по модулю k для любых n и k чисел, выраженных в базе 2.
Если вы хотите вычислить n по модулю k для фиксированного числа k (например, k = 4), вы можете создать чрезвычайно простую NN, которая делает это: выражает входное число n в базе k и игнорирует все цифры, кроме самого низкого ранга цифра, и у вас есть ответ!
источник
Одна идея, уклоняющаяся от использования явного «mod 2» во входных данных, может состоять в том, чтобы кодифицировать число как последовательность пикселей, тогда проблема состоит в том, чтобы распознать, можно ли разделить сегмент на два равных сегмента. Это проблема машинного зрения, которая может быть изучена обычными сетями.
С другой стороны, если число хранится как число с плавающей запятой, вопрос сводится (или обобщается) к распознаванию, когда число с плавающей запятой приблизительно равно целому числу.
источник
Я создал такую сеть здесь .
Представление @William Gottschalk было основой.
Он просто использует 1 нейрон в первом скрытом слое с 32 входами. Выходной слой имеет только 2 нейрона для горячего кодирования 0 и 1.
источник
Мое решение
Более того, делить на другие числа (скажем, 7) тоже хорошо:
Объяснение:
Я получаю 2 разных решения. Они оба хороши:
1. грех как активация
2. пол (или int) как активация
Невозможно найти лучшие веса, используя градиентный спуск, и я использую генетический алгоритм (из scikit-opt )
источник