自学教程 学编程从这里开始

损失函数与梯度

损失函数用来衡量模型预测结果和真实标签之间差距有多大;梯度告诉我们参数应该往哪个方向调整,才能缩小这个差距。损失函数是误差标尺,梯度是优化方向,二者是模型自动学习更新参数的核心。

一、损失函数(Loss Function)

模型输出预测值 y^\hat y,真实标签是 yy,损失函数 LL 输入预测和真实值,输出一个代表误差大小的数字。损失越大,代表模型预测越不准;训练的目标,就是不断降低损失。

常用损失函数

  1. 均方误差 MSE(Mean Squared Error)

    适合回归任务。

MSE=1N∑i=1N(y^i−yi)2MSE=\frac1N\sum_{i=1}^N(\hat y_i-y_i)^2

对误差做平方,放大较大误差。

  1. 交叉熵损失 Cross Entropy

    适合分类任务(逻辑回归、神经网络),衡量预测概率分布和真实分布之间的距离,也是我们前面二分类任务常用的损失。

要点:损失函数必须可导,才能计算梯度。不可导的损失无法用梯度下降优化。

二、梯度(Gradient)

梯度就是损失函数对模型参数的偏导数组合。梯度指向损失上升最快的方向。
所以我们更新参数时,要向梯度的反方向走,让损失变小,这个算法就是梯度下降。

参数更新公式:

θ=θ−η⋅∇L\theta = \theta – \eta \cdot \nabla L

  • θ\theta:模型参数(权重w、偏置b)
  • η\eta:学习率 learning rate,控制每一步走多大
  • ∇L\nabla L:损失函数的梯度

学习率的影响

  • 学习率太大:步子迈太大,来回震荡,无法收敛,损失不降反升
  • 学习率太小:更新极慢,训练耗时很久,容易困在局部最小值

三、完整训练循环(核心流程)

  1. 输入样本,模型正向传播,得到预测值
  2. 使用损失函数,计算当前损失
  3. 反向传播,计算损失对各个参数的梯度
  4. 沿着负梯度方向更新参数
  5. 重复迭代,直到损失稳定不再下降

配套代码示例(沿用统一 data.csv)

Age,Salary,Purchased
25,40000,0
45,80000,1
30,50000,0
48,,1
22,32000,0
35,60000,1
,55000,0
50,90000,1
29,43000,0
55,100000,1
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import log_loss

# 读取、清洗数据
df = pd.read_csv("data.csv")
df['Age'].fillna(df['Age'].mean(), inplace=True)
df['Salary'].fillna(df['Salary'].mean(), inplace=True)

X = df[['Age','Salary']]
y = df['Purchased']

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 逻辑回归,内部使用交叉熵损失、梯度下降优化
model = LogisticRegression()
model.fit(X_train, y_train)

# 计算交叉熵损失
y_pred_prob = model.predict_proba(X_train)
loss = log_loss(y_train, y_pred_prob)
print(f"训练集交叉熵损失:{loss:.4f}")

局部最小值 vs 全局最小值

损失函数的曲面可能凹凸不平,存在多个低谷:

  • 全局最小值:整个曲面上损失最低的位置,是我们想要的最优参数
  • 局部最小值:某一小块区域的低点,但不是全局最低

    梯度下降只能看到当前位置的坡度,有可能停在局部最小值。深度学习中常用动量、自适应学习率优化器(Adam)缓解这个问题。

常见误区

  1. 损失越低 ≠ 模型一定越好:训练损失很低、测试损失很高,就是过拟合
  2. 学习率不是越大收敛越快,过大容易震荡不收敛
  3. 梯度不是用来直接修改参数,梯度只是方向,还需要学习率控制步长

小结

损失函数定义“我们要优化什么目标”,梯度给出“怎么调整参数”。所有基于梯度的模型,逻辑回归、SVM、神经网络,底层都是这套思路。理解损失和梯度,就看懂了模型“学习”的本质。

思考题

  1. 回归任务一般优先选择什么损失函数?二分类任务呢?
  2. 如果梯度等于0,意味着什么?
标签:

0 条笔记