实例:房价预测回归任务

目标:用房屋面积、楼层、学区预测房价(连续值回归)
先统一背景:
数据集:10000条房屋样本
模型:GBDT / XGBoost / LightGBM
预测公式:
y^=y^(t−1)+ft(x)\hat{y}=\hat{y}^{(t-1)}+f_t(x)y^=y^(t1)+ft(x)
y^(t−1)\hat{y}^{(t-1)}y^(t1):前t-1棵树总和;ft(x)f_t(x)ft(x):第t棵新决策树

损失选用 MSE:L(y,y^)=12(y−y^)2L(y,\hat y)=\frac12(y-\hat y)^2L(y,y^)=21(yy^)2

1. 原生GBDT怎么做(只使用一阶导数)

第t轮,我们希望训练一棵树 ftf_tft 去拟合负梯度(残差)
梯度:g=∂L∂y^(t−1)=y^(t−1)−yg=\frac{\partial L}{\partial \hat y^{(t-1)}}=\hat y^{(t-1)}-yg=y^(t1)L=y^(t1)y
拟合目标:zi=−gi=yi−y^(t−1)z_i=-g_i=y_i-\hat{y}^{(t-1)}zi=gi=yiy^(t1)
也就是:新树去拟合真实房价 - 当前预测房价(残差)。

局限:只利用一阶信息,不知道损失曲面曲率。

2. XGBoost 实例(二阶泰勒展开 + 正则)

对损失做二阶泰勒展开:
L(t)≈∑i[gift(xi)+12hift(xi)2]+Ω(ft)L^{(t)}\approx \sum_i \left[g_i f_t(x_i)+\frac12 h_i f_t(x_i)^2\right]+\Omega(f_t)L(t)i[gift(xi)+21hift(xi)2]+Ω(ft)
MSE下:
一阶导 gi=y^i(t−1)−yig_i=\hat y^{(t-1)}_i-y_igi=y^i(t1)yi
二阶导 hi=1h_i=1hi=1(常数)

Ω(ft)=γT+12λ∑wj2\Omega(f_t)=\gamma T+\frac12\lambda\sum w_j^2Ω(ft)=γT+21λwj2

  • TTT:这棵树叶子数量;γ\gammaγ:新增叶子代价
  • wjw_jwj:叶子输出房价修正值;λ\lambdaλ L2正则

分裂寻点实例

假设候选分裂特征:房屋面积,分割阈值=90㎡
分裂前全部样本在一个叶子;
分裂后:≤90㎡左叶子,>90㎡右叶子。

XGBoost用g、h计算分裂增益Gain
Gain=GL2HL+λ+GR2HR+λ−(GL+GR)2HL+HR+λ−γGain=\frac{G_L^2}{H_L+\lambda}+\frac{G_R^2}{H_R+\lambda}-\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}-\gammaGain=HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2γ
GLG_LGL:左叶子一阶导总和,HLH_LHL左叶子二阶导总和

  • 如果Gain>0:分裂有效;
  • γ\gammaγ 作用:增益太小直接不分裂,防止碎叶子树(抑制过拟合,SRM);
  • λ\lambdaλ 平滑叶子权重,避免极端预测。

👉 对比GBDT:同时用到g、h,选择分割点更精准。

3. LightGBM 在同样房价任务上做加速(数学目标函数和XGB完全一致)

假设特征「房屋面积」取值范围 30~200㎡

  1. 直方图Histogram
    把连续面积离散成20个区间(bin:30-38,38-46……)
    不再遍历每一个面积数值,只在bin边界尝试分裂,候选点大幅变少。
    直方图差技巧:父直方图 − 左直方图 = 右直方图,减半计算。

  2. 生长策略差异

  • XGBoost:Level-wise(层优先)
    第一层全部节点分裂 → 第二层全部节点分裂。哪怕某个节点分裂增益很小,也要计算。
  • LightGBM:Leaf-wise(叶子优先)
    每次全局挑选增益最大的那个叶子进行分裂。
    例:当前有3个叶子A、B、C,A分裂收益最高,只分裂A;B、C暂时不动。

优点:相同树节点数量精度更高;风险:容易很深,必须设置max_depth防过拟合。

  1. GOSS样本采样举例
    每条样本梯度绝对值 ∣gi∣|g_i|gi 代表当前预测误差:
  • 梯度很大:房价预测偏差很大,必须保留;
  • 梯度很小:预测基本准确,可以随机删掉一部分。
    训练时保留大梯度样本,少量随机采样小梯度样本,样本变少,训练提速。
  1. EFB特征捆绑举例
    特征:是否学区房(0/1)、是否地铁房(0/1),属于互斥稀疏特征。
    不会同时等于1,打包合并成一个直方图特征,减少特征数量。

直观对比一轮训练流程(同一个房价数据集)

XGBoost

  1. 全部样本特征预排序
  2. 逐层遍历所有节点,遍历全部特征分割点,计算Gain
  3. 选出全局最优分裂点,生成新一层节点
  4. 带入二阶信息+正则计算目标

LightGBM

  1. 特征构建直方图
  2. 挑选收益最高的叶子尝试分裂,仅在bin分界点算增益
  3. 可选:GOSS减少样本、EFB压缩特征
  4. 目标函数、g/h公式和XGBoost一模一样,只是搜索方式更快

结合之前理论串联(重点!面试加分)

  1. 每一轮树不断最小化全体样本损失 → 经验风险最小化 ERM
  2. XGBoost:γ\gammaγλ\lambdaλ;LightGBM:max_depth、正则项
    等价于给模型增加复杂度惩罚 → 结构风险最小化 SRM
    目的:缩小训练集经验风险与真实分布期望风险的差距,缓解过拟合。

简单现象例子

训练过程:

  • XGBoost不设正则:训练loss持续下降,测试房价误差越来越大(过拟合,ERM缺陷)
  • 加入λ、γ(SRM):训练loss不会无限走低,但测试集效果更好

如果你想要,我可以给一段可运行的房价预测极简代码,直观观察两者训练速度、精度差异。

下面提供可直接运行完整示例:回归任务(模拟房价),同时演示 XGBoost / LightGBM,附带训练、评估、对比。
环境依赖:

pip install numpy pandas scikit-learn xgboost lightgbm matplotlib
import numpy as np
import pandas as pd
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import xgboost as xgb
import lightgbm as lgb

# ---------------------- 1. 构造模拟数据集 ----------------------
X, y = make_regression(
    n_samples=10000,
    n_features=20,
    n_informative=12,
    noise=15,
    random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# ---------------------- 2. XGBoost 训练 ----------------------
print("===== XGBoost =====")
xgb_model = xgb.XGBRegressor(
    n_estimators=100,        # 树数量
    max_depth=6,             # 树最大深度
    reg_lambda=1.0,          # L2正则 λ (SRM复杂度惩罚)
    gamma=0.1,               # 分裂最小增益阈值 γ
    objective="reg:squarederror",
    random_state=42
)
xgb_model.fit(X_train, y_train)

y_pred_xgb = xgb_model.predict(X_test)
mse_xgb = mean_squared_error(y_test, y_pred_xgb)
print(f"XGBoost Test MSE: {mse_xgb:.2f}")

# ---------------------- 3. LightGBM 训练 ----------------------
print("\n===== LightGBM =====")
lgb_model = lgb.LGBMRegressor(
    n_estimators=100,
    max_depth=6,
    reg_lambda=1.0,
    learning_rate=0.1,
    random_state=42,
    verbose=-1
)
lgb_model.fit(X_train, y_train)

y_pred_lgb = lgb_model.predict(X_test)
mse_lgb = mean_squared_error(y_test, y_pred_lgb)
print(f"LightGBM Test MSE: {mse_lgb:.2f}")

# ---------------------- 4. 理论对应关系(重点理解) ----------------------
"""
1. 模型迭代过程不断最小化样本损失 = 经验风险最小化 ERM
2. reg_lambda(L2)、gamma、max_depth:对模型复杂度施加惩罚 → 结构风险最小化 SRM
   作用:防止经验风险持续下降,但期望风险(测试误差)上升(过拟合)

数学差异回顾:
XGB:二阶泰勒展开 + 预排序/近似直方图 + Level-wise
LGB:目标函数数学形式一致;使用直方图、Leaf-wise、GOSS、EFB做工程加速
"""

输出示例参考

===== XGBoost =====
XGBoost Test MSE: 334.12

===== LightGBM =====
LightGBM Test MSE: 330.78

拓展:如果你想看训练过程 loss 变化

XGBoost 输出每轮训练损失

evals_xgb = [(X_train, y_train), (X_test, y_test)]
xgb_model = xgb.XGBRegressor(
    n_estimators=100,
    max_depth=6,
    reg_lambda=1.0,
    gamma=0.1,
    objective="reg:squarederror",
    random_state=42
)
xgb_model.fit(
    X_train, y_train,
    eval_set=evals_xgb,
    eval_metric="rmse",
    verbose=10
)

LightGBM 输出每轮loss

evals_lgb = [(X_train, y_train), (X_test, y_test)]
lgb_model = lgb.LGBMRegressor(
    n_estimators=100,
    max_depth=6,
    reg_lambda=1.0,
    random_state=42,
    verbose=-1
)
lgb_model.fit(
    X_train, y_train,
    eval_set=evals_lgb,
    eval_metric="rmse",
    callbacks=[lgb.log_evaluation(10)]
)

分类任务简易切换(如风控二分类)

只需改动模型与指标:

# 生成分类数据
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=10000, n_features=20, random_state=42)

# XGB分类器
xgb_cls = xgb.XGBClassifier(n_estimators=100, reg_lambda=1, gamma=0.1)
# LGB分类器
lgb_cls = lgb.LGBMClassifier(n_estimators=100, reg_lambda=1, verbose=-1)

MSE、MAE、RMSE 完整对比(回归评估指标,结合你前面房价预测代码)

设:
yiy_iyi:真实值;y^i\hat y_iy^i:预测值;nnn:样本数量;误差 ei=yi−y^ie_i = y_i - \hat y_iei=yiy^i

1. 公式定义

MAE 平均绝对误差 Mean Absolute Error

MAE=1n∑i=1n∣yi−y^i∣ \mathbf{MAE} = \frac{1}{n}\sum_{i=1}^n |y_i - \hat{y}_i| MAE=n1i=1nyiy^i

  • 误差取绝对值,线性惩罚;
  • 对异常值鲁棒
  • 单位和原始标签一致;
  • 导数在0点不连续,不可导

MSE 均方误差 Mean Squared Error

MSE=1n∑i=1n(yi−y^i)2 \mathbf{MSE} = \frac{1}{n}\sum_{i=1}^n (y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2

  • 误差平方,放大离群点、大误差的惩罚力度
  • 处处可导;
  • 单位 = 原始单位的平方(难以直观解释);

你前面XGB/LGB默认优化目标就是MSE损失。

RMSE 均方根误差 Root Mean Squared Error

RMSE=MSE \mathbf{RMSE} = \sqrt{\mathbf{MSE}} RMSE=MSE

  • MSE开根号;
  • 单位和原始标签一致,业务更容易解读;
  • 依然继承MSE特点:重惩罚大偏差、敏感异常值

2. 核心区别一览

指标公式特点对异常值敏感度可导性单位
MAE绝对值求和平均低(稳健)零点不可导与y相同
MSE误差平方平均很高全程可导y单位²
RMSE√MSE很高全程可导与y相同

3. 直观例子

真实房价:[100, 200, 300]
预测:[110, 195, 280]
误差:[-10, +5, +20]
MAE=10+5+203≈11.67 MAE = \frac{10+5+20}{3}\approx 11.67 MAE=310+5+2011.67
MSE=102+52+2023=5253=175 MSE = \frac{10^2+5^2+20^2}{3} = \frac{525}{3}=175 MSE=3102+52+202=3525=175
RMSE=175≈13.23 RMSE=\sqrt{175}\approx13.23 RMSE=17513.23
可以看到 RMSE > MAE,因为大误差被平方放大。

4. 关键面试考点

① 为什么很多模型训练损失用MSE,评估看RMSE?

  • MSE连续可导,适合梯度下降优化;
  • RMSE还原原始量纲,方便业务理解。

② MAE不可导会带来什么问题?

误差=0处梯度突变。直接以MAE作为损失函数时,优化难度高于MSE;
XGBoost/LightGBM支持mae损失,但优化过程收敛通常慢于MSE。

③ 什么时候选哪个?

数据存在大量异常值 → MAE
希望严厉惩罚大预测偏差(如自动驾驶、医疗预测)→ RMSE/MSE
业务需要直观解读误差大小优先看RMSE,不推荐直接展示MSE

回归模型大全(按流派划分,附带特点、适用场景,面试体系版)

回归任务目标:预测连续数值(房价、销量、温度、风险值)

一、传统统计回归(统计学起家)

1. 线性回归 Linear Regression

模型:y^=wTx+b\hat y = w^Tx + by^=wTx+b

  • 假设:特征与标签线性关系、误差正态分布、无多重共线性
  • 优化目标:最小化MSE(最小二乘法)
  • 优点:可解释极强、训练快
  • 缺点:只能捕捉线性关系,无法拟合非线性

2. 岭回归 Ridge

线性回归 + L2正则
L=MSE+λ∥w∥22\mathcal{L}=MSE+\lambda\|w\|_2^2L=MSE+λw22
解决普通线性回归特征多重共线性、参数爆炸。
👉 属于结构风险最小化SRM

3. Lasso回归

线性回归 + L1正则
L=MSE+λ∥w∥1\mathcal{L}=MSE+\lambda\|w\|_1L=MSE+λw1
特点:L1会让部分系数压缩至0,自动特征筛选

4. ElasticNet 弹性网

L1 + L2 结合,兼顾特征筛选与稳定训练,高维特征首选。

小结:岭/Lasso/ElasticNet统称正则化线性回归

二、树基集成回归(工业竞赛最常用,你正在实验)

1. 决策树回归(单棵树)

简单、可捕捉非线性;极易过拟合,一般不单独使用。

2. 随机森林回归 RandomForest

并行训练大量独立决策树,最后取均值。

  • Bagging思想;
  • 优点:鲁棒、不易过拟合;
  • 缺点:拟合上限通常低于Boosting。

3. GBDT 梯度提升回归树(基础Boosting)

串行训练树,每棵拟合前序残差(负梯度),只使用一阶导数。

4. XGBoost 极端梯度提升

GBDT增强:二阶泰勒展开 + 显式正则(γ,λ\gamma,\lambdaγ,λ)、缺失值处理。

5. LightGBM

XGB工程优化:直方图、Leaf-wise、GOSS、EFB,速度更快。

6. CatBoost

原生解决类别特征、减少类别特征目标泄露,适合表格数据大量category场景。

重点区分:
Bagging(随机森林):并行;Boosting(GBDT/XGB/LGB/CatBoost):串行。

三、邻近/核方法

1. KNN回归 K近邻

不用训练过程;预测时找距离最近k个样本标签平均。

  • 缺点:高维失效、推理慢,大数据不推荐。

2. SVR 支持向量回归

SVM拓展到回归,引入ε-不敏感带;
适合中小数据集、高维小样本;大数据速度劣势明显。

四、神经网络回归(深度学习回归)

1. 多层感知机 MLP / 全连接网络

堆叠全连接层拟合非线性映射;输出层1个神经元,激活一般不用sigmoid。
适合:海量表格数据、特征高度非线性;
缺点:小样本极易过拟合,可解释差。

2. 其他网络拓展

CNN回归(图像预测)、LSTM/Transformer回归(时序预测:负荷、股价)

五、其他小众回归

  1. 贝叶斯线性回归:输出预测分布(不确定性)
  2. 高斯过程回归 GPR:小样本、可得到置信区间;大数据计算爆炸
  3. 梯度提升的衍生:HistGradientBoostingRegressor(sklearn内置直方图GBDT)

分层选型指南(工程实战)

小样本、追求可解释:线性回归、Ridge、Lasso
中等规模表格数据、通用基线:随机森林
大数据表格、精度优先(工业主流):LightGBM > XGBoost > CatBoost
大量类别特征:CatBoost / LightGBM(categorical支持)
需要预测置信区间、不确定性:高斯过程、贝叶斯方法
图像/文本输入做回归:深度学习(CNN/Transformer)

四者清晰区分(面试高频易混淆概念,搭配例子串联)

先给总览一句话:
目标函数是顶层优化目标;损失函数是目标函数核心项;分数函数输出原始得分;激活函数作用在网络内部,塑造非线性表达。

1. 分数函数 Score Function

定义

输入样本,模型输出一组原始未归一化分值(logits),用来衡量样本属于各类别的置信度。

常见场景:分类任务

例子

1)逻辑回归:z=wTx+bz=w^Tx+bz=wTx+bzzz 就是分数
2)神经网络最后一层线性层输出:logitslogitslogits,分数函数
3)SVM输出的决策函数值也是分数

⚠️ 分数不是概率,值域不受限制 (−∞,+∞)(-\infty,+\infty)(,+)
后续通常接 sigmoid / softmax 转为概率。

区分:
分数函数 = 模型原始打分;概率是分数经过激活映射后的结果。

2. 激活函数 Activation Function

定义

施加在**网络中间层(神经元输出)**的非线性变换:
a=σ(z)a=\sigma(z)a=σ(z)
作用:引入非线性。没有激活函数,无论多少层网络等价于单层线性模型。

常见

  • Sigmoid:σ(z)=11+e−z\sigma(z)=\dfrac{1}{1+e^{-z}}σ(z)=1+ez1
  • Tanh、ReLU、LeakyReLU、GELU

重要边界

✅ 用在隐藏层
不是损失函数!不衡量预测对错,只做变换

⚠️ 容易混淆点:
softmax/sigmoid 放在输出层时:
既是激活函数,又用来把分数转为概率,然后送入交叉熵损失。

3. 损失函数 Loss Function

定义

针对单个样本,衡量预测值与真实标签之间差距:L(y^,y)\mathcal{L}(\hat y,y)L(y^,y)

  • 回归:MSE、MAE
  • 分类:二元交叉熵、多分类交叉熵

训练时:
batch内所有样本损失求和/平均,作为优化依据。

关键点:损失 = 评判预测有多“差”

4. 目标函数 Objective Function

定义

模型最终全局最小化/最大化的完整函数
目标函数 ≥ 损失函数,形式:
Obj=经验损失项+正则项\mathbf{Obj} = 经验损失项 + 正则项Obj=经验损失项+正则项
O=1N∑i=1NL(y^i,yi)+Ω(θ)\mathcal{O}=\frac1N\sum_{i=1}^N\mathcal{L}(\hat y_i,y_i)+\Omega(\theta)O=N1i=1NL(y^i,yi)+Ω(θ)

  • 1N∑L\dfrac1N\sum \mathcal{L}N1L:全体样本平均损失(经验风险)
  • Ω(θ)\Omega(\theta)Ω(θ):正则惩罚(L1、L2、树复杂度惩罚 γT\gamma TγT

👉 经验风险最小化 ERM:Obj = 平均损失
👉 结构风险最小化 SRM:Obj = 平均损失 + 正则项

直观串联两个场景【重点】

场景A:逻辑回归(二分类)

  1. 分数函数:z=wTx+bz=w^Tx+bz=wTx+b
  2. 激活函数(sigmoid):y^=σ(z)∈(0,1)\hat y=\sigma(z)\in(0,1)y^=σ(z)(0,1)
  3. 损失函数:单个样本交叉熵 L=−[ylog⁡y^+(1−y)log⁡(1−y^)]\mathcal{L}=-[y\log\hat y+(1-y)\log(1-\hat y)]L=[ylogy^+(1y)log(1y^)]
  4. 目标函数:O=1N∑L+λ∥w∥2\mathcal{O}=\frac1N\sum\mathcal{L}+\lambda\|w\|^2O=N1L+λw2

场景B:XGBoost(你正在学习)

树模型没有激活函数!激活函数是神经网络概念

  1. 分数函数:每棵树累加输出 y^(t)\hat y^{(t)}y^(t)(预测得分)
  2. 损失函数:MSE / 交叉熵(单样本)
  3. 目标函数:
    Obj=∑i=1nL(yi,y^i(t))+∑k=1tΩ(fk) Obj=\sum_{i=1}^n\mathcal{L}(y_i,\hat y_i^{(t)})+\sum_{k=1}^t\Omega(f_k) Obj=i=1nL(yi,y^i(t))+k=1tΩ(fk)
    Ω(f)=γT+12λ∑w2\Omega(f)=\gamma T+\frac12\lambda\sum w^2Ω(f)=γT+21λw2 树结构正则

核心对比表

名称作用位置核心作用典型例子
分数函数模型输出层线性部分产生原始分值logitsz=Wx+bz=Wx+bz=Wx+b
激活函数神经元中间/输出层引入非线性、值域映射ReLU、sigmoid、softmax
损失函数样本层面衡量预测与标签差距MSE、MAE、交叉熵
目标函数全局优化顶层训练最终最小化的完整式子平均损失+正则项

高频面试易错题澄清

Q1:softmax 是损失还是激活?

答:激活函数。把logits分数转为概率;
交叉熵才是损失函数。工程上常合并成 softmax+交叉熵 加速求导。

Q2:损失函数 = 目标函数?

❌ 不等。
目标函数 = 损失均值 + 正则;
只有不加任何正则时,二者才相等。

Q3:XGBoost / LightGBM 有没有激活函数?

没有!
激活函数是神经网络层与层之间的非线性变换。
树模型依靠树分裂天然拟合非线性,不存在神经元、不存在激活。

Q4:MSE可以既是损失又是目标函数吗?

无正则时:
全体样本MSE均值 = 损失均值 = 目标函数;
加入L2正则后目标函数变大,不再等于单纯MSE。

SVM / SVR 超参:C、γ(等价RBF里的σ)

先统一符号:
sklearn 中 gamma 和高斯核公式里的 σ\sigmaσ 直接相关
RBF核:
K(xi,xj)=exp⁡(−γ⋅∥xi−xj∥2) K(x_i,x_j)=\exp\left(-\gamma \cdot \|x_i-x_j\|^2\right) K(xi,xj)=exp(γxixj2)
原始数学版本常用形式:
K=exp⁡(−∥xi−xj∥22σ2) K=\exp\left(-\frac{\|x_i-x_j\|^2}{2\sigma^2}\right) K=exp(2σ2xixj2)
对应关系:
γ=12σ2 \boldsymbol{\gamma = \dfrac{1}{2\sigma^2}} γ=2σ21

面试经常混着叫:有的论文讲σ\boldsymbol{\sigma}σ,sklearn接口用γ\boldsymbol{\gamma}γ,二者是倒数平方关系。

1. C 惩罚系数(分类SVC / 回归SVR通用)

含义

控制对训练集错误的惩罚力度
SVM目标函数简化理解:
min⁡  12∥w∥2+C∑ξi \min\; \frac12\|w\|^2 + C\sum\xi_i min21w2+Cξi

  • 12∥w∥2\frac12\|w\|^221w2:最大化间隔(抑制模型复杂度,SRM)
  • ξi\xi_iξi:样本违反间隔的松弛变量(训练误差)

取值影响

C 很大
对误分类惩罚很重 → 尽量不允许训练集出错;
模型会拼命贴合训练数据 → 容易过拟合;间隔变窄。

C 很小
惩罚变轻,允许更多样本出错;
追求更大间隔,弱化单样本影响 → 更容易欠拟合,泛化变好

通俗:C = “要不要严格遵守训练集”

2. γ / σ 高斯核带宽(仅RBF核有效!线性核无此参数)

γ=12σ2\gamma=\frac{1}{2\sigma^2}γ=2σ21

σ\boldsymbol{\sigma}σ:核带宽,邻域有效作用范围

  • σ\boldsymbol{\sigma}σ 大 → γ\gammaγ
    每个样本影响范围很大,决策边界平滑;容易欠拟合。
  • σ\boldsymbol{\sigma}σ 小 → γ\gammaγ
    样本只对极近距离邻居产生影响;决策边界扭曲、细碎,紧贴训练点;极易过拟合

γ视角复述(适配sklearn代码)

  • gamma 大:半径很小,每个样本“势力范围极小”,容易画复杂弯曲线条,过拟合
  • gamma 小:半径很大,单个样本影响很远,边界平滑

直观总结对照表

参数变大带来的效果风险
C ↑看重训练准确率,缩小分类间隔过拟合
C ↓容忍训练错误,拉大间隔欠拟合
γ ↑(σ↓)局部影响范围缩小,边界复杂严重过拟合
γ ↓(σ↑)局部影响范围扩大,边界平滑欠拟合

3. 组合调参规律(面试+实战)

  1. C大 + γ大:高风险组合,几乎一定会过拟合
  2. C小 + γ小:倾向欠拟合
  3. 通用搜索方向:
    先粗调γ,再调C;或者网格搜索 GridSearchCV

4. 和你前面知识串联(重点加分)

  • C控制「愿意承受多大训练误差」;
  • γ控制特征空间映射后的非线性复杂度;
    两者共同约束模型容量,实现结构风险最小化SRM
    参数不合适 → 模型容量过大,陷入ERM(死磕训练集,泛化差)。

5. 常见面试题

Q:线性核SVM有没有γ、σ?

没有。只有RBF、多项式核这类非线性核才存在。

Q:gamma=scale / auto 是什么意思(sklearn)

SVR(kernel="rbf", gamma="scale")
  • scaleγ=1nfeatures⋅X.var()\gamma = \dfrac{1}{n_{features}\cdot X.var()}γ=nfeaturesX.var()1 根据数据自动缩放(默认推荐)
  • autoγ=1/nfeatures\gamma = 1/n_{features}γ=1/nfeatures

Q:SVR除了C、gamma还有一个重要超参ε?

是的!
SVR独有:epsilon ε,ε-不敏感带

  • ε越大:允许预测值和真值存在更大差距也不计入损失;
    模型更平滑,更容易欠拟合;
  • ε越小:要求预测更精准,容易过拟合。

6. 代码示例(带网格搜索示意)

from sklearn.svm import SVR
from sklearn.model_selection import GridSearchCV

params = {
    "C": [0.1, 1, 10, 100],
    "gamma": [0.001, 0.01, 0.1, 1],
    "epsilon": [0.01, 0.1, 0.5]
}
model = GridSearchCV(SVR(kernel="rbf"), params, cv=5)

先明确:投影(Projection)在深度学习两大常见含义

  1. 线性投影y=xW+by = xW + by=xW+b(特征维度变换,最常用,QKV、CLS投影、embedding映射)
  2. 向量空间正交投影:向量向子空间投影(约束优化、RL、几何深度学习)

分别给出 PyTorch / JAX 标准实现,区分写法、底层机制、性能。

一、场景1:深度学习最常用——线性特征投影(Transformer QKV、MLP投影层)

数学形式

y=xW+b\boldsymbol{y} = \boldsymbol{x}W + by=xW+b

  • x∈[B,T,Din]x\in[B, T, D_{in}]x[B,T,Din]
  • W∈[Din,Dout],  b∈[Dout]W\in[D_{in}, D_{out}],\;b\in[D_{out}]W[Din,Dout],b[Dout]

1)PyTorch

方式A:nn.Linear(标准方案,工程首选)

import torch
import torch.nn as nn

din, dout = 128, 64
proj = nn.Linear(din, dout, bias=True) # W, b 可学习参数

x = torch.randn(8, 50, din)  # [B, seq_len, din]
y = proj(x) # [8,50,64]

底层:y = x @ weight.T + bias

PyTorch Linear权重存储 shape: [d_out, d_in]

方式B:手写矩阵乘法(等价,不推荐,缺少参数管理)

W = nn.Parameter(torch.randn(dout, din))
b = nn.Parameter(torch.randn(dout))
y = x @ W.T + b

2)JAX + Flax(工业主流,对应nn.Linear)

Flax nn.Dense,等价 PyTorch Linear

import jax
import jax.numpy as jnp
import flax.linen as nn

din, dout = 128, 64
proj = nn.Dense(dout, use_bias=True)

x = jnp.random.normal(jax.random.PRNGKey(0), (8, 50, din))
params = proj.init(jax.random.PRNGKey(1), x)
y = proj.apply(params, x)

JAX Dense权重 shape:[din, dout]
计算:y=x@W+by = x @ W + by=x@W+b
⚠️ 注意权重矩阵存储顺序和PyTorch相反!

纯原生JAX手写投影(无Flax)

key = jax.random.PRNGKey(0)
W = jax.random.normal(key, (din, dout))
b = jax.random.normal(key, (dout,))
y = x @ W + b

二、场景2:正交投影(几何投影,向量投影到子空间)

给定基向量构成矩阵 UUU,向量 zzzUUU 张成子空间投影:
Proj⁡U(z)=UU⊤z \operatorname{Proj}_U(z) = UU^\top z ProjU(z)=UUz
要求:UUU 列向量标准正交;若不正交需要 (UU⊤)−1UU⊤z(UU^\top)^{-1}UU^\top z(UU)1UUz

PyTorch

def orthogonal_proj(z, U):
    # U: [D, K] 正交基
    return U @ U.T @ z

z = torch.randn(128)
U = torch.randn(128, 16)
U, _ = torch.qr(U) # 正交化
z_proj = orthogonal_proj(z, U)

JAX

def orthogonal_proj(z, U):
    return U @ U.T @ z

z = jnp.random.normal(jax.random.PRNGKey(0), (128,))
U = jnp.random.normal(jax.random.PRNGKey(1), (128, 16))
U, _ = jnp.linalg.qr(U)
z_proj = orthogonal_proj(z, U)

三、关键差异:PyTorch vs JAX 实现投影的核心区别

  1. 范式不同

    • PyTorch:命令式、面向对象、有状态Module
      nn.Linear 自带可训练参数,实例保存权重;自动微分基于tape。
    • JAX(Flax):函数式、无状态
      参数和网络主体分离;init() 创建参数,apply(params, x) 前向;搭配 jit、vmap、pmap。
  2. 权重矩阵存储转置坑(高频踩坑点)

    • PyTorch nn.Linear.weight : [d_out, d_in]xW⊤x W^\topxW
    • Flax nn.Dense.kernel : [d_in, d_out]xWx WxW
      互相移植代码极易维度出错。
  3. 自动微分机制

    • PyTorch:动态图,即时执行 .backward()
    • JAX:基于函数变换 jax.grad,需要把前向逻辑封装成纯函数。

四、延伸:Transformer里常用的多头投影(QKV Projection)

PyTorch

self.qkv_proj = nn.Linear(d_model, 3 * d_model)
x = torch.randn(2, 100, d_model)
qkv = self.qkv_proj(x)
q, k, v = torch.chunk(qkv, 3, dim=-1)

Flax JAX

self.qkv_proj = nn.Dense(3 * d_model)
qkv = self.qkv_proj(x)
q, k, v = jnp.split(qkv, 3, axis=-1)

五、极简总结(面试可用)

  1. 特征线性投影(最常用)
    • PyTorch:nn.Linear,计算 xW⊤+bxW^\top+bxW+b
    • JAX/Flax:nn.Dense,计算 xW+bxW+bxW+b,权重矩阵顺序相反
  2. 几何正交投影:手动实现 UU⊤zUU^\top zUUz,二者API只是张量库函数差异,公式完全一致;
  3. 本质数学运算都是矩阵乘法,区别来自框架的**参数管理范式(有状态 vs 函数式无状态)**和权重存储布局。

三角函数、正交基函数 完整梳理 + 工程/AI应用

一、基础概念先行

1. 正交函数定义

函数系 {ϕk(t)}\{\phi_k(t)\}{ϕk(t)} 在区间 [a,b][a,b][a,b] 正交:
∫abϕm(t)ϕn(t)dt={C≠0,m=n0,m≠n \int_a^b \phi_m(t)\phi_n(t)dt = \begin{cases} C \neq 0, & m=n\\ 0, & m\neq n \end{cases} abϕm(t)ϕn(t)dt={C=0,0,m=nm=n
C=1C=1C=1,称为标准正交基

2. 三角函数正交系(傅里叶基,最经典)

区间 [−π,π][-\pi,\pi][π,π]
{1,cos⁡t,sin⁡t,cos⁡2t,sin⁡2t,…,cos⁡nt,sin⁡nt,… } \{1,\cos t,\sin t,\cos2t,\sin2t,\dots,\cos nt,\sin nt,\dots\} {1,cost,sint,cos2t,sin2t,,cosnt,sinnt,}
满足正交性:不同频率三角函数乘积积分 = 0。
任意满足条件的周期函数,可分解为三角函数线性组合:傅里叶级数

核心思想:
任意信号 ≈ 不同频率正弦/余弦叠加;三角函数是一组正交基

二、三角函数正交基核心应用场景

1. 信号处理(传统工程)

1)频谱分析、FFT快速傅里叶变换

  • 时域信号 → 投影到三角函数正交基,得到频域幅值/相位;
  • 降噪:滤除高频噪声分量;
  • 振动、音频、雷达信号解调。

2)滤波
低通/高通滤波本质:保留部分基函数分量,舍弃其余分量。

2. 数值计算 & PDE偏微分方程

分离变量法求解波动方程、热传导方程;
把解展开为三角级数,将偏微分转化为常微分方程组。

3. 深度学习里的三角函数(重点,贴合你当前方向)

(1) 位置编码 Positional Encoding(Transformer原生)

PE(pos,2i)=sin⁡(pos100002i/d),PE(pos,2i+1)=cos⁡(pos100002i/d) PE_{(pos,2i)}=\sin\big(\frac{pos}{10000^{2i/d}\big)},\quad PE_{(pos,2i+1)}=\cos\big(\frac{pos}{10000^{2i/d}}\big) PE(pos,2i)=sin(100002i/d)pos,PE(pos,2i+1)=cos(100002i/dpos)
底层原理:
三角函数构成一组正交基,能够编码序列绝对位置、相对位置;
Transformer没有时序/空间先验,靠三角基注入位置信息。

数学理解:位置向量 = 将位置标量投影到三角函数正交张成的空间。

(2) 傅里叶特征编码(Fourier Features)

NeRF、坐标MLP、隐式神经表示(SDF、辐射场)核心技术:
对坐标 xxx 映射:
γ(x)=[sin⁡(2πBx),cos⁡(2πBx)] \gamma(x)=\big[\sin(2\pi Bx),\cos(2\pi Bx)\big] γ(x)=[sin(2πBx),cos(2πBx)]
把低维坐标投影到高维傅里叶正交空间,让MLP更容易学习高频细节纹理。
解决纯MLP无法拟合高频信号的“频谱偏置”问题。

(3) 神经算子 / Fourier Neural Operator(FNO)

直接用傅里叶正交基进行全局卷积,替代CNN局部卷积;
适合流体、气象、弹性力学等连续场预测。
CNN依靠局部感受野;FNO利用三角函数基一次性建模全局相互作用。

4. 图形学

  • 球面调和函数(SH,广义正交基)用于环境光照渲染;
  • DCT离散余弦变换(三角函数离散正交基):JPEG图片压缩、音频MP3压缩。

DCT = 离散形式的余弦正交基,把图像块投影到余弦基,丢弃幅值小的分量实现压缩。

三、拓展:其他常见正交基(横向对比三角函数基)

  1. 小波基(Wavelet)
    三角基全局振荡;小波具备局部时频特性。应用:图像压缩、瞬态信号检测。
  2. 勒让德多项式、切比雪夫多项式
    区间有限域正交多项式;用于数值逼近、光谱方法求解PDE。
  3. 球面调和函数 SH
    球面上正交基;3D渲染、气象球谐模拟。
  4. 离散正交基:PCA主成分基
    数据驱动正交基(不是固定解析函数);
    PCA本质:寻找一组正交向量基,把数据投影,保留最大方差方向。

四、统一数学视角:投影(衔接你刚才 pytorch/jax 投影)

任意正交基 {ϕk}\{\phi_k\}{ϕk},函数 fff 在基上展开:
f(t)=∑kakϕk(t),ak=⟨f,ϕk⟩⟨ϕk,ϕk⟩ f(t)=\sum_k a_k \phi_k(t),\quad a_k=\dfrac{\langle f,\phi_k\rangle}{\langle\phi_k,\phi_k\rangle} f(t)=kakϕk(t),ak=ϕk,ϕkf,ϕk
aka_kak 就是投影系数

  • 连续形式:内积是积分(三角函数傅里叶)
  • 离散形式:向量内积(矩阵乘法,DL里Linear/Dense投影)

一条贯通主线:
深度学习 nn.Linear = 向量向有限维离散基投影;
傅里叶分解 = 函数向连续三角函数正交基投影。
数学内核完全一致,只是离散/连续、基是否固定解析形式。

五、面试高频问答

Q1:为什么Transformer原始位置编码选用三角函数正交基?

  1. 三角函数正交,不同频率分量信息冗余低;
  2. 天然支持相对位置推算:sin⁡(a+b)\sin(a+b)sin(a+b) 可由 sin⁡a,cos⁡a,sin⁡b,cos⁡b\sin a,\cos a,\sin b,\cos bsina,cosa,sinb,cosb 线性组合;
  3. 可以外推:训练最长序列长度之外,依然能泛化预测更长位置。

Q2:傅里叶特征(Fourier Feature)为什么能提升MLP高频拟合能力?

普通MLP直接输入坐标,网络倾向学习低频函数;
通过三角函数正交基做显式投影,人工引入高频特征,扩大模型能够表达的频率范围。

Q3:三角正交基 vs CNN卷积核

  • 三角基:全局、固定解析基函数;全局同时作用于整个定义域(FNO)
  • CNN卷积核:学习得到的局部滤波器,非预先设定正交;依靠多层堆叠扩大感受野

六、极简应用汇总清单

三角函数正交基

✅ FFT频谱分析、振动/音频信号处理
✅ JPEG/MP3 DCT压缩
✅ Transformer三角位置编码
✅ NeRF傅里叶特征映射
✅ FNO傅里叶神经算子(连续物理场预测)
✅ PDE傅里叶谱方法求解
✅ 雷达、通信调制解调

更多推荐