博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
神经网络之代价函数的选择
阅读量:2377 次
发布时间:2019-05-10

本文共 1641 字,大约阅读时间需要 5 分钟。

引言

上一章节,我们介绍了神经网络,同时在后面的扩展遗留了几个问题。其中一个问题就是代价函数的选择。常规的机器学习算法中,我们都是选取的二次函数作为代价函数,这个没有什么大的问题,但是本章我们分析一下二次代价函数,看下二次代价的性质,同时看下是否有其他更好的代价函数可供我们选择。

二次代价函数

上一章节的神经网络中,我们选择了二次代价函数与sigmoid激活函数作为例子,引出介绍了神经网络。利用梯度下降算法,能够更新权重,使网络具有了学习的能力。

为什么二次代价函数学习效率会比较差

回顾一下梯度下降算法,其中的更新权重的方程如下所示:

wkwk=wkηCwk w k → w k ′ = w k − η ∂ C ∂ w k

blbl=blηCbl b l → b l ′ = b l − η ∂ C ∂ b l

其中 η η 是学习速率,当给定时,那么权重的更新就完全取决于后面的偏导数。也就意味着权重的更新大小将完全取决于后面的偏导数。那么我们来分析一下偏导 Cwk ∂ C ∂ w k

回顾一下:

C(w,b)=12nx||y(x)a||2 C ( w , b ) = 1 2 n ∑ x | | y ( x ) − a | | 2

σ=11+ez σ = 1 1 + e − z

其中

z=jwjxj+b z = ∑ j w j ∗ x j + b

a=σ(z) a = σ ( z )

根据链式求导法则:

Cwk=Caazzwk=1nx(ay)σ(z)xj ∂ C ∂ w k = ∂ C ∂ a ∂ a ∂ z ∂ z ∂ w k = − 1 n ∑ x ( a − y ) σ ′ ( z ) x j

其中 (ay) ( a − y ) 是输出与实际的差值,也就是误差,误差越大,那么权重的衰减就会越大,那么也就意味着学习效率越快,但是这里我们看到方程式中还乘以了一个导数 σ(z) σ ′ ( z ) 我们看下 σ(z) σ ( z ) 的图像

这里写图片描述

我们可以看到在最开始的地方,导数比较小,中间部分导数比较大,尾部导数依旧比较小,这也就意味着我们的权重更新最初是很慢的,也就意味着我们刚开始的学习效率是比较差劲的。

交叉熵代价函数

既然二次代价函数学习dasfadfafd效率比较差,那么是否存在其他的代价函数,能够消除二次代价函数存在的这个问题呢?这里我们引入交叉熵代价函数

C(w,b)=1nx[ylna+(1y)ln(1a)] C ( w , b ) = − 1 n ∑ x [ y ln ⁡ a + ( 1 − y ) ln ⁡ ( 1 − a ) ]

交叉熵函数具有非常优良的性质,同样我们根据链式求导法则:

Cwk=Caazzwk=1nx(ya1y1a)σ(z)xj=1nx((σ(z)y)σ(z)(1σ(z)))σ(z)xj ∂ C ∂ w k = ∂ C ∂ a ∂ a ∂ z ∂ z ∂ w k = − 1 n ∑ x ( y a − 1 − y 1 − a ) σ ′ ( z ) x j = 1 n ∑ x ( ( σ ( z ) − y ) σ ( z ) ( 1 − σ ( z ) ) ) σ ′ ( z ) x j

同时由于:

σ=11+ez σ = 1 1 + e − z

σ=σ(z)(1σ(z)) σ ′ = σ ( z ) ( 1 − σ ( z ) )

将其带入到上面的导数公式,可得:

Cwk=1nx(σ(z)y)xj ∂ C ∂ w k = 1 n ∑ x ( σ ( z ) − y ) x j

这个性质就很优良了啊。权重的减少完全取决于误差,而跟激活函数的导数无关了。也就意味着初始的误差越大,学习效率越高。这就和人类的行为一致了,因为当人类犯错误的时候,才能更好的学习到东西,机器也应该如此啊。

你可能感兴趣的文章
ERP&MES&SCM 三兄弟发展史
查看>>
Grace的简历-v3.1
查看>>
file2
查看>>
file456
查看>>
需求定位模型
查看>>
BOM
查看>>
Eclipse Debug调试详解
查看>>
Type Dynamic Web Module 4.0 requires Java 1.8 or newer----彻底杀死Bug
查看>>
前端接口请求测试
查看>>
error RS102 too stale to catch up
查看>>
Nagios监控MySQL报错:NRPE: Unable to read output的详细解决过程
查看>>
YUM安装调试以及命令详解
查看>>
在MySQL中使用init-connect与binlog来实现用户操作追踪记录
查看>>
使用Duplicate target database命令恢复线上oracle datagard备库
查看>>
源码编译安装MySQL5.6.12详细过程
查看>>
Emoji表情符号录入MySQL数据库报错的解决方案
查看>>
Linux系统CentOS6.2版本下安装JDK7详细过程
查看>>
Android Studio之Activity切换动画(三)
查看>>
我是怎样和Linux系统结缘并通过红帽RHCE认证的
查看>>
DIYer最担心的事来了!CPU降价彻底无望
查看>>