Нейронная сеть с несколькими выходами - PullRequest
11 голосов
/ 09 декабря 2011

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

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

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

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

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

Ответы [ 3 ]

17 голосов
/ 10 декабря 2011

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

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

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

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

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

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

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

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

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

2 голосов
/ 09 декабря 2011

По сути, вам нужна функция из нескольких действительных чисел, которая преобразует эти действительные числа в вероятности (каждая от 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

1 голос
/ 09 декабря 2011

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

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

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

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

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

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

...