На этом шаге мы рассмотрим общий принцип обратного распространения.
Последняя и самая сложная часть головоломки - это обратное распространение. Обратное распространение позволяет обнаружить ошибку в выходных данных нейронной сети и задействовать ее для изменения весов нейронов. Сильнее всего изменяются нейроны, больше других ответственные за ошибку. Но откуда берется ошибка? Как ее распознать? Ошибки возникают на этапе использования нейронной сети, называемом обучением.
Прежде чем с нейронной сетью можно будет работать, ее, как правило, необходимо обучить. Но мы должны знать правильные выходные данные для определенных входных данных, чтобы можно было, используя разницу между ожидаемыми и фактическими выходными данными, находить ошибки и изменять веса. Другими словами, нейронные сети ничего не знают, пока им не сообщат правильные ответы для определенного набора входных данных, чтобы потом они могли подготовиться к другим входным данным. Обратное распространение происходит только во время обучения.
Первым шагом при обратном распространении является вычисление ошибки между выходным сигналом нейронной сети для некоторого входного сигнала и ожидаемым выходным сигналом. Эта ошибка распространяется на все нейроны в выходном слое. (Для каждого нейрона есть ожидаемый и фактический выходной сигнал.) Затем к тому, что было бы выходным сигналом нейрона до того, как была задействована его функция активации, применяется производная функции активации выходного нейрона. (Мы кэшируем результат его функции перед активацией.) Этот результат умножают на ошибку нейрона, чтобы найти его дельту. Формула вычисления дельты использует частную производную (нахождение этой производной выходит за рамки нашего изложения). Главное, что мы получаем в результате, - то, за какое количество ошибок отвечает каждый выходной нейрон. Диаграмма вычисления показана на рисунке 1.
Рис.1. Механизм, с помощью которого вычисляется дельта выходного нейрона на этапе обучения посредством обратного распространения
Затем необходимо вычислить дельты для всех нейронов скрытого слоя (слоев) данной сети. Нужно определить, насколько каждый нейрон ответственен за неправильный выходной сигнал в выходном слое. Дельты выходного слоя используются для вычисления дельт в предыдущем скрытом слое. Для каждого предыдущего слоя дельты вычисляются определением скалярного произведения весов следующего слоя по отношению к конкретному рассматриваемому нейрону и уже вычисленных дельт в следующем слое. Чтобы получить дельту нейрона, это значение умножается на производную от функции активации, применяемой к последнему выходному сигналу нейрона, кэшированному перед задействованием функции активации. Эта формула также получена с помощью частной производной, подробнее о которой вы можете прочитать в более специализированных математических текстах.
На рисунке 2 показан фактический расчет дельт для нейронов в скрытых слоях.
Рис.2. Вычисление дельты для нейрона в скрытом слое
В сети с несколькими скрытыми слоями нейроны O1, O2 и O3 могут быть нейронами следующего скрытого слоя, а не нейронами выходного слоя.
И последнее, но самое главное: все веса для каждого нейрона в сети должны быть обновлены путем умножения последнего входного значения каждого отдельного веса на дельту нейрона и нечто, называемое скоростью обучения, и прибавления этого значения к существующему весу. Этот метод изменения веса нейрона называется градиентным спуском. Он похож на спуск с холма, где холм - это график функции ошибки нейрона, к точке минимальной ошибки. Дельта - это направление, в котором мы хотим спускаться, а скорость обучения определяет то, как быстро будем это делать. Трудно определить хорошую скорость обучения для неизвестной задачи без проб и ошибок. На рисунке 3 показано, как изменяются веса в скрытом и выходном слоях.
Рис.3. Веса каждого скрытого слоя и нейрона выходного слоя обновляются с использованием дельт, рассчитанных на предыдущих шагах, предыдущих весов, предыдущих входных данных и заданной пользователем скорости обучения
После изменения весов нейронная сеть готова к повторному обучению с другим набором входных и ожидаемых выходных данных. Процесс повторяется до тех пор, пока пользователь нейронной сети не сочтет, что сеть хорошо обучена. Это можно определить, проверив сеть по входным данным с известными правильными выходными данными.
Обратное распространение - сложный процесс. Не беспокойтесь, если вы еще не поняли все его детали. Объяснения, представленного в этом разделе, может оказаться недостаточно. В идеале реализация обратного распространения выведет ваше понимание на новый уровень. При реализации нашей нейронной сети и обратного распространения помните главное: обратное распространение - это способ корректировки каждого отдельного веса в сети в соответствии с тем, насколько верно он определяет неправильные выходные данные.
На следующем шаге мы рассмотрим ситуацию в целом.