神经网络二分类任务详解:前向传播与反向传播的数学计算
1. 引言
神经网络是深度学习的基础模型,在二分类任务中表现出色。本文将详细分析一个具体神经网络实例的前向传播、反向传播和参数更新过程,通过完整的数学计算展示神经网络的工作原理。二分类任务是神经网络最基础的应用之一,目标是让模型能够将输入数据划分为两个类别(如0和1)。我们将使用包含一个隐藏层的简单网络结构,其中隐藏层使用ReLU激活函数,输出层使用Sigmoid激活函数,损失函数采用均方误差。
本文将逐步演示如何计算神经网络的输出,然后通过反向传播算法计算梯度并更新权重参数。通过比较参数更新前后的损失值,我们可以直观地看到神经网络的学习过程。这种从理论到实践的分析方法,有助于读者深入理解神经网络的核心机制。
2. 神经网络结构与前向传播
2.1 网络架构与参数初始化
我们使用的神经网络结构如下:
- 输入层:2个神经元(对应特征值[0.8, 0.5])
- 隐藏层:3个神经元(神经元3、4、5)
- 输出层:1个神经元(神经元6)
权重和偏置参数初始值为:
- 神经元3:权重[0.5, 0.2],偏置0.2
- 神经元4:权重[0.8, 0.4],偏置0.1
- 神经元5:权重[0.5, 0.6],偏置0.2
- 神经元6:权重[0.3, 0.6, 0.5],偏置0.2
下面是初始神经网络的结构图:
w13=0.5 w14=0.8 w15=0.5 w23=0.2 w24=0.4 w25=0.6 w36=0.3 w46=0.6 w56=0.5 输入1: 0.8 神经元3偏置=0.2 神经元4偏置=0.1 神经元5偏置=0.2 输入2: 0.5 神经元6偏置=0.2
2.2 前向传播计算过程
前向传播是数据从输入层流向输出层的过程,每一层都会进行加权求和和激活函数变换。
隐藏层计算(使用ReLU激活函数):
神经元3的计算:
\\begin{aligned} z_3 \&= w_{13}x_1 + w_{23}x_2 + b_3 = 0.5 \\times 0.8 + 0.2 \\times 0.5 + 0.2 = 0.4 + 0.1 + 0.2 = 0.7 \\ a_3 \&= \\text{ReLU}(z_3) = \\max(0, 0.7) = 0.7 \\end{aligned}
神经元4的计算:
\\begin{aligned} z_4 \&= w_{14}x_1 + w_{24}x_2 + b_4 = 0.8 \\times 0.8 + 0.4 \\times 0.5 + 0.1 = 0.64 + 0.2 + 0.1 = 0.94 \\ a_4 \&= \\text{ReLU}(z_4) = 0.94 \\end{aligned}
神经元5的计算:
\\begin{aligned} z_5 \&= w_{15}x_1 + w_{25}x_2 + b_5 = 0.5 \\times 0.8 + 0.6 \\times 0.5 + 0.2 = 0.4 + 0.3 + 0.2 = 0.9 \\ a_5 \&= \\text{ReLU}(z_5) = 0.9 \\end{aligned}
输出层计算(使用Sigmoid激活函数) :
\\begin{aligned} z_6 \&= w_{36}a_3 + w_{46}a_4 + w_{56}a_5 + b_6 = 0.3 \\times 0.7 + 0.6 \\times 0.94 + 0.5 \\times 0.9 + 0.2 \\ \&= 0.21 + 0.564 + 0.45 + 0.2 = 1.424 \\ a_6 \&= \\sigma(z_6) = \\frac{1}{1 + e\^{-1.424}} \\approx \\frac{1}{1 + 0.2407} \\approx 0.806 \\end{aligned}
损失函数计算(均方误差) :
真实标签y=1,预测值a₆≈0.806
L = \\frac{1}{2} (y - a_6)\^2 = \\frac{1}{2} (1 - 0.806)\^2 = \\frac{1}{2} \\times (0.194)\^2 \\approx 0.018818
3. 反向传播与参数更新
3.1 反向传播原理
反向传播算法是神经网络训练的核心,通过链式法则计算损失函数对每个参数的梯度。基本思想是先将误差从输出层向隐藏层传播,然后根据梯度下降算法更新权重和偏置参数。学习率η控制参数更新的步长,这里设为0.1。
3.2 梯度计算过程
输出层误差计算 :
\\begin{aligned} \\frac{\\partial L}{\\partial a_6} \&= a_6 - y = 0.806 - 1 = -0.194 \\ \\frac{\\partial a_6}{\\partial z_6} \&= a_6(1 - a_6) = 0.806 \\times (1 - 0.806) = 0.806 \\times 0.194 \\approx 0.156364 \\ \\delta_6 \&= \\frac{\\partial L}{\\partial z_6} = \\frac{\\partial L}{\\partial a_6} \\cdot \\frac{\\partial a_6}{\\partial z_6} = (-0.194) \\times 0.156364 \\approx -0.03034 \\end{aligned}
隐藏层误差计算(ReLU导数为分段函数) :
\\begin{aligned} \\delta_3 \&= \\delta_6 \\cdot w_{36} \\cdot \\text{ReLU}'(z_3) = (-0.03034) \\times 0.3 \\times 1 \\approx -0.009102 \\ \\delta_4 \&= \\delta_6 \\cdot w_{46} \\cdot \\text{ReLU}'(z_4) = (-0.03034) \\times 0.6 \\times 1 \\approx -0.018204 \\ \\delta_5 \&= \\delta_6 \\cdot w_{56} \\cdot \\text{ReLU}'(z_5) = (-0.03034) \\times 0.5 \\times 1 \\approx -0.01517 \\end{aligned}
参数梯度计算:
输出层权重和偏置梯度:
\\begin{aligned} \\frac{\\partial L}{\\partial w_{36}} \&= \\delta_6 \\cdot a_3 \\approx (-0.03034) \\times 0.7 = -0.021238 \\ \\frac{\\partial L}{\\partial w_{46}} \&= \\delta_6 \\cdot a_4 \\approx (-0.03034) \\times 0.94 = -0.028520 \\ \\frac{\\partial L}{\\partial w_{56}} \&= \\delta_6 \\cdot a_5 \\approx (-0.03034) \\times 0.9 = -0.027306 \\ \\frac{\\partial L}{\\partial b_6} \&= \\delta_6 \\approx -0.03034 \\end{aligned}
隐藏层权重和偏置梯度(以神经元3为例):
\\begin{aligned} \\frac{\\partial L}{\\partial w_{13}} \&= \\delta_3 \\cdot x_1 \\approx (-0.009102) \\times 0.8 = -0.007282 \\ \\frac{\\partial L}{\\partial w_{23}} \&= \\delta_3 \\cdot x_2 \\approx (-0.009102) \\times 0.5 = -0.004551 \\ \\frac{\\partial L}{\\partial b_3} \&= \\delta_3 \\approx -0.009102 \\end{aligned}
3.3 参数更新
根据梯度下降算法,参数更新公式为:新参数=原参数-学习率×梯度。
输出层参数更新 :
\\begin{aligned} w_{36}\^{\\text{new}} \&= 0.3 - 0.1 \\times (-0.021238) \\approx 0.302124 \\ w_{46}\^{\\text{new}} \&= 0.6 - 0.1 \\times (-0.028520) \\approx 0.602852 \\ w_{56}\^{\\text{new}} \&= 0.5 - 0.1 \\times (-0.027306) \\approx 0.502731 \\ b_6\^{\\text{new}} \&= 0.2 - 0.1 \\times (-0.03034) \\approx 0.203034 \\end{aligned}
隐藏层参数更新(神经元3) :
\\begin{aligned} w_{13}\^{\\text{new}} \&= 0.5 - 0.1 \\times (-0.007282) \\approx 0.500728 \\ w_{23}\^{\\text{new}} \&= 0.2 - 0.1 \\times (-0.004551) \\approx 0.200455 \\ b_3\^{\\text{new}} \&= 0.2 - 0.1 \\times (-0.009102) \\approx 0.200910 \\end{aligned}
其他参数更新类似,全部更新后的参数如下表所示:
参数 | 原始值 | 更新后值 |
---|---|---|
( w_{13} ) | 0.5 | 0.500728 |
( w_{23} ) | 0.2 | 0.200455 |
( b_3 ) | 0.2 | 0.200910 |
( w_{14} ) | 0.8 | 0.801456 |
( w_{24} ) | 0.4 | 0.400910 |
( b_4 ) | 0.1 | 0.101820 |
( w_{15} ) | 0.5 | 0.501214 |
( w_{25} ) | 0.6 | 0.600759 |
( b_5 ) | 0.2 | 0.201517 |
( w_{36} ) | 0.3 | 0.302124 |
( w_{46} ) | 0.6 | 0.602852 |
( w_{56} ) | 0.5 | 0.502731 |
( b_6 ) | 0.2 | 0.203034 |
4. 更新后的网络结构与验证
4.1 更新后的网络结构
参数更新后,神经网络的结构图如下(权重四舍五入到小数点后6位):
4.2 更新后前向传播验证
使用更新后的权重重新计算输出和损失:
隐藏层输出 :
\\begin{aligned} a_3 \&= \\text{ReLU}(0.500728 \\times 0.8 + 0.200455 \\times 0.5 + 0.200910) \\approx \\text{ReLU}(0.70172) = 0.70172 \\ a_4 \&= \\text{ReLU}(0.801456 \\times 0.8 + 0.400910 \\times 0.5 + 0.101820) \\approx \\text{ReLU}(0.94344) = 0.94344 \\ a_5 \&= \\text{ReLU}(0.501214 \\times 0.8 + 0.600759 \\times 0.5 + 0.201517) \\approx \\text{ReLU}(0.90287) = 0.90287 \\end{aligned}
输出层输出 :
\\begin{aligned} z_6 \&\\approx 0.302124 \\times 0.70172 + 0.602852 \\times 0.94344 + 0.502731 \\times 0.90287 + 0.203034 \\ \&\\approx 0.212 + 0.569 + 0.454 + 0.203 = 1.438 \\ a_6 \&\\approx \\frac{1}{1 + e\^{-1.438}} \\approx 0.8083 \\end{aligned}
新损失值 :
L_{\\text{new}} = \\frac{1}{2} (1 - 0.8083)\^2 \\approx \\frac{1}{2} \\times (0.1917)\^2 \\approx 0.018374
4.3 损失比较与分析
- 更新前损失:( L_{\text{old}} \approx 0.018818 )
- 更新后损失:( L_{\text{new}} \approx 0.018374 )
- 损失减少量:( \Delta L = 0.018818 - 0.018374 = 0.000444 )(减少约2.36%)
损失函数的减少表明通过一次反向传播,神经网络的预测准确性得到了提升。参数调整方向是正确的,网络正在学习如何更好地拟合训练数据。
5. 总结与扩展
本文通过一个具体的二分类神经网络实例,详细演示了前向传播、反向传播和参数更新的完整计算过程。关键要点如下:
- 前向传播计算网络输出,涉及加权求和和激活函数变换。
- 反向传播使用链式法则计算损失函数对每个参数的梯度。
- 参数更新根据梯度方向调整权重和偏置,使损失函数减小。
- 学习率控制参数更新步长,影响训练稳定性和收敛速度。
实际应用建议:
- 对于更复杂的数据集,可能需要增加网络层数或神经元数量。
- ReLU激活函数能有效缓解梯度消失问题,适用于隐藏层。
- Sigmoid函数适用于二分类输出层,将输出映射到概率范围。
- 损失函数的选择取决于任务类型,均方误差适用于回归问题,交叉熵损失更适用于分类问题。
神经网络通过多次迭代上述过程,不断优化参数,最终得到一个能够准确分类的模型。理解这些基础原理对于深入学习更复杂的神经网络架构至关重要。