Softmax及其导数的清晰实现
Clear Implementation of Softmax and Its Derivative
我目前正在用 python 3.7 和 numpy 编写我的第一个多层神经网络,但我在实现 softmax 时遇到了问题(我打算使用我的网络进行分类,所以有一个 softmax 的工作实现非常关键)。我从另一个线程复制了这段代码:
def softmax(x):
return exp(x) / np.sum(exp(x), axis = 0)
我想我对softmax函数的预期功能有了基本的了解;也就是说,取一个向量并将其元素转换为概率,以便它们总和为 1。如果我错了,请纠正我的理解。我不太明白这段代码是如何完成那个功能的,但我在多个其他线程上发现了类似的代码,所以我相信它是正确的。请确认。
不幸的是,在这些线程中的 none 中,我可以找到 softmax 函数的导数的明确实现。我理解它比大多数激活函数更复杂,并且需要的参数不仅仅是 x,但我不知道如何自己实现它。我正在寻找其他参数的解释,以及 softmax 函数导数的实现(或数学表达式)。
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
你也可以在上面的函数中使用广播,不过我觉得这样更清晰。
我目前正在用 python 3.7 和 numpy 编写我的第一个多层神经网络,但我在实现 softmax 时遇到了问题(我打算使用我的网络进行分类,所以有一个 softmax 的工作实现非常关键)。我从另一个线程复制了这段代码:
def softmax(x):
return exp(x) / np.sum(exp(x), axis = 0)
我想我对softmax函数的预期功能有了基本的了解;也就是说,取一个向量并将其元素转换为概率,以便它们总和为 1。如果我错了,请纠正我的理解。我不太明白这段代码是如何完成那个功能的,但我在多个其他线程上发现了类似的代码,所以我相信它是正确的。请确认。
不幸的是,在这些线程中的 none 中,我可以找到 softmax 函数的导数的明确实现。我理解它比大多数激活函数更复杂,并且需要的参数不仅仅是 x,但我不知道如何自己实现它。我正在寻找其他参数的解释,以及 softmax 函数导数的实现(或数学表达式)。
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
你也可以在上面的函数中使用广播,不过我觉得这样更清晰。