4

Я реализовал нейронную сеть (используя CUDA) с двумя слоями. (2 нейрона на слой). Я пытаюсь заставить его изучить две простые квадратичные полиномиальные функции, используя backpropagation.Распространение нейронной сети вместо схождения

Но вместо сходящихся, то он расходится (выход становится бесконечность)

Вот еще некоторые подробности о том, что я пытался:

  • я установил начальные веса к 0 , но поскольку он расходился, я рандомизировал начальные веса
  • Я читал, что нейронная сеть может расходиться, если скорость обучения слишком высока, поэтому я уменьшил скорость обучения до 0,000001
  • Две функции, которые я пытаюсь получить для добавления : 3 * i + 7 * j+9 и j*j + i*i + 24 (я даю слой i и j в качестве входных данных)
  • я реализовал ее в виде одного слоя ранее, и которые могли бы приблизить полиномиальные функции лучше
  • Я имею в виду реализации импульс в этой сети, но я не уверен, что это поможет ей научиться
  • Я использую линейный (как ни в) функцию активации
  • Существует колебание в начале, но выход начинает расходящийся момент любые из весов становятся более 1

Я проверил и перепроверял свой код, но, похоже, с ним не было никаких проблем.

Итак, вот мой вопрос: что здесь происходит?

Любой указатель будет оценен по достоинству.

+0

как раз так я понимаю это правильно, вы хотели бы знать, почему ваш код, который вы не показали, сам реализующий алгоритм, который вы не описали, не сходится? Поставьте себя в мои пятна на мгновение и спросите себя, считаете ли вы, что это ответный вопрос или нет. Я голосую, чтобы закрыть это, извините ... – talonmies

+0

Я уверен, что в коде нет ничего плохого. и я верю, что алгоритм (backprop) достаточно хорошо описан для всех, кто знаком с нейронными сетями. То, что я хочу знать, это то, что еще могло поступить не так. Я удаляю метку cuda, чтобы не вводить в заблуждение кого-либо, думая, что это вопрос CUDA. –

+3

Из моего опыта это может произойти, когда ваши параметры переполняются или некоторые функции возвращают бесконечность (логарифм, например, если вы используете функцию потери логистики). Сначала я проверил бы числовые проблемы, например. с градиентной проверкой. Но это слишком широко, поэтому я думаю, мы не можем вам помочь. –

ответ

5
  1. Если проблема, которую вы пытаетесь решить это типа классификации, попробуйте 3 сетевой уровень (3 достаточно соответственно Колмогоров) Соединение с входами А и В к скрытому узлу C (C = A * прому + B * wb) представляют собой строку в пространстве AB. Эта линия делит правильные и неправильные полупространства. Связи от скрытого слоя к выходу, поместите значения скрытого слоя в корреляцию друг с другом, давая вам желаемый результат.

  2. В зависимости от ваших данных функция ошибки может выглядеть как расческа для волос, поэтому помощь в этом должна помочь. Сохранение скорости обучения в 1 оказалось оптимальным для меня.

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

  4. В начале каждого повторите инициализацию ваших весов со случайными значениями (-0,5 - +0,5).

  5. Это действительно помогает составить диаграмму ошибки. Вы получите это «Ага!» фактор.

+2

У вас есть ссылка на правило Колмогорова о количестве слоев? – Luis

+0

@ Луис мое впечатление, что 3-слойная вещь устарела, учитывая появление глубокого обучения. –

+1

@ChrisAnderson 3-слойная «вещь» - это не «вещь». Является математическим отражением и анализом того, что вы хотите сделать, почему и с какими методами. Конечно, вы можете разместить все больше и больше слоев (или много узлов, если на то пошло), но это не гарантирует, что вы решаете свою проблему соответствующим образом. Вопрос о количестве слоев остается интересным, особенно для исходного вопроса: * Я реализовал нейронную сеть (используя CUDA) с двумя слоями. (2 нейрона на слой). Я пытаюсь заставить его изучить две простые квадратичные полиномиальные функции, используя backpropagation. * – Luis

3

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

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

Если они не хранятся, тогда нам нужно увидеть код и ответить.

Смежные вопросы