我能够实现Softmax以便将其用于交叉熵成本函数,但我的问题是,我应该使用Softmax的输出(即概率)来进行反向传播并更新权重吗?
对我而言,它看起来并不正确,因为Softmax会返回概率而不是神经元的实际值。
另一种选择是使用Softmax的导数输出。有人可以解释一下吗?
答案 0 :(得分:1)
您应该使用值本身来计算衍生物。
计算输出层错误的公式如下(f
是激活函数,f'
是它的衍生物:
# outputs[a] represents the output of the (a)th layer
outputs[n] = f(outputs[n-1] . weights[n] + biases[n]) # final output
output_error = (outputs[n] - labels) * f'(outputs[n-1])
请注意,f'
适用于outputs[n-1]
,而非outputs[n]
,因为outputs[n-1]
是我们的函数f(outputs[n-1] . weights[n] + biases[n])
的原始输入。
为了更好地理解衍生产品的用途及其运作方式,我们首先要了解它的用途(取自Wikipedia):
实变量函数的导数测量函数(输出)值相对于其参数(输入值)变化的敏感度。
本质上,它测量输入变化时输出变化的速度(以及在什么方向)(您可以说它测量输出取决于输入的方式)。
结合测量网络误差的方法(成本函数),我们可以获得有关调整激活函数输入(这是我们的权重)的最佳方法的信息,以便输出更接近我们所需的标签
我们将误差乘以导数,并且我们在方向和比例上有一个小的更新,最好地优化功能以实现我们的目标。更新应用于权重(激活函数的输入),因此下次激活函数触发时,输出将稍微靠近我们的标签。
现在关于将导数应用于函数的结果或它的输入,因为我们希望看到函数的输出根据它的输入而变化多少,导数必须采用函数的原始输入,以便向我们提供有关它们的信息;这就是导数应用于图层输入的原因(在这种情况下,是最后一层的输出)。
你也可以尝试下面的实验,看看为什么会这样:
softmax [-1, 0, 1] # [9.003057317038046e-2,0.24472847105479767,0.6652409557748219]
softmax' [-1, 0, 1] # [0.19661193324148185,0.25,0.19661193324148185]
softmax' (softmax [-1, 0, 1]) # [0.24949408957503114,0.24629379904081422,0.22426006146673663]
如您所见,应用于softmax'
结果的softmax
未传达有关原始值的大量信息,因为生成的值彼此太接近,但softmax'
应用于softmax
的原始输入,提供有关输入比例的信息。
我推荐这篇文章来解释反向传播方程:http://neuralnetworksanddeeplearning.com/chap2.html