Цель
дельта [j] = o * (1,0 - o) * (t - o);
- найти ошибку выходного узла в сети обратного распространения.
o представляет выходные данные узла, t - ожидаемое значение выходных данных для узла.
Термин (o * (1.0 - o), является производной от общей используемой передаточной функции, сигмоидальной функции. (Другие передаточные функции не являются редкостью и требуют переписывания кода, в котором сигмоид находится первым вместо этого производная. Несоответствие между функцией и производной, скорее всего, будет означать, что обучение не будет сходиться.) Узел имеет значение «активации», которое подается через передаточную функцию для получения выходного сигнала o, например
o = f (активация)
Главное, что при обратном распространении используется градиентный спуск, а ошибка распространяется в обратном направлении путем применения правила цепочки. Проблема заключается в присвоении кредита или обвинении, если хотите, для скрытых узлов, выход которых напрямую не сопоставим с ожидаемым значением. Начнем с того, что известно и сопоставимо, с выходными узлами. Ошибка принимается пропорциональной первой производной выходных данных, умноженной на необработанное значение ошибки между ожидаемым выходным значением и фактическим выходным значением.
Так что более символично, мы бы написали эту строку как
delta [j] = f '(активации_j) * (t_j - o_j)
где f - ваша передаточная функция, а f '- ее первая производная.
Далее в скрытых слоях ошибка в узле - это его предполагаемый вклад в ошибки, найденные на следующем уровне. Таким образом, дельты из последующего слоя умножаются на соединительные веса, и эти произведения суммируются. Эта сумма умножается на первую производную активации скрытого узла, чтобы получить дельту для скрытого узла, или
дельта [j] = f '(активации_j) * сумма (дельта [k] * w_jk)
где j теперь ссылается на скрытый узел, а k - на узел в последующем слое.