从生物神经元到人工神经网络的完整学习路线
在学习神经网络之前,先看一个真实问题:预测混凝土的抗压强度。下面的散点图展示了水胶比与强度的关系——它不是一条直线!
在学习神经网络结构之前,先搞清楚一个根本问题:你的任务属于哪种类型?任务类型决定了网络结构、输出层设计和损失函数的选择。
| 任务类型 | 输入示例 | 输出示例 | 适合网络 |
|---|---|---|---|
| 回归 | 水胶比、龄期、温度 | 强度值(MPa) | MLP |
| 图像分类 | 裂缝照片 | 有裂缝 / 无裂缝 | CNN |
| 序列预测 | 传感器时序数据 | 下一时刻位移 | RNN / LSTM |
人工神经网络的灵感来自生物神经系统。大脑中约有 860 亿个神经元,通过突触相互连接。每个神经元接收信号、处理信号、发出信号——人工神经元正是对这个过程的数学模拟。
| 生物结构 | 功能 | 人工神经元对应 |
|---|---|---|
| 树突 | 接收来自其他神经元的电/化学信号 | 输入 \(x_1, x_2, \ldots, x_n\) |
| 突触强度 | 不同突触传递信号的效率不同 | 权重 \(w_1, w_2, \ldots, w_n\) |
| 细胞体 | 汇总所有输入信号,决定是否激活 | 加权求和 \(z = \sum w_i x_i + b\) |
| 激活阈值 | 信号总量超过阈值才“放电” | 激活函数 \(f(z)\) |
| 轴突 | 将激活信号传递给下一个神经元 | 输出 \(y = f(z)\) |
在正式学习之前,先思考以下问题,带着问题学习效果更好:
本章内容分六次课讲授,从基础到应用循序渐进:
| 课次 | 主题 | 核心内容 | 互动演示 |
|---|---|---|---|
| 第一课 | 神经元与数据 | 感知机、激活函数、数据集划分 | 神经元模拟器、激活函数可视化、前向传播手算 |
| 第二课 | 网络架构 | MLP 结构、前向传播、参数计数 | MLP 可视化 |
| 第三课 | 损失与优化 | 损失函数、梯度下降、反向传播 | 损失对比、梯度下降可视化、SGD vs Adam |
| 第四课 | 训练技巧 | 过拟合、正则化、模型评价 | 过拟合检测器、Dropout 可视化、训练历程 |
| 第五课 | CNN | 卷积、池化、图像识别 | 卷积动画、池化演示 |
| 第六课 | RNN 与应用 | 序列建模、LSTM、工程应用 | 记忆衰减、数据驱动 vs 物理驱动 |
感知机模型与激活函数
一个人工神经元做的事情非常简单:接收输入 → 加权求和 → 通过激活函数 → 输出。
场景:判断混凝土试块是否合格。三个输入特征各有权重,加上偏置后通过激活函数得到输出。
点击按钮切换不同激活函数,观察其形状和数学公式。激活函数为神经网络引入非线性,是网络表达能力的关键。
如果没有激活函数(或只用线性激活),无论网络有多少层,最终都等价于一个单层线性变换。多层线性变换的组合仍然是线性的:
不同的激活函数适用于不同的场景。以下是实用的选择建议:
| 激活函数 | 适用位置 | 推荐场景 | 注意事项 |
|---|---|---|---|
| ReLU | 隐藏层 | 大部分场景的默认选择 | 可能出现“死亡神经元” |
| Sigmoid | 输出层 | 二分类的输出层(概率输出) | 不推荐用于隐藏层(梯度消失) |
| Softmax | 输出层 | 多分类的输出层(概率分布) | 只用于最后一层 |
| Tanh | 隐藏层 / RNN | 需要输出在 (-1,1) 范围时 | RNN 中常用,仍有梯度消失问题 |
| 无激活 | 输出层 | 回归任务(输出连续值) | 输出层不加激活函数,直接输出 |
在训练神经网络之前,你需要准备好数据集。先搞懂四个基本概念:
下面这张表就是一个真实数据集的样子——每一行是一个样本,中间几列是特征(模型的输入),最后一列是标签(要预测的目标):
| 样本编号 | 特征 1:跨度 (m) | 特征 2:荷载 (kN) | 特征 3:截面高度 (mm) | 特征 4:钢材等级 | 标签:实测挠度 (mm) |
|---|---|---|---|---|---|
| #1 | 6.0 | 50 | 300 | Q235 | 12.3 |
| #2 | 8.0 | 80 | 400 | Q345 | 15.7 |
| #3 | 5.0 | 30 | 250 | Q235 | 8.1 |
| #4 | 10.0 | 120 | 500 | Q390 | 18.9 |
| #5 | 7.0 | 60 | 350 | Q345 | 11.5 |
| … | … | … | … | … | … |
| #500 | 9.0 | 100 | 450 | Q345 | 16.2 |
场景:用一个微型网络预测钢梁挠度。2 个输入(跨度、荷载)→ 2 个隐藏神经元 → 1 个输出(挠度预测)。点击“▶ 下一步”逐步查看前向传播的每一步计算。
多层感知机(MLP)与前向传播
多层感知机(Multi-Layer Perceptron)是最基础的神经网络架构,由输入层、隐藏层、输出层组成。每层神经元与下一层全连接(Full Connected)。
调整隐藏层数和每层神经元数量,观察网络结构和参数数量的变化。
数据从输入层出发,逐层经过加权求和和激活函数,最终到达输出层。这个过程称为前向传播(Forward Propagation)。
为什么神经网络如此强大?万能近似定理给出了理论保证:
这个定理听起来很抽象。下面用一个直觉证明解释为什么 ReLU 网络能拟合任意曲线:
大一高数中学过的泰勒公式,其实和万能近似定理有着相同的思想内核:用简单的基础单元叠加起来逼近复杂函数。
| 泰勒展开 | ReLU 神经网络 | |
|---|---|---|
| 基本构件 | 多项式 \(x^k\) | 折线 \(\text{ReLU}(wx+b)\) |
| 叠加方式 | 加权求和(系数由导数决定) | 加权求和(系数由训练学得) |
| 精度来源 | 阶数 \(n \to \infty\) | 神经元数 \(N \to \infty\) |
| 局限性 | 只在展开点附近精确 | 全局有效,但需训练 |
| 系数如何得到 | 手算导数 \(f^{(k)}(a)\) | 梯度下降自动学习 |
蓝色曲线是目标函数(钢梁挠度的非线性关系)。拖动滑块增加 ReLU 神经元数量,观察红色折线如何逐步逼近蓝色曲线:
以预测简支钢梁跨中挠度为例,展示如何设计一个完整的 MLP 网络:
| 连接 | 权重数 | 偏置数 | 小计 |
|---|---|---|---|
| 输入层 → 隐藏层 1 | \(4 \times 32 = 128\) | 32 | 160 |
| 隐藏层 1 → 隐藏层 2 | \(32 \times 32 = 1024\) | 32 | 1056 |
| 隐藏层 2 → 输出层 | \(32 \times 1 = 32\) | 1 | 33 |
| 总计 | 1184 | 65 | 1249 |
衡量模型预测与真实值之间的差距
在学习损失函数的选择之前,先用一个直觉例子理解这个工程场景——你不需要学过钢结构也能看懂:
如果我们想用神经网络预测焊缝附近各点的残余应力值(回归任务),面临一个关键选择:
拖动滑块调整预测偏移量,观察 MSE 和 MAE 的变化差异。注意:MSE 对大误差的放大效应。
分类问题不能用 MSE——因为输出是概率,需要用专门的交叉熵损失。先用一个生活类比理解它:
场景:检测钢梁焊缝是否存在裂缝(真实答案:有裂缝,即 \(y=1\))。拖动滑块改变模型的预测置信度:
损失函数不是随便选的——它和任务类型、输出层激活函数紧密绑定。记住以下对应关系:
| 任务类型 | 输出层激活 | 损失函数 | 土木工程示例 |
|---|---|---|---|
| 回归 | 无激活(线性输出) | MSE / MAE | 预测混凝土抗压强度(MPa) |
| 二分类 | Sigmoid | 二元交叉熵 | 判断焊缝是否合格 |
| 多分类 | Softmax | 多类交叉熵 | 裂缝等级分类(无/轻微/中等/严重) |
不同任务类型决定了输出层的设计。三种最常见的配置:
| 任务类型 | 输出层 | 损失函数 | 评价指标 | 土木例子 |
|---|---|---|---|---|
| 回归 | 线性输出(无激活) | MSE / MAE | MAE / RMSE / \(R^2\) | 钢梁挠度预测 |
| 二分类 | 1节点 + Sigmoid | 二元交叉熵 BCE | 准确率 / 召回率 | 裂缝有/无判定 |
| 多分类 | K节点 + Softmax | 多类交叉熵 CE | 准确率 / F1 | 损伤等级(无/轻/重) |
梯度下降与反向传播
想象你蒙着眼站在山上,想走到山谷最低点。你能做的就是感受脚下的坡度(梯度),然后沿着最陡的下坡方向走一小步。重复这个过程,最终就能到达谷底。
调整学习率,点击“开始下降”观察优化轨迹。学习率过大会发散,过小会收敛极慢。
反向传播是计算梯度的高效算法。下面这张图展示了完整的训练循环——数据先从左到右“前向传播”得到预测值,再从右到左“反向传播”计算每个参数的梯度:
点击按钮切换查看两个方向的数据流。绿色箭头 = 前向传播(计算预测值),红色箭头 = 反向传播(计算梯度)。
| 符号 | 读法 | 含义 | 出现位置 |
|---|---|---|---|
| \(z^{(l)}\) | "z 上标 l" | 第 l 层的加权求和结果(还没过激活函数),即 \(z = \sum w_i x_i + b\) | 神经元加权求和 |
| \(a^{(l)}\) | "a 上标 l" | 第 l 层的激活值 / 输出,\(a = f(z)\),f 是 ReLU / Sigmoid 等激活函数 | 神经元激活后输出 |
| \(w^{(l)}\) | "w 上标 l" | 第 l 层的权重参数(反向传播就是要算它的梯度) | 网络参数 |
| \(L\) | 普通大写 L | 网络的总层数(所以 \(a^{(L)}\) 就是最后一层的输出,也就是预测值 \(\hat y\)) | 网络架构 |
| \(\mathcal{L}\) | 花体 L("Loss") | 损失函数的值,比如 MSE、交叉熵算出来的那个数。 📌 用花体是为了和上面表示"总层数"的普通 \(L\) 区分开,不会混淆。 | 损失函数 |
| \(l\) | 小写 l | 任意第 l 层的编号,\(l = 1, 2, \dots, L\) | 层索引 |
| \(\frac{\partial \mathcal{L}}{\partial w}\) | "偏 ℒ 偏 w" | 梯度:损失 \(\mathcal{L}\) 对权重 \(w\) 的偏导数,表示"这个 \(w\) 动一点点,损失会变多少" | 梯度下降要用的量 |
在同一个损失曲面(x² + 3y²)上,同时观察 SGD 和 Adam 两种优化器的轨迹。Adam 利用动量和自适应学习率,通常收敛更快更稳定。
损失函数像一个碗,梯度下降就是沿碗壁往下走。学习率决定每步走多远——轨迹上的每个点都在碗壁上:
训练开始前,网络的权重不能全初始化为 0(否则所有神经元都做相同的事),也不能随机太大或太小。合理的初始化是训练成功的第一步。
训练神经网络时,数据不是一次性全部送入的,而是分批处理的。理解以下三个概念非常重要:
| 方式 | Batch Size | 特点 |
|---|---|---|
| 批量梯度下降 (BGD) | = 全部样本 | 梯度精确,但每步计算量大;内存需求高 |
| 随机梯度下降 (SGD) | = 1 | 每步只用 1 个样本,噪声大但更新快;有助于跳出局部最优 |
| 小批量梯度下降 (Mini-batch) | 16 ~ 256 | 兼顾效率和稳定性,是最常用的方式 |
过拟合、正则化与实用训练方法
调整模型复杂度,观察训练损失和验证损失的变化趋势。当两条曲线开始分叉时,就是过拟合的信号。
调整 Dropout 比率,观察隐藏层中神经元被随机“关闭”的效果。被关闭的神经元(灰色)在本次前向传播中不参与计算。
场景:用神经网络预测钢梁的极限承载力。点击“▶ 开始训练”观察训练损失和验证损失随 epoch 变化的动态过程。
训练完模型后,用什么指标评判它好不好?回归和分类用不同的指标。
| 预测:有裂缝 | 预测:无裂缝 | |
|---|---|---|
| 实际:有裂缝 | TP = 80(正确检出) | FN = 20(漏检!) |
| 实际:无裂缝 | FP = 10(误报) | TN = 890(正确排除) |
神经网络中有很多需要人工设定的“超参数”(不是训练学出来的),选择不当会严重影响性能。以下是常见超参数及其选择建议:
| 超参数 | 典型范围 | 选择建议 |
|---|---|---|
| 学习率 | 0.0001 ~ 0.1 | 先用 0.001 尝试;如果损失震荡,调小;如果收敛太慢,调大 |
| 隐藏层数 | 1 ~ 5 | 简单任务 1~2 层够用;复杂任务逐步加深,注意过拟合 |
| 每层神经元数 | 16 ~ 512 | 通常是 2 的幂次(32, 64, 128);逐步调整,观察验证集表现 |
| Batch Size | 16 ~ 256 | 小 batch 噪声大但泛化好;大 batch 训练快但可能陷入局部最优 |
| Dropout 比率 | 0.1 ~ 0.5 | 过拟合严重时增大;通常从 0.2 开始尝试 |
| 训练轮次 (Epochs) | 10 ~ 1000 | 配合早停法使用,监控验证集损失决定何时停止 |
神经网络对输入数据的尺度非常敏感。如果不做预处理,特征值范围差异巨大(如跨度 6 m vs 弹性模量 206000 MPa),会导致训练困难。
| 特征 | 原始范围 | 标准化后 | 说明 |
|---|---|---|---|
| 跨度 L (m) | 4 ~ 20 | -1.5 ~ 1.5 | 均值 12 m,标准差 5.3 m |
| 荷载 P (kN) | 10 ~ 500 | -1.5 ~ 1.5 | 均值 255 kN,标准差 163 kN |
| 弹性模量 E (MPa) | 200000 ~ 210000 | -1.5 ~ 1.5 | 均值 206000,标准差 2800 |
| 截面惯性矩 I (cm⁴) | 1000 ~ 50000 | -1.5 ~ 1.5 | 均值 15000,标准差 12700 |
图像识别的核心架构
一张 256x256 的彩色图片有 256 × 256 × 3 = 196,608 个像素值。如果用全连接层,第一层就需要近 2 亿个参数!CNN 通过局部连接和参数共享大幅减少参数量。
感受野是指输出特征图上的一个像素“能看到”原始输入图像多大的区域。随着网络层数增加,感受野逐渐扩大。
5×5 输入矩阵与 3×3 卷积核逐步进行卷积运算。点击“下一步”观察卷积核滑动和对应输出的计算过程。
4×4 输入矩阵上进行 2×2 最大池化。每个 2×2 区域取最大值,输出为 2×2。点击“下一步”逐步演示。
钢结构的焊缝质量直接关系到结构安全。传统的焊缝检测依赖人工目视检查或超声波探伤,效率低且受主观因素影响。CNN 可以通过自动分析焊缝照片来检测缺陷类型。
一张 128×128 焊缝图像,如果用全连接需要 128×128×64 = 1,048,576 个参数(仅第一层)。用 3×3 卷积核只需要 3×3×64 = 576 个参数——减少了 99.95%!
序列数据建模与记忆机制
MLP 和 CNN 处理的是固定大小的输入。但很多数据是序列形式的——文本是单词的序列、时间序列是时间步的序列。序列中的前后信息有依赖关系,RNN 通过“记忆”来捕捉这种依赖。
其中 \(h_t\) 是第 \(t\) 步的隐藏状态(记忆),它同时依赖当前输入 \(x_t\) 和上一步的记忆 \(h_{t-1}\)。
观察 RNN 处理一句话时,对早期单词的“记忆”如何随距离衰减。颜色越深代表记忆越强,越浅代表记忆越弱。点击“播放”逐词处理。
普通 RNN 在序列较长时,梯度在反向传播中会指数级衰减(梯度消失),导致网络无法学习长距离依赖。LSTM 通过引入门控机制解决了这个问题。
RNN 的核心限制在于“逐步处理”:必须按顺序一个时间步一个时间步地计算,无法并行化。2017 年提出的 Transformer 通过“注意力机制”彻底改变了这一局面。
RNN 的灵活之处在于输入和输出可以是不同长度的序列,这催生了四种常见的架构变体:
大型钢桥在运营过程中,需要持续监测结构状态以确保安全。LSTM 网络特别适合处理这类长时间序列的振动监测数据。
理解 RNN 和 LSTM 的关键差异,有助于判断何时需要“升级”到 LSTM:
神经网络在土木工程中的应用
土木工程的数据往往很少(几十到几百条),直接训练深度网络容易过拟合。迁移学习提供了一种解决思路:
钢结构领域是神经网络应用的热门方向。以下梳理了从设计到运维全生命周期中的典型应用场景:
场景:预测简支钢梁在集中荷载下的跨中挠度。三种不同的建模思路,各有优劣。点击下方卡片查看详情。
神经网络不是万能的。在土木工程中使用 AI 时,必须清醒认识以下局限:
如果你未来想在学术论文中使用神经网络解决土木工程问题,以下是评审专家最关注的要点:
MLP vs CNN vs RNN 及关键概念速查
| 维度 | MLP | CNN | RNN |
|---|---|---|---|
| 适用数据 | 表格/结构化数据 | 图像/网格数据 | 序列/时间序列 |
| 连接方式 | 全连接 | 局部连接 + 参数共享 | 循环连接(隐藏状态) |
| 核心操作 | 矩阵乘法 + 激活 | 卷积 + 池化 | 隐藏状态递推 |
| 参数效率 | 参数多 | 参数少(共享卷积核) | 参数少(时间步共享) |
| 土木应用 | 强度预测、造价估算 | 裂缝检测、缺陷识别 | 振动监测、进度预测 |
从感知机到大语言模型,神经网络经历了近 70 年的发展。理解这条脉络,有助于把握技术发展的内在逻辑。
| 概念 | 一句话解释 |
|---|---|
| 激活函数 | 为网络引入非线性,使其能拟合任意复杂关系。常用:ReLU、Sigmoid、Tanh |
| 损失函数 | 衡量模型预测与真实值的差距。回归用 MSE/MAE,分类用交叉熵 |
| 梯度下降 | 沿损失函数梯度的反方向更新参数,逐步逼近最优解 |
| 反向传播 | 利用链式法则高效计算所有参数梯度的算法 |
| 学习率 | 参数每次更新的步长。过大发散,过小太慢 |
| 过拟合 | 模型“记住”了训练数据的噪声,泛化能力差 |
| Dropout | 训练时随机关闭神经元,防止过拟合 |
| 卷积 | 用小矩阵(卷积核)在输入上滑动,提取局部特征 |
| 池化 | 对特征图降采样(如取最大值),减少计算量 |
| LSTM | 带门控机制的 RNN,解决长距离依赖的梯度消失问题 |
先看数据结构,再选网络结构。记住这个简单决策表:
| 你的数据长什么样? | 优先考虑 | 典型场景 |
|---|---|---|
| 表格 / 结构化数值 | MLP | 混凝土强度预测、造价估算 |
| 图片 / 照片 | CNN | 裂缝识别、缺陷检测 |
| 时间序列 / 传感器数据 | RNN / LSTM | 振动监测、沉降预测 |
| 网格 / 拓扑 / 节点关系 | GNN(进阶) | 有限元网格分析 |
| 长文本 / 复杂序列 | Transformer(进阶) | 施工文档理解、多模态 |
从拿到数据到模型上线,一个完整的深度学习项目通常包含以下步骤:
初学者在使用神经网络时,经常会掉入以下陷阱。提前了解可以少走很多弯路:
将本章学到的概念与 PyTorch 代码一一对应。即使你还不会编程,理解这种对应关系有助于加深对概念的理解:
| 概念 | PyTorch 代码 | 说明 |
|---|---|---|
| 定义 MLP | nn.Linear(4, 32) | 一个全连接层,4 个输入,32 个输出 |
| ReLU 激活 | nn.ReLU() | 添加 ReLU 非线性激活 |
| MSE 损失 | nn.MSELoss() | 回归任务的均方误差损失 |
| 交叉熵损失 | nn.CrossEntropyLoss() | 分类任务的交叉熵损失 |
| Adam 优化器 | optim.Adam(lr=0.001) | Adam 优化器,学习率 0.001 |
| 前向传播 | output = model(x) | 数据通过网络得到预测值 |
| 计算损失 | loss = criterion(output, y) | 比较预测值和真实值 |
| 反向传播 | loss.backward() | 计算所有参数的梯度 |
| 更新参数 | optimizer.step() | 用梯度更新权重和偏置 |
| Dropout | nn.Dropout(p=0.3) | 30% 概率随机关闭神经元 |
| 卷积层 | nn.Conv2d(1, 64, 3) | 1 通道输入,64 个 3×3 卷积核 |
| LSTM 层 | nn.LSTM(input_size, hidden_size) | LSTM 循环神经网络层 |
初学者经常混淆以下概念。清晰区分它们是理解神经网络的关键:
25 道选择题,检验你对神经网络的理解
如果你对某个方向特别感兴趣,以下资源可以帮助你深入学习: