我对在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/