我对在Tensorflow中构建Softmax的派生产品感兴趣,作为一个新用户,我感到很困惑。

我可以找到的最接近的代码是NumPy版本Softmax derivative in NumPy approaches 0 (implementation)。代码如下。我能够轻松地将softmax部分转换为张量流,但是我对如何将导数部分应用于张量流感到困惑-“如果导数”下的三行给我带来麻烦。您将如何建立衍生部分的三行?

谢谢。

导数部分

if derivative:
    J = - signal[..., None] * signal[:, None, :] # off-diagonal Jacobian
    iy, ix = np.diag_indices_from(J[0])
    J[:, iy, ix] = signal * (1. - signal) # diagonal
    return J.sum(axis=1)


这是上面链接的完整代码。

def softmax_function( signal, derivative=False ):
    # Calculate activation signal
    e_x = np.exp( signal )
    signal = e_x / np.sum( e_x, axis = 1, keepdims = True )
    if derivative:
        J = - signal[..., None] * signal[:, None, :] # off-diagonal Jacobian
        iy, ix = np.diag_indices_from(J[0])
        J[:, iy, ix] = signal * (1. - signal) # diagonal
        return J.sum(axis=1)
    else:
        # Return the activation signal
        return signal

最佳答案

我最近处在这种确切的情况下,找不到太多帮助,尤其是在提取对角线元素以更新i = j场景时。

一个可能的原因可能是张量流缺乏通用性等numpy。

看看以下两种选择是否对您有用,


在numpy中实现派生部分,并在feed_dict中的会话中动态调用函数,


在图形中定义一个占位符,

微分= tf.placeholder(tf.float32,[None,num_features])

考虑到您的softmax概率存储在名为“输出”的变量中

然后在您的会话中,您可以执行此操作,

session.run(train,feed_dict {导数:softmax(output.eval(),deriv = True)})

注意:此方法在计算上可能会很昂贵。


了解该特定导数背后的数学


损失函数

      L= -1/N  ∑ yk.log⁡(pk)


根据连锁规则,

      ∂L/∂W2 = ∂L/dpi .∂pi/∂a2 .∂a2/dW2


其中L是损失函数
       p是概率输出

通过针对两种情况计算链规则中的前2个项,k = i和k!= i,可以将其简化为以下项,

   ∂L/dpi . ∂pi/∂a2 = pi-yi  --- > delta value for the output layer.


因此,您只需从前端传播的softmax输出中减去目标即可计算出l2_delta,而不用使用复杂的Jacobian矩阵方法。

查看这些链接,以了解有关其背后的数学的更多信息,

很好的解释了为什么softmax派生像其他任何激活都不那么简单-> Derivative of a softmax function

PDF解释了答案PDF中描述的简化步骤

关于python - 从NumPy版本在Tensorflow中构建Softmax的派生,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42934036/

10-13 03:44