为了解决梯度下降求解变慢问题,怎么选择代价函数?怎么初始化参数?

为了解决梯度下降求解变慢问题,怎么选择代价函数?怎么初始化参数?

梯度下降求解变慢问题

Gradien descent slowdown-1

如果aL非常小或者非常大,则 aL*(1-aL) 接近于0。导致权重更新时,WL变化很小,出现了求解变得超慢的问题。

如何避免变慢问题

此时我们可能这样想,如果在dJ/dWL里,消掉g’(ZL),使之不受影响,能够正常的速度下降求解就好了。

所以我们这样干:

代价函数选择

选择一个完美的代价函数来消掉g’(ZL)。

输出单元选sigmoid作为激活函数

Gradien descent slowdown-2

我们发现选择了交叉熵的cost function后,dJ/dWL消掉g’(ZL),变成与(AL-Y)相关了。(AL-Y)的含义是预测值和实际值的误差,也就是说权重的下降速率由输出结果的误差决定了。这很好啊,是我们期待的。

输出单元为线性单元即直接输出

Gradien descent slowdown-3

cost function 选 quadratic cost function ( 均方误差函数 ) 时,不存在g’(ZL)的影响。所以输出直接线性输出时,可以直接用均方误差函数。

输出单元为softmax回归

想再解释一下softmax的cost function的含义:

Gradien descent slowdown-4

这里权重更新的速度也由预测误差值决定,是我们期待的。

附:推导出交叉熵函数

我们的期待是权重下降由误差来决定,所以写出1-1式。

Gradien descent slowdown-5

反推得到的就是交叉熵的函数表达式了。

参数初始化

一般采用随机初始化的方式初始化参数。

1
Wi = np.random.rand(ni+1,ni);

这样得到的是独立分布的高斯随机变量,均值为0,标准差是1。

Gradien descent slowdown-6

随机初始化

为了解决这种情况,我们可以给随机的结果乘个缩小系数。
如:

1
Wi = np.random.rand(ni+1,ni)*0.001;

随机窄分布初始化

这种治标不治本,只是整体缩小了参数,我们可能会这样想:压缩一下z的分布,使之更尖锐,这样|z|就不会很大了。

Gradien descent slowdown-7

如:

1
Wi = np.random.rand(ni+1,ni)/np.sqrt(ni);

输入数据归一化

此外,对输入数据进行归一化也是必须要做的,为了避免神经元饱和。

正则化对参数的影响

下面是加了L2正则项之后权重w的更新公式,先不管怎么得到的,看看加了正则后的影响。

Gradien descent slowdown-8

简单的理解,正则化可以看作是一种能够折中考虑小的权重和最小化原来的cost fuction 的方法。入是正则系数,它越小,偏好于最小化原来的 cost fuction-J(w),它越大偏好更小的权重。

正则是为了减少过拟合,先可以有个印象,就是正则使得网络少学习了训练集局部的噪声,增强网络泛化能力。我对正则化的理解及推导会在后面的一篇里写出。

0 Comments