Производное объяснение функции softmax

Я пытаюсь вычислить производную функции активации для softmax. Я нашел это: https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function кажется, никто не дает правильного вывода того, как мы получим ответы для i=j и i!= j. Может кто-нибудь объяснить это! Меня смущают производные, когда используется суммирование, как в знаменателе для функции активации softmax.


person Roshini    schedule 13.06.2016    source источник
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он не имеет ничего общего с программированием.   -  person desertnaut    schedule 16.03.2018


Ответы (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

Что является нашим ответом.

person SirGuy    schedule 13.06.2016
comment
большое спасибо! Это так ясно. Я не мог бы попросить лучшего объяснения! :) Я рад, что теперь полностью понимаю вывод. Я собираюсь сослаться на это без ответа на бирже math.stack! - person Roshini; 13.06.2016
comment
@SirGuy, разве ваше третье выражение не должно быть 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
comment
@BenjaminCrouzier Спасибо, исправил. - person SirGuy; 31.10.2017
comment
›Глядя на первый член, производная будет равна 0, если i != j Почему это так? Выход o_i (т. е. конкретный узел softmax) зависит от всех значений входящего слоя. Не означает ли это, что если i!=j , значения будут отличаться от i=k, но не 0? См. eli.thegreenplace.net/2016/ - person harveyslash; 06.07.2018
comment
@harveyslash Каждая переменная независима, поэтому частная производная точно говорит, что она равна 0. При взятии частной производной по какой-либо переменной вы рассматриваете любую другую переменную как константу в процессе. - person SirGuy; 08.07.2018
comment
@harveyslash Производная не смотрит на результат, она смотрит на то, как этот результат изменяется, когда вы меняете только одну переменную, поэтому все остальные переменные рассматриваются как постоянные. Надеюсь, это немного прояснит ситуацию. - person SirGuy; 08.07.2018
comment
пожалуйста, посмотрите мой вопрос, который я подробно опубликовал math.stackexchange.com/questions/2843505/ Моя производная оказалась не равной 0 для случая, для которого у вас есть 0. Я ошибаюсь? - person harveyslash; 08.07.2018
comment
@harveyslash Во-первых, в вашем вопросе, на который вы ссылаетесь, вы неправильно говорите, что складываете элементы якобиана, чтобы получить «окончательную» производную. Это неверно, думайте вместо якобиана как о производной, а не о промежуточном шаге, ведущем к производной. - person SirGuy; 09.07.2018
comment
@harveyslash в моем решении i и j относятся к элементам матрицы Якоби. вы, кажется, думаете, что «вещь», которая стремится к 0, является производной, но это всего лишь одна часть частной производной. Вы выписали каждую производную вручную (для 4 входов), тогда как я рассматривал общий случай. - person SirGuy; 09.07.2018
comment
@harveyslash То, что стало 0, было подвыражением 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
comment
Оно делает. Я думаю, что подробный ответ на мой вопрос будет очень полезен и другим :) - person harveyslash; 21.07.2018

Что бы это ни стоило, вот мой вывод, основанный на ответе SirGuy: (Не стесняйтесь указывать ошибки, если вы их найдете).

введите описание изображения здесь

person Benjamin Crouzier    schedule 31.10.2017
comment
большое спасибо за это! У меня есть только одно сомнение: почему Σ_k ( ( d e^{o_k} ) / do_i ) оценивается как e^{o_i} с шага 4 по 5? Я был бы очень признателен за любые идеи, которые вы можете предложить по этому вопросу. - person duhaime; 31.12.2017
comment
@duhaime Хороший вопрос. Подумайте обо всех членах этой суммы один за другим и посмотрите, что происходит с каждым членом. Вы видите, что у вас есть два случая: Когда i = k, терм равен d/do_i e^o_i, который равен e^o_i. Когда i != k, вы получаете кучу нулей. - person Benjamin Crouzier; 31.12.2017