共计 1629 个字符,预计需要花费 5 分钟才能阅读完成。
为什么我们需要损失函数和梯度下降?
刚开始学习机器学习时,我常常困惑:模型怎么知道自己预测得对不对?如何自动调整参数?这就要引出损失函数和梯度下降这对黄金搭档了。

-
损失函数 就像考试的评分标准,告诉我们当前预测值与真实值相差多少。比如预测房价时,绝对误差(MAE)会直接计算相差多少钱,而平方误差(MSE)会放大较大误差的影响。
-
梯度下降 则是模型的学习方式,就像蒙着眼下山的人,通过感受脚下坡度(梯度)一步步找到最低点(最小损失)。没有它,模型就像无头苍蝇一样乱撞。
常见损失函数面面观
- 均方误差(MSE)
- 计算公式:
(1/n) * Σ(预测值 - 真实值)² - 特点:对异常值敏感,适用于回归问题
-
Python 实现:
def mse(y_true, y_pred): return ((y_true - y_pred) ** 2).mean() -
交叉熵损失
- 计算公式:
-Σ(真实值 *log(预测值)) - 特点:分类任务首选,尤其适合输出概率的场景
- 示例代码:
def cross_entropy(y_true, y_pred): return -np.sum(y_true * np.log(y_pred + 1e-9)) # 加小量防 log(0)
梯度下降的实战演练
让我们用 Python 实现一个简单的线性回归梯度下降:
import numpy as np
# 生成模拟数据
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# 初始化参数
eta = 0.1 # 学习率
n_iterations = 1000
m = len(X)
theta = np.random.randn(2, 1) # 随机初始化参数
# 添加偏置项
X_b = np.c_[np.ones((100, 1)), X]
# 梯度下降主循环
for iteration in range(n_iterations):
gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
theta = theta - eta * gradients
学习率的艺术
-
过大学习率:会导致在最低点附近震荡甚至发散
# 危险示例(学习率 0.5)theta_history = [] eta = 0.5 # 明显过大 for iteration in range(10): # 仅演示 10 次迭代 gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y) theta = theta - eta * gradients theta_history.append(theta) -
过小学习率:收敛速度极慢
# 低效示例(学习率 0.001)eta = 0.001 n_iterations = 100000 # 需要极大迭代次数
实战中的避坑指南
- 特征缩放很重要
- 未缩放的特征会导致梯度下降震荡
-
标准化处理示例:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) -
批量选择策略
- 批量梯度下降:稳定但内存要求高
- 随机梯度下降:内存友好但波动大
- 小批量梯度下降(推荐):
batch_size = 32 indices = np.random.permutation(m) X_batch = X_b[indices[:batch_size]] y_batch = y[indices[:batch_size]]
向神经网络进阶
当基础概念掌握后,可以探索:
-
激活函数的作用:ReLU 解决梯度消失,sigmoid 用于概率输出
def relu(z): return np.maximum(0, z) def sigmoid(z): return 1 / (1 + np.exp(-z)) -
神经网络中的反向传播:链式法则的延伸应用
个人实践心得
在 Kaggle 的房价预测项目中,我发现:
- 组合 MSE 和 MAE 能平衡异常值影响
- 动态学习率(如指数衰减)效果优于固定值
- 特征工程的质量直接影响梯度下降效率
建议初学者先从单变量线性回归入手,逐步增加复杂度。记住:理解原理比调参更重要!
正文完
发表至: 未分类
近三天内
