交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式。与二次代价函数相比,它能更有效地促进ANN的训练。在介绍交叉熵代价函数之前,本文先简要介绍二次代价函数,以及其存在的不足。

1. 二次代价函数的不足

ANN的设计目的之一是为了使机器可以像人一样学习知识。人在学习分析新事物时,当发现自己犯的错误越大时,改正的力度就越大。比如投篮:当运动员发现自己的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更容易投进篮筐。同理,我们希望:ANN在训练时,如果预测值与实际值的误差越大,那么在反向传播训练的过程中,各种参数调整的幅度就要更大,从而使训练更快收敛。然而,如果使用二次代价函数训练ANN,看到的实际效果是,如果误差越大,参数调整的幅度可能更小,训练更缓慢。

以一个神经元的二类分类训练为例,进行两次实验(ANN常用的激活函数为sigmoid函数,该实验也采用该函数):输入一个相同的样本数据x=1.0(该样本对应的实际分类y=0);两次实验各自随机初始化参数,从而在各自的第一次前向传播后得到不同的输出值,形成不同的代价(误差):

实验1:第一次输出值为0.82

实验2:第一次输出值为0.98

在实验1中,随机初始化参数,使得第一次输出值为0.82(该样本对应的实际值为0);经过300次迭代训练后,输出值由0.82降到0.09,逼近实际值。而在实验2中,第一次输出值为0.98,同样经过300迭代训练,输出值只降到了0.20。

从两次实验的代价曲线中可以看出:实验1的代价随着训练次数增加而快速降低,但实验2的代价在一开始下降得非常缓慢;直观上看,初始的误差越大,收敛得越缓慢

其实,误差大导致训练缓慢的原因在于使用了二次代价函数。二次代价函数的公式如下:

其中,C表示代价,x表示样本,y表示实际值,a表示输出值,n表示样本的总数。为简单起见,同样一个样本为例进行说明,此时二次代价函数为:

目前训练ANN最有效的算法是反向传播算法。简而言之,训练ANN就是通过反向传播代价,以减少代价为导向,调整参数。参数主要有:神经元之间的连接权重w,以及每个神经元本身的偏置b。调参的方式是采用梯度下降算法(Gradient descent),沿着梯度方向调整参数大小。w和b的梯度推导如下:

其中,z表示神经元的输入,表示激活函数。从以上公式可以看出,w和b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,w和b的大小调整得越快,训练收敛得就越快。而神经网络常用的激活函数为sigmoid函数,该函数的曲线如下所示:

如图所示,实验2的初始输出值(0.98)对应的梯度明显小于实验1的输出值(0.82),因此实验2的参数梯度下降得比实验1慢。这就是初始的代价(误差)越大,导致训练越慢的原因。与我们的期望不符,即:不能像人一样,错误越大,改正的幅度越大,从而学习得越快。

可能有人会说,那就选择一个梯度不变化或变化不明显的激活函数不就解决问题了吗?图样图森破,那样虽然简单粗暴地解决了这个问题,但可能会引起其他更多更麻烦的问题。而且,类似sigmoid这样的函数(比如tanh函数)有很多优点,非常适合用来做激活函数,具体请自行google之。

2. 交叉熵代价函数

换个思路,我们不换激活函数,而是换掉二次代价函数,改用交叉熵代价函数:

其中,x表示样本,n表示样本的总数。那么,重新计算参数w的梯度:

其中(具体证明见附录):

因此,w的梯度公式中原来的被消掉了;另外,该梯度公式中的表示输出值与实际值之间的误差。所以,当误差越大,梯度就越大,参数w调整得越快,训练速度也就越快。同理可得,b的梯度为:

实际情况证明,交叉熵代价函数带来的训练效果往往比二次代价函数要好。

3. 交叉熵代价函数是如何产生的?

以偏置b的梯度计算为例,推导出交叉熵代价函数:

在第1小节中,由二次代价函数推导出来的b的梯度公式为:

为了消掉该公式中的,我们想找到一个代价函数使得:

即:

对两侧求积分,可得:

而这就是前面介绍的交叉熵代价函数。



附录:

sigmoid函数为:


可证:

交叉熵代价函数(作用及公式推导)相关推荐

  1. 交叉熵代价函数(作用及公式推导

    交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式.与二次代价函数相比,它能更有效地促进ANN的训练.在介绍交叉熵代价函 ...

  2. 为什么需要交叉熵代价函数

    为什么需要交叉熵代价函数 人类却能够根据明显的犯错快速地学习到正确的东西.相反,在我们的错误不是很好地定义的时候,学习的过程会变得更加缓慢.但神经网络却不一定如此,这种行为看起来和人类学习行为差异很大 ...

  3. 交叉熵代价函数——当我们用sigmoid函数作为神经元的激活函数时,最好使用交叉熵代价函数来替代方差代价函数,以避免训练过程太慢...

    交叉熵代价函数 machine learning算法中用得很多的交叉熵代价函数. 1.从方差代价函数说起 代价函数经常用方差代价函数(即采用均方误差MSE),比如对于一个神经元(单输入单输出,sigm ...

  4. 交叉熵代价函数cross-entropy

    交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式.与二次代价函数相比,它能更有效地促进ANN的训练.在介绍交叉熵代价函 ...

  5. 机器学习基础(六)—— 交叉熵代价函数(cross-entropy error)

    交叉熵代价函数 1. 交叉熵理论 交叉熵与熵相对,如同协方差与方差. 熵考察的是单个的信息(分布)的期望: H(p)=−∑i=1np(xi)logp(xi) H(p)=-\sum_{i=1}^n p( ...

  6. python3 23.keras使用交叉熵代价函数进行MNIST数据集简单分类 学习笔记

    文章目录 前言 一.交叉熵代价函数简介 二.交叉熵代价函数使用 前言 计算机视觉系列之学习笔记主要是本人进行学习人工智能(计算机视觉方向)的代码整理.本系列所有代码是用python3编写,在平台Ana ...

  7. 反向传播算法推导(交叉熵代价函数-吴恩达机器学习)

    0. 前言 第一次看吴恩达老师机器学习视频时, 在9.29.29.2节卡住.看到评论区别人解答(Arch725 的解答)发现有一些疏漏,而且缺少一些铺垫,所以进行了一些修改补充. 本文的反向传播算法的 ...

  8. 交叉熵代价函数(损失函数)及其求导推导

    转自:http://blog.csdn.net/jasonzzj/article/details/52017438 前言 交叉熵损失函数 交叉熵损失函数的求导 前言 说明:本文只讨论Logistic回 ...

  9. 交叉熵代价函数(损失函数)及其求导推导 (Logistic Regression)

    目录 1. 前言 2. 交叉熵损失函数 3. 交叉熵损失函数的求导 前言 说明:本文只讨论Logistic回归的交叉熵,对Softmax回归的交叉熵类似(Logistic回归和Softmax回归两者本 ...

  10. 损失函数梯度对比-均方差和交叉熵

    前言 我们都知道在机器学习中,希望算法或者网络收敛更快,有些是对数据预处理,尤其是Batch Normalization,有些是采用不同的激活函数,尤其是Relu激活函数取得了巨大的成功,还有一种加速 ...

最新文章

  1. c语言产生一m序列,其特征多相式:1+x^3+x^5,M序列伪随机码在测距回答概率控制中的 - FPGA/ASIC技术 - 电子发烧友网...
  2. Android异步处理三:Handler+Looper+MessageQueue深入详解
  3. NI FlexLogger 2020 R3中文版
  4. Linux 内核抓包功能实现基础(五) 常见问题解析
  5. ant root环境配置_如何给root用户设置PATH环境变量
  6. 在aspx页面向iframe中post参数
  7. node 获取表单数据 为空_数据结构与算法(python)单向链表篇
  8. 离散信号的希尔伯特变换的计算公式_希尔伯特变换和瞬时频率问题--连载(二)...
  9. jdba怎么连接mysql_一、JAVA通过JDBC连接mysql数据库(连接)
  10. web前端常用知识点
  11. MKCMS6.2.3视频程序源码修复列表页
  12. 「BZOJ 3529」「SDOI 2014」数表「莫比乌斯反演」
  13. 在Windows Server 2003上运行vSphere Client 4.0出现“clients.xml文件出错r
  14. VSCode前端文件(html文件)如何以服务器模式打开?
  15. Java 核心编程技术干货,2019 最新整理版
  16. 通用无线公共接口cpri学习笔记_11/24
  17. 彩色证件照片常用的红色、蓝色背景颜色值
  18. 已知函数comp的C语言,在C ++ STL中设置value_comp()函数
  19. R语言使用dplyr包计算dataframe分组聚合样本独特值个数、计数个数、四分位距IQR
  20. 图像去模糊系列二 高斯白噪声

热门文章

  1. sql或oracle插入数据时进行md5加密
  2. etc profile 的使用
  3. uni-app之实现分页
  4. C++11 std::bind
  5. JavaWeb之编码问题
  6. cp命令显示进度条_教程 | Linux常用命令大全
  7. vmVare使用NAT模式-配置详情
  8. ora使用动态sql给变量赋值
  9. CentOs 开启ssh服务
  10. d3.js中点可以用图片吗_拿什么拯救你,长英文命名——用中文(也许标点也可以)试试...