中计算均方误差_为什么分类问题不使用均方误差作为代价函数
导读
在神经网络中,回归问题通常都是使用均方误差(mean square erro)MSE作为代价函数,而在分类问题中通常都是选择最大似然函数或softmax作为代价函数,最大似然函数用于二分类,softmax用于多分类,softmax是最大似然函数对于多分类的推广。
不知道大家有没有想过,为什么在分类问题中不使用MSE作为代价函数呢?那么这篇文章就让我们来分析一下为什么在分类问题中不使用MSE作为代价函数。本篇文章的结构形式以理论+代码实践的方式来证明。代码实践以MXNet来实现,所以需要一点基础。
明确讨论的问题
为了帮助大家更好的理解,先简单介绍一下分类问题是如何实现的,为了简化分析问题我们使用一个单层的二分类模型来分析问题,一个单层的二分类模型结构图如下
二分类结构图
其实分类问题和回归问题最主要的区别在于,对回归问题来说通过全连接层之后就可以直接通过MSE损失函数来计算模型预测值与实际值之间的误差,然后通过计算梯度来更新参数。
而分类问题,在全连接层之后还需要通过sigmoid函数,目的是将输出归一化到(0,1)范围内,然后通过最大似然函数来计算预测值与实际值的误差,从而计算梯度更新参数。所以,模型最终输出是一个(0,1)范围内的概率值。sigmoid函数图像如下
sigmoid函数
通过分析sigmoid函数图像,我们可以发现sigmoid函数属于单调递增有界的非凸函数,取值范围在(0,1)范围内。
我们本篇文章讨论的问题是,通常对于分类问题而言在sigmoid后是通过最大似然函数损失来作为代价函数,而我们能不能将最大似然函数替换为均方误差。
理论分析
在分析一个函数是否能作为代价函数的时候,我们主要考虑的是代价函数是不是连续可导,从而通过计算梯度来更新参数,最小化代价函数。除此之外,还需要考虑一些代价函数是否具有一些其他的特性,如更新参数的速度,误差大更新的速度快,误差小更新的速度小。所以,我们主要是通过分析参数的更新来判断代价函数是否合适,在推导参数更新的时候需要知道下面几个公式
相关公式
MSE代价函数参数更新
均方误差代价函数
为了便于分析,下面我们绘制一下MSE代价函数的函数图像,x轴表示z的取值,y轴表示代价函数f(x),因为对于而分类问题来说,数据的真实标签y只能是0或1,不过为了让大家能够更好的观察出f(x)随z的变化,我们将y的取值为0.5
均方误差代价函数图像
通过MSE代价函数图像可以发现,它是一个凹函数最小值为0,不过大家仔细观察可以发现当z小于-2.5或z大于2.5时,代价函数的梯度(斜率)几乎接近于0(直线),所以如果在这个区间参数的更新会将会非常慢。
接下来我们来看看参数的梯度变化,然后再计算绝对误差A与参数梯度之间的关系
参数的梯度与误差之间的关系推导
接下来我们分析当真实值y取1时,绘制误差与参数梯度之间的关系如下图,因为误差范围在[0,1]之间所以只需要考虑误差在[0,1]区间内,参数梯度的变化
误差与参数梯度之间的关系
通过观察误差与参数梯度之间的关系可以发现,当误差大于0.7以后,为了最小化误差A,参数的梯度需要先由大到小,然后再变大才能使得误差A最小化,这样显然不利于模型的训练而且会导致需要更多的时间来迭代,造成更多的硬件资源的浪费。对于真实值y为0的情况大家可以自己
最大似然代价函数参数的更新
最大似然代价函数
为了让大家能够更好的观察出y轴f(x)随x轴z的变化,我们将真实值y取0.5,观察f(x)随z的变化如下图所示
最大似然代价函数图像
通过上图可以发现,最大似然函数作为代价函数时相对于均方误差函数而言,它的梯度区间更广,当均方误差函数在z大于2.5或小于-2.5时,梯度接近于0,而最大似然函数的梯度明显不为0。
接下来我们分析最大似然函数代价函数的梯度随误差的变化
函数图像如下
误差与参数梯度之间的关系
通过上图可以发现,当误差越大时,参数的梯度越大,参数的更新步伐越大,从而使得模型能够更快收敛。
代码实践
上面我们通过理论分析了当代价函数分别为均方误差函数和最大似然函数时,损失值随着输入的变化和梯度与误差之间的变化关系。
接下来,我们通过一个二分类来实践一下。代码主要是基于mxnet来实现的
首先我们随机生成1000个样本,每个样本包含两个特征,样本服从均值为0方差为0.5的正态分布。然后,通过定义边界,将1000个样本分为两个不同的类别,对于不满足条件的样本直接剔除。然后,分别定义了最大似然代价函数和均方误差代价函数。
代码
通过最大似然函数作为代价函数,经过 10个epoch之后,我们可以绘制出数据的分类边界如下图
分类边界
大家可以尝试着将loss改为square_loss,然后再跑一下模型,可以发现其实模型还是能够收敛。准确率和以最大似然函数为边界时毫无差别。
在理论分析中,我们发现当z值过大时,以均方误差为代价函数的参数的梯度会接近于0,从而会导致模型难以收敛,所以接下来我们将w参数的初始化改为均值为10,代码如下
w = mx.nd.random.normal(loc=10,scale=0.1,shape=(input_x.shape[1],1),dtype=np.float64)
可以发现,当以均方误差为代价函数时,经过10个epoch之后模型在测试集上的准确率只有19%,而且模型的收敛速度很慢。当以最大似然函数为代价函数时,经过大约6个epoch模型在测试集上的准确率就可以达到100%,而且模型的收敛速度非常快。
总结
通过理论分析和代码实践,可以发现在分类问题中使用最大似然函数作为代价函数的两个优点:
- 最大似然函数作为代价函数时,具有当误差越大时,参数的梯度越大,模型收敛越快
- 最大似然函数作为代价函数时,真实值与模型预测值之间的误差和参数的梯度呈反比,而均方误差作为代价函数时,真实值与模型预测值之间的误差和参数呈非线性关系,不利于模型的收敛
- 最大似然函数作为代价函数的梯度区间(梯度大于0)大于以均方误差作为代价函数的梯度区间
中计算均方误差_为什么分类问题不使用均方误差作为代价函数相关推荐
- python中计算带分数_聊聊 python 数据处理全家桶(Redis篇)
作者:星安果 来源:AirPython 前面两篇文章聊到了 python 处理 Mysql.Sqlite 数据库常用方式,本篇文章继续说另外一种比较常用的数据存储方式:Redis Redis:Remo ...
- mysql中计算金额_使用MySQL计算单个表中借方和贷方的余额
使用以下MySQL表包含带有相关金额的借方或贷方"操作",如何选择具有非零"余额"的所有CLIENT_ID?我已经尝试将表加入到自身中以计算所有借方和贷方总计, ...
- R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型、分类预测器(分类变量)被自动替换为一组虚拟编码变量、summary函数查看检查模型、使用table函数计算混淆矩阵评估分类模型性能
R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型(Logistic regression).分类预测器(分类变量)被自动替换为一组虚拟编码变量.summary函数查看检查模型.使用t ...
- python计算均方根误差_如何在Python中创建线性回归机器学习模型?「入门篇」
线性回归和逻辑回归是当今很受欢迎的两种机器学习模型. 本文将教你如何使用 scikit-learn 库在Python中创建.训练和测试你的第一个线性.逻辑回归机器学习模型,本文适合大部分的新人小白. ...
- 文本分类模型_文本分类中的经典深度学习模型
众所周知,文本分类是NLP领域中十分基础的任务,大部分文本分类模型稍加修改就可以应用到其他任务中.下面介绍几个经典的文本分类模型. 图中被引数来源google学术(2019/5/16) 1. text ...
- excel表格计算年龄_在Excel中计算年龄
excel表格计算年龄 Can you remember how old you are? Or are you like me, and have to ask, "What year i ...
- mysql 在字段中计算_整数在MySQL的计算字段中
我试图查询一个MySQL数据库.以整数形式存储在数据库中的字段将按照我的预期以整数形式返回.当在一个存储过程中计算出一个值时,即使我可以保证这个数字是0或1,它也会一直返回. 我需要一种方法来确保计算 ...
- 坡度土方计算案例_土石方工程造价中的细节解析(案例+计算式)
每个房建工程都避不开土石方工程,许多人知道怎样算量,也知道怎样组价,但是却有很多小细节的注意点被忽略,现将土石方工程从算量到组价的全过程整理,希望对大家深刻理解土石方规则,掌握手算及软件算技巧.组价注 ...
- origin怎么打开txt文本_【每日一学】差示扫描量热法(DSC)测量材料的比热容(3在Origin软件中计算间接法测得比热容的方法)...
在本系列内容第1部分和第2部分中分别介绍了使用DSC法通过间接法测量材料的比热容的常用方法的基本原理和得到高质量比热数据的方法,在完成实验后需要在相关的分析软件中计算所研究的材料的比热容. 在目前大多 ...
- comsol显示电场计算结果_在 COMSOL 中构建磁流体动力学多物理场模型
COMSOL Multiphysics® 软件中的模型都是从零开始构建的,软件支持多物理场,因此用户可以按照自己的意愿轻松地组合代表不同物理场现象的模型.有时这可以通过使用软件的内置功能来实现,但有些 ...
最新文章
- OO-ALV标准工具栏按钮
- 第四次作业-四则运算
- Oracle统计信息的导出、导入
- 从蓝桥杯来谈Fibonacci数列
- scroll-view——小程序横向滚动
- CTFHUB 《基础认证》:burp使用,basic请求了解
- 《Python cookbook》笔记一
- TCP模块如何处理数据包
- (十五)洞悉linux下的Netfilteriptables:开发自己的hook函数【实战】
- Springboot的工作机制:1 Springboot初体验
- 像素值与灰度值的区别与关系
- java上传下载原理_Java上传下载文件原理
- 新西兰理工大学计算机专业排名,有关往年新西兰的大学专业排名
- 《惢客创业日记》2019.01.23(周三) 太苦涩的人生也会让人麻木
- 计划三年投入十亿资金,统信UOS生态腾飞加速
- 偏爱MySQL,Nifty使用4个Web Server支撑5400万个用户网站
- 使用ADB 查看模拟器得日志,unity得日志 以及保存
- mac下使用diskutil给U盘格式化
- 西安面试第一天面试问题总结
- 数字世界的积木-从MOS管搭反相器,与非门,锁存器,触发器
热门文章
- 非零基础入门微信小程序
- Mongodb 学习
- Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
- shell中set的用法(转)
- 题目1544:数字序列区间最小值
- 2008 DHCP中继器代理服务
- Oracle使用技巧及PL/SQL Developer配置
- MediaDevices.getUserMedia()
- Webrtc demo system
- JM8.6之erc_api.c文件初探