Подтвердить что ты не робот

Обучение нейронной сети для добавления

Мне нужно тренировать сеть, чтобы умножить или добавить 2 входа, но она не кажется хорошо аппроксимируемой для всех точек после 20000 итераций. В частности, я тренирую его по всему набору данных, и он хорошо подходит для последних пунктов, но кажется как это не становится лучше для первых конечных точек. Я нормализую данные так, чтобы они находились между -0.8 и 0.8. сама сеть состоит из 2 входов 3 скрытых нейронов и 1 выходного нейрона. Я также установил скорость обучения в сети до 0,25, и использовать в качестве обучающей функции tanh (x).

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

Также, сколько нейронов подходит для скрытого слоя для этой сети?

4b9b3361

Ответ 1

Подумайте, что произойдет, если вы замените пороговую функцию tanh(x) линейной функцией x - вызовите ее a.x - и лечите a как единственный параметр обучения в каждом нейроне. Это эффективно то, что ваша сеть будет оптимизировать; это аппроксимация нулевого пересечения функции tanh.

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

Ответ 2

Сеть, состоящая из одного нейрона с весами = {1,1}, смещения = 0 и линейной активации, выполняет добавление двух входных чисел.

Умножение может быть сложнее. Вот два подхода, которые сеть может использовать:

  • Преобразуйте одно из чисел в цифры (например, двоичное) и выполните умножение, как в начальной школе. a*b = a*(b0*2^0 + b1*2^1 + ... + bk*2^k) = a*b0*2^0 + a*b1*2^1 + ... + a*bk*2^k. Этот подход прост, но требует переменное число нейронов, пропорциональное длине (логарифму) входа b.
  • Возьмите логарифмы входов, добавьте их и оцените результат. a*b = exp(ln(a) + ln(b)) Эта сеть может работать на числах любой длины, если она достаточно хорошо аппроксимирует логарифм и показатель.

Ответ 3

Возможно, слишком поздно, но простым решением является использование RNN (Рекуррентная нейронная сеть),

RNN SUM TWO DIGITS

После преобразования чисел в цифры ваш NN будет принимать несколько цифр из последовательности цифр слева направо.

RNN должен зацикливать один из своих выходов, чтобы он мог автоматически понять, что есть цифра для переноса (если сумма равна 2, напишите 0 и нести 1).

Чтобы обучить его, вам нужно будет предоставить ему входы, состоящие из двух цифр (один от первого номера, второго от второго номера) и желаемого вывода. И RNN в конечном итоге найдет, как сделать сумму.

Обратите внимание, что этот RNN должен знать только 8 следующих случаев, чтобы узнать, как суммировать два числа:

  • 1 + 1, 0 + 0, 1 + 0, 0 + 1 с переносом
  • 1 + 1, 0 + 0, 1 + 0, 0 + 1 без переноса

Ответ 4

Если вы хотите сохранить вещи neural (ссылки имеют вес, нейрон вычисляет взвешенную сумму входов по весам и ответам 0 или 1 в зависимости от сигмоида суммы, и вы используете backpropagation of gradient), тогда вы должны думать о нейроне скрытого слоя как классификаторы. Они определяют линию, которая отделяет входное пространство от классов: 1 класс соответствует той части, где нейрон отвечает 1, другой, когда он отвечает 0. Второй нейрон скрытого слоя определит другое разделение и так далее. Выходной нейрон объединяет выходы скрытого слоя, адаптируя его веса для вывода, соответствующие тем, которые вы представили во время обучения.
Следовательно, один нейрон будет классифицировать входное пространство в 2 класса (возможно, соответствующее добавлению в зависимости от базы данных обучения). Два нейрона смогут определить 4 класса. Три нейроны 8 классов и т.д. Подумайте о выходе скрытых нейронов как степеней 2: h1*2^0 + h2*2^1+...+hn*2^n, где hi - вывод скрытого нейрона i. NB: вам понадобятся n выходных нейронов. Это отвечает на вопрос о количестве скрытых нейронов для использования.
Но NN не вычисляет добавление. Он рассматривает это как проблему классификации, основанную на том, что он узнал. Он никогда не сможет генерировать правильный ответ для значений, которые находятся вне его базы обучения. На этапе обучения он настраивает весы для размещения разделителей (линий в 2D), чтобы дать правильный ответ. Если ваши входы находятся в [0,10], он научится создавать правильные ответы для добавления значений в [0,10]^2, но никогда не даст хорошего ответа для 12 + 11.
Если ваши последние значения хорошо изучены и первые забыты, попробуйте снизить скорость обучения: изменения весов (в зависимости от градиента) последних примеров могут переопределить первый (если вы используете стохастический backprop). Убедитесь, что ваша учебная база является справедливой. Вы также можете чаще представлять примеры с плохо изученными примерами. И попробуйте многие значения скорости обучения, пока не найдете хороший.