神经网络三:浅析神经网络backpropagation算法中的代价函数

在博客神经网络一:介绍,示例,代码中,Backpropagation Algorithm中用到了代价函数:\begin{align}J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2.\end{align}该代价函数是否是最好的?其有没有自身的局限性?还有其他的代价函数吗,有何特点?本文将针对这些问题进行分析。具体的分析是借鉴麦子学院的相关课程中的内容。

1 代价函数(二次cost) \begin{align}J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2.\end{align}

假设有一个神经网络模型:
神经网络三:浅析神经网络backpropagation算法中的代价函数_第1张图片
该模型很简单,只有一个输入,一个神经元,一个输出。假设输入值x=1, 真实输出值y=0。初始w=0.6,b=0.9,学习率为0.15,使用的f函数为 sigmoid函数: \textstyle f(z) = 1/(1+\exp(-z)) 。我们最终的目标是求得预测值a接近0或等于0。将相关参数值带入,求得第一次正向的最后的预测值输出为a=0.82。接下来就要进行反向传播算法,代价函数和循环迭代次数(epoch)的函数关系如下图:
神经网络三:浅析神经网络backpropagation算法中的代价函数_第2张图片
从图可以看到,一开始迭代的时候代价函数就下降很快。当迭代次数为100的时候代价函数基本上就开始收敛,迭代到300的时候最后的输出为0.09,已经很接近目标值0了。此时的权重w=-1.28,偏向值b=-0.98。
上面的过程都建立在初始值得基础上得到的,重新改变初始值:w=2.0,b=2.0,学习率还是0.15,此时第一次正向的输出值为:0.98再z进行 Backpropagation Algorithm的迭代,如下图;
神经网络三:浅析神经网络backpropagation算法中的代价函数_第3张图片
当迭代到300次时,输出为0.20,也可以认为接近0,当该图在迭代次数为160左右的时候才开始下降,开始学习。对比于上面的情况,可以看出模型开始下降很快的迭代次数是不一样的,即学习情况是不一样的。为什么后一种情况“学习慢”这是为什么呢?
原因分析为:
由公式神经网络三:浅析神经网络backpropagation算法中的代价函数_第4张图片可以看出,学习慢(更新迭代慢)是因为的值很小造成的,值小和代价函数有关,分析使用的代价函数:

\begin{align}J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2.\end{align}

对于模型只有一个x,一个神经元,一个输出y时,代价函数可以改为:
J = (y-a)*(y-a)/2。其中的a=f(z),z=wx+b。
将J分别关于w和b 求偏导,并将x=1,y=0带入得:


所以都和f(z)的导数有关,即和f(z)有关,而\textstyle f(z) = 1/(1+\exp(-z)),即sigmoid函数,下面分析sigmoid函数,如图为sigmoid函数的图形:
神经网络三:浅析神经网络backpropagation算法中的代价函数_第5张图片
观察图形得到,当f(z)快接近1(或接近0)的时候,其变化很小,变化很小即f(z)导数很小,则的值就会小,更新就会很慢,即学习就会慢。直接从f(z)的导数\textstyle f'(z) = f(z) (1-f(z))也可以看出。
综上分析可知学习的快慢和代价函数是有关系的,只用代价函数为 \begin{align}J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2.\end{align} 未必一定是最好的,那么是否还有其他的代价函数来解决上述学习慢的情况呢?是否能解决学习慢,效率低的区问题呢?下面将进行分析。

代价函数cross-entropy 

(1)熵(entropy)

在信息论与概率统计中, 熵(entropy)是表示随机变量不确定性的度量,设X是一个取有限个值得随机变量,其概率分布为:
则随机变量X的熵定义为:

当X只取两个值:1,0时,

此时变化曲线为:
神经网络三:浅析神经网络backpropagation算法中的代价函数_第6张图片

(2)cross-entropy 代价函数

假设有一个神经网络:

神经网络三:浅析神经网络backpropagation算法中的代价函数_第7张图片
定义cross-entropy函数:

这里对比于熵中X只取1和0的二类概况下:log->ln,y和a与p有关。
为什么可以用该函数做cost函数?原因为:
1)函数值C大于等于0,由上图的H(p)变化曲线可以得知。
2)当a=y时,C->0.
下面关于对w做偏导(对b同理可得):
神经网络三:浅析神经网络backpropagation算法中的代价函数_第8张图片
这里定义函数σ(z) = \textstyle f(z) = 1/(1+\exp(-z)),即sigmoid函数,对σ(z)求导,得\textstyle f'(z) = f(z) (1-f(z))
将导数带入C对w的偏导中,分母可以消掉,为:

所以最终的学习快慢取决于:σ(z)-y。即当我们的错误率比较大,即σ(z)-y比较大的时候,更新多,学习快;相反,错误小的时候,学习慢,趋于收敛,这正是神经网络中代价函数所需要的。对于偏向值b同理可得。
下面是代价函数为: \begin{align}J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2.\end{align} 时。第二种情况下,代价函数为cross-entropy函数时的变化曲线:
神经网络三:浅析神经网络backpropagation算法中的代价函数_第9张图片
相比于第一种代价函数,cross-entropy函数显示出其优势。

3 总结

1)cross-entropy函数几乎总是比二次cost函数\begin{align}J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2.\end{align}好;
2)如果神经元的方程式线性的(在上面分析中,两种都是非线性的情况),用二次函数不会有学习慢的问题,即用二次函数的效果是很好的。


你可能感兴趣的:(深度学习)