Вы должны использовать сами значения для вычисления производных.
Уравнение для вычисления ошибки выходного слоя выглядит следующим образом (f
— это функция активации, а f'
— ее производная):
# outputs[a] represents the output of the (a)th layer
outputs[n] = f(outputs[n-1] . weights[n] + biases[n]) # final output
output_error = (outputs[n] - labels) * f'(outputs[n-1])
Обратите внимание, что f'
применяется к outputs[n-1]
, а не outputs[n]
, поскольку outputs[n-1]
является исходным входом для нашей функции f(outputs[n-1] . weights[n] + biases[n])
.
Чтобы лучше понять, чем полезна производная и как она работает, давайте сначала посмотрим, какова ее цель (взято из Википедия):
Производная функции действительной переменной измеряет чувствительность к изменению значения функции (выходного) по отношению к изменению ее аргумента (входного значения).
По сути, он измеряет, насколько быстро (и в каком направлении) изменяется выходной сигнал при незначительном изменении входного сигнала (можно сказать, что он измеряет зависимость выходного сигнала от входного).
В сочетании с методом измерения ошибки нашей сети (функции стоимости) мы можем получить информацию о наилучшем способе настройки входных данных функций активации (которые являются нашими весами), чтобы результат был ближе к нашим желаемым меткам.
Мы умножаем ошибку на производную, и у нас есть небольшое обновление в направлении и пропорции, которые лучше всего оптимизируют функцию для достижения нашей цели. Обновление применяется к весам (которые являются входными данными функций активации), поэтому при следующем срабатывании функций активации выходные данные будут немного ближе к нашим меткам.
Теперь, что касается применения производной к результату функции или ее входным данным, поскольку мы хотим увидеть, насколько выходные данные нашей функции изменяются в зависимости от ее входных данных, производная должна принимать исходные входные данные функции, чтобы дать нам информацию. о них; вот почему производная применяется к входам слоя (которые в данном случае являются выходами последнего слоя).
Вы также можете провести следующий эксперимент, чтобы понять, почему это так:
softmax [-1, 0, 1] # [9.003057317038046e-2,0.24472847105479767,0.6652409557748219]
softmax' [-1, 0, 1] # [0.19661193324148185,0.25,0.19661193324148185]
softmax' (softmax [-1, 0, 1]) # [0.24949408957503114,0.24629379904081422,0.22426006146673663]
Как вы видите, softmax'
, примененное к результату softmax
, не передает много информации об исходных значениях, поскольку полученные значения слишком близки друг к другу, но softmax'
, примененное к исходным входам softmax
, дает информацию о пропорциях входов. .
Я рекомендую эту статью для объяснения уравнений обратного распространения: http://neuralnetworksanddeeplearning.com/chap2.html
person
Mahdi Dibaiee
schedule
20.09.2017