Для библиотеки нейронных сетей я реализовал некоторые функции активации и функции потерь и их производные. Они могут быть объединены произвольно, а производная на выходных слоях просто становится произведением производной потерь и производной активации.
Однако я не смог реализовать производную от функции активации Softmax независимо от любой функции потерь. Из-за нормализации, то есть знаменателя в уравнении, изменение одной входной активации изменяет все выходные активации, а не только одну.
Вот моя реализация Softmax, где производная не выполняет проверку градиента примерно на 1%. Как я могу реализовать производную Softmax, чтобы ее можно было комбинировать с любой функцией потерь?
import numpy as np
class Softmax:
def compute(self, incoming):
exps = np.exp(incoming)
return exps / exps.sum()
def delta(self, incoming, outgoing):
exps = np.exp(incoming)
others = exps.sum() - exps
return 1 / (2 + exps / others + others / exps)
activation = Softmax()
cost = SquaredError()
outgoing = activation.compute(incoming)
delta_output_layer = activation.delta(incoming) * cost.delta(outgoing)