Многофункциональная нейронная сеть

Я создал свою первую нейронную сеть на python, и я играл с несколькими наборами данных; пока все идет хорошо!

У меня есть быстрый вопрос относительно моделирования событий с несколькими результатами: -

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

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

Большое спасибо.

Ответ 1

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

Фактически вам не нужно видеть, какой выход равен 1. После того как вы подготовили свою сеть до определенного уровня ошибки, когда вы представляете входы, просто посмотрите на максимальный результат в своем выходе позже. Например, предположим, что ваш выходной уровень представляет следующий результат: [0.0001, 0.00023, 0.0041, 0.99999412, 0.0012, 0.0002], тогда бегун, выигравший гонку, является номером 4.

Итак, ваша сеть будет "учиться" производить 1, но это не будет точно. Вот почему вы тренируетесь с определенной частотой ошибок. Недавно я создал нейронную сеть для распознавания рукописных цифр, и это тот метод, который я использовал. В моем выходном слое у меня есть вектор с 10 компонентами. Первый компонент представляет 0, а последний компонент представляет 9. Поэтому, когда я представляю 4 в сети, я ожидаю, что выходной вектор будет выглядеть как [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]. Конечно, это не то, что я получаю точно, но это то, что я тренирую сеть. Поэтому, чтобы найти, какая цифра это, я просто проверяю, какой компонент имеет самый высокий результат или оценку.

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

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

Вы можете использовать описанный алгоритм здесь. Существует приличное количество математики, поэтому будьте готовы к этому! Если вы хотите увидеть пример реализации этого алгоритма, вы можете взглянуть на этот Java-код, который у меня есть на github, Код также использует импульс и простую форму моделирования, но стандартный алгоритм обратного распространения должен быть легко различим. В статье Wikipedia на backpropagation есть ссылка к реализации алгоритма backpropagation в Python.

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

Вот несколько ресурсов, которые помогут вам лучше понять backpropagation:

Если вам нужны дополнительные ресурсы, вы также можете посмотреть мой ответ здесь.

Ответ 2

Ваша сеть должна обойти это и научиться естественным образом.

Чтобы сеть узнала, что немного быстрее, вот что начинается с первого взгляда:

  • добавьте дополнительный вывод под названием sum (суммирование всех остальных выходных нейронов) - если вы хотите, чтобы все выходные нейроны находились в отдельном слое, просто добавьте слой выходов, сначала numRunners выходы просто подключитесь к соответствующему нейрону в предыдущем слое, а последний numRunners+1 -ный нейрон, который вы подключаете ко всем нейронам предыдущего слоя, и установите весы на 1)

  • набор тренировок будет содержать 0-1 векторов для каждого бегуна (did-not run), а "ожидаемым" результатом будет вектор 0-1 00..00001000..01 сначала 1, обозначающий бегуна, который выиграл гонка, последняя 1, обозначающая "сумму" "вероятностей"

  • для неизвестных рас, сеть попытается предсказать, какой бегун победит. Поскольку выходы имеют смежные значения (более или менее: D), их можно читать как "уверенность в сети, которую бегун выиграет в гонке" - вот что вы ищете

Даже без дополнительного нейрона sum это грубое описание того, как должны быть организованы учебные данные.

Ответ 3

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

Ваша сеть дает вам реальные числа r1, r2,..., rn, которые возрастают по мере того, как вероятность того, что каждый бегун победит в гонке.

Затем вычислим exp (r1), exp (r2),... и суммируем их для ers = exp (r1) + exp (r2) +... + exp (rn). Тогда вероятность победы первого гонщика равна exp (r1)/ers.

Это одно использование распределения Больцмана. http://en.wikipedia.org/wiki/Boltzmann_distribution