从理论到实践分析分类问题中为什么不使用均方误差损失函数
导读在神经网络中 , 回归问题通常都是使用均方误差(meansquareerro)MSE作为代价函数 , 而在分类问题中通常都是选择最大似然函数或softmax作为代价函数 , 最大似然函数用于二分类 , softmax用于多分类 , softmax是最大似然函数对于多分类的推广 。
不知道大家有没有想过 , 为什么在分类问题中不使用MSE作为代价函数呢?那么这篇文章就让我们来分析一下为什么在分类问题中不使用MSE作为代价函数 。 本篇文章的结构形式以理论+代码实践的方式来证明 。 代码实践以MXNet来实现 , 所以需要一点基础 。
明确讨论的问题为了帮助大家更好的理解 , 先简单介绍一下分类问题是如何实现的 , 为了简化分析问题我们使用一个单层的二分类模型来分析问题 , 一个单层的二分类模型结构图如下
而分类问题 , 在全连接层之后还需要通过sigmoid函数 , 目的是将输出归一化到(0,1)范围内 , 然后通过最大似然函数来计算预测值与实际值的误差 , 从而计算梯度更新参数 。 所以 , 模型最终输出是一个(0,1)范围内的概率值 。 sigmoid函数图像如下
我们本篇文章讨论的问题是 , 通常对于分类问题而言在sigmoid后是通过最大似然函数损失来作为代价函数 , 而我们能不能将最大似然函数替换为均方误差 。
理论分析在分析一个函数是否能作为代价函数的时候 , 我们主要考虑的是代价函数是不是连续可导 , 从而通过计算梯度来更新参数 , 最小化代价函数 。 除此之外 , 还需要考虑一些代价函数是否具有一些其他的特性 , 如更新参数的速度 , 误差大更新的速度快 , 误差小更新的速度小 。 所以 , 我们主要是通过分析参数的更新来判断代价函数是否合适 , 在推导参数更新的时候需要知道下面几个公式
接下来我们来看看参数的梯度变化 , 然后再计算绝对误差A与参数梯度之间的关系
最大似然代价函数参数的更新
接下来我们分析最大似然函数代价函数的梯度随误差的变化
代码实践上面我们通过理论分析了当代价函数分别为均方误差函数和最大似然函数时 , 损失值随着输入的变化和梯度与误差之间的变化关系 。
接下来 , 我们通过一个二分类来实践一下 。 代码主要是基于mxnet来实现的
首先我们随机生成1000个样本 , 每个样本包含两个特征 , 样本服从均值为0方差为0.5的正态分布 。 然后 , 通过定义边界 , 将1000个样本分为两个不同的类别 , 对于不满足条件的样本直接剔除 。 然后 , 分别定义了最大似然代价函数和均方误差代价函数 。
在理论分析中 , 我们发现当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)大于以均方误差作为代价函数的梯度区间
推荐阅读
- 米歇尔·戴斯玛克特|海奥华预言的真相,地球人被带到九级文明,揭开神话背后的秘密
- 从小就馋此口,比肉香多了,几块钱做一大盘,咋吃都不腻
- 这早餐我从3岁开始吃,三十多年了,从没吃腻过,晶莹剔透很好吃
- 萝卜做饺子馅时,到底要不要焯水?很多人都不清楚,吃完告诉家人
- 显微镜|假如人类可以把显微镜提升到40亿倍,是不是全新的宇宙观?
- 火星|拍摄11064张照片后,火星毅力号看到了什么?这次还真看到了
- 冬天到了,教你几道暖胃家常菜,营养健康,孩子营养不发愁!
- 水煮鱼到底怎么做即简单还好吃呢?下面三款家常做法你觉得怎样?
- 孩子特爱吃的煎饼,颜色鲜艳,营养美味,2分钟出锅,看到就想吃
- 豆腐不要红烧了,教你做外脆里嫩的炸豆腐,家人吃到赞不绝口
