神经网络三:浅析神经网络backpropagation算法中的代价函数和神经网络的反向传播原理、和ResNet网络的捷径链接误差传播计算

在博客神经网络一:介绍,示例,代码中,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}

假设有一个神经网络模型:

该模型很简单,只有一个输入,一个神经元,一个输出。假设输入值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)的函数关系如下图:

从图可以看到,一开始迭代的时候代价函数就下降很快。当迭代次数为100的时候代价函数基本上就开始收敛,迭代到300的时候最后的输出为0.09,已经很接近目标值0了。此时的权重w=-1.28,偏向值b=-0.98。

上面的过程都建立在初始值得基础上得到的,重新改变初始值:w=2.0,b=2.0,学习率还是0.15,此时第一次正向的输出值为:0.98再z进行Backpropagation Algorithm的迭代,如下图;

当迭代到300次时,输出为0.20,也可以认为接近0,当该图在迭代次数为160左右的时候才开始下降,开始学习。对比于上面的情况,可以看出模型开始下降很快的迭代次数是不一样的,即学习情况是不一样的。为什么后一种情况“学习慢”这是为什么呢?

原因分析为:

由公式\begin{align}W_{ij}^{(l)} &= W_{ij}^{(l)} - \alpha \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) \\b_{i}^{(l)} &= b_{i}^{(l)} - \alpha \frac{\partial}{\partial b_{i}^{(l)}} J(W,b)\end{align}可以看出,学习慢(更新迭代慢)是因为的值很小造成的,值小和代价函数有关,分析使用的代价函数:

\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函数的图形:

观察图形得到,当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}未必一定是最好的,那么是否还有其他的代价函数来解决上述学习慢的情况呢?是否能解决学习慢,效率低的区问题呢?下面将进行分析。

2 代价函数cross-entropy 

(1)熵(entropy)

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

则随机变量X的熵定义为:

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

此时变化曲线为:

(2)cross-entropy 代价函数

假设有一个神经网络:

 

定义cross-entropy函数:

这里对比于熵中X只取1和0的二类概况下:log->ln,y和a与p有关。

为什么可以用该函数做cost函数?原因为:

1)函数值C大于等于0,由上图的H(p)变化曲线可以得知。

2)当a=y时,C->0.

下面关于对w做偏导(对b同理可得):

这里定义函数σ(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函数时的变化曲线:

相比于第一种代价函数,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)如果神经元的方程式线性的(在上面分析中,两种都是非线性的情况),用二次函数不会有学习慢的问题,即用二次函数的效果是很好的。

4、神经网络的反向传播原理:

参考博客:https://www.cnblogs.com/pinard/p/6494810.html

主要的如下:

 注意:上面的是基于卷积网络的一个解析反向传播,对于其它的网络结构其原理也是一样的,其中对于其它的结构例如Resnet网络的捷径传播误差的。

从上面的原理可以看出,对于Resnet的误差传播,如果其连接方式是和叠加,其前向传播如下:

shortcut_cpu(l.batch, l.w, l.h, l.c, state.net.layers[l.index].output, l.out_w, l.out_h, l.out_c, l.output);

void shortcut_cpu(int batch, int w1, int h1, int c1, float *add, int w2, int h2, int c2, float *out)
{
	int stride = w1 / w2;
	int sample = w2 / w1;
	assert(stride == h1 / h2);
	assert(sample == h2 / h1);
	if (stride < 1) stride = 1;
	if (sample < 1) sample = 1;
	int minw = (w1 < w2) ? w1 : w2;
	int minh = (h1 < h2) ? h1 : h2;
	int minc = (c1 < c2) ? c1 : c2;

	int i, j, k, b;
	for (b = 0; b < batch; ++b){
		for (k = 0; k < minc; ++k){
			for (j = 0; j < minh; ++j){
				for (i = 0; i < minw; ++i){
					int out_index = i*sample + w2*(j*sample + h2*(k + c2*b));
					int add_index = i*stride + w1*(j*stride + h1*(k + c1*b));
                    //一般add跟out的维度都是一样的,则也out_index、add_index的值一样,
                    //add、out分别是两条路径上的网络输出
					out[out_index] += add[add_index];
				}
			}
		}
	}
}

则其反向传播的误差同大小向两个方向传播,因为上面的两条路的输出值权重都是1进行求和,则根据公式得出权重乘于损失即为反向损失。则其反向损失对应的计算韩式也是上面的shortcut_cpu()函数。其调用方式变为:

shortcut_cpu(l.batch, l.out_w, l.out_h, l.out_c, l.delta, l.w, l.h, l.c, state.net.layers[l.index].delta);

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值