【通俗理解】AI的两次寒冬:从感知机困局到深度学习前夜

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寒冬的种子

  • 步骤

    1. 建立单层感知机模型并尝试解决异或(XOR)等非线性问题。
    2. 引入多层网络(BP算法),看其在复杂数据集上的表现。
    3. 讨论参数规模、硬件计算能力与算法局限性,探寻AI寒冬的成因。
  • 应用公式

    y = θ ( ∑ i w i x i + b ) y = \theta\Bigl(\sum_{i} w_i x_i + b\Bigr) y=θ(iwixi+b)

    E = 1 2 ∑ ( y pred − y true ) 2 E = \frac{1}{2}\sum (y_{\text{pred}} - y_{\text{true}})^2 E=21(ypredytrue)2

    w i ← w i − η ∂ E ∂ w i w_i \leftarrow w_i - \eta \frac{\partial E}{\partial w_i} wiwiηwiE

    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(dk QKT)V


第一节:感知机与第一次AI寒冬

1. 感知机模型的公式解释与案例

1.1 感知机模型
感知机模型公式通俗解释
y = θ ( ∑ i w i x i + b ) y = \theta\Bigl(\sum_{i} w_i x_i + b\Bigr) y=θ(iwixi+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(ypredytrue)2均方误差 (MSE)度量预测值与真实值之差距
w i ← w i − η ∂ E ∂ w i w_i \leftarrow w_i - \eta \frac{\partial E}{\partial w_i} wiwiηwiE梯度下降更新权重,减少预测误差
变量释义
( 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(dk QKT)V都是神经网络中常见机制,基于加权和。Attention主要用于对序列信息做加权,BP用于端到端的梯度优化。
Cauchy-Schwarz不等式都能对运算范围进行一定限制或提供判断标准。C-S不等式在向量空间中度量相似度,神经网络偏重训练误差或注意力机制。
热力学第二定律都反映“不可逆性”或“单调变化”的概念。热力学描述宏观世界熵增,AI训练则是误差下降,与统计学习理论紧密相关。
专家系统推理规则都关注“条件-结论”的推断,涉及系统的“知识与推断框架”。专家系统基于规则库,神经网络基于数据驱动;二者在某些应用侧面相互补充。

3.2 推导过程(以梯度下降为例)

  1. 定义误差函数
    E = 1 2 ∑ ( y pred − y true ) 2 E = \frac{1}{2}\sum (y_{\text{pred}} - y_{\text{true}})^2 E=21(ypredytrue)2
  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} wiE=(ypredytrue)wiypred
  3. 参数更新
    w i ← w i − η ∂ E ∂ w i w_i \leftarrow w_i - \eta \frac{\partial E}{\partial w_i} wiwiηwiE

在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)

在这里插入图片描述

代码可视化要点

  1. 不同的线型和标记:在散点图中采用多种标记(如 o, s, ^ 等)区分特征。
  2. 添加网格plt.grid(True) 帮助读者更容易跟踪数据点位置。
  3. 优化标题和标签:标题与坐标轴标签均指明含义。
  4. 使用不同的颜色散点图、柱状图、饼图都选用对比度较高的配色方案。
  5. 添加图例:并通过 loc='best' 选择合适位置。
  6. 高亮关键区域:在柱状图中采用 plt.axhspan() 凸显平均线以下区域。
  7. 添加注释:使用 plt.annotate() 指出与理想线较为接近的区域等。

代码输出说明

输出内容描述
测试集均方误差(MSE)评估网络预测效果,数值越小表示模型对房价预测更准确。
散点图(真实值 vs. 预测值)展示模型表现,理想情况下数据点应靠近对角线。
特征重要性(柱状图+饼图)虽然MLP没有明确的特征重要性,但可以用绝对权重求和近似衡量每个特征的影响力。
多特征散点图可视化不同特征与价格之间的关系,强调线型、标记与网格以提高可读性。
SHAP可视化使用SHAP解释模型决策过程,展示各特征对预测结果的正负影响程度。
中间调试信息包含数据集维度、MLP的网络结构等,方便排查潜在问题。

代码功能实现

  1. 数据加载与清洗:载入加利福利亚住房数据并进行标准化处理。
  2. 网络构建与训练:采用多层感知机并通过误差反向传播来学习参数。
  3. 评估与可视化:使用散点图、柱状图、饼图、SHAP可视化等多方式展现模型表现与特征影响。
  4. 多标注方式的图形输出:使用网格、注释、不同线型与颜色等提升可读性。

第五节:参考信息源

  1. AI历史与寒冬

    • Minsky, M., & Papert, S. (1969). Perceptrons. MIT Press.
    • Russell, S. J., & Norvig, P. (2009). Artificial Intelligence: A Modern Approach. Prentice Hall.
  2. 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.
  3. SHAP解释模型

    • Lundberg, S. M., & Lee, S. I. (2017). A Unified Approach to Interpreting Model Predictions. Advances in Neural Information Processing Systems.
  4. Scikit-learn与数据集

    • Pedregosa, F., et al. (2011). Scikit-learn: Machine Learning in Python. Journal of Machine Learning Research, 12, 2825-2830.

参考文献链接

  1. Minsky, M., & Papert, S. (1969). Perceptrons. MIT Press.
  2. Russell, S., & Norvig, P. (2009). Artificial Intelligence: A Modern Approach.
  3. Rumelhart, D. E., et al. (1986). Learning representations by back-propagating errors.
  4. Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.
  5. Lundberg, S. M., & Lee, S. I. (2017). A Unified Approach to Interpreting Model Predictions.
  6. Pedregosa, F., et al. (2011). Scikit-learn: Machine Learning in Python.

结语

两次AI寒冬体现了技术发展的曲折性:

  • 第一次感知机的局限性使得线性模型萎靡不振;
  • 第二次专家系统瓶颈**、硬件落后与投资潮水褪去,AI再度进入沉寂。
    然而,这些“寒冬”也为后续的深度学习、硬件革新与数据驱动模式提供了养分。如今,AI在大规模算力与数据的支撑下,开启了
    第三波浪潮**,也正因此,我们更应当记住历史教训,让技术发展更加稳健与长远。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949686.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构9.3 - 文件基础(C++)

目录 1 打开文件字符读写关闭文件 上图源自&#xff1a;https://blog.csdn.net/LG1259156776/article/details/47035583 1 打开文件 法 1法 2ofstream file(path);ofstream file;file.open(path); #include<bits/stdc.h> using namespace std;int main() {char path[]…

下载ffmpeg执行文件

打开网址&#xff1a;Download FFmpeg 按下面步骤操作 解压文件就可以看到ffmpeg的执行文件了&#xff0c;需要通过命令行进行使用&#xff1a; ffmpeg命令行使用参考&#xff1a; ffmpeg 常用命令-CSDN博客

网络安全抓包

#知识点&#xff1a; 1、抓包技术应用意义 //有些应用或者目标是看不到的&#xff0c;这时候就要进行抓包 2、抓包技术应用对象 //app,小程序 3、抓包技术应用协议 //http&#xff0c;socket 4、抓包技术应用支持 5、封包技术应用意义 总结点&#xff1a;学会不同对象采用…

国产编辑器EverEdit - 两种删除空白行的方法

1 使用技巧&#xff1a;删除空白行 1.1 应用场景 用户在编辑文档时&#xff0c;可能会遇到很多空白行需要删除的情况&#xff0c;比如从网页上拷贝文字&#xff0c;可能就会存在大量的空白行要删除。 1.2 使用方法 1.2.1 方法1&#xff1a; 使用编辑主菜单 选择主菜单编辑 …

可以输入的下拉框(下拉框数据过大,页面卡死)

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在项目中&#xff0c;有些下拉框的数据过于庞大&#xff0c;这样页面有时候会卡死&#xff0c;在vue3中常用的组件库element-puls中有个组件可以避免 在项目中&#xff0c;有些需求要求下拉框选择的同…

基于Python的音乐播放器 毕业设计-附源码73733

摘 要 本项目基于Python开发了一款简单而功能强大的音乐播放器。通过该音乐播放器&#xff0c;用户可以轻松管理自己的音乐库&#xff0c;播放喜爱的音乐&#xff0c;并享受音乐带来的愉悦体验。 首先&#xff0c;我们使用Python语言结合相关库开发了这款音乐播放器。利用Tkin…

谷粒商城-高级篇完结-Sleuth+Zipkin 服务链路追踪

1、基本概念和整合 1.1、为什么用 微服务架构是一个分布式架构&#xff0c;它按业务划分服务单元&#xff0c;一个分布式系统往往有很多个服务单元。由于服务单元数量众多&#xff0c;业务的复杂性&#xff0c;如果出现了错误和异常&#xff0c;很难去定位 。主要体现在&#…

ollama+FastAPI部署后端大模型调用接口

ollamaFastAPI部署后端大模型调用接口 记录一下开源大模型的后端调用接口过程 一、ollama下载及运行 1. ollama安装 ollama是一个本地部署开源大模型的软件&#xff0c;可以运行llama、gemma、qwen等国内外开源大模型&#xff0c;也可以部署自己训练的大模型 ollama国内地…

pandas系列----DataFrame简介

DataFrame是Pandas库中最常用的数据结构之一&#xff0c;它是一个类似于二维数组或表格的数据结构。DataFrame由多个列组成&#xff0c;每个列可以是不同的数据类型&#xff08;如整数、浮点数、字符串等&#xff09;。每列都有一个列标签&#xff08;column label&#xff09;…

Unity【Colliders碰撞器】和【Rigibody刚体】的应用——小球反弹效果

目录 Collider 2D 定义&#xff1a; 类型&#xff1a; Rigidbody 2D 定义&#xff1a; 属性和行为&#xff1a; 运动控制&#xff1a; 碰撞检测&#xff1a; 结合使用 实用检测 延伸拓展 1、在Unity中优化Collider 2D和Rigidbody 2D的性能 2、Unity中Collider 2D…

Java实现UDP与TCP应用程序

三、Java实现UDP应用程序 3.1 InetAddress类 java.net.InteAddress类是用于描述IP地址和域名的一个Java类&#xff1b; 常用方法如下&#xff1a; public static InetAddress getByName(String host)&#xff1a;根据主机名获取InetAddress对象public String getHostName()…

信号处理-消除趋势项

matlab 版本 python 版本 import numpy as np import matplotlib.pyplot as plt from matplotlib import rcParams# 设置中文字体 rcParams[font.sans-serif] [SimHei] # 设置默认字体为黑体 rcParams[axes.unicode_minus] False # 解决负号显示问题def compute_time(n, f…

Linux 安装 meilisearch

前言 由于项目部分数据需要用到搜索引擎进行检索&#xff0c;但是服务器资源有限&#xff0c;安装elasticsearch过于笨重&#xff0c;不太符合现实情况&#xff0c;所以选择了meilisearch作为搜索引擎来使用&#xff0c;目前使用接近一年&#xff0c;运行良好。 安装 在/usr/…

【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1. 二叉排序树的基本概念 2. 二叉排序树节点结构体定义 3. 创建二叉排序树 4. 判断是否为二叉排序树 5. 递归查找关键字为 6 的结点并输出查找路径 6. 删除二叉排序树中的节点 测试说明 通关代码 测试结果 任务描述 本关任务&a…

TCP与DNS的报文分析

场景拓扑&#xff1a; 核心路由配置&#xff1a; 上&#xff08;DNS&#xff09;&#xff1a;10.1.1.1/24 下(WEB)&#xff1a;20.1.1.1/24 左&#xff08;client&#xff09;&#xff1a;192.168.0.1/24 右(PC3)&#xff1a;192.168.1.1/24Clint2配置&a…

OpenHarmony通过挂载镜像来修改镜像内容,RK3566鸿蒙开发板演示

在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容&#xff0c;修改源码再编译很费时。今天为大家介绍一个便捷的方法&#xff0c;让OpenHarmony通过挂载镜像来修改镜像内容&#xff01;触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器&#xff0c;树…

linux ansible部署

ansible部署完后&#xff0c;执行报错 # ansible one -i hosts -m ping dataos193 | FAILED! > {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add …

【微服务】3、配置管理

微服务配置管理 已掌握的微服务组件及配置管理问题引出 已掌握注册中心、Openfan、远程调用、负载均衡、网关等组件&#xff0c;具备微服务开发能力&#xff0c;但仍存在其他问题待解决。微服务和网关存在大量配置文件&#xff0c;其中包含很多重复配置&#xff0c;如数据库、日…

C# 事件

目录 1、事件模型的5个组成部分2、使用内置委托类型声明事件2.1 EventHandler2.1.1 &#xff1f;2.1.2 this2.1.3 使用匿名函数和lamda表达式2.1.3.1 匿名函数2.1.3.2 lamda表达式 2.1.4 异常处理 2.2 EventHandler<TEventArgs> 3、使用自定义委托类型声明事件3.1 事件的…

php反序列化原生态 ctfshow练习 字符串逃逸

web262 拿着题审计一下 <?php error_reporting(0); class message{public $from;public $msg;public $to;public $tokenuser;public function __construct($f,$m,$t){$this->from $f;$this->msg $m;$this->to $t;} }$f $_GET[f]; $m $_GET[m]; $t $_GET[t…