交叉熵代价函数定义及其求导推导(读书笔记)-阿里云开发者社区

开发者社区> 大黄有故事> 正文

交叉熵代价函数定义及其求导推导(读书笔记)

简介: 目的:为了解决学习缓慢的问题 神经元的输出就是 a = σ(z),其中z=∑wjij+bz=\sum w_{j}i_{j}+b是输⼊的带权和。
+关注继续查看

目的:为了解决学习缓慢的问题


神经元的输出就是 a = σ(z),其中z=wjij+b是输⼊的带权和。

C=1n[ylna+(1y)ln(1a)]

其中 n 是训练数据的总数,求和是在所有的训练输⼊ x 上进⾏的, y 是对应的⽬标输出。

表达式是否解决学习缓慢的问题并不明显。实际上,甚⾄将这个定义看做是代价函数也不是显⽽易⻅的!在解决学习缓慢前,我们来看看交叉熵为何能够解释成⼀个代价函数。

将交叉熵看做是代价函数有两点原因。

第⼀,它是⾮负的, C > 0。可以看出:式子中的求和中的所有独⽴的项都是负数的,因为对数函数的定义域是 (0,1),并且求和前⾯有⼀个负号,所以结果是非负。

第⼆,如果对于所有的训练输⼊ x,神经元实际的输出接近⽬标值,那么交叉熵将接近 0。

假设在这个例⼦中, y = 0 ⽽ a ≈ 0。这是我们想到得到的结果。我们看到公式中第⼀个项就消去了,因为 y = 0,⽽第⼆项实际上就是 − ln(1 − a) ≈ 0。反之, y = 1 ⽽ a ≈ 1。所以在实际输出和⽬标输出之间的差距越⼩,最终的交叉熵的值就越低了。(这里假设输出结果不是0,就是1,实际分类也是这样的)

综上所述,交叉熵是⾮负的,在神经元达到很好的正确率的时候会接近 0。这些其实就是我们想要的代价函数的特性。其实这些特性也是⼆次代价函数具备的。所以,交叉熵就是很好的选择了。但是交叉熵代价函数有⼀个⽐⼆次代价函数更好的特性就是它避免了学习速度下降的问题。为了弄清楚这个情况,我们来算算交叉熵函数关于权重的偏导数。我们将a=ς(z)代⼊到 公式中应⽤两次链式法则,得到:

Cwj=====1nwj[ylna+(1y)ln(1a)]1na[ylna+(1y)ln(1a)]awj1n(ya1y1a)awj1n(yς(z)1y1ς(z))ς(z)wj1n(yς(z)1y1ς(z))ς(z)xj

根据ς(z)=11+ez 的定义,和⼀些运算,我们可以得到 ς(z)=ς(z)(1ς(z))。化简后可得:

Cwj=1nxj(ς(z)y)

这是⼀个优美的公式。它告诉我们权重学习的速度受到ς(z)y,也就是输出中的误差的控制。更⼤的误差,更快的学习速度。这是我们直觉上期待的结果。特别地,这个代价函数还避免了像在⼆次代价函数中类似⽅程中ς(z)导致的学习缓慢。当我们使⽤交叉熵的时候,ς(z)被约掉了,所以我们不再需要关⼼它是不是变得很⼩。这种约除就是交叉熵带来的特效。实际上,这也并不是⾮常奇迹的事情。我们在后⾯可以看到,交叉熵其实只是满⾜这种特性的⼀种选择罢了。

根据类似的⽅法,我们可以计算出关于偏置的偏导数。我这⾥不再给出详细的过程,你可以轻易验证得到:

Cb=1n(ς(z)y)

再⼀次, 这避免了⼆次代价函数中类似ς(z)项导致的学习缓慢。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9963 0
函数定义与声明:
函数定义与声明: 在程序中输写通数时,要先对函数进行声明,再对函数进行定义。函数的声明是让编译器知道函数的名称、参数、返回值类型等信息。函数的定义是让编译器知道函数的功能。 函数声明的格式由函数返回值类型、函数名、参数列表和分号4部分组成,其形式如下: 返回值类型 函数名(参数列表); 此处要注意的是,在声明的最后要用分号“,"作为语句的结尾。
294 0
Java数组与函数的结合
import java.util.Scanner; public class HelloWorld { public static void main(String[] args){ // Scanner s = new Scanner(System.
703 0
Redis系列-存储篇hash主要操作函数小结
hash是一些列key value(field value)的映射表。常常用其存储一些对象实例。相对于把一个对象的各个字段存储为string,存储为hash会占用更少的内存。为什么会更省内存呢?需要搞清楚两个配置(hash-max-zipmap-entries和hash-max-zipmap-value)的含义,配置的详细介绍,我打算放在最后的配置优化环节讲。
704 0
C++语言基础 例程 类声明和成员函数定义的分离
贺老师的教学链接  本课讲解 1、一个程序,一个源文件的做法 #include<iostream> #include<cstring> using namespace std; class Student { private: char Name[20]; //学生姓名 double Chinese; //语文成绩 double Math; /
1126 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13719 0
数据库自定义函数
一、函数   在数据库中都有函数,这些函数属于系统函。除此之外用户也可以编写用户自定义函数。用户定义函数是存储在数据库中的代码块,可以把值返回到调用程序。调用时如同系统函数一样,如max(value)函数,其value被称为参数。
724 0
+关注
大黄有故事
java,算法,编程语言相关技术专家
114
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载