Ответ за 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
Вы также можетеиспользуйте трансляцию в вышеприведенной функции, но я думаю, что она более понятна таким образом.