郭震 AI公众号:郭震AI

15 深度学习与神经网络之前向传播与反向传播

发布日期:

最近更新:

分类: 计算机视觉

预计阅读: 5 分钟

阅读次数: 0

预计阅读5 分钟
结构重点6 个
图文要点6 张
正文规模2.2k 字

整理说明

这篇内容怎么整理

郭震 · 2026-06-04

独立整理围绕 6 个结构重点拆成环境、步骤、验证点和常见误区,尽量让读者能照着复现。
图文对照保留 6 张和配置、流程、判断结果有关的图片,方便快速定位正文重点。
持续校对工具、模型和命令变化较快,后续优先修正入口、参数和风险提醒。

阅读路线

先按这条路线读

先抓住主线,再回到代码、配置和图文细节,读起来会更稳。

图文要点

先看本文图文节点

按图先建立主线,再跳回正文核对步骤、配置和判断标准。

前向传播与反向传播流程图查看大图
前向传播与反向传播流程图

前向传播回答模型怎么算,反向传播回答参数怎么改。两者合起来,才是一个完整训练闭环。

前向传播与反向传播实操核对图查看大图
前向传播与反向传播实操核对图

我会检查每一层输出形状和 loss 是否能下降。形状对不上会报错,loss 不降则说明数据、模型或学习率有问题。

在上一篇中,我们讨论了神经元模型与激活函数,它们是构建深度学习模型的基本单元。接下来,我们将深入探讨两个关键过程:前向传播反向传播。这两者是神经网络训练的核心机制。

前向传播

在神经网络中,前向传播是指输入数据通过网络进行处理的过程。这一过程涉及到每个神经元的计算,最终输出网络的预测结果。

前向反向传播视觉判断卡查看大图
前向反向传播视觉判断卡

理解视觉网络前向与反向传播时,先看输入特征、预测输出、损失计算、梯度回传和参数更新。

1. 前向传播过程

假设我们有一个简单的全连接网络,包含输入层、一个隐藏层以及输出层。假设输入层的节点数为 ninputn_{\text{input}},隐藏层的节点数为 nhiddenn_{\text{hidden}},输出层的节点数为 noutputn_{\text{output}}

步骤如下:

  1. 输入层传递输入向量: 输入向量可以表示为 X=[x1,x2,...,xninput]TX = [x_1, x_2, ..., x_{n_{\text{input}}}]^T

  2. 计算隐藏层输出: 隐藏层到每个神经元的输入是前一层(输入层)的输出与相应的权重相乘并加上偏置:

    Z(1)=W(1)X+b(1)Z^{(1)} = W^{(1)}X + b^{(1)}

    其中,W(1)W^{(1)} 是从输入层到隐藏层的权重矩阵,b(1)b^{(1)} 是隐藏层的偏置向量。然后,经过激活函数激活:

    A(1)=σ(Z(1))A^{(1)} = \sigma(Z^{(1)})

    其中,σ\sigma 是选择的激活函数,如ReLU、Sigmoid等。

  3. 计算输出层输出: 输出层的计算过程与隐藏层类似,设置 A(1)A^{(1)} 为输入:

    Z(2)=W(2)A(1)+b(2)Z^{(2)} = W^{(2)}A^{(1)} + b^{(2)}

    激活得到输出:

A(2)=softmax(Z(2))A^{(2)} = \text{softmax}(Z^{(2)})

在分类任务中,我们通常使用 softmax 函数作为输出层的激活函数,以获得各类别的概率分布。

2. 示例代码

下面是一个使用Python和NumPy库实现简单前向传播的示例代码:

import numpy as np

# 定义激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 前向传播示例
def forward_propagation(X, W1, b1, W2, b2):
    # 隐藏层计算
    Z1 = np.dot(W1, X) + b1
    A1 = sigmoid(Z1)
    
    # 输出层计算
    Z2 = np.dot(W2, A1) + b2
    A2 = np.exp(Z2) / np.sum(np.exp(Z2), axis=0)  # softmax
    return A1, A2

# 假设输入和参数
X = np.array([[0.1], [0.2]])
W1 = np.random.rand(3, 2)  # 隐藏层权重
b1 = np.random.rand(3, 1)  # 隐藏层偏置
W2 = np.random.rand(2, 3)  # 输出层权重
b2 = np.random.rand(2, 1)  # 输出层偏置

A1, A2 = forward_propagation(X, W1, b1, W2, b2)
print("隐藏层输出:", A1)
print("最终输出:", A2)

在这个例子中,我们定义了一个简单的前向传播过程,得到了隐藏层和输出层的结果。

反向传播

反向传播是用来训练神经网络的过程,其目标是通过调整权重和偏置来减少网络的误差。反向传播的核心是应用链式法则计算损失函数关于各个参数的梯度。

深度学习与神经网络之前向传播与反向传播应用检查卡查看大图
深度学习与神经网络之前向传播与反向传播应用检查卡

回看《深度学习与神经网络之前向传播与反向传播》时,不必一次做大项目,先用一条简单样例确认主线是否清楚。

深度学习与神经网络之前向传播与反向传播应用复盘卡查看大图
深度学习与神经网络之前向传播与反向传播应用复盘卡

如果《深度学习与神经网络之前向传播与反向传播》还没完全消化,可以从这张卡片的四个动作重新走一遍。

计算机视觉阅读地图卡查看大图
计算机视觉阅读地图卡

读完《深度学习与神经网络之前向传播与反向传播》不要只停在“看懂了”。回头挑一个步骤动手做一遍,再记录哪里卡住,后面的学习会更稳。

1. 反向传播过程

  1. 计算输出误差: 输出层的误差为:

    δ(2)=A(2)Y\delta^{(2)} = A^{(2)} - Y

    其中,YY 是实际标签。

  2. 计算输出层梯度: 输出层权重梯度为:

    LW(2)=δ(2)A(1)T\frac{\partial \mathcal{L}}{\partial W^{(2)}} = \delta^{(2)} A^{(1)T}

    输出层偏置梯度为:

    Lb(2)=δ(2)\frac{\partial \mathcal{L}}{\partial b^{(2)}} = \delta^{(2)}
  3. 反向传播到隐藏层: 隐藏层的误差由输出层的误差通过权重传递回来的:

    δ(1)=(W(2)Tδ(2))σ(Z(1))\delta^{(1)} = (W^{(2)T} \delta^{(2)}) \circ \sigma'(Z^{(1)})

    其中,\circ 表示Hadamard乘积,σ(Z(1))\sigma'(Z^{(1)}) 是激活函数的导数。

  4. 计算隐藏层梯度: 隐藏层权重梯度为:

    LW(1)=δ(1)XT\frac{\partial \mathcal{L}}{\partial W^{(1)}} = \delta^{(1)} X^T

    隐藏层偏置梯度为:

    Lb(1)=δ(1)\frac{\partial \mathcal{L}}{\partial b^{(1)}} = \delta^{(1)}

2. 示例代码

下面是相应的反向传播的实现示例:

# 反向传播示例
def backward_propagation(X, Y, A1, A2, W2):
    m = Y.shape[1]  # 样本数

    # 计算误差
    delta2 = A2 - Y
    dW2 = np.dot(delta2, A1.T) / m
    db2 = np.sum(delta2, axis=1, keepdims=True) / m

    # 传播到隐藏层
    delta1 = np.dot(W2.T, delta2) * (A1 * (1 - A1))  # sigmoid的导数
    dW1 = np.dot(delta1, X.T) / m
    db1 = np.sum(delta1, axis=1, keepdims=True) / m

    return dW1, db1, d

继续阅读

从这篇继续找到相关教程

AI 教程总索引

常见问题

读前先确认这三点

深度学习与神经网络之前向传播与反向传播适合谁读?

这是 计算机视觉网络教程 系列第 15 / 31 篇,适合正在学习计算机视觉网络教程,并且需要把概念落到操作步骤或判断标准里的读者。

读这篇计算机视觉网络教程要多久?

按中文技术文章阅读速度估算,通读大约 5 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。

这篇文章里的图文节点怎么用?

正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。

分享文章

转发到常用平台

微信/朋友圈可先复制链接

相关教程

AI 教程总索引

继续阅读

继续找到相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...