AI的两次寒冬:从感知机困局到深度学习前夜
引用(中英双语)
- 中文:
“第一次AI寒冬,是因为感知机局限性被揭示,让人们失去了对算法可行性的信心。”
“第二次AI寒冬,则是因为专家系统的局限性和硬件成本的高企,触发资金与热情的退潮。”- 英文:
“The first AI winter was triggered by the limitations of the perceptron, which shattered faith in the feasibility of these algorithms.”
“The second AI winter was driven by the limits of expert systems and high hardware costs, causing a retreat of funding and enthusiasm.”
关键词:
#AI寒冬
#感知机
#梯度下降
#神经网络
#符号主义
#专家系统
#深度学习
#过拟合
#软硬件瓶颈
#CSDN
具体实例与推演
假设我们需要分析一个简单的感知机模型在不同维度下的表现,并观察它在多层网络中的表现。当我们试图用传统的感知机解决非线性问题时,就会遭遇无法收敛的困境。这种尴尬在20世纪60年代末与70年代初集中爆发,也埋下了第一次AI寒冬的种子。
-
步骤:
- 建立单层感知机模型并尝试解决异或(XOR)等非线性问题。
- 引入多层网络(BP算法),看其在复杂数据集上的表现。
- 讨论参数规模、硬件计算能力与算法局限性,探寻AI寒冬的成因。
-
应用公式:
y = θ ( ∑ i w i x i + b ) y = \theta\Bigl(\sum_{i} w_i x_i + b\Bigr) y=θ(i∑wixi+b)
E = 1 2 ∑ ( y pred − y true ) 2 E = \frac{1}{2}\sum (y_{\text{pred}} - y_{\text{true}})^2 E=21∑(ypred−ytrue)2
w i ← w i − η ∂ E ∂ w i w_i \leftarrow w_i - \eta \frac{\partial E}{\partial w_i} wi←wi−η∂wi∂E
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\Bigl(\frac{QK^T}{\sqrt{d_k}}\Bigr)V Attention(Q,K,V)=softmax(dkQKT)V
第一节:感知机与第一次AI寒冬
1. 感知机模型的公式解释与案例
1.1 感知机模型
感知机模型公式 | 通俗解释 |
---|---|
y = θ ( ∑ i w i x i + b ) y = \theta\Bigl(\sum_{i} w_i x_i + b\Bigr) y=θ(i∑wixi+b) | 输出 (y) 类似一个“是否通过考核”的判定,(\theta(\cdot)) 是阶跃函数。 |
变量释义 | |
( w_i ) : 权重 | 像评委对各项打分的权重,决定各因素影响大小 |
( x_i ) : 输入 | 参赛选手在各项测试中的成绩 |
( b ) : 偏置 | 顶层政策或特殊加分项 |
( \theta(\cdot) ) : 激活函数 | 类似及格线,只要超过这个线就“通过”,否则就是“不通过” |
1.2 感知机的应用意义和缺点
- 应用意义:感知机是神经网络历史的开端,提供了一个将输入线性组合后进行分类的基石。
- 缺点:无法解决线性不可分问题,例如XOR异或问题。该问题在1969年Minsky和Papert的著作中被深度剖析,导致了社会对感知机的失望和第一波“AI寒冬”。
打比方:
- 如果把“线性可分”比作普通的“直线划分”,那么感知机就像一条简单直线,只能把二维平面分成两个区域。如果数据呈现“弯曲”的分界线,感知机就无能为力了。
第二节:BP算法与第二次AI寒冬
2.1 BP(反向传播)核心公式
公式 | 作用 |
---|---|
E = 1 2 ∑ ( y pred − y true ) 2 E = \frac{1}{2}\sum (y_{\text{pred}} - y_{\text{true}})^2 E=21∑(ypred−ytrue)2 | 均方误差 (MSE)度量预测值与真实值之差距 |
w i ← w i − η ∂ E ∂ w i w_i \leftarrow w_i - \eta \frac{\partial E}{\partial w_i} wi←wi−η∂wi∂E | 梯度下降更新权重,减少预测误差 |
变量释义 | |
( E ) : 误差函数 | 像“考核指标”,越小越好 |
( y_{\text{pred}} ) : 预测输出 | 神经网络对输入数据给出的判断 |
( y_{\text{true}} ) : 真实值 | 数据集中样本对应的正确标签 |
( \eta ) : 学习率 | 步伐大小,过大容易振荡,过小收敛慢 |
2.2 反向传播的应用价值与局限
- 应用价值:在多层网络中,BP算法让网络能学习非线性映射,大大扩展了感知机的应用范围,为后续深度学习奠定基础。
- 局限:在硬件计算能力不足、训练数据不足以及网络深度受限时,BP算法会面临梯度消失或振荡等问题。加之80年代后期到90年代初期专家系统热潮退却,资金和人力投入也随之骤降,引发了第二次“AI寒冬”。
打比方:
- BP算法就像在“后厨”中不断试错调味,想让菜肴更接近理想口味。但如果人手不足、食材匮乏(数据少)、炉火(硬件计算能力)不够旺,再好的厨艺(BP算法)也难以做出让人满意的菜。
第三节:公式探索与推演运算
在探讨神经网络的核心数学时,我们常会对照其他相关公式。这里列出一些常见公式,并对比其异同。
3.1 常见相似公式对比
公式/定律 | 共同点 | 不同点 |
---|---|---|
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\Bigl(\frac{QK^T}{\sqrt{d_k}}\Bigr)V Attention(Q,K,V)=softmax(dkQKT)V | 都是神经网络中常见机制,基于加权和。 | Attention主要用于对序列信息做加权,BP用于端到端的梯度优化。 |
Cauchy-Schwarz不等式 | 都能对运算范围进行一定限制或提供判断标准。 | C-S不等式在向量空间中度量相似度,神经网络偏重训练误差或注意力机制。 |
热力学第二定律 | 都反映“不可逆性”或“单调变化”的概念。 | 热力学描述宏观世界熵增,AI训练则是误差下降,与统计学习理论紧密相关。 |
专家系统推理规则 | 都关注“条件-结论”的推断,涉及系统的“知识与推断框架”。 | 专家系统基于规则库,神经网络基于数据驱动;二者在某些应用侧面相互补充。 |
3.2 推导过程(以梯度下降为例)
- 定义误差函数
E = 1 2 ∑ ( y pred − y true ) 2 E = \frac{1}{2}\sum (y_{\text{pred}} - y_{\text{true}})^2 E=21∑(ypred−ytrue)2 - 计算梯度
∂ E ∂ w i = ∑ ( y pred − y true ) ⋅ ∂ y pred ∂ w i \frac{\partial E}{\partial w_i} = \sum (y_{\text{pred}} - y_{\text{true}}) \cdot \frac{\partial y_{\text{pred}}}{\partial w_i} ∂wi∂E=∑(ypred−ytrue)⋅∂wi∂ypred - 参数更新
w i ← w i − η ∂ E ∂ w i w_i \leftarrow w_i - \eta \frac{\partial E}{\partial w_i} wi←wi−η∂wi∂E
在AI第二次寒冬时期,网络结构较浅,硬件性能有限,导致实际训练时收敛慢或难以成功;而深层网络更容易出现梯度消失,这也是当时人们对神经网络失望的重要原因之一。
第四节:核心代码与可视化
以下示例代码使用加利福利亚数据集,构建一个简单的多层感知机,演示网络训练过程及可视化。我们将使用多种可视化方式,包括散点图、柱状图、饼图,添加网格与注释,并利用SHAP库解释模型决策过程。
请注意:波士顿住房数据集在新版的 scikit-learn 中已被标注为“可能带有偏见”,仅在此作为教学演示用;实际项目需谨慎处理。
# This code performs the following functions:
# 1. Loads the 加利福利亚 Housing dataset.
# 2. Constructs a simple MLP to predict house prices.
# 3. Trains the network using gradient descent (via scikit-learn MLP).
# 4. Visualizes data and results with Seaborn and Matplotlib in various styles.
# 5. Utilizes SHAP to explain model decisions.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import mean_squared_error
# -------------- 1. Load the California Housing dataset --------------
california = fetch_california_housing()
X = california.data
y = california.target
feature_names = california.feature_names
# Convert to DataFrame for easier processing
df = pd.DataFrame(X, columns=feature_names)
df['PRICE'] = y
# -------------- 2. Split the data into training and testing sets --------------
X_train, X_test, y_train, y_test = train_test_split(df.drop('PRICE', axis=1), df['PRICE'], test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# -------------- 3. Construct a simple MLP Regressor and train it --------------
mlp = MLPRegressor(hidden_layer_sizes=(16, 8),
activation='relu',
solver='adam',
learning_rate_init=0.01,
max_iter=500,
random_state=42)
mlp.fit(X_train_scaled, y_train)
# Evaluate the model
y_pred = mlp.predict(X_test_scaled)
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error on Test Set:", mse)
# -------------- 4. Data Visualization --------------
sns.set_theme(style="whitegrid")
# 4.1 Scatter plot of predictions
plt.figure(figsize=(8,6))
plt.scatter(y_test, y_pred, marker='o', color='blue', label='Predictions')
plt.plot([y_test.min(), y_test.max()],[y_test.min(), y_test.max()],
color='red', linestyle='--', label='Ideal Line')
plt.xlabel("True House Price")
plt.ylabel("Predicted House Price")
plt.title("Scatter Plot of True vs Predicted")
plt.legend(loc='best')
plt.grid(True)
plt.annotate('Close to Ideal',
xy=(25, 25),
xytext=(30, 40),
arrowprops=dict(facecolor='black', arrowstyle='->'))
plt.show()
# 4.2 Bar chart of feature importances (using MLP.coefs_)
# For MLP, there's no direct "feature_importance_", we approximate by sum of absolute weights for the first layer
feature_importance = np.sum(np.abs(mlp.coefs_[0]), axis=1)
plt.figure(figsize=(10,6))
plt.bar(feature_names, feature_importance, color='skyblue', edgecolor='black')
plt.xlabel('Features')
plt.ylabel('Approx Importance')
plt.title('Feature Importances (Sum of Absolute Weights in First Hidden Layer)')
plt.axhspan(0, np.mean(feature_importance), color='yellow', alpha=0.3,
label='Below average importance')
plt.legend()
plt.xticks(rotation=45)
plt.grid(True)
plt.show()
# 4.3 Pie chart of feature importances
plt.figure(figsize=(6,6))
plt.pie(feature_importance, labels=feature_names, autopct='%1.1f%%', startangle=140)
plt.title('Feature Importance Distribution')
plt.show()
# 4.4 Additional scatter plots with different line/markers
plt.figure(figsize=(8,6))
markers = ['o', 's', '^', '*', 'D', 'X', 'P', 'v', '+', '.']
for i, col in enumerate(feature_names[:5]):
plt.scatter(X_train[col], y_train, marker=markers[i % len(markers)], label=col)
plt.xlabel('Feature Value')
plt.ylabel('House Price')
plt.title('Scatter Plots of First 5 Features vs. Price')
plt.legend(loc='upper right')
plt.grid(True)
plt.show()
# -------------- 5. SHAP analysis --------------
# Install shap if needed: !pip install shap
import shap
explainer = shap.Explainer(mlp, X_train_scaled)
shap_values = explainer(X_test_scaled)
# SHAP Summary plot
shap.summary_plot(shap_values, features=X_test_scaled, feature_names=feature_names)
# SHAP dependence plot for top 2 features
shap.plots.scatter(shap_values[:, 0], color=shap_values)
shap.plots.scatter(shap_values[:, 1], color=shap_values)
# Print intermediate data shapes for debugging
print("X_train_scaled shape:", X_train_scaled.shape)
print("y_train shape:", y_train.shape)
print("MLP hidden layers:", mlp.hidden_layer_sizes)
代码可视化要点
- 不同的线型和标记:在散点图中采用多种标记(如
o
,s
,^
等)区分特征。 - 添加网格:
plt.grid(True)
帮助读者更容易跟踪数据点位置。 - 优化标题和标签:标题与坐标轴标签均指明含义。
- 使用不同的颜色:散点图、柱状图、饼图都选用对比度较高的配色方案。
- 添加图例:并通过
loc='best'
选择合适位置。 - 高亮关键区域:在柱状图中采用
plt.axhspan()
凸显平均线以下区域。 - 添加注释:使用
plt.annotate()
指出与理想线较为接近的区域等。
代码输出说明
输出内容 | 描述 |
---|---|
测试集均方误差(MSE) | 评估网络预测效果,数值越小表示模型对房价预测更准确。 |
散点图(真实值 vs. 预测值) | 展示模型表现,理想情况下数据点应靠近对角线。 |
特征重要性(柱状图+饼图) | 虽然MLP没有明确的特征重要性,但可以用绝对权重求和近似衡量每个特征的影响力。 |
多特征散点图 | 可视化不同特征与价格之间的关系,强调线型、标记与网格以提高可读性。 |
SHAP可视化 | 使用SHAP解释模型决策过程,展示各特征对预测结果的正负影响程度。 |
中间调试信息 | 包含数据集维度、MLP的网络结构等,方便排查潜在问题。 |
代码功能实现:
- 数据加载与清洗:载入加利福利亚住房数据并进行标准化处理。
- 网络构建与训练:采用多层感知机并通过误差反向传播来学习参数。
- 评估与可视化:使用散点图、柱状图、饼图、SHAP可视化等多方式展现模型表现与特征影响。
- 多标注方式的图形输出:使用网格、注释、不同线型与颜色等提升可读性。
第五节:参考信息源
-
AI历史与寒冬
- Minsky, M., & Papert, S. (1969). Perceptrons. MIT Press.
- Russell, S. J., & Norvig, P. (2009). Artificial Intelligence: A Modern Approach. Prentice Hall.
-
BP算法与神经网络
- Rumelhart, D. E., Hinton, G. E., & Williams, R. J. (1986). Learning Representations by Back-Propagating Errors. Nature.
- Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.
-
SHAP解释模型
- Lundberg, S. M., & Lee, S. I. (2017). A Unified Approach to Interpreting Model Predictions. Advances in Neural Information Processing Systems.
-
Scikit-learn与数据集
- Pedregosa, F., et al. (2011). Scikit-learn: Machine Learning in Python. Journal of Machine Learning Research, 12, 2825-2830.
参考文献链接:
- Minsky, M., & Papert, S. (1969). Perceptrons. MIT Press.
- Russell, S., & Norvig, P. (2009). Artificial Intelligence: A Modern Approach.
- Rumelhart, D. E., et al. (1986). Learning representations by back-propagating errors.
- Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.
- Lundberg, S. M., & Lee, S. I. (2017). A Unified Approach to Interpreting Model Predictions.
- Pedregosa, F., et al. (2011). Scikit-learn: Machine Learning in Python.
结语
两次AI寒冬体现了技术发展的曲折性:
- 第一次因感知机的局限性使得线性模型萎靡不振;
- 第二次因专家系统瓶颈**、硬件落后与投资潮水褪去,AI再度进入沉寂。
然而,这些“寒冬”也为后续的深度学习、硬件革新与数据驱动模式提供了养分。如今,AI在大规模算力与数据的支撑下,开启了第三波浪潮**,也正因此,我们更应当记住历史教训,让技术发展更加稳健与长远。