1.6.2 交叉熵

从方差代价函数说起

代价函数经常用方差代价函数(即采用均方误差MSE),比如对于一个神经元(单输入单输出,sigmoid函数), 定义其代价函数为:

$$ C= \dfrac {(y-a)^2} 2 $$

其中y 是我们期望的输出,a为神经元的实际输出( a=σ(z), where z=wx+b)。

在训练神经网络过程中,我们通过梯度下降算法来更新w和b,因此需要计算代价函数对w和b的导数:这里假设了神经元x=1作为输入,y=0作为输出。

$$ \dfrac {\partial C} {\partial w} = (a-y)σ'(z)x =aσ'(z) $$

$$ \dfrac {\partial C} {\partial b} = (a-y)σ'(z) =aσ'(z) $$

然后更新w、b:

$$ w:= w-η \dfrac { \partial C} {\partial w} =w - η a *σ′(z) $$

$$ b:=b- η \dfrac { \partial C} {\partial b} =b - η a *σ′(z) $$

因为sigmoid函数的性质,导致σ′(z)在z取大值时会很小(如下图标出来的两端,几近于平坦),这样会使得w和b更新非常慢(因为η * a * σ′(z)这一项接近于0)。

交叉熵代价函数(cross-entropy cost function)

为了克服这个缺点,引入了交叉熵代价函数(下面的公式对应一个神经元,多输入单输出):

$$ C=- \dfrac 1 n \sum_x[ylna+(1-y)ln(1-a)] $$

其中y为期望的输出,a为神经元实际输出(a=σ(z), where $$ z=\sum_j w_jx_j + b $$ )

与方差代价函数一样,交叉熵代价函数同样有两个性质:

  • 非负性(所以我们的目标就是最小化代价函数)。
  • 当真实输出a与期望输出y接近的时候,代价函数接近于0.(比如y=0,a~0;y=1,a~1时,代价函数都接近0)。

另外,它可以克服方差代价函数更新权重过慢的问题。我们同样看看它的导数:

$$ \dfrac {\partial C} {\partial w_j}= \dfrac 1 n \sum_x x_j(σ(z)-y) $$

$$ \dfrac {\partial C} {\partial b}= \dfrac 1 n \sum_x(σ(z)-y) $$

可以看到,导数中没有σ′(z)这一项,权重的更新是受σ(z)-y这一项影响,即受误差的影响。所以当误差大的时候,权重更新就快,当误差小的时候,权重的更新就慢。这是一个很好的性质。

参考:http://neuralnetworksanddeeplearning.com/chap3.html

results matching ""

    No results matching ""