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

损失函数

损失函数(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=1n(yiy^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=1n(yiy^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=1nyiy^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=1n[yilog(y^i)+(1yi)log(1y^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,1yiy^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=1n(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} θ0Jθ1J=n1i=1n(yi(θ0+θ1xi))=n1i=1n(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=1n(yi(θ0+θ1xi)):=θ1α×n1i=1n(yi(θ0+θ1xi))xi

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

【代码示例】

# 梯度下降算法
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()

运行结果:

在这里插入图片描述

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值