Pytorch框架与经典卷积神经网络
Published in:2025-09-03 | category: Pytorch
Words: 3k | Reading time: 12min | reading:

全连接神经网络与激活函数

2.1 全连接神经网络整体结构

全连接神经网络(Fully Connected Neural Network,FCNN)的结构通常包含输入层隐藏层输出层

  • 输入层:负责接收原始数据(如特征向量、图像展平后的向量等)。
  • 隐藏层:介于输入层与输出层之间的多层结构,层数和每层神经元数量可根据任务复杂度灵活设计。
  • 输出层:根据任务类型(分类、回归等)输出结果(如分类任务用softmax输出类别概率,回归任务直接输出连续值)。

层与层之间的神经元是“全连接”的——即上一层的每个神经元都与下一层的所有神经元存在连接,连接上带有可学习的权重。

2.2 全连接神经网络的单元结构

全连接网络的基本单元是神经元(Neuron),单个神经元的运算分为两步:

  1. 线性组合:对输入信号进行加权求和并加偏置,公式为:
    $[ z = \sum_{i} w_i x_i + b ]$
    其中 $( x_i )$ 是输入信号,$( w_i )$ 是输入对应的权重,$( b )$ 是偏置项。
  2. 非线性激活:将线性组合的结果 $( z )$ 输入激活函数,得到神经元的输出 $( a = f(z) )$,该输出会传递到下一层神经元。

2.3 为什么要加入非线性激活函数

若神经网络中没有非线性激活函数,无论有多少层隐藏层,整个网络的输出都只是输入的线性组合(线性操作的叠加仍为线性操作)。

但现实中大量任务(如图像分类、复杂函数拟合)具有非线性规律,线性模型的表达能力无法满足需求。而非线性激活函数能让神经网络学习并表示复杂的非线性关系,从而拟合各类复杂任务的模式。

2.4 sigmoid激活函数

sigmoid函数的数学表达式为:
$[ f(z) = \frac{1}{1 + e^{-z}} ]$

特点:

  • 输出范围为 $( (0, 1) )$,可模拟“概率”或用于二分类任务的输出层。
  • 输出平滑连续,便于求导(支持反向传播训练)。
  • 存在梯度消失问题:当 $( z )$ 过大或过小时,函数导数趋近于0,导致深层网络的梯度难以传递到浅层,训练困难。
  • 输出非“零中心化”(均值接近0.5),易使后续层输入偏向,影响训练效率。

2.5 Tanh激活函数

Tanh(双曲正切)函数的数学表达式为:
$[ f(z) = \tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}} ]$

特点:

  • 输出范围为 $( (-1, 1) )$,是sigmoid的“零中心化”版本,使后续层输入更对称,训练更稳定。
  • 仍存在梯度消失问题:当 $( |z| )$ 过大时,导数趋近于0,深层网络训练仍受限制。
  • 计算复杂度略高于sigmoid(涉及更多指数运算)。

2.6 ReLU激活函数

ReLU(Rectified Linear Unit,修正线性单元)的数学表达式为:
$[ f(z) = \max(0, z) ]$

特点:

  • 缓解梯度消失:当 $( z > 0 )$ 时,导数为1,梯度可高效传递,非常适合深层神经网络(如CNN、深层FCNN)。
  • 计算极简单(只需比较大小),训练和推理速度快。
  • 存在“死亡ReLU”问题:若输入长期为负,ReLU神经元会“死亡”(输出恒为0,且梯度为0,无法更新参数),导致部分神经元失效。

2.7 Leaky ReLU激活函数

Leaky ReLU是ReLU的改进版,数学表达式为:
$[ f(z) = \begin{cases}
z, & z \geq 0 \
\alpha z, & z < 0
\end{cases} ]$
其中 $( \alpha )$ 是小正数(通常取0.01左右)。

特点:

  • 保留ReLU的优势(计算简单、缓解梯度消失)。
  • 解决“死亡ReLU”问题:当 $( z < 0 )$ 时,仍有小梯度 $( \alpha )$,使神经元在输入为负时也能更新参数,避免完全“死亡”。
  • 需调整超参数 $( \alpha )$,不同任务可能需要不同取值。

神经网络前向传播(Forward Propagation):具体计算过程

1. 前向传播核心概念

前向传播是神经网络从输入层接收数据,通过隐藏层逐层计算神经元激活值,最终传递到输出层生成预测结果的过程。它是神经网络“做出预测”的核心流程,也是后续反向传播(参数优化)的基础。

本质上,前向传播是线性组合(加权和)+ 非线性激活的迭代计算:每一层的输出都依赖于上一层的输出,通过权重(连接强度)和偏置(偏移量)调整,再经激活函数引入非线性,最终拟合复杂数据规律。

2. 前向传播的核心组成元素

在计算前,需明确神经网络的关键组件及其定义(以下以上标[l]表示“第l层”,如[1]表示第1隐藏层,[L]表示输出层):

组件 符号 定义与作用 维度规则(假设前一层有$n_{l-1}$个神经元,当前层有$n_l$个神经元)
输入层数据 $a^{[0]}$ 原始输入(如图片像素、特征向量),即第0层的激活值 $(n_0, 1)$,$n_0$为输入特征数,1表示单个样本(列向量)
权重矩阵 $W^{[l]}$ 连接“前一层神经元”与“当前层神经元”的参数,值越大表示连接强度越强 $(n_l, n_{l-1})$,行=当前层神经元数,列=前一层神经元数
偏置向量 $b^{[l]}$ 当前层每个神经元的偏移量,用于调整线性组合的基线(避免仅依赖输入) $(n_l, 1)$,与当前层神经元数一致
线性组合(加权和) $z^{[l]}$ 当前层神经元的“原始输入”,由前一层激活值、权重、偏置计算得到:$z^{[l]} = W^{[l]}a^{[l-1]} + b^{[l]}$ $(n_l, 1)$,与当前层神经元数一致
激活函数 $\sigma(\cdot)$ 对$z^{[l]}$进行非线性变换,让神经网络能拟合非线性关系(如ReLU、Sigmoid、Softmax) 输入输出维度相同:$(n_l, 1) \to (n_l, 1)$
激活值(层输出) $a^{[l]}$ 当前层的最终输出,作为下一层的输入:$a^{[l]} = \sigma(z^{[l]})$ $(n_l, 1)$,与当前层神经元数一致

3. 前向传播具体计算步骤(以“三层网络”为例)

为了清晰展示计算过程,我们以一个简单三层神经网络为实例:

  • 输入层($[0]$层):2个神经元($n_0=2$,输入特征$x_1, x_2$)
  • 隐藏层($[1]$层):3个神经元($n_1=3$),激活函数用ReLU($\sigma(z)=\max(0,z)$)
  • 输出层($[2]$层):1个神经元($n_2=1$),激活函数用Sigmoid($\sigma(z)=\frac{1}{1+e^{-z}}$,适用于二分类)

步骤1:定义已知参数与输入

假设输入数据、权重、偏置如下(实际中权重/偏置由初始化生成,后续通过反向传播优化):

  • 输入层激活值(原始输入):$a^{[0]} = \begin{bmatrix} x_1 \ x_2 \end{bmatrix} = \begin{bmatrix} 1 \ 2 \end{bmatrix}$
  • 隐藏层权重矩阵:$W^{[1]} = \begin{bmatrix} 0.1 & 0.2 \ 0.3 & 0.4 \ 0.5 & 0.6 \end{bmatrix}$(3行2列,对应3个隐藏神经元×2个输入神经元)
  • 隐藏层偏置向量:$b^{[1]} = \begin{bmatrix} 0.1 \ 0.2 \ 0.3 \end{bmatrix}$(3行1列,对应3个隐藏神经元)
  • 输出层权重矩阵:$W^{[2]} = \begin{bmatrix} 0.7 & 0.8 & 0.9 \end{bmatrix}$(1行3列,对应1个输出神经元×3个隐藏神经元)
  • 输出层偏置向量:$b^{[2]} = \begin{bmatrix} 0.4 \end{bmatrix}$(1行1列,对应1个输出神经元)

步骤2:计算隐藏层($[1]$层)的激活值$a^{[1]}$

隐藏层的计算分两步:**先算线性组合$z^{[1]}$,再算激活值$a^{[1]}$**。

2.1 计算隐藏层线性组合$z^{[1]}$

根据公式 $z^{[1]} = W^{[1]}a^{[0]} + b^{[1]}$,代入参数计算:

  • 第一步:矩阵乘法$W^{[1]}a^{[0]}$
    $W^{[1]}a^{[0]} = \begin{bmatrix} 0.1 & 0.2 \ 0.3 & 0.4 \ 0.5 & 0.6 \end{bmatrix} \times \begin{bmatrix} 1 \ 2 \end{bmatrix} = \begin{bmatrix} 0.1×1 + 0.2×2 \ 0.3×1 + 0.4×2 \ 0.5×1 + 0.6×2 \end{bmatrix} = \begin{bmatrix} 0.5 \ 1.1 \ 1.7 \end{bmatrix}$

  • 第二步:加偏置$b^{[1]}$
    $z^{[1]} = \begin{bmatrix} 0.5 \ 1.1 \ 1.7 \end{bmatrix} + \begin{bmatrix} 0.1 \ 0.2 \ 0.3 \end{bmatrix} = \begin{bmatrix} 0.6 \ 1.3 \ 2.0 \end{bmatrix}$

2.2 计算隐藏层激活值$a^{[1]}$

用ReLU激活函数($\sigma(z)=\max(0,z)$)对$z^{[1]}$逐元素处理:
$a^{[1]} = \sigma(z^{[1]}) = \begin{bmatrix} \max(0,0.6) \ \max(0,1.3) \ \max(0,2.0) \end{bmatrix} = \begin{bmatrix} 0.6 \ 1.3 \ 2.0 \end{bmatrix}$

此时,$a^{[1]}$将作为输出层的输入

步骤3:计算输出层($[2]$层)的激活值$a^{[2]}$

输出层计算逻辑与隐藏层一致,仅激活函数换为Sigmoid。

3.1 计算输出层线性组合$z^{[2]}$

根据公式 $z^{[2]} = W^{[2]}a^{[1]} + b^{[2]}$,代入参数计算:

  • 第一步:矩阵乘法$W^{[2]}a^{[1]}$
    $W^{[2]}a^{[1]} = \begin{bmatrix} 0.7 & 0.8 & 0.9 \end{bmatrix} \times \begin{bmatrix} 0.6 \ 1.3 \ 2.0 \end{bmatrix} = 0.7×0.6 + 0.8×1.3 + 0.9×2.0 = 0.42 + 1.04 + 1.8 = 3.26$

  • 第二步:加偏置$b^{[2]}$
    $z^{[2]} = 3.26 + 0.4 = 3.66$

3.2 计算输出层激活值$a^{[2]}$

用Sigmoid激活函数($\sigma(z)=\frac{1}{1+e^{-z}}$)处理$z^{[2]}$:
$a^{[2]} = \sigma(3.66) = \frac{1}{1+e^{-3.66}} \approx \frac{1}{1+0.025} \approx 0.976$

步骤4:输出结果解读

输出层激活值$a^{[2]} \approx 0.976$是神经网络的最终预测结果。由于使用了Sigmoid函数,结果落在$[0,1]$区间,可解释为“样本属于正类的概率为97.6%”(二分类任务)。

4. 批量数据的前向传播(拓展)

上述实例是单个样本的计算(输入$a^{[0]}$为列向量),实际训练中通常用批量样本(Mini-batch) 提高效率,此时输入变为矩阵(每一列对应一个样本):

  • 假设批量大小为$m$(如$m=100$),输入矩阵$A^{[0]} = [a^{0}, a^{0}, …, a^{0}]$,维度为$(n_0, m)$
  • 线性组合公式调整为:$Z^{[l]} = W^{[l]}A^{[l-1]} + b^{[l]}$(偏置$b^{[l]}$会通过“广播机制”自动扩展为$(n_l, m)$)
  • 激活值公式调整为:$A^{[l]} = \sigma(Z^{[l]})$,维度为$(n_l, m)$

例如,若$m=2$,输入$A^{[0]} = \begin{bmatrix} 1 & 0.5 \ 2 & 1.5 \end{bmatrix}$(2个样本),则隐藏层$Z^{[1]} = W^{[1]}A^{[0]} + b^{[1]}$的维度为$(3,2)$,最终输出$A^{[2]}$维度为$(1,2)$(2个样本的预测概率)。

5. 前向传播关键注意事项

  1. 维度匹配是核心:必须确保$W^{[l]}$、$A^{[l-1]}$、$b^{[l]}$的维度满足矩阵运算规则(参考第2节表格),否则会报错。
  2. 激活函数的选择
    • 隐藏层:常用ReLU(解决梯度消失)、Leaky ReLU;
    • 输出层:二分类用Sigmoid,多分类用Softmax,回归任务用线性激活(无激活)。
  3. 广播机制:批量计算中,偏置$b^{[l]}$(维度$(n_l,1)$)会自动广播为$(n_l, m)$,无需手动扩展。
  4. 计算顺序固定:严格从输入层→隐藏层→输出层逐层计算,不可跨层跳跃(每一层的激活值依赖前一层)。

总结

前向传播的本质是“逐层线性变换+非线性激活”的迭代过程:

  1. 输入层接收数据$a^{[0]}$;
  2. 对每一层$l$(从1到L):
    • 计算线性组合$z^{[l]} = W^{[l]}a^{[l-1]} + b^{[l]}$;
    • 计算激活值$a^{[l]} = \sigma(z^{[l]})$;
  3. 输出层$a^{[L]}$即为预测结果。

这一过程是神经网络“预测”的基础,而反向传播则是通过计算$a^{[L]}$与真实标签的误差,反向更新$W^{[l]}$和$b^{[l]}$,最终提升模型精度。

梯度下降法

Next:
【自动驾驶】局部路径规划-曲线插值法