我的知识记录

digSelf

从生物神经元到智能学习:深度解析神经网络的原理与反向传播

2025-06-10
从生物神经元到智能学习:深度解析神经网络的原理与反向传播

人工神经网络(ANNs)作为现代人工智能的核心,其灵感源于生物神经网络(BNNs),但本质上是对BNNs核心功能的高度抽象和数学化建模。本文深入探讨了这一抽象过程,详细阐述了生物神经元(如突触可塑性、全或无特性、频率编码)如何映射至人工神经元组件(如节点、可变权重、线性加权和与激活函数),并揭示了ANNs在信息编码上的“取巧”之处。文章追溯了从麦卡洛克-皮茨神经元到感知器,再到多层感知器与误差反向传播算法的演进历程,详细推导了反向传播作为高效梯度计算方法的数学原理。最终,本文旨在为读者构建一个清晰、严谨的神经网络运作机制图景,强调其功能性抽象在实现强大学习能力中的关键作用。

从生物神经网络到人工神经网络

生物神经网络(Biological Neural Networks)是人工神经网络(Artificial Neural Networks, ANNs)的根本灵感来源。ANNs 并非生物神经系统的精确复制,而是对其核心工作原理的高度抽象和数学化建模。这个过程经历了从简单的仿生模型到复杂计算架构的演进。

起源:生物神经元的核心启发

人工神经网络的起源可以追溯到对生物神经元基本工作机制的理解。一个典型的生物神经元包含以下关键要素:

  1. 细胞体(Soma):负责整合接收到的信号。
  2. 树突(Dendrites):接收来自其他神经元的电信号。
  3. 轴突(Axon):传递神经元自身的输出信号。
  4. 突触(Synapses):连接不同神经元,信号在此处传递,其强度可变。
  5. 突触强度(synaptic strength)的“可塑性”:神经细胞间相连之处,即突触连接强度能改变的特性
  6. 阈值(Threshold):神经元只有当接收到的信号强度总和超过某个阈值时,才会“点火”(fire)并传递信号。
  7. 全或无定律(All-or-None Law):一旦达到阈值,神经元会以其最大强度发放动作电位,而非部分发放。
  8. 兴奋性与抑制性连接:突触可以是兴奋性的(增强信号),也可以是抑制性的(减弱信号)。

生物神经网路

在生物神经网络中,细胞体通过树突接收来自外部其他神经元的信号(或信息),首先在细胞体中将信号整合。若整合后的信号强度超过某个阈值时,该细胞体则会产生一个动作电位(Action Potential)。

这个动作电位具有**“全或无”(All-or-None)的特性,即一旦产生,其幅值(强度)是基本固定的,不会因为超过阈值多少而改变。生物神经元编码信息强度的方式并非改变单个动作电位的幅值,而是通过动作电位的发放频率**:刺激越强,神经元在单位时间内发放的动作电位次数越多,从而传递更强的信号。

神经元的突触强度具有可塑性(Synaptic Plasticity),这是指神经细胞间相连之处,即突触,其连接强度能够改变的特性。突触可塑性被认为是生物学习和记忆功能的重要神经化学基础。例如,通过长时程增强(LTP),突触连接会变得更强,相同的前端信号会引起更大的后端响应;通过长时程抑制(LTD),突触连接会变得更弱。这种连接强度的持续变化,是生物学习和记忆的生理基础。

过程:从生物神经网络到人工神经网络的数学抽象

生物神经网络建模为人工神经网络,本质上是一个数学抽象和算法化的过程。它并非直接“翻译”生物组件,而是提取其功能性原理。

从生物部件到人工组件的映射

生物神经元的外部结构包含若干个组件,分别是:细胞体,树突、轴突和突触。对于这些部件,可以建模为如下形式:

  • 神经元(Cell Body)的抽象:在人工神经网络中,一个神经元被抽象为一个计算节点(圆圈),它负责接收、整合并处理信息;
  • 输入与树突(Dendrites)的抽象:来自其他神经元(或外部数据)的信号通过 **连接线段(边)**流入当前的神经元。这些汇聚的线段模拟了树突接收信息的功能;
  • 输出与轴突(Axon)的抽象:激活函数产生的**输出值(Activation Value)代表了该神经元当前处理后的信息。这个激活值随后会沿着发出的连接线段(模拟轴突)**传递给下一层神经元,作为它们的新输入。

核心功能与机制的抽象建模

在对生物神经元的外部结构进行建模后,我们进一步对其核心功能,特别是学习机制进行数学抽象。这主要包括对突触强度可塑性、信号整合、以及神经元激活决策的抽象,具体建模如下:

  • 突触(Synapses)与权重的抽象:每个传入的连接线段上都有一个权重(Weight)。这个权重是对生物突触**强度可变性(Synaptic Plasticity)**的建模。权重的值(可正可负,大小可变)决定了传入信号在整合过程中的重要性和影响程度。
  • 信号整合(Signal Integration)的抽象:神经元内部首先进行线性加权和的计算。这意味着它将所有传入的信号(每个输入神经元的激活值)乘以其对应的权重,并将这些加权后的值累加起来,再加上一个偏置项(Bias)。这模拟了细胞体对兴奋性和抑制性突触信号的累积整合
  • 决策与激活(Excitation Decision & Activation)的抽象:整合后的线性加权和随后通过一个激活函数(Activation Function)进行转换。这个激活函数模拟了生物神经元达到阈值后是否“点火”以及“点火”强度(频率)的决策过程。它将任意实数值的加权和映射到一个特定范围内的输出值(如​0​1,或​-1​1,或非负数)。
graph LR A((输入信号1)) B((输入信号2)) C((输入信号3)) A --> O1(("人工神经元")) B --> O1 C --> O1 O1 --> O2("激活函数") style A fill:#DCE9FF,stroke:#3366CC,stroke-width:2px,color:#333 style B fill:#DCE9FF,stroke:#3366CC,stroke-width:2px,color:#333 style C fill:#DCE9FF,stroke:#3366CC,stroke-width:2px,color:#333 style O1 fill:#DCFFDC,stroke:#33CC33,stroke-width:2px,color:#333

边的权重(Weights)精确地模拟了突触强度可变性,突触的可塑性可以类比为一个水池排水阀门。阀门的“开度”就是这个连接的权重。阀门开得越大(权重越大),从上一个水池(神经元)流过来的水流(信号)对当前水池(神经元)的影响就越大。人工神经网络的“学习”过程,就是调整这些权重(阀门开度)的过程,以优化信息流向和处理。

此外,人工神经网络中的激活函数将生物神经元的两个关键功能抽象地融合在了一个操作中:

  1. “是否激活(达到阈值)”:通过将低于某个阈值(或导致负净输入)的信号抑制(例如输出0或接近0),激活函数模拟了神经元的阈值特性。
  2. “向外输出的信号/信息的总大小(强度/频率)”:通过输出一个连续的数值,激活函数模拟了神经元在激活后的强度或频率编码。输出值越大,表示“信息总大小”越大。

人工神经网络在对生物神经元进行建模时,做出了一个**“取巧”的抽象决策**:

  • 没有直接模拟生物神经元复杂的动作电位产生和频率编码的动态过程
  • 而是直接将这个编码后的信息强度(即生物神经元以某种频率传递的信号大小)抽象为一个单一的、连续的数值(即激活值)。

原因是研究者们发现,在许多认知和计算任务中,真正重要的是信息传递的强度和模式,而不是实现这种强度的方式(是高频率的脉冲还是更大的电压值)。只要能有效地传递信号强度信息,具体的编码过程可以被抽象掉

需要注意的是:人工神经网络的建模是对生物神经网络的功能性抽象,而非物理层面的精确复制。激活函数扮演了核心角色,它接收来自神经元的整合信号(线性加权和),然后根据这个整合信号的强度,“决策”神经元是否应该“激活”(输出非零值),以及“激活的程度”(输出的激活值大小)。这个激活值,就统一地代表了生物神经元经过“全或无”放电后,以“特定频率”传递的“信号强度”,以及在突触间“累积释放的神经递质总量”的效果。

人工神经网络的历史演进

人工神经网络的历史演进,是其抽象程度和计算能力不断提升的过程。受到“全或无”开关特性的启发,最早的人工神经元模型,如麦卡洛克-皮茨(McCulloch-Pitts, MP)神经元(1943年),将神经元抽象为一个简单的逻辑门,只能输出0或1,此时的神经元不具备学习能力,如下图所示:

McCulloch-Pitts Neuron

具体的抽象过程如下:

  • 输入:来自其他神经元的信号,被抽象为二值输入​x_i \in \{0, 1\}
  • 权重:突触强度被抽象为权重​w_i,可以是正数(兴奋性)或负数(抑制性)。
  • 加权和:神经元整合信号的过程被抽象为输入的加权和​z = \sum_{i = 1}^n w_ix_i
  • 阈值激活:阈值放电机制被抽象为简单的阶跃函数,当加权和超过某个阈值​T时,输出​1(激发),否则输出​0(抑制)。

MP神经元可以实现基本的逻辑门(AND, OR, NOT),但由于在MP神经元中的权重的值是预先设置的,因此其不具备可学习性。

为了弥补MP神经元模型的不足(即无法学习权重)以及对生物学习(即突触可塑性)的渴望,对MP神经元加以改进,构建了感知器(Perceptron)模型,引入学习能力,如下示意图所示:

感知器模型

感知器模型的具体抽象过程如下:

  • 可学习的权重:权重​w_i和阈值​T(或等效地,偏置项​b=−T)不再是固定的,而是可以通过数据自动学习调整。
  • 线性加权和:仍然是​z = \sum_i w_i x_i + b
  • 阶跃激活函数:输出仍然是0或1的二值。
  • 学习算法:引入了感知器学习规则(Perceptron Learning Rule),通过迭代地调整权重来最小化分类错误。

由于感知器的激活函数仍然是二值阶跃函数,具体表示为:

y = \begin{cases} 1, &z \ge T \\ 0, &z < T \end{cases}

其分类边界

z = T = \sum_{i} w_i x_i + b

是一个超平面,代表其是一个线性分类器。 当数据是线性可分时,感知器模型表现良好。但是若数据是非线性可分时,感知器模型表现就比较差。因此,引入了多层结构以及非线性激活函数,具体示意图如下:

具体的抽象过程如下:

  • 多层结构:引入了隐藏层,允许网络学习更复杂的非线性特征。
  • 非线性激活函数:将硬阈值阶跃函数替换为连续可导的非线性激活函数,例如:
    • Sigmoid 函数(如 Logistic 函数):将神经元的净输入压缩到​(0,1)范围,模拟神经元的“激活程度”,可以解释为概率。
    • ReLU 函数:现代神经网络中最常用的激活函数,简单而高效。

由于有了多层结构,因此需要引入高效的算法来计算损失函数对每个权重的梯度,从而利用梯度下降法更新所有层的权重,这个方法也就是误差反向传播(Backpropagation),该方法模拟了某种形式的“学习信号”在网络中的反向传播。下表中总结了生物类比与人工神经网络的抽象

特性 生物神经网络 人工神经网络 (现代)
神经元 细胞体、树突、轴突 节点(Node/Unit)与连边
输入 树突接收的电信号 输入值​x_i
突触 神经元间的连接点,强度可变 边的权重​W_{ij}
信号整合 细胞体整合电位变化 输入加权和​\sum_{i} w_ix_i + b
阈值/放电 膜电位达到阈值发放动作电位 激活函数(如 Sigmoid, ReLU, SiLu)
输出 动作电位(全或无)或发放频率 激活值(通常连续浮点数,如​(0, 1)​[0, +\infty)
学习 突触可塑性 权重调整算法(如梯度下降、反向传播)
连接性质 兴奋性/抑制性 正权重/负权重

通过这种从生物学启发到数学抽象和算法实现的转化,人工神经网络成为了强大的机器学习工具,能够从数据中学习复杂的模式,并在分类、回归、图像识别、自然语言处理等广泛领域取得突破性进展。

误差反向传播(Backpropagation)方法

符号说明

为方便后续推导,现将所用到的符号进行定义与说明:

  • ​h(\cdot):表示的是非线性激活函数,例如 Sigmoid函数

  • ​W_{ji}^{(l)}:表示的是​l层的前一层第​j个节点到第​l层的第​i个节点输入(即边)的权重

  • ​a^{(l)}_{i}:表示的是第​l层的第​i个节点的线性加权值,即:

    a_i^{(l)} = \sum_{j}W_{ji}^{(l)} x_{j}^{(l-1)}
  • ​x_i^{(l)}:表示的是第​l层的第​i个神经元节点的输出,即:

    x_i^{(l)} = h(a_i^{(l)})
  • ​\mathcal L(X, \pmb y):表示的是损失函数,为负对数似然。若为回归问题,则​\mathcal L( X, \pmb y)表示的是MSE;若为分类问题,则​\mathcal L(X, \pmb y)表示的是交叉熵损失。

此外,在回归问题中,神经网络的最后一层为线性层;若为分类问题(特指多分类),则在最后一层线性层输出的 Logits 基础上,增加 Softmax 激活函数,将其转换为表示各类别概率的分布。最终的分类决策(选择概率最大的类别)通常通过 argmax 函数实现。本文中的后续推导,将遵循本节中的定义和符号说明。

神经网络的前向传播(Forward Propagation)

神经网络的前向传播其实指的就是从输入到神经网络给出输出的计算过程,下图是一个二分类任务的前向传播计算示意图:

graph TD subgraph 输入层 X1[x₁] X2[x₂] end subgraph 隐藏层 direction LR A1("a₁ = W₁₁x₁ + W₂₁x₂ + b₁") --> H1("h₁ = g(a₁)") A2("a₂ = W₁₂x₁ + W₂₂x₂ + b₂") --> H2("h₂ = g(a₂)") end subgraph 输出层 Y_hat("ŷ = W₁h₁ + W₂h₂ + b₃") --> Output("ŷ = g(ŷ)") end X1 -- W₁₁ --> A1 X2 -- W₂₁ --> A1 X1 -- W₁₂ --> A2 X2 -- W₂₂ --> A2 H1 -- W₁ --> Y_hat H2 -- W₂ --> Y_hat style X1 fill:#DCE9FF,stroke:#3366CC,stroke-width:2px,color:#333 style X2 fill:#DCE9FF,stroke:#3366CC,stroke-width:2px,color:#333 style A1 fill:#F0FFF0,stroke:#66CC66,stroke-width:2px,color:#333 style A2 fill:#F0FFF0,stroke:#66CC66,stroke-width:2px,color:#333 style H1 fill:#FFDCE9,stroke:#CC3366,stroke-width:2px,color:#333 style H2 fill:#FFDCE9,stroke:#CC3366,stroke-width:2px,color:#333 style Y_hat fill:#F0FFF0,stroke:#66CC66,stroke-width:2px,color:#333 style Output fill:#C2E0FF,stroke:#3399FF,stroke-width:2px,color:#333

首先,输入层将数据输入神经网络。神经网络接受到外部输入的数据后,逐层向前计算线性的信息整合以及非线性的激活函数。假设​\pmb a^{(l)}为向量化的第​l 层的线性加权和,​\pmb x^{l}为第​l层的非线性激活值,​W^{(l)}为第​l层的权重矩阵,则前向传播可以表示为如下递推函数:

\begin{align*} \pmb a^{(l+1)} &= W^{(l+1)}\pmb x^{(l)} + \pmb b^{(l+1)} \\ \pmb x^{(l+1)} &= h(\pmb a^{(l + 1)}) \end{align*}

不断迭代即可获得最后的神经网络输出值,这就是神经网络的前向传播过程。

神经网络误差的反向传播(Back Propagation)

人工神经网络可以视为由各层权重所构成的参数所决定的函数,通过在给定观测数据集​\mathcal D上学习最优的参数值,使得该神经网络能在已知数据和未知数据上获得最优的表现。当人工神经网络中所采用的激活函数是光滑的,则可以采用梯度下降法来计算各个参数的参数值。若采用差分法来计算各个神经元的梯度,其时间复杂度为平方级,这使得在规模较大的神经网络上计算梯度在时间上变的不可承受。因此,需要一个高效的方法来计算各个神经元的梯度。

假设神经网络中的激活函数为sigmoid函数,根据符号定义一节可知:

h(z) = \frac{1}{1 + \exp(-z)}

当采用梯度下降法时,想要寻找的是能够使得损失函数变小的方向。而梯度的各个分量就是各个方向的偏导数,在神经网络中,即为:​\frac{\partial \mathcal L}{\partial W^{(l)}_{ji}}。此外,最终的目标不仅仅是能够计算出该值,还要能够高效的求解。因此,可采用迭代的方式以线性时间复杂度计算。为此,需寻找计算各参数的递推公式

由于损失函数​\mathcal L是关于各层参数​\pmb W的附和函数,因此采用链式法则将​\frac{\partial \mathcal L}{\partial a_i^{(l)}}表示出来。链式法则追踪变量间的直接依赖关系。为了正确计算该式,可以先将链路分解出来,损失​\mathcal L受到权重​W^{(l)}_{ji}影响的完整链条如下:

W^{(l)}_{ji} \overset{\text{直接线性关系}}{\longrightarrow} a^{(l)}_i \overset{\text{通过激活函数}}{\longrightarrow} x^{(l)}_i \overset{\text{通过后续层}}{\longrightarrow} \cdots \overset{\text{通过后续层}}{\longrightarrow} \mathcal L

因此可以将其表示为下式:

\begin{align*} \frac{\partial \mathcal L}{\partial W^{(l)}_{ji}} &= \frac{\partial \mathcal L}{\partial a^{(l)}_{i}} \cdot \frac{\partial a^{(l)}_{i}}{\partial W^{(l)}_{ji}} \end{align*}

记等式第一项为​\delta_i^{(l)},即:

\delta_i^{(l)} \doteq \frac{\partial \mathcal L}{\partial a^{(l)}_{i}}

该项被称作误差信号Delta项,它表示损失函数对当前神经元线性加权和的敏感度。该项的计算相对比较麻烦,因此可以先对第二项进行计算。展开等式右侧第二项,有:

\begin{align*} \frac{\partial \mathcal a^{(l)}_i}{\partial W_{ji}^{(l)}} &= \frac{\partial}{\partial W_{ji}^{(l)}}\left[\sum_j W_{ji}^{(l)} x_{j}^{(l-1)}\right] \\ &= x^{(l - 1)}_{j} \end{align*}

而这一项可以通过前向传播得到。由于目标是获得一个递推公式,因此需要造出一个与​\Delta w^{(l)}_{ji}相关的误差项。考察第​l层和​l+1层的关系,其传导链路图可以表示为:

W^{(l)}_{ji} \overset{\text{直接线性关系}}{\longrightarrow}a^{(l)}_i \overset{\text{通过激活函数}}{\longrightarrow} x^{(l)}_i \overset{通过l+1层}{\longrightarrow} \cdots \overset{\text{通过后续层}}{\longrightarrow} \mathcal L

因此,可对​\delta W^{(l)}_{ji}进行恒等变换,有:

\begin{align*} \delta_i^{(l)} &= \frac{\partial \mathcal L}{\partial a^{(l)}_{i}} \\ &= \sum_{k = 1}^{N_{l + 1}} \frac{\partial \mathcal L}{\partial a_k^{(l + 1)}} \cdot \frac{\partial a_k^{(l + 1)}}{\partial x_i^{(l)}} \cdot \frac{\partial x^{(l)}_i}{\partial a_i^{(l)}}\\ &= h'(a_i^{(l)}) \sum_{k = 1}^{N_{l + 1}} \frac{\partial \mathcal L}{\partial a_k^{(l + 1)}} \cdot W^{(l+1)}_{ik} \\ &= h'(a_i^{(l)}) \sum_{k = 1}^{N_{l + 1}} \delta_k^{(l + 1)} \cdot W^{(l+1)}_{ik} \end{align*}

其中​N_{l + 1}表示的是第​l+1层的神经元节点数量。由于反向传播时,其先有损失函数到输出层,因此在传播到第​l层时,第​l+1层的误差​\delta_k^{(l + 1)}是已知的,因此可以直接利用​l+1层的误差计算第​l层各个神经元节点的误差,进而获得对​l层各个参数的偏导数,具体公式如下:

\begin{align*} \frac{\partial \mathcal L}{\partial W^{(l)}_{ji}} &= \frac{\partial \mathcal L}{\partial a^{(l)}_{i}} \cdot \frac{\partial a^{(l)}_{i}}{\partial W^{(l)}_{ji}}\\ &= \left[ h'(a_i^{(l)}) \sum_{k = 1}^{N_{l + 1}} \delta_k^{(l + 1)} \cdot W^{(l+1)}_{ik} \right] \cdot x^{(l - 1)}_{j} \end{align*}

根据上述递推公式,可以看到,其实其相当于是从损失函数,由后向前,逐步迭代结算,即相当于从后向前逐步传播,因此称为反向传播。

  • 1