Четкая реализация Softmax и его производная - PullRequest
0 голосов
/ 22 апреля 2019

В настоящее время я пишу свою первую многослойную нейронную сеть с python 3.7 и numpy, и у меня возникают проблемы с реализацией softmax (я намерен использовать свою сеть для классификации, поэтому наличие работающей реализации softmax довольно важно). Я скопировал этот код из другого потока:

def softmax(x):
    return exp(x) / np.sum(exp(x), axis = 0)

Я думаю, что у меня есть общее представление о предполагаемой функции функции softmax; то есть взять вектор и превратить его элементы в вероятности, чтобы они суммировали с 1. Пожалуйста, исправьте мое понимание, если я ошибаюсь. Я не совсем понимаю, как этот код выполняет эту функцию, но я нашел похожий код во многих других потоках, поэтому я считаю, что это правильно. Пожалуйста, подтвердите.

К сожалению, ни в одном из этих потоков я не смог найти четкую реализацию производной функции softmax. Я понимаю, что это сложнее, чем в большинстве функций активации, и требует больше параметров, чем просто x, но я не знаю, как реализовать это сам. Я ищу объяснение того, что представляют собой эти другие параметры, а также реализацию (или математическое выражение) производной функции softmax.

1 Ответ

0 голосов
/ 22 апреля 2019

Ответ за how this code accomplishes that function:

Здесь мы используем концепцию, известную как broadcasting.

Когда вы используете функцию exp(x), тогда, предполагая xявляется вектором, вы фактически выполняете операцию, аналогичную той, которая может быть выполнена с помощью следующего кода:

exps = []
for i in x:
    exps.append(exp(i))
return exps

Приведенный выше код является более длинной версией того, что вещание происходит здесь автоматически.

Какдля реализации производной это немного сложнее, как вы говорите.

Непроверенная реализация для вычисления вектора производных по каждому параметру:

def softmax_derivative(X):
    # input : a vector X
    # output : a vector containing derivatives of softmax(X) wrt every element in X

    # List of derivatives
    derivs = []

    # denominator after differentiation
    denom = np.sum(exp(X), axis=0)

    for x in X:
        # Function of current element based on differentiation result
        comm = -exp(x)/(denom**2)
        factor = 0

        # Added exp of every element except current element
        for other in X:
            if other==x:
                continue
            factor += (exp(other))

        derivs.append(comm*factor)

    return derivs

Вы также можетеиспользуйте трансляцию в вышеприведенной функции, но я думаю, что она более понятна таким образом.

...