Примечание: я не эксперт по backprop, но теперь, прочитав немного, я думаю, что следующее предостережение уместно. При чтении статей или книг по нейронным сетям нередки случаи, когда производные записываются с использованием сочетания стандартных обозначений суммирования / индекса , матричного обозначения и многоиндексного обозначения (включая гибрид двух последних для тензорно-тензорных производных). ). Как правило, цель состоит в том, чтобы это было «понято из контекста», поэтому вы должны быть осторожны!
Я заметил пару несоответствий в вашем происхождении. Я не делаю нейронные сети на самом деле, поэтому следующее может быть неверным. Тем не менее, вот как я бы пошел о проблеме.
Во-первых, вам нужно учесть суммирование в , и вы не можете предполагать, что каждый член зависит только от одного веса. Таким образом, принимая градиент отношению к компоненту из , мы имеем
E k z E = - ∑ j t j log o jEEkz
E=−∑jtjlogoj⟹∂E∂zk=−∑jtj∂logoj∂zk
Тогда, выражая как
у нас есть
где является Дельта Кронекера . Тогда градиент софтмакс-знаменателя равен
что дает
или, расширяя журнал
Обратите внимание, что производная по , произвольныйo j = 1oj∂ log o j
oj=1Ωezj,Ω=∑iezi⟹logoj=zj−logΩ
δjk∂Ω∂logoj∂zk=δjk−1Ω∂Ω∂zk
δjk∂логоJ∂Ω∂zk=∑ieziδik=ezk
∂oj∂logoj∂zk=δjk−ok
гкгδJK=1K=J∂оJ∂ZК= оJ( δJ K- оК)
ZКкомпонент , который дает член ( только когда ).
ZδJ K= 1k = j
Таким образом, градиент относительно равен
где является постоянным (для данного вектора ).z ∂ EЕZ
∂Е∂ZК= ∑JTJ( оК- δJ K) = оК( ∑JTJ) - тК⟹∂Е∂ZК= оКτ- тК
τ= ∑JTJT
Это показывает первое отличие от вашего результата: больше не умножает . Обратите внимание, что в типичном случае, когда является «горячим», мы имеем (как отмечено в вашей первой ссылке).TКоКTτ= 1
Второе несоответствие, если я правильно понимаю, заключается в том, что « », который вводится в , вряд ли будет « », который выводится из softmax. Я думаю, что имеет больше смысла, что это на самом деле «дальше» в сетевой архитектуре?оZо
Называя этот вектор , мы получаем
Y
ZК= ∑явеся кYя+ бК⟹∂ZК∂веср д= ∑яYя∂веся к∂веср д= ∑яYяδя пδk q= δk qYп
Наконец, чтобы получить градиент отношению к весовой матрице , мы используем правило цепочки
дающий окончательное выражение (принимая единицу -hot , т. е. )
где - вход на самом низком уровне (в вашем примере).Евес
∂Е∂веср д= ∑К∂Е∂ZК∂ZК∂веср д= ∑К( оКτ- тК) δk qYп= уп( оQτ- тQ)
Tτ= 1∂Е∂веся ж= уя( оJ- тJ)
Y
Таким образом, это показывает второе отличие от вашего результата: « », вероятно, должно быть от уровня ниже , который я называю , а не от уровня выше (то есть ).ояZYZо
Надеюсь, это поможет. Этот результат кажется более последовательным?
Обновление: в ответ на запрос от OP в комментариях, здесь расширение первого шага. Во-первых, обратите внимание, что правило векторной цепочки требует суммирования (см. Здесь ). Во-вторых, чтобы быть уверенным в получении всех компонентов градиента, вы всегда должны вводить новую нижнюю букву для компонента в знаменателе частной производной. Таким образом, чтобы полностью выписать градиент с правилом полной цепочки, мы имеем
и
так
∂Е∂веср д= ∑я∂Е∂оя∂оя∂веср д
∂оя∂веср д= ∑К∂оя∂ZК∂ZК∂веср д
∂Е∂веср д= ∑я[ ∂Е∂оя( ∑К∂оя∂ZК∂ZК∂веср д) ]
На практике полные суммы сокращаются, потому что вы получаете много терминов . Хотя это включает в себя множество «дополнительных» суммирований и подписок, использование правила полной цепочки гарантирует, что вы всегда получите правильный результат.δа б