【机器学习】(基础篇三) —— 损失函数和梯度下降

损失函数

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

损失函数的种类

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

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

选择损失函数

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

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

梯度下降

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

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

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

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

J ( θ 0 , θ 1 ) = 1 2 n ∑ i = 1 n ( y i − ( θ 0 + θ 1 x i ) ) 2 \begin{aligned}J(\theta_0,\theta_1)&=\frac{1}{2n}\sum_{i=1}^n(y_i-(\theta_0+\theta_1x_i))^2\end{aligned} J(θ0,θ1)=2n1i=1∑n(yi−(θ0+θ1xi))2

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

∂ J ∂ θ 0 = − 1 n ∑ i = 1 n ( y i − ( θ 0 + θ 1 x i ) ) ∂ J ∂ θ 1 = − 1 n ∑ i = 1 n ( y i − ( θ 0 + θ 1 x i ) ) ⋅ x i \begin{aligned}\frac{\partial J}{\partial\theta_0}&=-\frac1n\sum_{i=1}^n(y_i-(\theta_0+\theta_1x_i))\\\\\frac{\partial J}{\partial\theta_1}&=-\frac1n\sum_{i=1}^n(y_i-(\theta_0+\theta_1x_i))\cdot x_i\end{aligned} ∂θ0∂J∂θ1∂J=−n1i=1∑n(yi−(θ0+θ1xi))=−n1i=1∑n(yi−(θ0+θ1xi))⋅xi

更新参数:

θ 0 : = θ 0 − α × 1 n ∑ i = 1 n ( y i − ( θ 0 + θ 1 x i ) ) θ 1 : = θ 1 − α × 1 n ∑ i = 1 n ( y i − ( θ 0 + θ 1 x i ) ) ⋅ x i \begin{aligned}\theta_0&:=\theta_0-\alpha\times\frac1n\sum_{i=1}^n(y_i-(\theta_0+\theta_1x_i))\\\\\theta_1&:=\theta_1-\alpha\times\frac1n\sum_{i=1}^n(y_i-(\theta_0+\theta_1x_i))\cdot x_i\end{aligned} θ0θ1:=θ0−α×n1i=1∑n(yi−(θ0+θ1xi)):=θ1−α×n1i=1∑n(yi−(θ0+θ1xi))⋅xi

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

【代码示例】

py 复制代码
# 梯度下降算法
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 n o r m = X − X min ⁡ X max ⁡ − X min ⁡ X_{{\mathrm{norm}}}=\frac{X-X_{\min}}{X_{\max}-X_{\min}} Xnorm=Xmax−XminX−Xmin

Z-Score标准化 (Standardization) : X s t d = X − μ σ X_{\mathrm{std}}=\frac{X-\mu}{\sigma} Xstd=σX−μ

梯度下降中学习率的选择

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

α过大会出现的情况:

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

相关推荐
孙同学要努力1 小时前
全连接神经网络案例——手写数字识别
人工智能·深度学习·神经网络
Eric.Lee20211 小时前
yolo v5 开源项目
人工智能·yolo·目标检测·计算机视觉
其实吧32 小时前
基于Matlab的图像融合研究设计
人工智能·计算机视觉·matlab
丕羽2 小时前
【Pytorch】基本语法
人工智能·pytorch·python
ctrey_2 小时前
2024-11-1 学习人工智能的Day20 openCV(2)
人工智能·opencv·学习
SongYuLong的博客3 小时前
Air780E基于LuatOS编程开发
人工智能
Jina AI3 小时前
RAG 系统的分块难题:小型语言模型如何找到最佳断点?
人工智能·语言模型·自然语言处理
-派神-3 小时前
大语言模型(LLM)量化基础知识(一)
人工智能·语言模型·自然语言处理
johnny_hhh3 小时前
AI大模型重塑软件开发流程:定义、应用场景、优势、挑战及未来展望
人工智能
Elastic 中国社区官方博客3 小时前
释放专利力量:Patently 如何利用向量搜索和 NLP 简化协作
大数据·数据库·人工智能·elasticsearch·搜索引擎·自然语言处理