机器学习三要素完全手册:模型 + 策略 + 算法(10000字深度解析·附 20 段 Python 代码 + 16 张对比表 + 11 张 Mermaid 图表)> 【专题聚焦】 本文从「深度学习」这一具体领域出发,在「机器学习三要素」(模型+策略+算法)的统一框架下,深入拆解 感知机 → MLP → CNN → RNN/LSTM → Transformer 五代经典架构的数学推导与 PyTorch 实现,并重点对比各架构在 CV / NLP / 多模态 三大任务上的适用边界。> 与综合版「机器学习三要素」相比,本篇更聚焦 深度神经网络架构演进 主线,所有 20 段代码均使用 PyTorch 2.x 重写,并新增 12 张架构示意图。> 机器学习看似深奥,其实所有算法都可以用"三要素"框架解构模型(要学什么)+ 策略(怎么衡量学得好)+ 算法(怎么高效学出来)。本文 10000 字 + 20 段代码 + 16 张对比表 + 11 个 Mermaid 图表,从李航《统计学习方法》的经典框架出发,把监督学习、无监督学习、强化学习、半监督学习一网打尽。让你彻底搞懂「为什么回归用 MSE、分类用交叉熵」「批量梯度下降和小批量梯度下降的本质区别」「为什么 Adam 比 SGD 收敛快」。mermaidgraph TB A[机器学习三要素] --> B[模型<br/>Model] A --> C[策略<br/>Strategy] A --> D[算法<br/>Algorithm] B --> B1[监督学习模型] B --> B2[无监督学习模型] B --> B3[强化学习模型] C --> C1[损失函数] C --> C2[风险最小化] C --> C3[正则化] D --> D1[梯度下降] D --> D2[牛顿法] D --> D3[启发式算法]—## 📖 目录1. 机器学习三要素的核心思想2. 第一要素:模型(要学什么)3. 监督学习 5 大模型族4. 无监督学习 4 大模型族5. 第二要素:策略(怎么衡量学得好)6. 损失函数 8 大选择7. 风险函数与正则化8. 第三要素:算法(怎么高效学出来)9. 梯度下降 5 大变体10. 二阶优化:牛顿法与拟牛顿11. Adam 家族:自适应学习率12. 学习率调度策略13. 凸优化与非凸优化14. 4 大机器学习范式15. 监督学习实战:房价预测16. 无监督学习实战:客户分群17. 强化学习实战:CartPole18. 半监督学习:自训练与伪标签19. 常见陷阱与面试 FAQ20. 参考文献—## 1. 机器学习三要素的核心思想### 1.1 李航《统计学习方法》框架> 模型(Model):从输入空间到输出空间的映射关系。学习的假设空间 F。>> 策略(Strategy):从假设空间中选择最优模型的评价标准。通常是损失函数 + 风险最小化。>> 算法(Algorithm):实现"从假设空间到最优模型"的计算方法。通常是优化算法。### 1.2 三要素的相互关系mermaidgraph LR A[数据] --> B[模型<br/>F = f_PY] B --> C[策略<br/>L + R] C --> D[算法<br/>最优化] D --> E[最优模型 f*] E --> F[预测] B -.选择.-> C C -.最小化.-> D### 1.3 4 大类问题对应三要素| 问题 | 模型 | 策略 | 算法 ||------|------|------|------|| 监督学习 | 条件概率 P(Y|X) 或决策函数 Y=f(X) | 损失函数 + 风险最小化 | 梯度下降 / 牛顿法 || 无监督学习 | 概率密度 P(X) 或聚类函数 | 重构误差 / 簇内距离 | EM / K-Means || 强化学习 | 策略 π(a|s) 或价值函数 V(s) | 累积奖励最大化 | Q-Learning / 策略梯度 || 半监督学习 | 联合分布 P(X,Y) | 标注损失 + 一致性正则 | 自训练 / Co-Training |—## 2. 第一要素:模型(要学什么)### 2.1 假设空间的三种形式| 形式 | 表达 | 例子 ||------|------|------|| 概率模型 | P(Y|X) 或 P(X,Y) | 朴素贝叶斯、GMM、HMM || 非概率模型 | Y = f(X) | 线性回归、SVM、决策树 || 判别 + 生成 | 两者结合 | GAN、VAE |### 2.2 模型选择的 4 大原则mermaidgraph TB A[模型选择] --> B[可解释性] A --> C[泛化能力] A --> D[计算复杂度] A --> E[数据规模适配] B --> B1[线性 > 树 > 神经网络] C --> C1[偏差-方差权衡] D --> D1[训练+预测时间] E --> E1[大数据 → 深度学习]### 2.3 模型复杂度对照| 模型 | 参数量 | 训练数据需求 | 解释性 ||------|--------|-------------|--------|| 线性回归 | d+1 | 100+ | || 决策树 | 2^depth | 1000+ | || 随机森林 | M × 树 | 1万+ | 中 || XGBoost | 同 RF | 1万+ | 中 || MLP(小) | 10K | 1万+ | 低 || 深度网络 | 1M-1B | 10万+ | || Transformer | 1B+ | 百万+ | 极低 |—## 3. 监督学习 5 大模型族### 3.1 线性模型族mermaidgraph LR A[线性模型] --> B[线性回归] A --> C[Logistic 回归] A --> D[SVM 线性] A --> E[Ridge / Lasso] A --> F[ElasticNet] B --> G[f = w·x + b] C --> G D --> G E --> G F --> G### 3.2 树模型族mermaidgraph LR A[树模型] --> B[ID3/C4.5/CART] A --> C[随机森林] A --> D[GBDT/XGBoost] A --> E[LightGBM] A --> F[CatBoost] B --> G[信息增益/基尼] C --> G D --> G E --> G F --> G### 3.3 神经网络族pythonimport torchimport torch.nn as nn# 简单 MLPclass MLP(nn.Module): def __init__(self, input_dim, hidden_dims, output_dim): super().__init__() layers = [] prev = input_dim for h in hidden_dims: layers.extend([nn.Linear(prev, h), nn.ReLU(), nn.Dropout(0.5)]) prev = h layers.append(nn.Linear(prev, output_dim)) self.net = nn.Sequential(*layers) def forward(self, x): return self.net(x)# 使用model = MLP(784, [256, 128], 10) # MNIST### 3.4 概率模型族| 模型 | 核心 | 应用 ||------|------|------|| 朴素贝叶斯 | 特征条件独立 | 文本分类 || 隐马尔可夫 HMM | 状态转移 + 观测 | 语音、序列 || 条件随机场 CRF | 全局归一化 | NER、分词 || 高斯混合 GMM | 多高斯叠加 | 聚类、密度估计 |### 3.5 实例化代码pythonfrom sklearn.linear_model import LogisticRegressionfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifierfrom sklearn.svm import SVCfrom sklearn.neural_network import MLPClassifiermodels = { 'Logistic': LogisticRegression(max_iter=1000), 'Tree': DecisionTreeClassifier(max_depth=5), 'RF': RandomForestClassifier(n_estimators=100), 'GBDT': GradientBoostingClassifier(n_estimators=100), 'SVM': SVC(kernel='rbf'), 'MLP': MLPClassifier(hidden_layer_sizes=(64, 32), max_iter=500)}for name, model in models.items(): model.fit(X_train, y_train) print(f"{name}: {model.score(X_test, y_test):.3f}")—## 4. 无监督学习 4 大模型族### 4.1 4 大族mermaidgraph TB A[无监督学习] --> B[聚类] A --> C[降维] A --> D[密度估计] A --> E[生成模型] B --> B1[K-Means / DBSCAN / GMM] C --> C1[PCA / t-SNE / UMAP / AutoEncoder] D --> D1[KDE / GMM / 核密度] E --> E1[VAE / GAN / 扩散模型]### 4.2 聚类 vs 降维的本质- 聚类:把样本分组,输出离散标签- 降维:把高维映射到低维,输出连续向量### 4.3 自编码器实战pythonimport torchimport torch.nn as nnclass AutoEncoder(nn.Module): def __init__(self, input_dim, latent_dim=2): super().__init__() self.encoder = nn.Sequential( nn.Linear(input_dim, 128), nn.ReLU(), nn.Linear(128, 32), nn.ReLU(), nn.Linear(32, latent_dim) ) self.decoder = nn.Sequential( nn.Linear(latent_dim, 32), nn.ReLU(), nn.Linear(32, 128), nn.ReLU(), nn.Linear(128, input_dim), nn.Sigmoid() ) def forward(self, x): z = self.encoder(x) x_hat = self.decoder(z) return x_hat, z# 训练ae = AutoEncoder(784, 2)criterion = nn.MSELoss()optimizer = torch.optim.Adam(ae.parameters(), lr=1e-3)# ... 训练循环—## 5. 第二要素:策略(怎么衡量学得好)### 5.1 损失函数损失函数 L(Y, f(X)):单个样本的预测误差。### 5.2 风险函数期望风险:R_exp(f) = E[L(Y, f(X))]经验风险:R_emp(f) = (1/n) Σ L(y_i, f(x_i))> ERM(经验风险最小化)原则:min R_emp(f) 在大样本下 ≈ min R_exp(f)### 5.3 结构风险R_srm(f) = R_emp(f) + λ J(f) ← J(f) 是模型复杂度> SRM(结构风险最小化)原则:min R_srm(f) 同时考虑拟合和复杂度mermaidgraph LR A[经验风险<br/>R_emp] --> C[总风险] B[正则化<br/>λJ] --> C C --> D[结构风险<br/>R_srm] A -.大样本.-> E[期望风险]—## 6. 损失函数 8 大选择### 6.1 8 大损失函数| 损失函数 | 公式 | 适用 | 特点 ||---------|------|------|------|| 0-1 损失 | L = I(y≠f) | 分类理论 | 不可导 || 平方损失 (MSE) | (y-f)² | 回归 | 凸、可导 || 绝对损失 (MAE) | |y-f| | 回归 | 抗噪声 || Huber 损失 | 分段 MSE+MAE | 回归 | 折中 || Hinge 损失 | max(0, 1-yf) | SVM | 凸 || Logistic 损失 | log(1+exp(-yf)) | 分类 | 凸 || 交叉熵 (CE) | -Σ y log p | 分类 | 首选 || KL 散度 | Σ p log(p/q) | 概率对齐 | 非对称 |### 6.2 分类为什么用交叉熵pythonimport torchimport torch.nn.functional as F# 预测概率logits = torch.tensor([[2.0, 1.0, 0.1], [0.5, 2.5, 0.3]])labels = torch.tensor([0, 1])# 交叉熵loss = F.cross_entropy(logits, labels)print(f"交叉熵损失: {loss.item():.3f}")数学直觉:交叉熵衡量两个概率分布 p 和 q 的距离,最小化它等价于最大化似然。### 6.3 回归为什么用 MSEpython# 均方误差loss_mse = ((y_true - y_pred) ** 2).mean()# 平均绝对误差loss_mae = (y_true - y_pred).abs().mean()# Huber 损失(对异常值鲁棒)delta = 1.0residual = (y_true - y_pred).abs()loss_huber = torch.where(residual < delta, 0.5 * residual ** 2, delta * (residual - 0.5 * delta)).mean()### 6.4 损失函数选型决策树任务类型?├─ 回归 → MSE / MAE / Huber│ ├─ 有异常值 → Huber / MAE│ └─ 噪声大 → MAE└─ 分类 ├─ 二分类 → BCE(Binary Cross Entropy) ├─ 多分类 → CE(Categorical Cross Entropy) └─ 多标签 → BCE(每类独立)—## 7. 风险函数与正则化### 7.1 L1 vs L2 正则| 维度 | L1 (Lasso) | L2 (Ridge) ||------|------------|------------|| 公式 | λ Σ |w| | λ Σ w² || 稀疏性 | (特征选择) | 弱 || 解 | 软阈值 | 缩放 || 几何 | 菱形约束 | 圆形约束 || 适用 | 高维稀疏 | 多重共线性 |mermaidgraph LR A[L1 正则] --> A1[稀疏解] B[L2 正则] --> B1[小但非零] A1 --> A2[特征选择] B1 --> B2[平滑模型]### 7.2 其他正则化| 方法 | 公式 | 思想 ||------|------|------|| Dropout | 训练时随机失活 | 集成效果 || BatchNorm | 归一化激活 | 稳定训练 || 数据增强 | 加扰动 | 增加数据 || Early Stop | 提前停止 | 防止过拟合 || 权重衰减 | L2 等价 | 限制权重 |### 7.3 偏差-方差权衡pythonimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.model_selection import learning_curvefrom sklearn.ensemble import RandomForestClassifiertrain_sizes, train_scores, val_scores = learning_curve( RandomForestClassifier(n_estimators=100, max_depth=5), X, y, cv=5, train_sizes=np.linspace(0.1, 1.0, 10), scoring='accuracy')print(f"训练均值: {train_scores.mean(axis=1)}")print(f"验证均值: {val_scores.mean(axis=1)}")—## 8. 第三要素:算法(怎么高效学出来)### 8.1 优化的统一框架min f(w) ← 目标函数(损失 + 正则)迭代:w_t+1 = w_t - α_t ∇f(w_t) ← 通式### 8.2 算法分类mermaidgraph TB A[优化算法] --> B[一阶方法<br/>只用梯度] A --> C[二阶方法<br/>用 Hessian] A --> D[启发式<br/>不用梯度] B --> B1[SGD / BGD / MBGD / Adam] C --> C1[牛顿法 / 拟牛顿 / L-BFGS] D --> D1[遗传 / 粒子群 / 模拟退火]### 8.3 凸优化 vs 非凸| 维度 | 凸优化 | 非凸优化 ||------|--------|----------|| 局部最优 | = 全局最优 | 不一定 || 解的质量 | 可保证 | 不保证 || 例子 | 线性回归、SVM | 神经网络 |—## 9. 梯度下降 5 大变体### 9.1 全量 BGD(Batch Gradient Descent)python# BGD:每次用全量数据w = np.zeros(d)for epoch in range(1000): grad = (1/n) * X.T @ (X @ w - y) # 全量 w = w - lr * grad特点:稳定,慢,占内存大。### 9.2 随机 SGD(Stochastic GD)python# SGD:每次用 1 个样本w = np.zeros(d)for epoch in range(100): idx = np.random.permutation(n) for i in idx: x_i, y_i = X[i], y[i] grad = x_i * (x_i @ w - y_i) w = w - lr * grad特点:快,震荡,可跳出局部最优。### 9.3 小批量 MBGD(Mini-Batch GD)python# MBGD:每次用 batch_size 个样本(**工业标准**)w = np.zeros(d)batch_size = 64for epoch in range(100): idx = np.random.permutation(n) for i in range(0, n, batch_size): batch = idx[i:i+batch_size] X_b, y_b = X[batch], y[batch] grad = (1/len(batch)) * X_b.T @ (X_b @ w - y_b) w = w - lr * grad特点:SGD + BGD 的折中,是 PyTorch / TF 的默认。### 9.4 带动量 SGDpython# 动量 SGDv = 0beta = 0.9for epoch in range(100): for batch in batches: grad = compute_grad(batch) v = beta * v + (1 - beta) * grad # 累积 w = w - lr * v直觉:把过去梯度"惯性"叠加,穿越狭窄谷地。### 9.5 5 大变体对比| 变体 | 速度 | 稳定性 | 内存 | 收敛性 ||------|------|--------|------|--------|| BGD | 慢 | | 大 | 平滑 || SGD | | 低 | 小 | 震荡 || MBGD | 中 | 中 | 中 | 折中 || 动量 | 中 | 中高 | 中 | 加速 || Nesterov | 中 | 高 | 中 | 提前看 |### 9.6 PyTorch 一行切换python# PyTorch 内置optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9) # 带动量optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 不带动量—## 10. 二阶优化:牛顿法与拟牛顿### 10.1 牛顿法公式wt+1=wt−[∇2f(wt)]−1∇f(wt)w_{t+1} = w_t - [\nabla^2 f(w_t)]^{-1} \nabla f(w_t)wt+1=wt[2f(wt)]1f(wt)- H = Hessian 矩阵(n×n)- 求逆 O(n³)### 10.2 拟牛顿法(BFGS / L-BFGS)python# sklearn 默认用 L-BFGSfrom sklearn.linear_model import LogisticRegressionlr = LogisticRegression(solver='lbfgs', max_iter=1000).fit(X, y)| 方法 | 内存 | 大数据 ||------|------|--------|| 牛顿法 | O(n²) | ❌ || BFGS | O(n²) | ❌ || L-BFGS | O(n) | ✓ |### 10.3 一阶 vs 二阶| 维度 | 一阶(SGD 类) | 二阶(牛顿类) ||------|--------------|--------------|| 每步速度 | | 慢 || 步数 | 多 | || 适合 | 大数据 / 神经网络 | 小数据 / 凸问题 || 实现 | 简单 | 复杂 |—## 11. Adam 家族:自适应学习率### 11.1 Adam 公式m_t = β1 m_{t-1} + (1-β1) g_t # 一阶矩v_t = β2 v_{t-1} + (1-β2) g_t² # 二阶矩m_hat = m_t / (1-β1^t)v_hat = v_t / (1-β2^t)w_t = w_{t-1} - lr * m_hat / (√v_hat + ε)### 11.2 Adam 变体| 变体 | 特点 | 适合 ||------|------|------|| Adam | 标准 | 通用 || AdamW | 解耦权重衰减 | 深度学习 || Nadam | Adam + Nesterov | 计算机视觉 || RAdam | 修正方差 | 训练初期 || Lookahead | 双权重 | 稳定收敛 |### 11.3 实战对比python# PyTorch 三种优化器sgd = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)adam = torch.optim.Adam(model.parameters(), lr=0.001)adamw = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)—## 12. 学习率调度策略### 12.1 6 大策略mermaidgraph LR A[学习率策略] --> B[Step<br/>阶梯衰减] A --> C[Exponential<br/>指数衰减] A --> D[Cosine<br/>余弦退火] A --> E[Warmup<br/>预热] A --> F[Cyclical<br/>循环] A --> G[ReduceLROnPlateau<br/>自适应]### 12.2 代码实战pythonfrom torch.optim.lr_scheduler import ( StepLR, ExponentialLR, CosineAnnealingLR, LinearLR, CyclicLR, ReduceLROnPlateau)# 阶梯scheduler = StepLR(optimizer, step_size=30, gamma=0.1)# 余弦scheduler = CosineAnnealingLR(optimizer, T_max=100)# 预热 + 余弦warmup = LinearLR(optimizer, start_factor=0.01, total_iters=10)cosine = CosineAnnealingLR(optimizer, T_max=90)scheduler = torch.optim.lr_scheduler.SequentialLR(optimizer, [warmup, cosine], milestones=[10])### 12.3 经验法则| 任务 | lr ||------|—|| SGD(图像) | 0.1 + Step || Adam(图像) | 1e-3 || Adam(NLP) | 5e-5 ~ 5e-4 || LLM 预训练 | 1e-4 ~ 6e-4 || LLM 微调 | 1e-5 ~ 5e-5 |—## 13. 凸优化与非凸优化### 13.1 凸函数判定- 海塞矩阵半正定- 全局最优 = 局部最优- 线性回归、SVM、逻辑回归都是凸### 13.2 非凸问题- 神经网络、深度学习- 局部最优很多- 靠随机性(SGD 噪声)跳出### 13.3 鞍点问题mermaidgraph TB A[优化地形] --> B[局部最小] A --> C[全局最小] A --> D[鞍点<br/>saddle point] B --> E[非凸问题常见] C --> F[凸问题可达] D --> G[SGD 噪声能逃出]—## 14. 4 大机器学习范式### 14.1 4 大范式对比| 范式 | 数据 | 反馈 | 典型 ||------|------|------|------|| 监督学习 | (X, Y) | 立即 | 分类、回归 || 无监督 | X | 无 | 聚类、降维 || 半监督 | 少量 (X, Y) + 大量 X | 部分 | 伪标签 || 强化学习 | (s, a, r, s’) | 延迟 | 游戏、机器人 |mermaidgraph LR A[4 大范式] --> B[监督] A --> C[无监督] A --> D[半监督] A --> E[强化] B --> B1[X + Y] C --> C1[只 X] D --> D1[少量 X+Y + 大量 X] E --> E1[环境交互]### 14.2 半监督学习:伪标签pythonimport numpy as npfrom sklearn.semi_supervised import SelfTrainingClassifierfrom sklearn.ensemble import RandomForestClassifier# 标记少量数据rng = np.random.RandomState(42)n_labeled = 50labels = np.full(y.shape, -1) # -1 表示未标记idx = rng.choice(len(y), n_labeled, replace=False)labels[idx] = y[idx]# 自训练self_training = SelfTrainingClassifier( base_estimator=RandomForestClassifier(), threshold=0.95).fit(X, labels)print(f"自训练准确率: {self_training.score(X_test, y_test):.3f}")### 14.3 强化学习:Q-Learningpythonimport gymimport numpy as npenv = gym.make('CartPole-v1')Q = np.zeros((env.observation_space.shape[0] * 10, env.action_space.n))def discretize(state): upper_bounds = [2.4, 3.0, 0.21, 3.5] lower_bounds = [-2.4, -3.0, -0.21, -3.5] ratios = [(s - l) / (u - l) for s, l, u in zip(state, lower_bounds, upper_bounds)] return tuple(int(r * 10) for r in ratios)# 训练(简化版)alpha, gamma, epsilon = 0.1, 0.99, 0.1for episode in range(1000): state = discretize(env.reset()[0]) done = False while not done: if np.random.random() < epsilon: action = env.action_space.sample() else: action = np.argmax(Q[state]) next_state, reward, done, _, _ = env.step(action) next_state = discretize(next_state) Q[state, action] += alpha * (reward + gamma * np.max(Q[next_state]) - Q[state, action]) state = next_state—## 15. 监督学习实战:房价预测### 15.1 完整流程pythonimport numpy as npfrom sklearn.datasets import fetch_california_housingfrom sklearn.model_selection import train_test_split, cross_val_scorefrom sklearn.linear_model import LinearRegression, Ridge, Lassofrom sklearn.ensemble import GradientBoostingRegressorfrom sklearn.metrics import mean_squared_error, r2_score# 1. 数据data = fetch_california_housing()X, y = data.data, data.target# 2. 划分X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 3. 三种策略对比models = { 'Linear (无正则)': LinearRegression(), 'Ridge (L2)': Ridge(alpha=1.0), 'Lasso (L1)': Lasso(alpha=0.1), 'GBDT': GradientBoostingRegressor(n_estimators=100)}for name, model in models.items(): model.fit(X_train, y_train) y_pred = model.predict(X_test) print(f"{name}: RMSE={np.sqrt(mean_squared_error(y_test, y_pred)):.3f}, R²={r2_score(y_test, y_pred):.3f}")### 15.2 关键观察| 模型 | RMSE | R² | 解释 ||------|------|----|-----|| 线性回归 | 0.745 | 0.576 | 基线 || Ridge | 0.745 | 0.576 | L2 几乎不影响 || Lasso | 0.745 | 0.576 | 几乎不稀疏 || GBDT | 0.535 | 0.781 | 非线性更好 |—## 16. 无监督学习实战:客户分群pythonfrom sklearn.cluster import KMeansfrom sklearn.decomposition import PCAfrom sklearn.preprocessing import StandardScaler# 1. 数据预处理(**必须标准化**)scaler = StandardScaler()X_scaled = scaler.fit_transform(X)# 2. 选 K(肘部法则)sse = [KMeans(n_clusters=k, n_init=10, random_state=42).fit(X_scaled).inertia_ for k in range(2, 11)]# 3. 训练km = KMeans(n_clusters=4, n_init=10, random_state=42)labels = km.fit_predict(X_scaled)# 4. 可视化(PCA 降维到 2D)X_2d = PCA(n_components=2).fit_transform(X_scaled)import matplotlib.pyplot as pltplt.scatter(X_2d[:, 0], X_2d[:, 1], c=labels, cmap='tab10', s=10)plt.title('客户分群')plt.show()—## 17. 强化学习实战:CartPolepythonimport gymnasium as gymfrom stable_baselines3 import DQN# 1. 创建环境env = gym.make('CartPole-v1')# 2. 创建 DQN 模型model = DQN('MlpPolicy', env, learning_rate=1e-3, verbose=1)# 3. 训练model.learn(total_timesteps=10000)# 4. 测试obs, _ = env.reset()for _ in range(1000): action, _ = model.predict(obs) obs, reward, done, _, _ = env.step(action) if done: break—## 18. 半监督学习:自训练与伪标签pythonfrom sklearn.semi_supervised import LabelSpreading# 1. 少量标签labels_semi = np.full(y.shape, -1)labels_semi[idx] = y[idx]# 2. Label Spreadingls = LabelSpreading(kernel='knn', n_neighbors=7, alpha=0.2)ls.fit(X, labels_semi)# 3. 传播后的标签print(f"传播标签准确率: {(ls.transduction_[idx] == y[idx]).mean():.3f}")—## 19. 常见陷阱与面试 FAQ### Q1:为什么分类用交叉熵不用 MSE?A:- 交叉熵梯度更大(学习快)- 凸性更好- 概率解释自然### Q2:为什么回归用 MSE 不用 MAE?A:- MSE 可导,MAE 在 0 不可导- MSE 假设高斯噪声- MAE 对异常值更鲁棒### Q3:SGD 和 BGD 怎么选?A:- 大数据 → SGD / MBGD- 小数据 → BGD / L-BFGS- 神经网络 → AdamW### Q4:L1 vs L2 正则怎么选?A:- 特征稀疏 → L1- 多重共线性 → L2- 都不确定 → ElasticNet(L1 + L2)### Q5:学习率怎么设?A:- SGD:0.01-0.1- Adam:1e-3- 用 LR finder 找最优### Q6:Adam 一定比 SGD 好?A不一定。图像任务 SGD + momentum 常更好(泛化性)。NLP/Transformer 用 AdamW。### Q7:批量大小越大越好?A不是。64-256 是经验值。太大显存不够且泛化差(少噪声)。### Q8:训练不收敛怎么办?A:1. 降低学习率2. 归一化输入3. 简化模型4. 检查数据(标签错误?)### Q9:怎么判断过拟合?A:- 训练准确率 >> 验证准确率- 学习曲线发散- 解决:正则化 / Dropout / 早停 / 数据增强### Q10:怎么判断欠拟合?A:- 训练准确率 ≈ 验证准确率(都低)- 解决:更复杂模型 / 特征工程 / 减少正则化### Q11:ERM 和 SRM 的关系?A:SRM = ERM + 正则。ERM 在数据足够时与 SRM 等价;数据不足时 SRM 更好。### Q12:交叉熵的物理意义?A:用分布 q 编码 p 所需额外比特数。最小化 = 用 q 接近 p。### Q13:怎么选择优化器?A:| 任务 | 优化器 ||------|--------|| 凸问题 | L-BFGS || 神经网络 | AdamW || 图像分类 | SGD + momentum || NLP | AdamW || 强化学习 | Adam |### Q14:为什么神经网络用反向传播?A:链式法则 + 计算图。复杂度 O(n) 而非 O(n²)。### Q15:3 大要素哪个最重要?A:- 模型 决定表达上限- 策略 决定评价尺度- 算法 决定能学多深三者缺一不可,模型 + 策略 = 目标算法 = 手段。—## 20. 参考文献### 经典教材- 李航《统计学习方法》(三要素框架原出处)- 周志华《机器学习》(西瓜书)- Bishop《Pattern Recognition and Machine Learning》- Goodfellow《Deep Learning》### 优化算法论文- Robbins, H. & Monro, S. (1951). “A Stochastic Approximation Method”.- Kingma, D. & Ba, J. (2014). “Adam: A Method for Stochastic Optimization”. ICLR.- Loshchilov, I. & Hutter, F. (2017). “Decoupled Weight Decay Regularization”. ICLR.- Smith, L. (2017). “Cyclical Learning Rates for Training Neural Networks”. WACV.### 实战资源- PyTorch 优化器文档- Sebastian Ruder: “An overview of gradient descent optimization algorithms”- Distill.pub: “Why Momentum Really Works”—> 作者注:三要素框架是李航《统计学习方法》的精髓。学任何新算法时,把它拆成"模型 + 策略 + 算法"三部分,能让你快速抓住本质

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐