出发点

对于一个样本,有输入和输出结果,我们的目的是优化训练我们的模型,使得对于样本输入,模型的预测输出尽可能的接近真实输出结果。现在需要一个损失函数来评估预测输出与真实结果的差距

均方误差

回归问题

样本有若干维,每一维都有一个真实值。我们要将样本的数据通过我们的模型预测也得到同样多的预测值,真实值可以看成一个向量,预测值也一样。预测值向量要在某种定义下与真实值向量是接近的。

定义

L = 1 N ∑ i = 1 N ( y ^ i − y i ) 2 L={1\over N}\sum\limits_{i=1}^{N}(\hat y_i-y_i)^2 L=N1​i=1∑N​(y^​i​−yi​)2

其中 N N N为样本的总维数, y i y_i yi​表示第i维的真实值, y ^ i \hat y_i y^​i​表示第i维的预测值,这个误差函数是容易理解的。

如果把这个样本看做N维空间中的一个向量,均方误差实际上是这真实值与预测值两个向量的欧氏距离

均方误差实际上就是一种衡量“有多近”的标准,这个距离的定义显然是合适的。

在实际应用中,我们需要利用梯度方法训练模型,因此损失函数应当是容易计算梯度并且不会产生梯度消失的。

考虑 L L L对每个 y ^ i \hat y_i y^​i​的偏导
∂ L ∂ y ^ i = 1 N 2 ( y ^ i − y i ) {\partial L\over \partial \hat y_i}={1\over N}2(\hat y_i-y_i) ∂y^​i​∂L​=N1​2(y^​i​−yi​)
当预测值与真实值差别越大,即 ∣ y ^ i − y i ∣ |\hat y_i-y_i| ∣y^​i​−yi​∣越大时,梯度的绝对值也是更大的,这符合我们的要求。

分类问题

与回归问题不同的是,样本的每一维的真实值不是连续,有序的,而是一个个离散的类别

这些类别不仅不连续(离散),而且还是无序的,如果仍然用回归问题的思路,直接去这个 y ^ i \hat y_i y^​i​表示把第 i i i维归入哪一类显然是不合适的,因为不存在2.5类这样的东西。在这种情况下传统的均方误差也不适用了。因为第1类与第2类的差距并不一定比第1类与第9类的差距小,然而 ( 2 − 1 ) 2 < ( 9 − 1 ) 2 (2-1)^2<(9-1)^2 (2−1)2<(9−1)2,也就是说类之间没法定义“距离”的概念了。

如果我们换一种思路呢,尝试预测分到每一类的概率?

概率分布

假设总共有 K K K类,对于每一维的预测值不是一个类别的确定值,而是一个K维的向量,代表分到每一类的一个概率分布。

设 z i k z_i^k zik​表示样本第 i i i维被分到第k类的概率

神经网络直接得到出来的预测值并不能满足概率的要求——和为1

那么将这个预测值过一个Softmax


p i k = e z i k ∑ j = 1 K e z i j p_i^k={\text e^{z_i^k}\over \sum\limits_{j=1}^{K}\text e^{z_i^j}} pik​=j=1∑K​ezij​ezik​​
这样就得到了一个和为1的概率分布,同时这个概率分布很好的突出了最大值(指数关系)。

举例,[1,5,3],通过softmax后得到的是[0.015,0.866,0.117]

那对应的真实值又是什么呢?

如果训练数据中样本每一维的Label就是确定的类别,那么就是一个只有正确的类那一维概率为1,其他维都为0的K维向量。

设第i维的真实类别为 y i y_i yi​,那么
p i k = { 1 , k = y i 0 , e l s e p_i^k=\begin{cases}1,&k=y_i\\0,&else \end{cases} pik​={1,0,​k=yi​else​
在某些特殊情况中,训练数据的Label不是确定的类别,而也是一个概率分布。

既然是两个向量的差异,那这样我们不可以直接做均方差吗?
L = 1 N ∑ i = 1 N 1 K ∑ k = 1 K ( p ^ i k − p i k ) 2 L={1\over N}\sum\limits_{i=1}^N{1\over K}\sum\limits_{k=1}^K(\hat p_i^k-p_i^k)^2 L=N1​i=1∑N​K1​k=1∑K​(p^​ik​−pik​)2
(同样用 p ^ i k \hat p_i^k p^​ik​代表预测值)

在实际情况中,分类问题往往不像回归问题那样要同时考虑多维,分类问题的样本往往就是一维的(N=1),就是这个东西要分到哪一类,其实也就是加起来除以N的区别,不妨设N=1,那么下标 i i i可以去掉了。

得到
L = 1 K ∑ k = 1 K ( p ^ k − p k ) 2 L={1\over K}\sum\limits_{k=1}^K(\hat p_k-p_k)^2 L=K1​k=1∑K​(p^​k​−pk​)2
我们下面将说明,在这里用均方差是不合适的。

梯度消失

由于这里的 p p p是 z z z过了一遍softmax的结果,我们还要把这个加上
∂ L ∂ z ^ k = ∂ L ∂ p ^ k ∂ p ^ k ∂ z ^ k {\partial L\over \partial \hat z_k}={\partial L\over \partial \hat p_k}{\partial \hat p_k\over \partial \hat z_k} ∂z^k​∂L​=∂p^​k​∂L​∂z^k​∂p^​k​​

∂ L ∂ p ^ k = 1 K 2 ( p ^ k − p k ) {\partial L\over \partial \hat p_k}={1\over K}2(\hat p_k-p_k) ∂p^​k​∂L​=K1​2(p^​k​−pk​)

就是先前求过的均方差的梯度


S = ∑ j = 1 K e z ^ j S=\sum\limits_{j=1}^{K}\text e^{\hat z_j} S=j=1∑K​ez^j​

∂ p ^ k ∂ z ^ k = e z ^ k ( S − e z ^ k ) S 2 = p ^ k ( 1 − p ^ k ) {\partial \hat p_k\over \partial \hat z_k}={\text e^{\hat z_k}(S-\text e^{\hat z_k})\over S^2}=\hat p_k(1-\hat p_k) ∂z^k​∂p^​k​​=S2ez^k​(S−ez^k​)​=p^​k​(1−p^​k​)
所以
∂ L ∂ z ^ k = 1 K 2 ( p ^ k − p k ) p ^ k ( 1 − p ^ k ) {\partial L\over \partial \hat z_k}={1\over K}2(\hat p_k-p_k)\hat p_k(1-\hat p_k) ∂z^k​∂L​=K1​2(p^​k​−pk​)p^​k​(1−p^​k​)
我们前面说过,softmax的特点是突出大值,最大的那个 p ^ k \hat p_k p^​k​大了,其他的就自然小了, p ^ k \hat p_k p^​k​不仅与 z ^ k \hat z_k z^k​有关,更重要的是 z ^ k \hat z_k z^k​在所有 z ^ \hat z z^中的相对大小而不是绝对大小,所以我们主要关心真实概率 p k p_k pk​较大的那些类,只需要那些类被突出出来,其他自然就小了。

大的概率值应该是怎么样的?

真实概率 p k p_k pk​较大,预测出来的 p ^ k \hat p_k p^​k​我们也希望它比较大,当 p ^ k \hat p_k p^​k​很小的时候就错了,这个时候梯度绝对值应该更大

这时候就出问题了,当预测出来 p ^ k \hat p_k p^​k​特别接近0的时候,均方差计算出的梯度非常小,当 p ^ k = 0 \hat p_k=0 p^​k​=0时梯度直接消失了,这明显是有问题的。这就需要我们使用新的损失函数。

交叉熵

交叉熵本身是用来计算两个概率分布之间的差异性信息的。

定义式是这样的
L = − ∑ k = 1 K p k log ⁡ p ^ k L=-\sum\limits_{k=1}^K p_k\log \hat p_k L=−k=1∑K​pk​logp^​k​
log外面的是第k类的真实概率,里面的是第k类的预测概率

(在绝大多数分类问题中, p k p_k pk​只有一个是1,其他都是0,都是确定的分类任务,也就是说求和式只有一项。但不失一般性,我们还是按照原来的形式讨论)

现在我们来求它的梯度

求梯度

∂ L ∂ z ^ k = ∂ L ∂ p ^ k ∂ p ^ k ∂ z ^ k {\partial L\over \partial \hat z_k}={\partial L\over \partial \hat p_k}{\partial \hat p_k\over \partial \hat z_k} ∂z^k​∂L​=∂p^​k​∂L​∂z^k​∂p^​k​​

其中
∂ p ^ k ∂ z ^ k = e z ^ k ( S − e z ^ k ) S 2 = p ^ k ( 1 − p ^ k ) {\partial \hat p_k\over \partial \hat z_k}={\text e^{\hat z_k}(S-\text e^{\hat z_k})\over S^2}=\hat p_k(1-\hat p_k) ∂z^k​∂p^​k​​=S2ez^k​(S−ez^k​)​=p^​k​(1−p^​k​)
这一部分与上面是一样的。


∂ L ∂ p ^ k = − p k p ^ k {\partial L\over \partial \hat p_k}=-{p_k\over \hat p_k} ∂p^​k​∂L​=−p^​k​pk​​
那么
∂ L ∂ z ^ k = − p k ( 1 − p ^ k ) {\partial L\over \partial \hat z_k}=-p_k(1-\hat p_k) ∂z^k​∂L​=−pk​(1−p^​k​)

真实概率 p k p_k pk​较大,当 p ^ k \hat p_k p^​k​很小的时候,梯度绝对值应该更大,可以观察到上式是符合突出大值的要求的,在这种情况下按照梯度下降法走一步, z ^ k \hat z_k z^k​的增大量会比其他 z z z要大, p ^ k \hat p_k p^​k​就会被突出。

另外的想法

网上还有一些说法是,在分类问题中我们只关心最大值(因为最后输出的答案还是要找一个概率最大的输出),把整个分布拟合的那么像没有意义。

在确定的分类任务中,对于那些错误的类( p k = 0 p_k=0 pk​=0,预测值 p ^ k \hat p_k p^​k​是多少并不重要,只要它不是最大的那个就行了,所以它是 0.1 0.1 0.1还是 0.01 0.01 0.01并不一定有很大的差别,而均方误差的目标是概率分布的完全拟合,它可能过于严格了。)

【AI学习总结】均方误差(Mean Square Error,MSE)与交叉熵(Cross Entropy,CE)损失函数相关推荐

  1. 经典损失函数——均方误差(MSE)和交叉熵误差(CEE)的python实现

    损失函数(loss function)用来表示当前的神经网络对训练数据不拟合的程度.这个损失函数有很多,但是一般使用均方误差和交叉熵误差等. 1.均方误差(mean squared error) 先来 ...

  2. 均方误差(mean-square error, MSE)

    欢迎关注博主的公众号:happyGirl的异想世界.有更多干货还有技术讨论群哦~ 全参考图像质量评价的方法有:PSNR 峰值信噪比: SSIM 结构相似性:MSE 均方误差: 我们接下来介绍一下均方误 ...

  3. 动手学深度学习——softmax回归之OneHot、softmax与交叉熵

    目录 一.从回归到多类分类 1. 回归估计一个连续值 2. 分类预测一个离散类别 二.独热编码OneHot 三.校验比例--激活函数softmax 四.损失函数--交叉熵 五.总结 回归可以用于预测多 ...

  4. 均方误差越大越好_直观理解为什么分类问题用交叉熵损失而不用均方误差损失?...

    交叉熵损失与均方误差损失 常规分类网络最后的softmax层如下图所示,传统机器学习方法以此类比, 一共有\(K\)类,令网络的输出为\([\hat{y}_1,\dots, \hat{y}_K]\), ...

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

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

  6. 【机器学习】 - 关于合适用均方误差(MSE)何时用交叉熵(cross-entropy)

    分类问题用交叉熵,回归问题用均方误差. 至于原因,可以看看它们的函数式,主要是两种损失函数对分类和回归结果误差的衡量的方式不同.比如,交叉熵,在分类时(热编码),如果分类正确,则损失值为零,否则就有个 ...

  7. 【TensorFlow】TensorFlow从浅入深系列之六 -- 教你深入理解经典损失函数(交叉熵、均方误差)

    本文是<TensorFlow从浅入深>系列之第6篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维导 ...

  8. 【MSE/BCE/CE】均方差、交叉熵损失函数理解

    文章目录 1 均方误差(Mean Squared Error, MSE) 1.1 MSE介绍 1.2 MSE为何不常用于分类 1.3 那什么常用于分类呢? 2 二值交叉熵损失(Binary Cross ...

  9. 机器学习入门(08)— 损失函数作用和分类(均方误差、交叉熵误差)

    神经网络的学习中的"学习"是指从训练数据中自动获取最优权重参数的过程. 为了使神经网络能进行学习,将导入损失函数这一指标.而学习的目的就是以该损失函数为基准,找出能使它的值达到最小 ...

最新文章

  1. github READme 的使用教程
  2. 集成学习(Bagging和AdaBoost和随机森林(random forest))
  3. java23中设计模式——结构模式——Composite(组合)
  4. Hadoop权威指南 _04_第I部分Hadoop基础知识_第2章关于MapReduce
  5. 少数民族青年作家要有更高的标准和目标
  6. c语言转义字符_C语言啊中的转义符有什么含义?
  7. bzoj2245 [SDOI2011]工作安排 费用流
  8. java对象拷贝——PropertyUtils copyProperties 用法和性能
  9. Tomcat基础教程(三)
  10. Maven ojdbc错误:Cannot resolve com.oracle:ojdbc6:11.2.0.1.0
  11. 计算机休眠后无法联网,电脑休眠后回来就不能上网了
  12. 米家蓝牙温湿度计2 换用 LIR2032 充电电池的问题
  13. 前端下载svg格式图片
  14. xkcd 单线程下载图片
  15. Android - 基于EasyAR SDK的AR红包的实现
  16. mark:Kafka
  17. 将十进制数对应的八进制、十六进制、十进制数输出
  18. AC 瘦AP配置 ensp
  19. 华为ensp NAT 相关配置
  20. c语言_std=c11,关于带有std = c11 arg的c:GCC警告

热门文章

  1. Firefox Developer Edition下载
  2. LBP特征学习及实现
  3. 机械臂控制软件,上位机软件 此机器人上位软件。 运动采用通用G代码指令编程,具有G5三维的空间圆弧插补,空间直线插补功能
  4. Windows 组件服务我的电脑出现红色向下箭头
  5. 用python画小王八裤(turtle库)
  6. mysql聚簇和非聚簇索引
  7. GitHub封了41万俄罗斯开发者账户,开源真的无国界?
  8. 虚拟地址空间【详解】 虚拟地址空间是什么 | 为什么要有虚拟地址空间
  9. STM32蜂鸣器实例详解
  10. Spring详细教程入门(一)