kay nielsen(michael wu)

内容广告上

我还是从xndc wwddy的神经网络学的。基于之前的学习,我已经大致了解了神经网络和BP算法的基本结构,也可以通过神经网络训练数字识别功能。之后,我尝试了用神经网络训练前的文本分类,但只是简单地用词频作为词向量处理过程,没有任何其他参数调整过程。对于8个分类,准确率达到84%,相比之前的参数调整,勉强达到72%。嗯,安利在神经网络上做了这么久,现在该回到正题了。

这篇文章和后续文章涉及神经网络的调整。有人会说:“看,神经网络也需要调优参数。”其实我想表达的是,神经网络在参数整定时的精度非常好。调整参数只需要上一段楼梯,神经网络的参数调整绝对比支持向量机(SVM)简单得多。这就是我喜欢神经网络的原因。

神经网络调谐包括三个方面:

**1.损失函数的选择

2.正规化

3.初始参数W和B的选择* *

本文主要集中在优化的第一个方面,即选择一个新的损失函数来加快学习过程。

简单回忆一下上一篇文章中的损失函数,学习xndc wwddy的神经网络之一,即二次损失函数:二次代价。它的基本形式是:

这个损失函数有什么问题?事实上,二次损失函数有很多优点,例如容易推导和基本表示“损失”一词的含义。现在我们来看看这个损失函数对于特定神经元的表现过程。

首先,对于下图中的单个神经元,我们假设初始权重w=0.6,偏移量b=0.9,步长n=0.15。那么我们假设这个神经元的输出是0.0。根据以前的神经元计算方法,我们的计算结果是0.82,这有很大的初始误差。然后我们观察这个神经元在使用梯度下降法过程中的参数变化过程:

从图中可以看出,结果还是很给力的。300次迭代,结果是0.09,和结果相差不大。这是其中一个例子。

让我们看另一个例子。我们也使用了二次损失函数,但是我们将初始权重W和B设计为2,步长为0.15,输出结果为0.98,比第一个结果大。同样,我们来看看它的参数在梯度下降过程中的变化过程:

经过30次迭代,输出结果为0.2,误差远大于第一次迭代。

通过这两个例子,我们能发现什么?在第二个例子中,初始参数偏差很大,所以初始误差很大。但是,从变化图中可以看出,学习过程相当缓慢(曲线相对平滑)。从人的角度来看,如果给定初始参数,一个人发现这个参数的偏差很大,通常这个人会增加而不是减少参数调整范围。但是从第二个例子来看,

回顾之前的神经网络,我们一开始用随机数生成W和B。在二次损失函数的情况下,这引起了严重的问题。如果随机生成的数字有点正常,就像上面的例子1,我们可以收敛得更快,但是如果生成的数字初始偏差很大,很容易导致最终收敛过程太慢的问题。

现在,从数学的角度,想象一下为什么当参数误差很大时,二次损失函数的学习速度会变慢。

为了简单起见,让我们以单个神经元为例。

一、损失函数:

相应的推导方法为:

因为使用了sigmoid函数,所以A的值在(0,1)之间。从上面的导数公式可以看出,当A和Y相差较大时,导数值较低,这意味着这个值的输出与误差值没有直接的线性关系,这就是二次损失函数容易学习缓慢的原因。鉴于上述二次损失函数的确定,本文引入了“互熵”损失。

或者以单个神经元为例:

让我们来看看互熵的表示:

其实这和一般的熵没什么区别。我们来说说为什么互熵能起到损失函数的作用。总而言之,有几个优点:

值为正,输出数据之间存在依赖关系,W和B的导数的结果与误差值正相关。

具体方面再说吧。对于第一点:这是显而易见的。

对于第二点:我们可以看到,如果输出应该为1,那么当我们通过神经元得到的输出接近1时,它的值为0,当我们通过神经元得到的输出为0时,它的值为1,基本满足损失函数所要求的函数。

对于第三点;我们可以很容易地得到:

其中a是神经元的输出值。

从上面的导数公式很容易得出一个结论:当误差值较大时,W和B的下降梯度也会变大,这与我们想要的不同。

功能是一样的。

现在来测试一下使用互熵作为损失函数的效果,和文章开篇测试的方法一样,只是对于单个神经元的测试: 例一:初始权重w为0.6,偏移b=0.9,需要的输出是0,步长为0.15.

例二:w和b都为2,需要输出是0,步长为0.15

可以看出如果误差越大,其下降的梯度也就越大,也就是说学习过程加快了,达到了我们要的效果。

拓展到多层多个神经元,其求导方式是一样的,只不过多了一些参数罢了

在使用了互熵作为损失函数之后,之前的神经网络代码就需要改变了,不过只是需要改变一下在BP步骤里面的求导值即可

delta = (self.cost).delta(zs[-1], activations[-1], y) #(1) nabla_b[-1] = delta #(2) nabla_w[-1] = np.dot(delta, activations[-2].transpose) #(3)

其中在第一步中

delta计算值为:activations[-1]-y 这个和我们上面的求导结果是一样的。

END!

参考文献:《Improving the way neural networks learn》xndc wwddy's 神经网络与深度学习

内容广告下