全连接神经网络与激活函数
2.1 全连接神经网络整体结构
全连接神经网络(Fully Connected Neural Network,FCNN)的结构通常包含输入层、隐藏层和输出层:
- 输入层:负责接收原始数据(如特征向量、图像展平后的向量等)。
- 隐藏层:介于输入层与输出层之间的多层结构,层数和每层神经元数量可根据任务复杂度灵活设计。
- 输出层:根据任务类型(分类、回归等)输出结果(如分类任务用softmax输出类别概率,回归任务直接输出连续值)。
层与层之间的神经元是“全连接”的——即上一层的每个神经元都与下一层的所有神经元存在连接,连接上带有可学习的权重。
2.2 全连接神经网络的单元结构
全连接网络的基本单元是神经元(Neuron),单个神经元的运算分为两步:
- 线性组合:对输入信号进行加权求和并加偏置,公式为:
 $[ z = \sum_{i} w_i x_i + b ]$
 其中 $( x_i )$ 是输入信号,$( w_i )$ 是输入对应的权重,$( b )$ 是偏置项。
- 非线性激活:将线性组合的结果 $( 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. 前向传播关键注意事项
- 维度匹配是核心:必须确保$W^{[l]}$、$A^{[l-1]}$、$b^{[l]}$的维度满足矩阵运算规则(参考第2节表格),否则会报错。
- 激活函数的选择:- 隐藏层:常用ReLU(解决梯度消失)、Leaky ReLU;
- 输出层:二分类用Sigmoid,多分类用Softmax,回归任务用线性激活(无激活)。
 
- 广播机制:批量计算中,偏置$b^{[l]}$(维度$(n_l,1)$)会自动广播为$(n_l, m)$,无需手动扩展。
- 计算顺序固定:严格从输入层→隐藏层→输出层逐层计算,不可跨层跳跃(每一层的激活值依赖前一层)。
总结
前向传播的本质是“逐层线性变换+非线性激活”的迭代过程:
- 输入层接收数据$a^{[0]}$;
- 对每一层$l$(从1到L):- 计算线性组合$z^{[l]} = W^{[l]}a^{[l-1]} + b^{[l]}$;
- 计算激活值$a^{[l]} = \sigma(z^{[l]})$;
 
- 输出层$a^{[L]}$即为预测结果。
这一过程是神经网络“预测”的基础,而反向传播则是通过计算$a^{[L]}$与真实标签的误差,反向更新$W^{[l]}$和$b^{[l]}$,最终提升模型精度。
梯度下降法

 
       
     
        