Я пытаюсь вычислить производную функции активации для softmax. Я нашел это: https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function кажется, никто не дает правильного вывода того, как мы получим ответы для i=j и i!= j. Может кто-нибудь объяснить это! Меня смущают производные, когда используется суммирование, как в знаменателе для функции активации softmax.
Производное объяснение функции softmax
Ответы (2)
Производная суммы есть сумма производных, т.е.:
d(f1 + f2 + f3 + f4)/dx = df1/dx + df2/dx + df3/dx + df4/dx
Чтобы вывести производные от p_j
по отношению к o_i
, начнем с:
d_i(p_j) = d_i(exp(o_j) / Sum_k(exp(o_k)))
Я решил использовать d_i
для производной по отношению к o_i
, чтобы упростить чтение. Используя правило произведения, получаем:
d_i(exp(o_j)) / Sum_k(exp(o_k)) + exp(o_j) * d_i(1/Sum_k(exp(o_k)))
Глядя на первый член, производная будет 0
, если i != j
, это можно представить с помощью дельта-функции, который я буду называть D_ij. Это дает (для первого члена):
= D_ij * exp(o_j) / Sum_k(exp(o_k))
Это просто наша исходная функция, умноженная на D_ij
= D_ij * p_j
Для второго члена, когда мы получаем каждый элемент суммы по отдельности, единственный ненулевой член будет, когда i = k
, это дает нам (не забывая о правиле мощности, потому что сумма находится в знаменателе)
= -exp(o_j) * Sum_k(d_i(exp(o_k)) / Sum_k(exp(o_k))^2
= -exp(o_j) * exp(o_i) / Sum_k(exp(o_k))^2
= -(exp(o_j) / Sum_k(exp(o_k))) * (exp(o_j) / Sum_k(exp(o_k)))
= -p_j * p_i
Сложив их вместе, мы получим удивительно простую формулу:
D_ij * p_j - p_j * p_i
Если вы действительно хотите, мы можем разделить его на случаи i = j
и i != j
:
i = j: D_ii * p_i - p_i * p_i = p_i - p_i * p_i = p_i * (1 - p_i)
i != j: D_ij * p_i - p_i * p_j = -p_i * p_j
Что является нашим ответом.
d_i(exp(o_j)) / Sum_k(exp(o_k)) + exp(o_j) * d_i(1/Sum_k(exp(o_k)))
? Отсутствует опыт перед последним o_k
- person Benjamin Crouzier; 31.10.2017
i
и j
относятся к элементам матрицы Якоби. вы, кажется, думаете, что «вещь», которая стремится к 0, является производной, но это всего лишь одна часть частной производной. Вы выписали каждую производную вручную (для 4 входов), тогда как я рассматривал общий случай.
- person SirGuy; 09.07.2018
d_i(exp(o_j))
, которое является частью подвыражения d_i(exp(o_j)) / Sum_k(exp(o_k))
. Посмотрите внимательно на круглые скобки, и вы увидите, что это the derivative of
exp(o_j)` относительно o_i
, деленного на Sum over k of exp(o_k)
. Производная Sum_k(exp(o_k))
по отношению к o_i
рассматривается во второй части расширения правила произведения. Это поможет прояснить ситуацию?
- person SirGuy; 09.07.2018
Что бы это ни стоило, вот мой вывод, основанный на ответе SirGuy: (Не стесняйтесь указывать ошибки, если вы их найдете).
Σ_k ( ( d e^{o_k} ) / do_i )
оценивается как e^{o_i}
с шага 4 по 5? Я был бы очень признателен за любые идеи, которые вы можете предложить по этому вопросу.
- person duhaime; 31.12.2017
d/do_i e^o_i
, который равен e^o_i
. Когда i != k, вы получаете кучу нулей.
- person Benjamin Crouzier; 31.12.2017