机器学习大牛是如何选择回归损失函数的?
无论在机器学习还是深度领域中,损失函数都是一个非常重要的知识点。损失函数(Loss Function)是用来估量模型的预测值 f(x) 与真实值 y 的不一致程度。我们的目标就是最小化损失函数,让 f(x) 与 y 尽量接近。通常可以使用梯度下降算法寻找函数最小值。
关于梯度下降最直白的解释可以看我的这篇文章:
简单的梯度下降算法,你真的懂了吗?
损失函数有许多不同的类型,没有哪种损失函数适合所有的问题,需根据具体模型和问题进行选择。一般来说,损失函数大致可以分成两类:回归(Regression)和分类(Classification)。今天,红色石头将要总结回归问题中常用的 3 种损失函数,希望对你有所帮助。
回归模型中的三种损失函数包括:均方误差(Mean Square Error)、平均绝对误差(Mean Absolute Error,MAE)、Huber Loss。
1. 均方误差(Mean Square Error,MSE)
均方误差指的就是模型预测值 f(x) 与样本真实值 y 之间距离平方的平均值。其公式如下所示:
其中,yi 和 f(xi) 分别表示第 i 个样本的真实值和预测值,m 为样本个数。
为了简化讨论,忽略下标 i,m = 1,以 y-f(x) 为横坐标,MSE 为纵坐标,绘制其损失函数的图形:
MSE 曲线的特点是光滑连续、可导,便于使用梯度下降算法,是比较常用的一种损失函数。而且,MSE 随着误差的减小,梯度也在减小,这有利于函数的收敛,即使固定学习因子,函数也能较快取得最小值。
平方误差有个特性,就是当 yi 与 f(xi) 的差值大于 1 时,会增大其误差;当 yi 与 f(xi) 的差值小于 1 时,会减小其误差。这是由平方的特性决定的。也就是说, MSE 会对误差较大(>1)的情况给予更大的惩罚,对误差较小(<1)的情况给予更小的惩罚。从训练的角度来看,模型会更加偏向于惩罚较大的点,赋予其更大的权重。
如果样本中存在离群点,MSE 会给离群点赋予更高的权重,但是却是以牺牲其他正常数据点的预测效果为代价,这最终会降低模型的整体性能。我们来看一下使用 MSE 解决含有离群点的回归模型。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(1, 20, 40)
y = x + [np.random.choice(4) for _ in range(40)]
y[-5:] -= 8
X = np.vstack((np.ones_like(x),x)) # 引入常数项 1
m = X.shape[1]
# 参数初始化
W = np.zeros((1,2))# 迭代训练
num_iter = 20
lr = 0.01
J = []
for i in range(num_iter):y_pred = W.dot(X)loss = 1/(2*m) * np.sum((y-y_pred)**2)J.append(loss)W = W + lr * 1/m * (y-y_pred).dot(X.T)# 作图
y1 = W[0,0] + W[0,1]*1
y2 = W[0,0] + W[0,1]*20
plt.scatter(x, y)
plt.plot([1,20],[y1,y2])
plt.show()
拟合结果如下图所示:
可见,使用 MSE 损失函数,受离群点的影响较大,虽然样本中只有 5 个离群点,但是拟合的直线还是比较偏向于离群点。这往往是我们不希望看到的。
2. 平均绝对误差(Mean Absolute Error,MAE)
平均绝对误差指的就是模型预测值 f(x) 与样本真实值 y 之间距离的平均值。其公式如下所示:
为了简化讨论,忽略下标 i,m = 1,以 y-f(x) 为横坐标,MAE 为纵坐标,绘制其损失函数的图形:
直观上来看,MAE 的曲线呈 V 字型,连续但在 y-f(x)=0 处不可导,计算机求解导数比较困难。而且 MAE 大部分情况下梯度都是相等的,这意味着即使对于小的损失值,其梯度也是大的。这不利于函数的收敛和模型的学习。
值得一提的是,MAE 相比 MSE 有个优点就是 MAE 对离群点不那么敏感,更有包容性。因为 MAE 计算的是误差 y-f(x) 的绝对值,无论是 y-f(x)>1 还是 y-f(x)<1,没有平方项的作用,惩罚力度都是一样的,所占权重一样。针对 MSE 中的例子,我们来使用 MAE 进行求解,看下拟合直线有什么不同。
X = np.vstack((np.ones_like(x),x)) # 引入常数项 1
m = X.shape[1]
# 参数初始化
W = np.zeros((1,2))# 迭代训练
num_iter = 20
lr = 0.01
J = []
for i in range(num_iter):y_pred = W.dot(X)loss = 1/m * np.sum(np.abs(y-y_pred))J.append(loss)mask = (y-y_pred).copy()mask[y-y_pred > 0] = 1mask[mask <= 0] = -1W = W + lr * 1/m * mask.dot(X.T)# 作图
y1 = W[0,0] + W[0,1]*1
y2 = W[0,0] + W[0,1]*20
plt.scatter(x, y)
plt.plot([1,20],[y1,y2],'r--')
plt.xlabel('x')
plt.ylabel('y')
plt.title('MAE')
plt.show()
注意上述代码中对 MAE 计算梯度的部分。
拟合结果如下图所示:
显然,使用 MAE 损失函数,受离群点的影响较小,拟合直线能够较好地表征正常数据的分布情况。这一点,MAE 要优于 MSE。二者的对比图如下:
选择 MSE 还是 MAE 呢?
实际应用中,我们应该选择 MSE 还是 MAE 呢?从计算机求解梯度的复杂度来说,MSE 要优于 MAE,而且梯度也是动态变化的,能较快准确达到收敛。但是从离群点角度来看,如果离群点是实际数据或重要数据,而且是应该被检测到的异常值,那么我们应该使用MSE。另一方面,离群点仅仅代表数据损坏或者错误采样,无须给予过多关注,那么我们应该选择MAE作为损失。
3. Huber Loss
既然 MSE 和 MAE 各有优点和缺点,那么有没有一种激活函数能同时消除二者的缺点,集合二者的优点呢?答案是有的。Huber Loss 就具备这样的优点,其公式如下:
Huber Loss 是对二者的综合,包含了一个超参数 δ。δ 值的大小决定了 Huber Loss 对 MSE 和 MAE 的侧重性,当 |y−f(x)| ≤ δ 时,变为 MSE;当 |y−f(x)| > δ 时,则变成类似于 MAE,因此 Huber Loss 同时具备了 MSE 和 MAE 的优点,减小了对离群点的敏感度问题,实现了处处可导的功能。
通常来说,超参数 δ 可以通过交叉验证选取最佳值。下面,分别取 δ = 0.1、δ = 10,绘制相应的 Huber Loss,如下图所示:
Huber Loss 在 |y−f(x)| > δ 时,梯度一直近似为 δ,能够保证模型以一个较快的速度更新参数。当 |y−f(x)| ≤ δ 时,梯度逐渐减小,能够保证模型更精确地得到全局最优值。因此,Huber Loss 同时具备了前两种损失函数的优点。
下面,我们用 Huber Loss 来解决同样的例子。
X = np.vstack((np.ones_like(x),x)) # 引入常数项 1
m = X.shape[1]
# 参数初始化
W = np.zeros((1,2))# 迭代训练
num_iter = 20
lr = 0.01
delta = 2
J = []
for i in range(num_iter):y_pred = W.dot(X)loss = 1/m * np.sum(np.abs(y-y_pred))J.append(loss)mask = (y-y_pred).copy()mask[y-y_pred > delta] = deltamask[mask < -delta] = -deltaW = W + lr * 1/m * mask.dot(X.T)# 作图
y1 = W[0,0] + W[0,1]*1
y2 = W[0,0] + W[0,1]*20
plt.scatter(x, y)
plt.plot([1,20],[y1,y2],'r--')
plt.xlabel('x')
plt.ylabel('y')
plt.title('MAE')
plt.show()
注意上述代码中对 Huber Loss 计算梯度的部分。
拟合结果如下图所示:
可见,使用 Huber Loss 作为激活函数,对离群点仍然有很好的抗干扰性,这一点比 MSE 强。另外,我们把这三种损失函数对应的 Loss 随着迭代次数变化的趋势绘制出来:
MSE:
MAE:
Huber Loss:
对比发现,MSE 的 Loss 下降得最快,MAE 的 Loss 下降得最慢,Huber Loss 下降速度介于 MSE 和 MAE 之间。也就是说,Huber Loss 弥补了此例中 MAE 的 Loss 下降速度慢的问题,使得优化速度接近 MSE。
最后,我们把以上介绍的回归问题中的三种损失函数全部绘制在一张图上。
好了,以上就是红色石头对回归问题 3 种常用的损失函数包括:MSE、MAE、Huber Loss 的简单介绍和详细对比。这些简单的知识点你是否已经完全掌握了呢?
参考文献:
http://www.10tiao.com/html/782/201806/2247495489/1.html
https://www.cnblogs.com/massquantity/p/8964029.html
推荐阅读
我的深度学习入门路线
【干货】我的机器学习入门路线图
长文!机器学习笔试精选 100 题【附详细解析】
机器学习大牛是如何选择回归损失函数的?相关推荐
- 如何选择回归损失函数
转 如何选择回归损失函数 2018年09月07日 10:21:13 qq_34555202 阅读数 1467 无论在机器学习还是深度领域中,损失函数都是一个非常重要的知识点.损失函数(Loss Fun ...
- Sklearn 损失函数如何应用到_机器学习大牛最常用的5个回归损失函数,你知道几个?...
"损失函数"是机器学习优化中至关重要的一部分.L1.L2损失函数相信大多数人都早已不陌生.那你了解Huber损失.Log-Cosh损失.以及常用于计算预测区间的分位数损失么?这些可 ...
- 收藏 | 机器学习中常用的5种回归损失函数
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:机器猫 AI博士笔记系列推荐 周志华<机器学习>手推 ...
- 如何为模型选择合适的损失函数?所有ML学习者应该知道的5种回归损失函数
作者 | Prince Grover 译者 | 张建军 整理 | 阿司匹林.Jane 出品 | AI科技大本营 [导读]没有一个损失函数可以适用于所有类型的数据.损失函数的选择取决于许多因素,包括是否 ...
- 机器学习初学者都应该知道的5类回归损失函数
来源: https://heartbeat.fritz.ai/5-regression-loss-functions-all-machine-learners-should-know-4fb140e9 ...
- 机器学习中常用的5种回归损失函数
损失函数大致可分为两类:分类问题的损失函数和回归问题的损失函数. 1 均方误差 均方误差(MSE)是最常用的回归损失函数,计算方法是求预测值与真实值之间距离的平方和,公式如图. 2 平均绝对误差(MA ...
- 干货丨11位机器学习大牛最爱算法全解
1 来源:Quora 译者:朱焕 [导读]"你最喜欢的机器学习算法是什么?"这个问题有些像"你最喜欢的颜色是什么?"说不重要吧,细究起来,颇有深意.本文摘选一些 ...
- Coursera公开课笔记: 斯坦福大学机器学习第六课“逻辑回归(Logistic Regression)”
Coursera公开课笔记: 斯坦福大学机器学习第六课"逻辑回归(Logistic Regression)" 斯坦福大学机器学习第六课"逻辑回归"学习笔记,本次 ...
- 【机器学习基础】数学推导+纯Python实现机器学习算法13:Lasso回归
Python机器学习算法实现 Author:louwill 第13讲和第14讲我们来关注一下回归模型的两个变种模型.本节我们要介绍的是基于L1正则化的Lasso模型,下一节介绍基于L2正则化的Ridg ...
最新文章
- CSS:当子元素皆浮动,撑开父元素的3种方式
- 洛谷P1095守望者的逃离题解-伪动态规划/贪心
- powerbi 线性回归_Power BI二月新增图表及课程福利
- Memcache参数
- 作者:刘新海(1976-),男,中国人民银行征信中心副研究员
- [ASP.NET]动态页面调用JS错误。保存为HTML文件就不报错了。
- 华为Mate 50系列明年初发布:麒麟990/骁龙8 Gen1加持
- 疫时急速挑战,AI 落地大考
- Keras中文文档 评估标准Metrics
- CSkin相当优秀的C#/.Net Winform界面库
- 数据库学习与应用之什么是数据库
- 通过高阶DMD对地铁的实时短时OD预测
- 为什么博途V17及以下的HMI面板不能与1500固件版本2.9或1200版本4.5 的CPU建立连接?
- 注塑成型工艺流程四大知识点总结
- Aviary集成心得
- python-字符串练习1
- 计算机系统1 实验 LC-3 Nim游戏 子程序
- 【疑难杂症爆破委员会】UEFI Linux、Windows双系统,丢失Windows的efi文件导致找不到启动项(恢复Windows的efi文件)
- 电商项目实战第五节: CSS3+HTML5+JS 设计案例【考拉海购网站】之【商品栏及右侧垂直导航】
- Linux0.11内核源码解析01
热门文章
- 将 instance 连接到 vlan100- 每天5分钟玩转 OpenStack(95)
- winform 时间控件 可以选择时分 设置为空
- (3.2)将分词和去停用词后的评论文本基于“环境、卫生、价格、服务”分类...
- 【转】.NET NPOI操作Excel常用函数
- logback 常用配置详解(二) appender
- linux下配置DHCP中继代理
- 关于J2EE+DOTNET的一些网站
- poj 2831(次小生成树)
- hdu 3966( 树链剖分+点权更新)
- NYOJ 195 飞翔