机器学习算法中的7个损失函数的详细指南


机器学习算法中的7个损失函数的详细指南

文章插图
 
介绍
想象一下-你已经在给定的数据集上训练了机器学习模型,并准备好将它交付给客户 。但是,你如何确定该模型能够提供最佳结果?是否有指标或技术可以帮助你快速评估数据集上的模型?
当然是有的,简而言之,机器学习中损失函数可以解决以上问题 。
损失函数是我们喜欢使用的机器学习算法的核心 。但大多数初学者和爱好者不清楚如何以及在何处使用它们 。
它们并不难理解,反而可以增强你对机器学习算法的理解 。那么,什么是损失函数,你如何理解它们的意义?
在本文中,我将讨论机器学习中使用的7种常见损失函数,并解释每种函数的使用方法 。
目录
  • 什么是损失函数?
  • 回归损失函数
  • 平方误差损失
  • 绝对误差损失
  • Huber损失
  • 二分类损失函数
  • 二分类交叉熵
  • Hinge损失
  • 多分类损失函数
  • 多分类交叉熵损失
  • KL散度(Kullback Leibler Divergence Loss)
1. 什么是损失函数?
假设你在山顶,需要下山 。你如何决定走哪个方向?
机器学习算法中的7个损失函数的详细指南

文章插图
 
我要做的事情如下:
  • 环顾四周,看看所有可能的路径
  • 拒绝那些上升的路径 。这是因为这些路径实际上会消耗更多的体力并使下山任务变得更加艰难
  • 最后,走我认为的坡度最大的路径
关于我判断我的决策是否好坏的直觉,这正是损失函数能够提供的功能 。
损失函数将决策映射到其相关成本
决定走上坡的路径将耗费我们的体力和时间 。决定走下坡的路径将使我们受益 。因此,下坡的成本是更小的 。
在有监督的机器学习算法中,我们希望在学习过程中最小化每个训练样例的误差 。这是使用梯度下降等一些优化策略完成的 。而这个误差来自损失函数 。
损失函数(Loss Function)和成本函数(Cost Function)之间有什么区别?
在此强调这一点,尽管成本函数和损失函数是同义词并且可以互换使用,但它们是不同的 。
损失函数用于单个训练样本 。它有时也称为误差函数(error function) 。另一方面,成本函数是整个训练数据集的平均损失(average function) 。优化策略旨在最小化成本函数 。
2. 回归损失函数
此时你必须非常熟悉线性回归 。它涉及对因变量Y和几个独立变量 X_i 之间的线性关系进行建模 。因此,我们在空间中对这些数据拟合出一条直线或者超平面 。
【机器学习算法中的7个损失函数的详细指南】Y = a0 + a1 * X1 + a2 * X2 + ....+ an * Xn我们将使用给定的数据点来找到系数a0,a1,…,an 。
机器学习算法中的7个损失函数的详细指南

文章插图
 
我们将使用著名的波士顿住房数据集来理解这个概念 。为了简单起见,我们将只使用一个特征-每个住宅的平均房间数(Average number of rooms per dwelling)(X)来预测因变量-1000美元价位的房屋的中位数价值(Median Value)(Y) 。
机器学习算法中的7个损失函数的详细指南

文章插图
 
我们将使用梯度下降(Gradient Descent)作为优化策略来查找回归线 。我不会详细介绍Gradient Descent的细节,但这里提醒一下权重更新规则:
机器学习算法中的7个损失函数的详细指南

文章插图
 
这里,θ_j 是要更新的权重,α 是学习率,J 是成本函数 。成本函数由 θ 参数化 。我们的目标是找到产生最小总成本的 θ 值 。
我已经为下面的每个损失函数定义了我们将遵循的步骤:
  1. 写出预测函数f(X)的表达式,并确定我们需要找到的参数
  2. 确定每个训练样本计算得到的损失
  3. 找到成本函数(所有样本的平均损失)的表达式
  4. 找到与每个未知参数相关的成本函数的梯度
  5. 确定学习率并在固定次数中进行迭代执行权重更新规则
2.1. 平方误差损失
每个训练样本的平方误差损失(也称为L2 Loss)是实际值和预测值之差的平方:
机器学习算法中的7个损失函数的详细指南

文章插图
 
相应的成本函数是这些平方误差的平均值(MSE) 。
推荐你引用以下代码时先尝试自己计算出梯度
def update_weights_MSE(m, b, X, Y, learning_rate): m_deriv = 0 b_deriv = 0 N = len(X) for i in range(N): # 计算偏导数为 # -2x(y - (mx + b)) m_deriv += -2*X[i] * (Y[i] - (m*X[i] + b)) # -2(y - (mx + b)) b_deriv += -2*(Y[i] - (m*X[i] + b)) # 我们减去它,因为导数指向最陡的上升方向 m -= (m_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m, b


推荐阅读