【问题标题】:Clear Implementation of Softmax and Its DerivativeSoftmax及其导数的清晰实现
【发布时间】:2019-04-22 03:48:29
【问题描述】:

我目前正在使用 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】:

    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
    

    你也可以在上面的函数中使用广播,但我认为这样更清楚。

    【讨论】:

      猜你喜欢
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多