问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

机器学习基础:损失函数和梯度下降详解

创作时间:
作者:
@小白创作中心

机器学习基础:损失函数和梯度下降详解

引用
CSDN
1.
https://blog.csdn.net/dao_cao_renshuai/article/details/141034097

在机器学习领域,损失函数和梯度下降是两个至关重要的概念。损失函数用于衡量模型预测值与真实值之间的差异,而梯度下降则是一种优化算法,用于最小化损失函数。本文将详细介绍各种常见的损失函数类型,以及梯度下降算法的原理和实现方法。

损失函数

损失函数(Loss Function),也称为代价函数(Cost Function)或误差函数(Error Function),是机器学习和深度学习中一个核心的概念。它用于量化模型预测与实际目标之间的差异,是优化算法(如梯度下降)试图最小化的函数。损失函数的选择直接影响模型的学习过程和性能。

损失函数的种类

损失函数的类型取决于具体的应用场景,常见的有以下几类:

  1. 均方误差(Mean Squared Error, MSE)
  • 用于回归任务,计算的是预测值与真实值之间的差的平方的平均值。
  • 公式为:$MSE=\frac{1}{n}\sum_{i=1}^n(y_i-\hat{y}_i)^2$
  • 对于较大的误差给予更大的惩罚。
  1. 均方根误差(Root Mean Squared Error, RMSE)
  • 也是用于回归,是MSE的平方根,单位与目标变量相同,便于解释。
  • 公式为:$RMSE=\sqrt{\frac{1}{n}\sum_{i=1}^n(y_i-\hat{y}_i)^2}$
  1. 平均绝对误差(Mean Absolute Error, MAE)
  • 同样用于回归,计算的是预测值与真实值之间的差的绝对值的平均值。
  • 公式为:$MAE=\frac{1}{n}\sum_{i=1}^n|y_i-\hat{y}_i|$
  • 对于所有的误差给予相同的惩罚,相比MSE更鲁棒于异常值。
  1. 交叉熵损失(Cross Entropy Loss)
  • 广泛用于分类任务,特别是多类分类和二分类问题。
  • 对于二分类问题,通常使用二元交叉熵损失。
  • 公式为:$CrossEntropy=-\frac{1}{n}\sum_{i=1}^n[y_i\log(\hat{y}_i)+(1-y_i)\log(1-\hat{y}_i)]$
  1. Hinge Loss(合页损失)
  • 用于支持向量机(SVM)分类,鼓励正确的分类并且惩罚错误分类的边界点。
  • 公式为:$HingeLoss=\max(0,1-y_i\hat{y}_i)$

选择损失函数

选择合适的损失函数是构建机器学习模型的关键步骤之一,它应当反映模型预测错误的严重性,并且与模型的优化目标相一致。例如,在回归任务中,如果异常值的存在需要被考虑,MAE可能比MSE更适合;而在分类任务中,交叉熵损失是标准的选择,因为它鼓励模型输出概率式的预测。

在实际应用中,损失函数的选择还可能受到数据特性和模型结构的影响,有时需要通过实验来确定最合适的损失函数。

梯度下降

梯度下降用于最小化或最大化一个函数(通常是一个损失函数或代价函数)。其基本思想是利用函数的梯度(多变量函数的导数)来确定函数值下降最快的方向,从而逐步迭代地更新参数,直到找到函数的局部最小值或最小值。

梯度下降法在大数据集和高维特征空间中更为实用,因为它只需要每次更新一小部分数据,但可能需要更多的计算时间来达到收敛。在某些直接求解解析解不可行或成本过高时使用梯度下降法。

梯度下降中的目标函数还是使用均方误差,求其最小值,但为了计算方便(平方求导后消掉),让其除以2n:

$J(\theta_0,\theta_1)=\frac{1}{2n}\sum_{i=1}^n(y_i-(\theta_0+\theta_1x_i))^2$

先初始化两个参数(任意值或者进行预训练),然后计算梯度:

$\frac{\partial J}{\partial\theta_0}=-\frac{1}{n}\sum_{i=1}^n(y_i-(\theta_0+\theta_1x_i))$

$\frac{\partial J}{\partial\theta_1}=-\frac{1}{n}\sum_{i=1}^n(y_i-(\theta_0+\theta_1x_i))\cdot x_i$

更新参数:

$\theta_0:=\theta_0-\alpha\times\frac{1}{n}\sum_{i=1}^n(y_i-(\theta_0+\theta_1x_i))$

$\theta_1:=\theta_1-\alpha\times\frac{1}{n}\sum_{i=1}^n(y_i-(\theta_0+\theta_1x_i))\cdot x_i$

重复更新参数直到满足停止条件(例如,损失函数几乎不再降低或达到预设的最大迭代次数)。

【代码示例】

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 6, 141)
y = (x - 2.5) ** 2 - 1
plt.plot(x, y)
plt.figure()
plt.show()

def dj(theta):  # 求导
    return 2 * (theta - 2.5)

def J(theta): # 损失函数
    return (theta-2.5) ** 2 - 1

theta = 0.0 # 初始化参数
epsilon = 1e-8  # 阈值
eta = 0.1 # 下降的步长
history_theta = [] # 保存历史参数

while True:
    gradient = dj(theta) # 梯度
    last_theta = theta
    history_theta.append(theta)
    theta = theta - eta * gradient
    if (abs(J(theta) - J(last_theta)) < epsilon): # 两次迭代损失函数变化小于阈值
        break

plt.plot(x, J(x))
plt.plot(np.array(history_theta), J(np.array(history_theta)), 'r', marker='+')
plt.show()
plt.show()

运行结果:

归一化

在有多个特征的情况下,为了达到好的拟合效果,通常是变化范围大的参数小,变化范围小的参数大,这样的参数设置会让梯度下降的时候参数都集中在同一个区域,形成一个椭圆,椭圆在进行梯度下降的时候会在较短轴的方向上快速移动,而在较长轴的方向上缓慢移动,导致迭代路径呈现锯齿状,效率低下。这是因为椭圆形等高线意味着在某些方向上需要较小的学习率,而在其他方向上则需要较大的学习率,选择一个单一的学习率来适应所有方向是很困难的。如下图所示

使用归一化对数据进行缩放可以达到更好的梯度下降效果,归一化可以在训练过程中维持各层输出的稳定分布,从而减少梯度消失或爆炸的问题。

最小最大归一化 (Min-Max Scaling):$X_{norm}=\frac{X-X_{\min}}{X_{\max}-X_{\min}}$

Z-Score标准化 (Standardization):$X_{std}=\frac{X-\mu}{\sigma}$

梯度下降中学习率的选择

在使用梯度下降法的时候,学习率α的选择至关重要,α过大可能导致损失函数不能正常下降,α过小可能导致损失函数下降太慢,需要很多次迭代才能到到损失函数的收敛。

α过大会出现的情况:

通常从一个较小值开始,利用损失函数J的变化趋势,多次尝试找到一个合适的学习率

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号