我应该使用 Softmax 的输出进行反向传播吗?
Should I use the output of Softmax for backpropagation?
我能够实现 Softmax 以便将其用于交叉熵成本函数,但我的问题是,我应该使用 Softmax 的输出(即概率)来进行反向传播并更新权重吗?
对我来说它看起来并不完全正确,因为 Softmax returns 是概率而不是神经元的实际值。
另一种选择是使用Softmax导数的输出。有人可以解释一下吗?
您应该使用这些值本身来计算导数。
计算输出层误差的公式如下(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])
.[=26 的原始输入=]
为了更好地理解导数有什么用以及它是如何工作的,让我们先看看它的用途是什么(摘自Wikipedia):
The derivative of a function of a real variable measures the sensitivity to change of the function (output) value with respect to a change in its argument (input value).
本质上,它衡量的是当输入发生少量变化时输出变化的速度(以及方向)(你可以说它衡量的是输出如何依赖于输入)。
结合测量网络误差的方法(成本函数),我们可以获得有关调整激活函数输入(即我们的权重)的最佳方法的信息,从而使输出更接近我们的所需的标签。
我们将误差乘以导数,然后我们在方向和比例上进行了小幅更新,以最好地优化函数以实现我们的目标。更新应用于权重(激活函数的输入),因此下次激活函数触发时,输出将稍微接近我们的标签。
现在关于将导数应用于函数的结果或其输入,因为我们正在查看函数的输出根据其输入发生了多少变化,导数必须采用函数的原始输入为了向我们提供有关他们的信息;这就是为什么将导数应用于层的输入(在本例中是最后一层的输出)。
您也可以尝试下面的实验来了解为什么会这样:
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
我能够实现 Softmax 以便将其用于交叉熵成本函数,但我的问题是,我应该使用 Softmax 的输出(即概率)来进行反向传播并更新权重吗?
对我来说它看起来并不完全正确,因为 Softmax returns 是概率而不是神经元的实际值。
另一种选择是使用Softmax导数的输出。有人可以解释一下吗?
您应该使用这些值本身来计算导数。
计算输出层误差的公式如下(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])
.[=26 的原始输入=]
为了更好地理解导数有什么用以及它是如何工作的,让我们先看看它的用途是什么(摘自Wikipedia):
The derivative of a function of a real variable measures the sensitivity to change of the function (output) value with respect to a change in its argument (input value).
本质上,它衡量的是当输入发生少量变化时输出变化的速度(以及方向)(你可以说它衡量的是输出如何依赖于输入)。
结合测量网络误差的方法(成本函数),我们可以获得有关调整激活函数输入(即我们的权重)的最佳方法的信息,从而使输出更接近我们的所需的标签。
我们将误差乘以导数,然后我们在方向和比例上进行了小幅更新,以最好地优化函数以实现我们的目标。更新应用于权重(激活函数的输入),因此下次激活函数触发时,输出将稍微接近我们的标签。
现在关于将导数应用于函数的结果或其输入,因为我们正在查看函数的输出根据其输入发生了多少变化,导数必须采用函数的原始输入为了向我们提供有关他们的信息;这就是为什么将导数应用于层的输入(在本例中是最后一层的输出)。
您也可以尝试下面的实验来了解为什么会这样:
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