Softmax及其衍生词的明确实现

问题描述 投票:0回答:1

我正在用python 3.7和numpy编写我的第一个多层神经网络,我在实现softmax时遇到了麻烦(我打算使用我的网络进行分类,因此有一个工作的softmax实现非常重要)。我从不同的线程复制了这段代码:

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

我想我对softmax函数的预期功能有基本的了解;也就是说,取一个向量并将其元素转换为概率,使它们总和为1.如果我错了,请纠正我的理解。我不太明白这段代码是如何完成这个功能的,但我在多个其他线程上找到了类似的代码,所以我认为它是正确的。请确认。

不幸的是,在这些线程中,我都找不到softmax函数派生的明确实现。我理解它比大多数激活函数更复杂,并且需要比x更多的参数,但我不知道如何自己实现它。我正在寻找对其他参数的解释,以及softmax函数导数的实现(或数学表达式)。

python neural-network softmax
1个回答
0
投票

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

您也可以在上述功能中使用广播,但我认为以这种方式更清晰。

© www.soinside.com 2019 - 2024. All rights reserved.