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

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



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

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

其中 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)代⼊到 公式中应⽤两次链式法则,得到:

∂C∂wj=====−1n∑∂∂wj[ylna+(1−y)ln(1−a)]−1n∑∂∂a[ylna+(1−y)ln(1−a)]∗∂a∂wj−1n∑(ya−1−y1−a)∗∂a∂wj−1n∑(yς(z)−1−y1−ς(z))∂ς(z)∂wj−1n∑(yς(z)−1−y1−ς(z))ς′(z)xj

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

∂C∂wj=1n∑xj(ς(z)−y)

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

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

∂C∂b=1n∑(ς(z)−y)

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

时间: 2024-08-03 02:41:59

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

神经网络的交叉熵损失函数

常见损失函数 0-1损失函数 L(Y,f(X))={1,0Y != f(X)Y = f(X) 平方损失函数 L(Y,f(X))=(Y−f(X))2 绝对损失函数L(Y,f(X))=|(Y−f(X))| 对数损失函数L(Y,P(Y|X))=−logP(Y|X) 常见的损失函数包含以上几个. 平方损失函数 在神经网络中样本的平方损失函数一般会定义为: Ed=12∑i(zi−yi)2,方便求导后约掉系数. 使用误差逆传播训练神经网络时会使用梯度下降法来更新每个神经网络中的权重, 根据链式求导法可以得到

BP算法双向传,链式求导最缠绵(深度学习入门系列之八)

更多深度文章,请关注:https://yq.aliyun.com/cloud 系列文章: 一入侯门"深"似海,深度学习深几许(深度学习入门系列之一)人工"碳"索意犹尽,智能"硅"来未可知(深度学习入门系列之二)神经网络不胜语,M-P模型似可寻(深度学习入门系列之三)"机器学习"三重门,"中庸之道"趋若人(深度学习入门系列之四)Hello World感知机,懂你我心才安息 (深度学习入门系列之五)损失函数减肥

归一化(softmax)、信息熵、交叉熵

机器学习中经常遇到这几个概念,用大白话解释一下: 一.归一化 把几个数量级不同的数据,放在一起比较(或者画在一个数轴上),比如:一条河的长度几千甚至上万km,与一个人的高度1.7m,放在一起,人的高度几乎可以被忽略,所以为了方便比较,缩小他们的差距,但又能看出二者的大小关系,可以找一个方法进行转换. 另外,在多分类预测时,比如:一张图,要预测它是猫,或是狗,或是人,或是其它什么,每个分类都有一个预测的概率,比如是猫的概率是0.7,狗的概率是0.1,人的概率是0.2... , 概率通常是0到1之间

mfc-MFC中如何使用求导法判断周期数据中的拐点和鞍点

问题描述 MFC中如何使用求导法判断周期数据中的拐点和鞍点 MFC中如何使用求导法判断周期数据中的拐点和鞍点,分别提取它们到新的数据文件 解决方案 http://zhidao.baidu.com/link?url=hFcevJMBxUipTvIYlyYLYpCQsQkLqhwInXMkJ0Qtt65fs1UPgtAasbpQIxQzk4Tz9ZMBWUbk-ao5PGrGV3w6fAoRv73ZYSgLAh0i3IHurTW

mfc-MFC函数求幂之后已经有了原浮点数和幂,是不是就可以求导?

问题描述 MFC函数求幂之后已经有了原浮点数和幂,是不是就可以求导? MFC函数求幂之后已经有了原浮点数和幂,是不是就可以求导?求导的函数公式怎么计算?看了一些资料但是不是很明晰 解决方案 http://www.bianceng.cn/Programming/cplus/201411/46664.htm

NDArray自动求导

NDArray可以很方便的求解导数,比如下面的例子:(代码主要参考自https://zh.gluon.ai/chapter_crashcourse/autograd.html)  用代码实现如下: 1 import mxnet.ndarray as nd 2 import mxnet.autograd as ag 3 x = nd.array([[1,2],[3,4]]) 4 print(x) 5 x.attach_grad() #附加导数存放的空间 6 with ag.record(): 7

c语言- 用C语言实现一元多项式求导

问题描述 用C语言实现一元多项式求导 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 设计函数求一元多项式的导数. 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格.注意"零多项式"的指数和系数都是0,但是表示为"0 0". 输入样例: 3 4 -5

编程-写一个宏定义#define 求高手作答。

问题描述 写一个宏定义#define 求高手作答. 今天突发奇想,object C里面 @""hello"" 就代表了 hello 的字符串. 然后C++里面 ""hello"" 即代表 hello 字符串. 能否写个define 类似于 @""__str__"" = ""__str__"" 的功能. 类似 #define @""

mfc-一个MFC求幂指数函数和求导结合的问题

问题描述 一个MFC求幂指数函数和求导结合的问题 如果C++ 6.0 MFC已经求出了幂指数函数,请问如何进一步求指定浮点数的导数 解决方案 求导和求指数函数是两回事,参考:http://wenku.baidu.com/link?url=IA5Py3jd-tpw-ZMuvtSrW8vlhKr32BTf7DeGhsYUNuMnqWhMw5RPj14r5bcng7bz0sMXuaWQTCvxAeE8t765OsGeuFuB5WhH9Nhyyw9JU3K