代价函数的选择
在我们训练时可能会遇到学习缓慢的问题。学习缓慢问题可能时步长的问题,步长设置的太小导致每次权重的变化过慢,而另一个原因就可能是激活函数的问题了,我们可以通过选择不同的代价函数来规避这个问题。
如下图神经元所示:
:
我们训练有一个参数的神经元,使其输入1,输出为0,激活函数为sigmoid的模型。初始w=0.6,b=0.9,训练情况如下
cost为代价函数 Epoch为训练次数
而当我们设置初始w=2.0,b=2.0时,训练情况如下:
我们从这两幅训练情况来看,我们不难看出第一幅图训练情况符合我们的预期,在正确与计算结果相差较大的情况下能够快速的学习,而第二幅图就出现了问题一开始的学习速度十分缓慢这是为什么?
最常见的sigmoid激活函数图像如下:
在其输出接近于1是变得平缓,于是sigmoid的导数就会逼近于0,但我们通过链式法则来进行梯度下降时就会出现问题,比如代价函数为时,我们的求出偏导中就会含有sigmoid的导数项,而当此时我们神经元计算sigmoid函数时的值接近于1时,学习缓慢的问题就出现了。
我们如何解决这个问题呢,一时可以更换激活函数,比如RELU等激活函数,或者是更换代价函数,如交叉熵代价函数:
n是训练样本数,y是正确结果,a是计算结果。
对于交叉熵的应用链式法则我们可以得到如下推到过程:
简化:
最终有:
我们可以发现sigmoid的导数被约掉了,所以说交叉熵代价函数可以解决有sigmoid导数导致的学习缓慢问题。
过拟合与规范化问题
我们根据真实事件创建对应的神经网络模型,并且通过减小代价函数的方式去调整权重参数。但是这种方式是无法一直做到,通过代价函数减小,准确率不断提高的。为什么?我们可以做到在训练集上达到很高的准确率,如果我们继续训练,你会发现,在某一时刻,在测试集上的测试结果准确率随着代价函数的减小反而降低了。这个很好理解,试想一下,如果你做出一个识别人的神经网络,通过分析图像判断图像上面是否有人。你有1000张带有人的图像,1000张没有人在的图像作为训练进行训练,你反复的使用这2000张图片进行训练,你会发现在测试集上的准确率前期会随着训练次数增加而增加,后来则会出现准确率下降的问题。为什么会出现这一问题,最简单的答案,训练样本太少,20000张呢?200000张呢?我们无法训练所有样本,这样一来,神经网络就会有可能“锁定局部特征”,即将训练样本中大部分都有的,非所有图像共有的特征作为判别条件之一,并且逐渐加大其权重,就出现了过拟合现象。过拟合现象可以说时不可能消失的,在样本数无法增加的情况下我们可以通过规范化来减轻过拟合。
规范化是用作代价函数上的,我们在代价函数上增加一个规范化项,例如在交叉熵代价函数上进行规范化:
相比于原先的交叉熵代价函数,此时多出了一个规范化项,偏置不需要规范化项。
在反向传播计算权重的变化时,由变为了 为求得的偏导数
可以看出,有了规范化后,只是每次改变权重时缩减了权重大小。为什么缩减权重后会减小过拟合?因为⼩的权重在某种程度上,意味着更低的复杂性,也就对数据给出 了⼀种更简单却更强⼤解释,因此应该优先选择。说下理解,过拟合就是对于训练样本的“细节”扣的太细,所以我们给权重一个限制,让他扣“细节”时轻一点,这样一来,我们即朝着正确的大方向走,又不会死扣小的路径,从而走进死胡同。