Ответ 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:
Если вам нужны дополнительные ресурсы, вы также можете посмотреть мой ответ здесь.