我应该使用Softmax的输出进行反向传播吗?

时间:2017-09-20 07:30:16

标签: machine-learning neural-network softmax

我能够实现Softmax以便将其用于交叉熵成本函数,但我的问题是,我应该使用Softmax的输出(即概率)来进行反向传播并更新权重吗?

对我而言,它看起来并不正确,因为Softmax会返回概率而不是神经元的实际值。

另一种选择是使用Softmax的导数输出。有人可以解释一下吗?

1 个答案:

答案 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