数据科学家是怎么了解你的——集成学习(XGBoost、LightGBM)完结篇
通俗的讲解了集成学习里面XGBoost算法和LightGBM算法,完结了集成学习里面的所有算法,即使机器学习的入门,也是开启其他AI的新起步。
1. XGBoost
1.1 XGBoost的概念
XGBoost是GBDT的一种,也是加法模型和前向优化算法,在监督学习中,可以分为:模型
,参数
,目标函数
和学习方法
;
- 模型:给定输入x后预测输出y的方法,比如说回归,分类,排序等;
- 参数:模型中的参数,比如线性回归中的权重和偏置;
- 目标函数:即损失函数,包含正则化项;
- 学习方法:给定目标函数后求解模型和参数的方法,比如:梯度下降法,数学推导等。
这四方面的内容也指导着XGBoost系统的设计。
类比:
想象你在考试复习:
- 第一遍做题,错了一些题(第一个模型预测不准)。
- 第二遍重点复习错题(第二个模型修正第一个模型的错误)。
- 第三遍再复习仍然错的题(第三个模型继续修正)……
这样一步步提升,最终考试成绩就会很好!
1.2 XGBoost的核心原理
给定数据集:
D = ( X i , y i ) ( ∣ D ∣ = n , x i ∈ R m , y ∈ R ) D=(X_i,y_i)(|D|=n,x_i\in R^m,y\in R) D=(Xi,yi)(∣D∣=n,xi∈Rm,y∈R)
1.2.1 加法模型
XGBoost利用前向分布算法,学习到包含K棵树的加法模型:
y ^ i = ∑ t = 1 K f t ( x i ) , f t ∈ F \hat y_i=\sum_{t=1}^K f_t(x_i),f_t\in \mathcal {F} y^i=t=1∑Kft(xi),ft∈F
y ^ i : 第 i 个样本的预测值 ; \hat y_i : 第 i个样本的预测值; y^i:第i个样本的预测值;
K : 树的总数量 K: 树的总数量 K:树的总数量
f k : 第 k 棵树 f_k: 第k棵树 fk:第k棵树
F : 所有可能得决策树集合 \mathcal{F}: 所有可能得决策树集合 F:所有可能得决策树集合
通俗解释:
假设你要预测房价:
- 第一棵树预测 100 万,但实际是 110 万(误差 +10 万)。
- 第二棵树尝试修正,预测 +8 万(现在总共 108 万,误差 +2 万)。
- 第三棵树再预测 +2 万(最终 110 万,误差 0)。
这样,多棵树叠加,逐步逼近真实值。
1.2.2 目标函数=损失函数+正则项
那怎么得到这些树,也就是树的结构和叶子节点的预测结果?所以需要一个目标,也就是目标函数,XGBoost 的训练目标是优化以下函数:
O b j ( Θ ) = ∑ i = 1 N l ( y i , y ^ i ) + ∑ j = 1 t Ω ( f j ) , f j ∈ F Obj(\Theta)= \sum _{i=1}^N l(y_i,\hat y_i)+ \sum _{j=1}^t \Omega(f_j), f_j \in \mathcal{F} Obj(Θ)=i=1∑Nl(yi,y^i)+j=1∑tΩ(fj),fj∈F
l ( y i , y ^ i ) :损失函数(衡量预测值和真实值的差距,比如 M S E 、 L o g L o s s ) l(y_i,\hat y_i) :损失函数(衡量预测值和真实值的差距,比如 MSE、LogLoss) l(yi,y^i):损失函数(衡量预测值和真实值的差距,比如MSE、LogLoss)
Ω ( f j ) : 正则化项(防止过拟合) , 生成的树越复杂,则惩罚力度越大 \Omega(f_j) : 正则化项(防止过拟合), 生成的树越复杂,则惩罚力度越大 Ω(fj):正则化项(防止过拟合),生成的树越复杂,则惩罚力度越大
通俗解释:
目标函数 = 损失函数(预测误差) + 正则项(模型复杂度惩罚)
- 我们既要让预测尽量准确(第一项),又要防止模型太复杂(第二项,避免过拟合)。
利用泰勒展开式优化目标函数:
- 泰勒展开:局部近似损失函数
在点 y ^ i t − 1 处对 L 进行二阶泰勒公式展开 在点\hat y_i^{t-1}处对L进行二阶泰勒公式展开 在点y^it−1处对L进行二阶泰勒公式展开
O b j ( Θ ) = ∑ i = 1 N L ( y i , y ^ i t − 1 + f t ( X i ) ) + Ω ( f t ) ≈ ∑ i = 1 N ( L ( y i , y ^ i t − 1 ) + g i f t ( X i ) + 1 2 h i f t 2 ( X i ) ) + Ω ( f t ) Obj(\Theta)=\sum_{i=1}^NL(y_i,\hat y_i^{t-1}+f_t(X_i))+\Omega(f_t)\approx \sum_{i=1}^N\Big(L(y_i,\hat y_i^{t-1})+g_if_t(X_i)+\frac 1 2h_if_t^2(X_i)\Big)+\Omega(f_t) Obj(Θ)=i=1∑NL(yi,y^it−1+ft(Xi))+Ω(ft)≈i=1∑N(L(yi,y^it−1)+gift(Xi)+21hift2(Xi))+Ω(ft)
其中:
一阶导数(梯度) g i = ∂ L ( y i , y ^ i t − 1 ) ∂ y ^ i t − 1 ; 二阶导数( H e s s i a n ) h i = ∂ 2 L ( y i , y ^ i t − 1 ) ∂ 2 y ^ i t − 1 一阶导数(梯度)g_i=\frac {\partial L(y_i,\hat y_i^{t-1})} {\partial \hat y_i^{t-1}} ;二阶导数(Hessian)h_i=\frac {\partial ^2L(y_i,\hat y_i^{t-1})} {\partial^2 \hat y_i^{t-1}} 一阶导数(梯度)gi=∂y^it−1∂L(yi,y^it−1);二阶导数(Hessian)hi=∂2y^it−1∂2L(yi,y^it−1)
移除对t轮迭代来说的常数项
L ( y i , y ^ i t − 1 ) L(y_i,\hat y_i^{t-1}) L(yi,y^it−1)
得到:
O b j ( Θ ) = ∑ i = 1 N ( g i f t ( X i ) + 1 2 h i f t 2 ( X i ) ) + Ω ( f t ) Obj(\Theta)=\sum_{i=1}^N\Big(g_if_t(X_i)+\frac 1 2h_if_t^2(X_i)\Big)+\Omega(f_t) Obj(Θ)=i=1∑N(gift(Xi)+21hift2(Xi))+Ω(ft)
所以目标函数只依赖于每条数据在误差函数上的一阶导数(梯度)和二阶导数(Hessian)导数,所以,XGBoost相对GBDT的优化之一泰勒展开用多项式逼近函数,二阶项 h:引入了损失函数的曲率信息,比一阶梯度更能反映局部变化趋势。
泰勒公式参考,假设
x t + 1 = x t + Δ x x^{t+1}=x^t+\Delta x xt+1=xt+Δx
则有
f ( x t + 1 ) = f ( x t ) + f 1 ( x t ) Δ x + f 2 ( x t ) Δ x 2 + … … + o ( x n ) f(x^{t+1})=f(x^t)+f^1(x^t)\Delta x+f^2(x^t)\Delta x^2+ …… + o(x^n) f(xt+1)=f(xt)+f1(xt)Δx+f2(xt)Δx2+……+o(xn)
- 关于目标函数的正则项(防止过拟合)生成的树越复杂,则惩罚力度越大,可以改写成
Ω ( f t ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega (f_t)= \gamma T + \frac 1 2 \lambda \sum _{j=1}^T w_j^2 Ω(ft)=γT+21λj=1∑Twj2
树的复杂度可以用如树的深度,内部节点个数,叶节点个数等来衡量。XGBoost中正则项用来衡量树的复杂度:树的叶子节点个数T和每棵树的叶子节点输出分数W的平方和(相当于L2正则化),其中**lambda
默认值为 1
。 和 gamma
**默认值为 0
在模型初始化时就被指定为固定的超参数(常量)。
- 于是目标函数就改写成了如下格式:第一部分是对样本的累加,而后面的部分是正则项,是对叶节点的累加。
- 定义函数q将输入的特征值x映射到某个叶子节点w上的,则有:
- 定义每个叶子节点j上的样本集合为
I j = { i ∣ q ( x i ) = j } I_j=\{{i|q(x_i)}=j\} Ij={i∣q(xi)=j}
则目标函数可以改写为:
O b j ( Θ ) = ∑ i = 1 N ( g i f t ( X i ) + 1 2 h i f t 2 ( X i ) ) + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ i = 1 N ( g i w q ( X i ) + 1 2 h i w q ( X i ) 2 ) + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ i = 1 T ( ∑ i ∈ I j g i w j + 1 2 ∑ i ∈ I j h i w j 2 ) + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ i = 1 T ( G j w j + 1 2 ( H j + λ ) w j 2 ) + γ T \begin{align} Obj(\Theta)\\& = \sum_{i=1}^N\Big(g_if_t(X_i)+ \frac 1 2h_i f_t^2(X_i) \Big)+\gamma T + \frac 1 2\lambda \sum _{j=1} ^T w_j^2 \\& = \sum_{i=1}^N\Big(g_iw_{q(Xi)}+ \frac 1 2h_i w^2_{q(Xi)} \Big)+\gamma T + \frac 1 2\lambda \sum _{j=1} ^T w^2_j \\& = \sum_{i=1}^T\Big(\sum_{i \in I_j} g_iw_j + \frac 1 2 \sum _{i \in I_j } h_i w^2_j\Big)+ \gamma T + \frac 1 2\lambda \sum _{j=1} ^T w^2_j \\& = \sum_{i=1}^T\Big(G_jw_j+ \frac 1 2(H_j+\lambda)w_j^2 \Big)+\gamma T \end{align} Obj(Θ)=i=1∑N(gift(Xi)+21hift2(Xi))+γT+21λj=1∑Twj2=i=1∑N(giwq(Xi)+21hiwq(Xi)2)+γT+21λj=1∑Twj2=i=1∑T(i∈Ij∑giwj+21i∈Ij∑hiwj2)+γT+21λj=1∑Twj2=i=1∑T(Gjwj+21(Hj+λ)wj2)+γT
其中:
G j = ∑ i ∈ I j g i ; H j ∑ i ∈ I j h i G_j=\sum_{i \in I_j}g_i ; H_j \sum _{i \in I_j } h_i Gj=i∈Ij∑gi;Hji∈Ij∑hi
-
优化目标函数,即计算第t轮时使目标函数最小的叶节点的输出分数w,直接对w求导(二次方函数,在该点导数等于0,代表在该点取的极值),使得导数为0,得:
w j = − G j H j + λ w_j= -\frac{G_j} {H_j+ \lambda} wj=−Hj+λGj -
将其带入损失函数中,得到最终的公式,这个公式越小就是目标函数越小,就是最优解。
O b j ( Θ ) = ∑ i = 1 T ( G j w j + 1 2 ( H j + λ ) w j 2 ) + γ T = ∑ j = 1 T ( − G j 2 H j + λ + 1 2 G j 2 ( H j + λ ) ) + γ T = − 1 2 ∑ j = 1 T ( G j 2 H j + λ ) + γ T \begin{align} Obj(\Theta) \\&= \sum_{i=1}^T\Big(G_jw_j+ \frac 1 2(H_j+\lambda)w_j^2 \Big)+\gamma T \\&= \sum_{j=1}^T\Big(- \frac{G_j^2} {H_j+ \lambda} + \frac 1 2 \frac {G_j^2}{(H_j+\lambda)} \Big)+\gamma T \\&= - \frac 1 2\sum_{j=1} ^T \Big(\frac {G_j^2} {H_j+\lambda} \Big)+\gamma T \end{align} Obj(Θ)=i=1∑T(Gjwj+21(Hj+λ)wj2)+γT=j=1∑T(−Hj+λGj2+21(Hj+λ)Gj2)+γT=−21j=1∑T(Hj+λGj2)+γT
-
计算目标函数的例子,最终的目标函数越小,这个目标函数就是最优解。
图1.4 计算目标函数的例子
1.2.3 学习策略解析
采用贪心算法,每次尝试分裂一个叶节点,计算分裂后的增益选择增益最大的。类似于决策树里面的信息增益和基尼指数,那XGBoost中怎么计算增益呢?损失函数是:
其中红色部分衡量了叶子节点对总体损失的贡献,目标函数越小越好,则红色框内部分就越大越好,在XGBoost中增益计算方法是:
Gain值越大,说明分裂后能使目标函数减小的越多,也就是越好。
1.2.4 XGBoost在GBDT的基础上的优化总结:
除了基本的 Gradient Boosting,XGBoost 还做了很多优化:
- 二阶泰勒展开:用 一阶梯度(Gradient) + 二阶 Hessian 更精确地逼近损失函数。
- 正则化:
- L1 正则(
alpha
):让叶子权重稀疏化(部分特征不重要时设为 0)。 - L2 正则(
lambda
):防止权重过大。
- L1 正则(
- 特征采样(Column Subsample):每棵树只用部分特征,增加多样性。当数据量庞大,无法全部存入内存中时,精确算法很慢,因此引入近似算法。根据特征k的分布确定l个候选切分点s={sx1,sx2, …… , skl },然后根据候选切分点把相应的样本放入对应的桶中,对每个桶的G, H进行累加,在候选切分点集合上进行精确贪心查找。 何时选取切分点?全局策略(Global)和局部策略(Local),全局策略:学习每棵树前,提出候选的切分点,当切分点数足够多时,和精确的贪心算法性能相当;局部策略:树节点分裂时,重新提出候选切分点,切分点个数不需要那么多,性能与精确贪心算法相差不多。
- 行采样(Row Subsample):每棵树只用部分数据,防止过拟合。
- 缺失值处理:自动学习缺失值应该分到左子树还是右子树。所谓的数据缺失值,大量的零值,One-hot编码XGBoost能对缺失值自动进行处理,思想是对于缺失值自动学习出它该划分的方向;
- 将特征k的缺失值都放在右子树枚举划分点,计算最大的gain,枚举划分点,计算最大的gain
- 将特征k的缺失值都放在左子树枚举划分点,计算最大的gain,枚举划分点,计算最大的gain
- 最后求出最大增益,确定缺失值的划分。
1.3 代码实战
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
from sklearn.metrics import root_mean_squared_error # 新增的RMSE计算函数
import numpy as np
import xgboost as xgb
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets
if __name__ == '__main__':
# macOS 推荐方法
plt.rcParams['font.family'] = 'Arial Unicode MS' # 苹果系统自带字体
plt.rcParams['axes.unicode_minus'] = False # 支持正号和负号
# 加载数据
housing = fetch_california_housing()
X = housing.data
y = housing.target
feature_names = housing.feature_names
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 创建DMatrix
dtrain = xgb.DMatrix(X_train, label=y_train, feature_names=feature_names)
dtest = xgb.DMatrix(X_test, label=y_test, feature_names=feature_names)
# 设置参数
params = {
'objective': 'reg:squarederror',
'max_depth': 5,
'eta': 0.05,
'subsample': 0.8,
'colsample_bytree': 0.8,
'seed': 42
}
# 训练模型
num_round = 200
model = xgb.train(params, dtrain, num_round)
# 预测
y_pred = model.predict(dtest)
# 评估 - 使用新的RMSE计算方法
mse = mean_squared_error(y_test, y_pred)
rmse = root_mean_squared_error(y_test, y_pred) # 推荐的新方法
# 或者: rmse = np.sqrt(mse) # 替代方法
print("均方误差(MSE): %.4f" % mse)
print("均方根误差(RMSE): %.4f" % rmse)
print("平均绝对误差(MAE): %.4f" % mean_absolute_error(y_test, y_pred))
print("决定系数(R²): %.4f" % r2_score(y_test, y_pred))
# 特征重要度
print("\n特征重要度 (增益):")
importance = model.get_score(importance_type='gain')
for feat, score in sorted(importance.items(), key=lambda x: x[1], reverse=True):
print(f"{feat}: {score:.4f}")
# 可视化特征重要度
xgb.plot_importance(model, importance_type='gain')
plt.title('Feature Importance (Gain)')
plt.show()
# 可选:展示实际值与预测值的对比
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.6)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--')
plt.xlabel('实际值')
plt.ylabel('预测值')
plt.title('实际值 vs 预测值')
plt.show()
2. LightGBM
2.1LightGBM的概念
LightGBM 是由微软(亚洲研究院)的 梯度提升框架,和 XGBoost 类似,但是速度比XGBoost快,精度也还可以,且做了大量优化:
- 更快:处理大数据时比 XGBoost 快几倍到几十倍;
- 更低内存占用:特别适合大规模数据集;
- 准确率相近甚至更高:在某些任务上表现更好。
核心改进:
- 直方图算法(Histogram):离散化特征,加速计算。
- 单边梯度采样(GOSS):只关注梯度大的样本,减少计算量。
- 互斥特征捆绑(EFB):合并稀疏特征,减少维度。
2.2 LightGBM 的核心原理
2.2.1 直方图算法(Histogram-based Split)
问题:XGBoost 在分裂节点时要遍历所有特征值,计算量大。
分桶的具体步骤(结合比喻和代码逻辑)
假设我们有一个“年龄”特征,共有11个样本的原始数据:[19, 23, 27, 31, 35, 39, 46, 50, 55, 60, 65]
LightGBM的分桶过程大致如下:
第1步:排序 (Sorting)
首先,算法会忽略缺失值,然后将所有特征值进行排序。[19, 23, 27, 31, 35, 39, 46, 50, 55, 60, 65]
(已经排好序了)
第2步:确定分位点 (Finding Quantile Points)
假设我们决定分成 max_bin = 4
个桶(这是LightGBM的一个超参数,默认是255)。
为了让每个桶里的样本数大致相等,我们需要找到3个“分位点”(因为4个桶需要3个隔板),将数据分成4份。
- 总样本数 n = 11
- 每个桶理想的样本数 = n / max_bin = 11 / 4 ≈ 2.75
所以,我们大致希望每2~3个样本就设置一个分桶的边界。我们可以在排序后的数据中找到相应的位置:
- 第一个边界点在第
11 / 4 * 1 ≈ 2.75
个位置(取整为第3个值) - 第二个边界点在第
11 / 4 * 2 ≈ 5.5
个位置(取整为第6个值) - 第三个边界点在第
11 / 4 * 3 ≈ 8.25
个位置(取整为第8个值)
对应到我们的数据:[19, 23, 27, 31, 35, 39, 46, 50, 55, 60, 65]
索引: 0 1 2 3 4 5 6 7 8 9 10
- 第一个边界值:索引2 ->
27
- 第二个边界值:索引5 ->
39
- 第三个边界值:索引8 ->
55
第3步:构建直方图桶 (Building the Histogram Bins)
现在,我们可以根据这三个边界值,创建出4个桶(bin):
- Bin 0: (-∞, 27] -> 包含值
[19, 23, 27]
- Bin 1: (27, 39] -> 包含值
[31, 35, 39]
- Bin 2: (39, 55] -> 包含值
[46, 50, 55]
- Bin 3: (55, +∞) -> 包含值
[60, 65]
(注意:实际算法实现可能会对边界点的归属有更精细的处理,比如让边界点成为上一个桶的上界和下一个桶的下界,但核心思想不变)
- 把连续特征 分桶(bin) 成离散值(比如 0~255)。
- 基于直方图计算分裂点,复杂度从 O(数据量)降到 O(bin数量)。
2.2.2 树的生长策略
LightGBM的生长策略是leaf-wise,以降低模型损失最大化为目的,对当前所有叶子节点中切分增益最大的leaf节点进行切分。leaf-wise的缺点是会生成比较深的决策树,为了防止过拟合,可以在模型参数中设置决策树的深度。
2.3 代码实战
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
from sklearn.metrics import root_mean_squared_error
import lightgbm as lgb
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
if __name__ == '__main__':
# macOS 推荐方法
plt.rcParams['font.family'] = 'Arial Unicode MS' # 苹果系统自带字体
plt.rcParams['axes.unicode_minus'] = False # 支持正号和负号
# 加载数据
housing = fetch_california_housing()
X = housing.data
y = housing.target
feature_names = housing.feature_names
# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 创建LightGBM数据集
train_data = lgb.Dataset(X_train, label=y_train, feature_name=feature_names)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data, feature_name=feature_names)
# 设置参数
params = {
'objective': 'regression', # 回归任务
'boosting_type': 'gbdt',
'metric': {'rmse', 'l2'}, # 评估指标
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.9,
'bagging_fraction': 0.8,
'bagging_freq': 5,
'verbose': -1,
'seed': 42
}
# 训练模型
num_round = 500
model = lgb.train(
params,
train_data,
num_round,
valid_sets=[test_data],
callbacks=[lgb.early_stopping(stopping_rounds=20)]
)
# 预测
y_pred = model.predict(X_test)
# 评估
rmse = root_mean_squared_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("均方误差(MSE): {:.4f}".format(mse))
print("均方根误差(RMSE): {:.4f}".format(rmse))
print("平均绝对误差(MAE): {:.4f}".format(mae))
print("决定系数(R²): {:.4f}".format(r2))
# 特征重要度 (按信息增益)
print("\n特征重要度 (按信息增益):")
importance = model.feature_importance(importance_type='gain')
for i, score in enumerate(importance):
print(f"{feature_names[i]}: {score:.4f}")
# 可视化特征重要度
lgb.plot_importance(model, importance_type='gain', title='特征重要度 (按信息增益)')
plt.show()
# 实际值 vs 预测值
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.6)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r--')
plt.xlabel('实际值')
plt.ylabel('预测值')
plt.title('实际值 vs 预测值')
plt.grid(True)
plt.show()
# 残差分析
residuals = y_test - y_pred
plt.figure(figsize=(10, 6))
plt.scatter(y_pred, residuals, alpha=0.6)
plt.axhline(y=0, color='r', linestyle='--')
plt.xlabel('预测值')
plt.ylabel('残差')
plt.title('残差分析')
plt.grid(True)
plt.show()
3. 从集成学习到Agent的历程
通过数据科学家是怎么了解你的——决策树&随机森林和数据科学家是怎么了解你的——AdaBoost、BDT、GBDT以及此篇文章的XGBoost和LightGBM,与大家分享完了整个集成学习相关的内容,集成学习是机器学习中典型的监督学习,截止目前机器学习有三种形式是比较值得关注的,即监督学习,无监督学习和强化学习,那这些形式和目前如火如荼的LLM,Agent等又有什么区别和联系呢?身为数据科学家的你面对这些不同的模型或工具又要如何抉择呢?
3.1 监督学习(有答案的练习题)
通过集成学习,是比较容易总结出监督学习这种技术的,基本上就是数据科学家拿到一些数据集样本,先分析和数据处理成特征,然后对这些样本根据期望的输出结果分别进行标记,从而得到一个训练的模型,并且该模型可以用来预测响应新的输入和输出。
核心: 我给你题目(数据) 和对应的标准答案(标签),你通过学习找出“题目”和“答案”之间的关系。以后给你新题目,你就能预测出答案。
-
生活比喻:
你拿着一套带答案的数学练习题教孩子。- 你给他看一道题:“3 + 5 = ?” (数据)
- 同时告诉他:“答案是8” (标签)
- 你反复给他看很多这样的例题(“1+1=2", "2+2=4”…)。
- 终于,当你问他 “4 + 4 = ?” 时,他通过之前的学习预测出了答案是8。
-
机器在学什么:
机器在学习一个从输入(题目)到输出(答案)的映射函数。它试图找到其中的规律(比如“加法就是数量增加”)。 -
常见任务:
- 分类:判断一张图片是猫还是狗(答案:离散的类别)
- 回归:预测一套房子的价格(答案:连续的数字)
-
一句话总结: “看图识字”。有标准答案的学习。
3.2 无监督学习(自主探索)+强化学习(训宠物、下围棋)
所有的场景都是有已知答案的吗?显然不是,在只有大量数据的情况下,数据科学家怎么去提取可能有用的见解呢?这个时候就会用到无监督学习,通过无监督学习训练的人工智能可以识别出微妙差别、数据规模过大或两者兼有而错过的那些模式。这类人工智能在训练时没有明确规定“适当”的结果,因此它们会像人类自学者一样产生令人惊讶的创新见解。不过,也可能和人类自学者一样,可能给出古怪荒谬、毫无意义的结果。
在无监督学习和监督学习中,人工智能主要使用数据来执行发现趋势、识别图像和做出预测等任务。除了数据分析,研究人员还试图训练人工智能在动态环境中运行。机器学习的第三个主要类别——强化学习便由此而来。在强化学习中,人工智能不是被动地识别数据之间的关系,它是受控环境中的“智能体”,会观察并记录环境对其行为的反应。一般而言,这些环境都是模拟的、简化版本的现实,缺乏真实世界的复杂性。比如一场国际象棋比赛,一步走棋也可能引发一连串的机会和风险。其结果便是,指导人工智能在人工环境中自我训练通常并不足以产生最佳表现,还需要有反馈。
奖励函数的任务就是提供这种反馈,为的是向人工智能表明它的方法有多成功。人类无法胜任这一角色:在数字处理机上运行的人工智能可以在数小时或数天内对自己进行数百次、数千次乃至数十亿次的训练,这使得直接的人类反馈完全不切实际。作为替代,程序员将这种奖励函数自动化,谨慎而又精确地指定该函数如何运行及如何模拟现实的性质。在理想情况下,模拟器提供真实的体验,奖励函数则促进有效的决策。
3.2.1 无监督学习
核心: 我只给你一大堆没有答案的题目(数据),你自己去发现这些题目内部隐藏的结构、分组或规律。
- 生活比喻:
你丢给小朋友一堆各种形状、颜色的积木,但什么都不告诉他。- 小朋友自己摆弄一阵后,可能会自动地把红色的积木放一堆,蓝色的放一堆(按颜色分)。
- 或者把三角形的放一堆,正方形的放一堆(按形状分)。
- 他发现了数据(积木)内在的相似性,但你从来没告诉过他“颜色”或“形状”这个概念。
- 机器在学什么:
机器在自主探索数据本身的内在结构,比如哪些数据点更相似,或者数据的主要变化方向是什么。 - 常见任务:
- 聚类:将用户分成不同的群体,用于精准营销(比如“高端消费者”、“性价比追求者”)。
- 降维:把高维数据压缩,方便可视化。比如把描述一个人的100个特征,压缩成2个主要特征画在平面上。
- 一句话总结: “自主探索”。没有标准答案,自己发现规律。
3.2.2 强化学习
核心: 有一个智能体(Agent) 在一个环境(Environment) 里通过试错来学习。它做出一个动作(Action),环境会给它一个奖励(Reward) 或惩罚。它的目标是学习一套策略,使得长期获得的总奖励最大。
- 生活比喻: 教狗子学习“握手”。
- 你(环境)伸出手(状态)。
- 狗子(智能体)可能抬起爪子(动作A),也可能舔你一口(动作B)。
- 如果它抬爪,你立刻给它一块零食(正奖励)。
- 如果它舔你,你就不理它(零奖励/惩罚)。
- 经过多次尝试,狗子终于明白:“原来抬起爪子这个动作,能带来好吃的!” 于是它就学会了握手。
- 机器在学什么:
机器在学习一套在特定环境下最优的行为策略:在什么状态下,采取什么动作,能获得最大的长远回报。 - 常见任务:
- 玩游戏:AlphaGo下围棋。赢棋是最终奖励,每走一步都是在试错。
- 自动驾驶:安全到达目的地是奖励,撞车、闯红灯是惩罚。
- 机器人控制:让机器人学会走路,不倒下去就是奖励。
- 一句话总结: “摸着石头过河” 或 “重赏之下,必有勇夫”。通过奖励和惩罚来学习最佳行为策略。
3.3 标准的神经网络 & 生成式神经网络
可以从语言翻译的故事线来看看标准神经网络和生成式神经网络的进展;
3.3.1 严谨的翻译官 —— 标准神经网络
核心任务: “识别”和“分类”。它的工作是在已有选项中找到最正确的那个答案。
它在翻译上的历程:
早期:词对词查找(不是神经网络)
- 工作方式:就像一本厚厚的双语词典。看到英文“apple”,就去找中文“苹果”。它非常死板,无法处理一词多义和语法结构。
- 贡献/问题:能解决最基本的需求,但翻译结果生硬、经常出错,比如会把“Chip Apple”(芯片苹果公司)翻译成“碎片 苹果”。
中期:循环神经网络(RNN)与 Seq2Seq 模型
- 工作方式:这位翻译官有了记忆力。他不再一个词一个词地看,而是先通读整个英文句子(编码器Encoder),把它的核心意思记在心里(压缩成一个上下文向量),然后再根据这个核心意思,逐个词地吐出中文(解码器Decoder)。
- 好比:听你说完一整个英文句子,他低头思考一下,然后说:“您刚才那句话的意思是……”,再用中文复述出来。
- 贡献:这是神经机器翻译(NMT)的开端,翻译质量飞跃式提升,因为模型能理解整个句子的基本语境了。
- 局限:记忆力有限。如果句子太长,他可能忘了开头说了什么(无法有效处理长距离依赖)。翻译长文时,质量会下降。
近期:Transformer 与 Attention 机制(仍是判别式模型)
- 工作方式:这是翻译官的终极进化形态。他不再需要先通读再复述,而是引入了一个“注意力机制”(Attention)。
- “注意力机制”通俗解释:他在翻译当前中文词时,会动态地、有侧重地回头看英文句子的每一个部分。
- 翻译“苹果”时,他会同时注意到句中的“ ate ”(吃)和“ juicy ”(多汁的),从而确定这个“Apple”是能吃的水果,而不是一家公司。
- 他真正做到了一边输出,一边在不同的时间点关注输入的不同部分,实现了“动态对齐”。
- 贡献:这成为了现代翻译系统的绝对基石。谷歌翻译、百度翻译等核心模型都基于此。翻译准确度和流畅度达到了前所未有的高度,基本解决了长句遗忘问题。
3.3.2 小说家 —— 生成式神经网络
核心任务: “创造”和“生成”。它的工作不是选择,而是从零开始“创作”出一个符合要求的内容。
它在翻译上的历程与贡献:
生成式模型最初并不是为翻译而生的,它们擅长的是无中生有,比如生成图片(GAN)、写文章(GPT)。但当它们被应用到翻译上时,带来了革命性的视角。
核心思想:翻译是“条件生成”
- 工作方式:我们不把翻译看作“查找”或“判别”,而是看作一种创作。
- 好比:你给这位小说家一段英文剧情大纲(原文),要求他:“请根据这段大纲,用中文的思维和文风,创作出一个完整的故事(译文)。”
- 他理解了大纲的核心意图和情感后,会运用自己从海量中文文学中学到的知识、文风和语法,重新创作出一个地道的、符合中文习惯的故事。他可能不会字字对应,但会神似。
代表模型:基于GPT等大语言模型(LLM)的翻译
- 工作方式:像ChatGPT这样的模型,是更强大的“小说家”。它在万亿级别的多语言文本上训练过,它“读过”所有语言的“小说”。
- 它在翻译上的超凡能力体现在:
- 理解上下文和领域:你给它一篇医学论文,它能用专业的医学术语翻译;你给它一句莎士比亚的诗,它会努力模仿诗歌的文体。
- 处理歧义和灵活意译:它能更好地根据上下文判断一词多义,并选择最传神的词来表达。
- 超越字面翻译:它能捕捉原文的语气、风格和情感(比如讽刺、幽默、正式、口语化),并在目标语言中生成具有同样效果的句子。
3.4 人工智能的家族图谱
3.5 AIGC、Agent、MCP的概念关系
2023年是GenAI的元年,近两年 AI 技术的日新月异,大语言模型 (LLM)、AIGC、多模态、RAG、Agent、MCP 等各种相关概念层出不穷,百花齐放,若不深入了解,也是极易混淆的。
可以参考:腾讯技术工程一篇文章:
4. 开放题:AI将去往哪里?
4.1 一些AI巨佬的言论
- 《人工智能时代与人类未来》——亨利.基辛格;埃里克.施密特等
1965年,工程师戈登·摩尔预测,计算能力将每两年翻一番这一预测被证明拥有持久生命力。但人工智能的进展远没有那么容易预测。语言翻译人工智能曾停滞不前长达几十年,然后才通过技术和计算能力的融合,实现了惊人的发展。短短数年之间,人类就开发出了具有大致相当于双语人士翻译能力的人工智能。那么,人工智能需要多长时间(如果真的有这一天)才能具备-名天才专业译者的素质?这一点无法准确预测。
我们可以合理地预期,随着时间的推移,人工智能的发展速度至少会和计算能力一样快,在15~20年内增长100万倍。这种发展势头必将催生出在规模上与人脑相当的神经网络。截至撰写本书时,生成式转换器在人工智能中拥有最大的神经网络。GPT-3有大约10的11次方个此类权重。最近,中国的人工智能专家公布了一种生成语言模型,其权重是GPT-3的10倍,但这仍然比人类大脑突触的估计数量少10的4次方个数量级。然而,如果该领域的进展可以实现每两年翻一番,这一差距可能在不到10年的时间内就会被弥合。当然,数量规模并不能直接转化为智力。事实上,一个神经网络能够维持的能力水平是未知的。一些灵长类动物的大脑尺寸与人类相似,甚至比人类更大,但它们没有表现出任何接近人类的智力水平。该领域的发展将很有可能产生人工智能“专家”,即一种能够在特定领域(如先进科学领域)显著超越人类表现的程序。
- 《我看见的世界》——李飞飞
李飞飞也对未来人工智能的发展方向提出了自己的判断和警醒,核心就是“以人为本",让人工智能真正推动人类的发展,而不是成为威胁。这本书既是对重大科学突破幕后的精彩窥探,也是一位女性用好奇心和勇气突破人生困境的故事。它不仅证明了即使是最技术性的学术研究也需要激情,更加表明永不停歇的好奇心可以激发无尽的科技创新。
- 中国科学院院士徐宗本关于
智能问题维度
与技术实现
的探讨
4.1 徐宗本院士的结语
更多内容可以关注笔者之前写的AI领域偶像大佬们在2025世界人工智能大会上聊了些什么
4.2 OpenAI对AGI定义和预测的五个阶段
论文地址:https://arxiv.org/abs/2311.02462
-
人工智能的5个阶段
-
人机交互的五个阶段
更多推荐
所有评论(0)