Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

2.1 神经网络基本结构

本节从最经典的感知机出发,逐步推导出现代深度学习中广泛使用的前馈神经网络(MLP),并系统讨论激活函数、损失函数以及反向传播与自动求导。这一部分是后续卷积网络、Transformer、VLA 模型的“通用底层语法”。


2.1.1 感知机与前馈神经网络

2.1.1.1 感知机模型

感知机(Perceptron)是最早的人工神经元模型之一,用于二分类问题。形式非常简单:对输入向量做一次线性加权求和,然后通过一个阈值函数决定输出类别。(维基百科)

设输入为 \(x \in \mathbb{R}^d\),权重为 \(w \in \mathbb{R}^d\),偏置为 \(b \in \mathbb{R}\),则感知机的输出为

\[ f(x) = h(w^\top x + b), \]

其中 \(h(\cdot)\) 通常取阶跃(Heaviside step)函数:

\[ h(a) = \begin{cases} 1, & a > 0,[4pt] 0, & a \le 0. \end{cases} \]

几何上,\(w^\top x + b = 0\) 是输入空间中的一个超平面,感知机就是“问:样本在超平面的哪一侧?”。因此它是一个线性分类器,只能解决** 线性可分**的二分类问题,例如 AND、OR,但无法解决 XOR 这样的非线性问题。(Cross Validated)

感知机的学习(经典的感知机学习算法)就是不断调整 \((w,b)\),使训练集中正负样本最终被这个超平面正确分开——只要数据线性可分,经典感知机算法可以在有限步内收敛。(维基百科)

【图 2-1 占位】 感知机结构示意图:左侧若干输入节点 \(x_1,\dots,x_d\),连接到一个神经元,中间标出权重 \((w_i)\),节点内部显示加权和 \(\sum w_i x_i + b\),右侧是经阶跃函数后输出 0/1。

在具身智能/机器人中,单个感知机本身不常直接使用,但它是理解更复杂神经网络的基石:你可以把它看作“最小决策单元”。


2.1.1.2 前馈神经网络(MLP)

感知机只有一层线性变换 + 非线性,不足以表达复杂模式。为此,人们自然想到:把很多这样的“神经元”堆叠起来——于是就有了多层前馈神经网络(Multilayer Perceptron, MLP)。(Take heed : 개발 블로그)

前馈网络的典型结构:

  • 输入层:接收原始特征,例如图像像素、机器人关节状态、传感器读数等。
  • 若干隐藏层:每一层都是仿照感知机的线性变换 + 激活函数。
  • 输出层:给出回归值、类别概率或动作命令等。

以两层 MLP(1 个隐藏层)为例:

\[ \begin{aligned} h &= \sigma(W_1 x + b_1), y &= \phi(W_2 h + b_2), \end{aligned} \]

其中

  • \(x \in \mathbb{R}^{d_{\text{in}}}\):输入;
  • \(h \in \mathbb{R}^{d_{\text{hidden}}}\):隐藏层表示;
  • \(\displaystyle y\):输出;
  • \((W_1, W_2)\)、\((b_1, b_2)\) 为可学习参数;
  • \(\sigma(\cdot)\) 是隐藏层激活函数(如 ReLU、GELU);
  • \(\phi(\cdot)\) 是输出层激活函数(如恒等、sigmoid 或 softmax,视任务而定)。

所有层的连接方向从输入到输出,没有回路,所以称为“前馈(feedforward)”。

【图 2-2 占位】 两层 MLP 拓扑图:输入层若干节点,经全连接到隐藏层,再全连接到输出层,用箭头表示信息单向流动。

在机器人具身智能系统中,MLP 通常扮演以下角色:

  • 视觉 backbone 后面的决策头(policy head):将高维视觉特征映射为动作参数。
  • 强化学习中的价值函数 / Q 函数近似器
  • 动力学模型或世界模型中的局部近似模块,将状态映射到下一状态或奖励。

2.1.1.3 表示能力

为什么 MLP 如此重要?关键是它的函数逼近能力

通用逼近定理(Universal Approximation Theorem) 表明:在较宽的条件下,具有非多项式激活函数(如 sigmoid、ReLU)的一隐藏层前馈网络,可以以任意精度逼近定义在紧致集合上的任意连续函数 。(维基百科)

直观地讲:

  • 每个隐藏层神经元可以看作一个“小基函数”,例如某个方向上的“台阶”或“拐点”;
  • 通过线性组合足够多的这样的基函数,就能构造出形状非常复杂的曲线和曲面;
  • 因此,只要隐藏单元足够多,MLP 在理论上可以表示任意复杂的输入–输出映射。

从工程角度:

  • 宽度(隐藏单元个数)决定单层网络能表示多复杂的函数;
  • 深度(层数)允许网络通过逐层组合,产生更高层次、更结构化的特征,很多研究表明“适度加深”比“无限加宽”更高效。(维基百科)

但要注意: 通用逼近定理只是“存在性定理”,它告诉我们“有某个参数配置”能做到,并不保证我们一定能通过有限数据和有限训练时间找到那个最好配置。这正是前面第 1 章中优化与泛化问题的现实版本。

在具身智能场景里,这个理论给我们信心:只要模型结构合理、数据与训练方法得当,一个足够大的前馈网络有能力学会从机器人多模态观测到高质量控制命令的映射


2.1.2 激活函数(ReLU、GELU 等)及其性质

2.1.2.1 常见激活函数

激活函数决定了神经元如何“非线性响应”输入。如果没有激活函数(或者只用线性函数),整个网络退化为一层线性变换,无法表示复杂关系。常见激活函数包括:sigmoid、tanh、ReLU、GELU、SiLU 等。(geeksforgeeks.org)

  1. Sigmoid(S 形函数)

\[ \text{sigmoid}(x) = \frac{1}{1 + e^{-x}}. \]

  • 输出范围 \(\displaystyle (0,1)\),早期常用于二分类输出。
  • 曲线在 0 附近较陡,两端(正/负无穷)趋近于 1 和 0。
  • 大输入绝对值区域梯度接近 0,深层网络中容易产生梯度消失
  1. Tanh(双曲正切)

\[ \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}, \]

输出范围 \(\displaystyle (-1,1)\),形状与 sigmoid 相似,但是零中心的。相比 sigmoid,在某些场景下收敛更快,但同样存在饱和区梯度很小的问题。

  1. ReLU(Rectified Linear Unit)

\[ \text{ReLU}(x) = \max(0, x). \]

  • \(x\le 0\) 时输出 0;\((x>0)\) 时保持线性。
  • 计算简单,梯度在正半轴为 1,在负半轴为 0。
  • 在深度网络中表现良好,是目前最常用的激活函数之一。(维基百科)
  1. GELU(Gaussian Error Linear Unit)

GELU 大致形状类似一个平滑的“软 ReLU”:对较小或负的输入输出接近 0,对较大的输入近似线性;它的精确表达式可写为与高斯累积分布相关的形式。GELU 在 Transformer 等大模型中被广泛采用,被认为在某些任务上比 ReLU 有更好的性能和更平滑的梯度性质。(Medium)

  1. SiLU / Swish 等平滑 ReLU 变体

SiLU(Sigmoid Linear Unit)、Swish 等也是近年常用的激活函数,在负半轴有小的负输出,在正半轴近似线性,兼具平滑与非线性。

【图 2-3 占位】 多种激活函数曲线对比图:在同一坐标系中绘制 Sigmoid、Tanh、ReLU、GELU 的函数曲线,并在另一幅子图中绘制它们的导数,突出梯度在不同区间的大小差异。


2.1.2.2 激活函数对梯度的影响

激活函数不仅影响网络的表达能力,也直接影响梯度传播质量,从而影响训练速度与稳定性。(geeksforgeeks.org)

  1. 梯度消失(vanishing gradient)
  • Sigmoid/Tanh 在远离 0 的区域导数接近 0,深层网络中多次相乘后,梯度会迅速衰减。
  • 结果是靠近输入的前几层几乎得不到有效更新,训练停滞。
  1. 梯度爆炸(exploding gradient)
  • 若激活函数的导数较大,或者权重初始化不合适,梯度在层间传播时会被放大,导致数值不稳定。
  • 虽然激活函数本身不是唯一原因,但其导数规模是关键因素之一。
  1. ReLU 的“半线性”优势与问题
  • ReLU 在正半轴导数为 1,不会压缩梯度;在负半轴导数为 0,可以增加稀疏性。
  • 这有助于缓解梯度消失问题,也在实践中显著提升了深度网络训练效果。(维基百科)
  • 但 ReLU 也会出现“死亡 ReLU”(neuron dying)现象:若某个神经元长期落在负区间,其输出和梯度都为 0,难以再被激活。
  1. 平滑非线性(GELU、SiLU)的折中
  • GELU 等函数在零附近平滑过渡,导数在全域不为 0,利于梯度更柔和地传播。(arXiv)
  • 实证研究表明,在 Transformer 等架构中使用 GELU 能带来更好的收敛性质和最终性能。

总体来看,激活函数的设计和选择,是在“表达能力—梯度稳定性—计算开销”之间寻找平衡。


2.1.2.3 激活函数选择

在具体工程实践中,激活函数通常按以下经验进行选择:

  • 隐藏层(MLP、CNN、Transformer 前馈)
    • 默认优先:ReLU 或 GELU。
    • 若特别追求平滑性或更高性能,可考虑 GELU、SiLU 等。
  • 输出层
    • 回归:一般使用线性激活(恒等函数),直接输出实数。
    • 二分类:常用 sigmoid,将输出映射到 \(\displaystyle (0,1)\),然后配合二元交叉熵损失。
    • 多分类:使用 softmax,将 logits 映射为概率分布,再配合交叉熵损失。
  • 机器人 / 具身智能中的特殊考虑
    • 输出若为角速度、力矩等连续控制量,通常选择线性或 Tanh,并在 Tanh 输出后再缩放到物理允许范围;
    • 为保证安全,可在激活函数后附加硬裁剪(clamp),确保输出不超出机器人硬件极限。

随着模型规模与任务复杂度提升,新的激活函数还在不断被提出;但在掌握基础原理后,读者可以将它们都看作是在“非线性形状”和“梯度传播”上的微调。


2.1.3 损失函数(交叉熵、MSE 等)与任务类型对应关系

损失函数(Loss function)度量模型输出与真实标签之间的差异,是训练中需要最小化的目标。不同任务适合不同的损失设计,这一点在前面机器学习基础(1.4 节)已有初步介绍,这里结合神经网络再做系统梳理。

2.1.3.1 均方误差(MSE)

均方误差(Mean Squared Error, MSE)是回归任务中最常用的损失之一。(simpling)

单样本情况下:

\[ \mathcal{L}_{\text{MSE}}(y,\hat{y}) = \frac{1}{2}(y - \hat{y})^2, \]

其中 \(\displaystyle y\) 为真实值,\(\hat{y}\) 为模型预测值。对一个批量大小为 \(\displaystyle n\) 的样本集合,损失通常取平均:

\[ \mathcal{L}_{\text{MSE}} = \frac{1}{n} \sum_{i=1}^n \frac{1}{2}(y_i - \hat{y}_i)^2. \]

MSE 的特点:

  • 对误差进行平方,放大大误差 的影响,有利于收敛到整体最优。
  • 对于高斯噪声假设下的线性回归,MSE 对应于最大似然估计,是一个有良好统计意义的目标函数。
  • 梯度简单:\(\partial \mathcal{L}/\partial \hat{y} = \hat{y} - y\),便于反向传播。

在机器人控制中,若要预测未来状态、关节角度或力矩等连续量,MSE 是自然的选择;在某些 RL 算法中,价值函数近似也常使用 MSE(或 Huber 损失等变体)来拟合目标回报。


2.1.3.2 交叉熵损失

交叉熵损失主要用于分类任务,特别是配合 softmax(多分类)或 sigmoid(二分类)输出时。(simpling)

  1. 二分类交叉熵

设真实标签 \(y \in {0,1}\),预测概率 \(\hat{p} = \sigma(z)\) 为属于正类的概率,则二元交叉熵为:

\[ \mathcal{L}_{\text{BCE}}(y,\hat{p}) = - \big( y \log \hat{p} + (1-y) \log (1-\hat{p}) \big). \]

  1. 多分类交叉熵

设有 \(\displaystyle K\) 个类别,真实标签 one-hot 向量 \(y \in {0,1}^K\),预测概率 \(\hat{p}\in[0,1]^K\),\(\sum_k \hat{p}_k=1\)。多分类交叉熵为:

\[ \mathcal{L}_{\text{CE}}(y,\hat{p}) = - \sum_{k=1}^K y_k \log \hat{p}_k. \]

与 softmax 联用时,这个损失实际上等价于最大化真实类别对应的 log 概率 。 从信息论角度看,交叉熵与 KL 散度密切相关,是衡量模型预测分布与真实分布差异的自然指标。

为什么分类不用 MSE,而更偏好交叉熵?

  • 软最大 + 交叉熵组合在梯度上更“匹配”,能提供更稳定、有效的学习信号;
  • 对于概率模型,交叉熵直接对应于最大似然估计,使模型输出可以被解释为概率。(Medium)

在具身智能中,当我们训练“高层离散决策”(例如动作原语的选择:抓取/放置/导航)或文本指令分类时,交叉熵是主力损失函数。


2.1.3.3 特定任务的损失

除了 MSE 与交叉熵,各类特定任务还发展出大量对应的损失设计,这里只做简要指引:

  • 序列任务
    • 语言模型、动作序列预测:通常使用序列交叉熵,对每个时间步的 token/动作进行交叉熵损失求和或求平均。
    • 在 VLA 中,若动作被离散化为 token(参见第 8 章),也可以使用交叉熵学习“下一个动作 token”。
  • 生成与对抗学习
    • GAN 中的对抗损失、KL 散度、Wasserstein 距离等,用于度量生成分布与真实分布的差异。
    • 对于机器人世界模型(生成未来观测/状态),常见组合是 MSE + 感知损失等。
  • 几何与控制相关损失
    • 位姿误差:使用位置误差的 MSE + 姿态误差(如四元数距离)组合。
    • 轨迹平滑正则:对加速度、加加速度(jerk)的平方惩罚。
    • 碰撞惩罚:对发生碰撞的样本加上大损失,或在 RL 中赋予负奖励。

本书后续章节在具体任务中会分别介绍对应的损失设计;在本节的层级,我们只要意识到:损失函数就是把“我们想要的行为”翻译成一个可优化的数学目标

【图 2-4 占位】 \(\displaystyle a\) MSE 对预测值的曲线示意;\(\displaystyle b\) 交叉熵随预测正确类别概率变化的曲线示意,直观展示它们对误差的惩罚差异。


2.1.4 反向传播算法与链式法则

前面的所有内容——网络结构、激活函数、损失函数——最终都要通过反向传播(Backpropagation) 来连接:我们需要计算损失对每一个参数的梯度,从而用优化算法(如 SGD、Adam)更新参数。反向传播本质上就是把多元微积分里的链式法则,以系统化的方式应用到计算图上 。(深度学习导引)

2.1.4.1 链式法则

在 1.3 节中已经回顾过单变量和多变量的链式法则,这里结合神经网络做一个针对性的强化。

假设有复合函数:

\[ y = f(g(x)), \]

则对 \(\displaystyle x\) 的导数为

\[ \frac{\mathrm{d}y}{\mathrm{d}x} = f’(g(x)) \cdot g’(x). \]

推广到多维情况,如果

\[ \begin{aligned} u &= g(x_1, x_2, \dots, x_n), y &= f(u), \end{aligned} \]

则对某个输入 \((x_i)\) 的偏导数为

\[ \frac{\partial y}{\partial x_i} = \frac{\partial y}{\partial u} \cdot \frac{\partial u}{\partial x_i}. \]

在神经网络中,每一层的输出都是前一层输出的函数,整个网络就是大量函数的复合。因此,只要我们能写出每个小步骤的导数,就可以通过链式法则逐层把梯度传回去。


2.1.4.2 反向传播算法

考虑一个简单的两层网络:

\[ \begin{aligned} h &= \sigma(W_1 x + b_1), \hat{y} &= \phi(W_2 h + b_2), \mathcal{L} &= \ell(\hat{y}, y), \end{aligned} \]

目标是计算 \(\frac{\partial \mathcal{L}}{\partial W_1}, \frac{\partial \mathcal{L}}{\partial b_1}, \frac{\partial \mathcal{L}}{\partial W_2}, \frac{\partial \mathcal{L}}{\partial b_2}\)。

前向传播(forward pass)

  1. 从输入 \(x\) 出发,依次计算: \(z_1 = W_1 x + b_1,\ h = \sigma(z_1),\ z_2 = W_2 h + b_2,\ \hat{y} = \phi(z_2),\ \mathcal{L} = \ell(\hat{y}, y)\)。

反向传播(backward pass)

  1. 先计算损失对输出的梯度 \(\frac{\partial \mathcal{L}}{\partial \hat{y}} = \nabla_{\hat{y}} \ell(\hat{y}, y)\);

  2. 对输出层做链式法则:

    \[ \frac{\partial \mathcal{L}}{\partial z_2} = \frac{\partial \mathcal{L}}{\partial \hat{y}} \cdot \phi’(z_2), \]

    \[ \frac{\partial \mathcal{L}}{\partial W_2} = \frac{\partial \mathcal{L}}{\partial z_2} \cdot h^\top, \quad \frac{\partial \mathcal{L}}{\partial b_2} = \frac{\partial \mathcal{L}}{\partial z_2}. \]

  3. 把梯度“传回”隐藏层:

    \[ \frac{\partial \mathcal{L}}{\partial h} = W_2^\top \frac{\partial \mathcal{L}}{\partial z_2}. \]

  4. 对隐藏层做链式法则:

    \[ \frac{\partial \mathcal{L}}{\partial z_1} = \frac{\partial \mathcal{L}}{\partial h} \odot \sigma’(z_1), \]

    \[ \frac{\partial \mathcal{L}}{\partial W_1} = \frac{\partial \mathcal{L}}{\partial z_1} \cdot x^\top, \quad \frac{\partial \mathcal{L}}{\partial b_1} = \frac{\partial \mathcal{L}}{\partial z_1}. \]

其中 \(\odot\) 表示按元素乘。

这一过程可以抽象描述为:

  • 前向:从输入到输出,保存中间结果(如每一层的 \((z, h)\))。
  • 反向:从输出到输入,逐层应用链式法则,把 \(\partial \mathcal{L}/\partial(\text{当前变量})\) 传递给前一层,同时计算相应参数的梯度。

反向传播的核心思想在 20 世纪 80 年代已经提出,是现代深度学习训练的核心算法。更形式化地看,它是反向模式自动微分(reverse-mode automatic differentiation) 在神经网络上的一个具体实现。(cs.toronto.edu)

【图 2-5 占位】 以简单两层 MLP 为例,画出前向图与反向箭头:从输入开始向前计算,再从损失节点反向传播梯度到各层权重的示意图。


2.1.4.3 计算图与自动求导

手工推导复杂网络的梯度既繁琐又容易出错。现代深度学习框架(PyTorch、TensorFlow、JAX 等)普遍采用计算图(Computational Graph)+ 自动求导(Automatic Differentiation,Autograd) 机制,大幅简化了开发工作。(深度学习导引)

  1. 计算图

在前向计算时,框架会构建一个有向无环图(DAG):

  • 节点:变量或中间结果(张量);
  • 边:由某个算子(加法、矩阵乘法、激活函数等)连接输入与输出。

例如一个简单表达式:

\[ y = (x_1 \cdot x_2 + \sin x_1)^2 \]

即可被拆成若干节点:乘法、加法、sin、平方等。

  1. 自动求导(Autograd)

自动求导是一类算法族,目标是在计算图上高效、精确地实现链式法则 。(Medium)

  • 在前向传播阶段,框架记录每一步操作以及输入/输出;
  • 在调用 .backward()grad() 等接口时,框架从损失节点开始,沿计算图反向 遍历,逐个节点应用链式法则,自动得到所有需要的梯度;
  • 这一过程就是反向模式自动微分(reverse-mode AD),对“多参数、单输出”的场景(典型的神经网络训练)非常高效。
  1. 静态图 vs 动态图
  • 静态图(如早期 TensorFlow):先定义好计算图,再执行;优化空间大,但调试不直观。
  • 动态图(如 PyTorch):前向执行时即时构图,更接近命令式编程,易于调试与与 Python 生态结合。

无论哪种形式,对使用者来说,最重要的是理解:框架帮你做的是链式法则的机械应用,但你仍然需要明白梯度是什么、如何影响训练 。本节的理论理解会在后续你阅读复杂 VLA 模型代码(尤其是自定义算子、非标准损失)时发挥作用。

【图 2-6 占位】 简单计算图示例:以 \(y = (x_1 \cdot x_2 + \sin x_1)^2\) 为例,画出节点和有向边,并用另一幅图显示从 \(y\) 反向传播到 \((x_1, x_2)\) 的梯度流向。


到此为止,我们已经构建了深度学习中“最小工作单元”的全景: 结构 =(前馈网络) + 非线性(激活函数) + 目标(损失函数) + 训练机制(反向传播与自动求导)

在接下来的 2.2 和 2.3 节,我们将在此基础上讨论深层网络训练技巧、卷积与序列建模,并逐步走向 Transformer 与 VLA 的整体结构,为后面在机器人具身智能中的大规模模型应用做好准备。