Выход из вашей нейронной сети будет приближаться 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.
Возможно, вы не сразу поймете алгоритм; ожидайте потратить некоторое время на понимание этого и проработку математики. Я сел с карандашом и бумагой, когда писал код, и вот как я в конце концов понял, что происходит.
Вот несколько ресурсов, которые помогут вам лучше понять обратное распространение:
Если вам нужны дополнительные ресурсы, вы также можете посмотреть мой ответ здесь .