简单理解ConvNet层的Backpropagation

这篇博客详细介绍了二维卷积神经网络在strides等于1时的前向传播和反向传播过程。在前向传播中,通过滤波器进行卷积计算每个输出单元。而在反向传播中,利用链式法则推导出误差δ的传播,发现反向传播同样是一个卷积操作,但可能需要填充以保持输出尺寸。此外,还讨论了权重梯度的计算。当strides不等于1时,提出通过在输出矩阵间插入0来调整计算。

这里只谈一下二维的情况,也就是channel = 1, strides = 1的情况下,单就这一层的计算.

ConvNet forward propagation

filter’s shape: [height, length, 1]
CNN forward

yi,j=Σn=0lengthΣm=0heightWm,nxi+m,j+ny_{i,j} = \Sigma_{n=0}^{length}\Sigma_{m=0}^{height} W_{m,n}x_{i+m,j+n}yi,j=Σn=0lengthΣm=0heightWm,nxi+m,j+n

ConvNet backpropagation

对于该层,我们首先已知∂L∂yi,j\frac{\partial{L}}{\partial y_{i,j}}yi,jL, 我们将他重新命名为δyi,j\delta{y_{i,j}}δyi,j
首先用全微分用W,xW, xW,x来表达dyi,jdy_{i,j}dyi,j:
dyi,j=Σn=0lengthΣm=0heightdWm,nxi+m,j+n+Σn=0lengthΣm=0heightWm,ndxi+m,j+ndy_{i,j} = \Sigma_{n=0}^{length}\Sigma_{m=0}^{height} dW_{m,n}x_{i+m,j+n} + \Sigma_{n=0}^{length}\Sigma_{m=0}^{height} W_{m,n}dx_{i+m,j+n} dyi,j=Σn=0lengthΣm=0heightdWm,nxi+m,j+n+Σn=0lengthΣm=0heightWm,ndxi+m,j+n
从上式我们可以看出:
∂yi,j∂xi+m,j+n=Wm,n\frac{\partial y_{i,j}}{\partial x_{i+m,j+n}} = W_{m,n}xi+m,j+nyi,j=Wm,n
而通过链式法则
∂L∂xi,j=Σh,k∂yi−h,j−k∂xi,j∂L∂yi−h,j−k=Σh,kWh,k∂L∂yi−h,j−k\frac{\partial{L}}{\partial x_{i,j}} = \Sigma_{h,k} \frac{\partial y_{i-h,j-k}}{\partial x_{i,j}}\frac{\partial{L}}{\partial y_{i-h,j-k}} = \Sigma_{h,k} W_{h,k} \frac{\partial{L}}{\partial y_{i-h,j-k}}xi,jL=Σh,kxi,jyih,jkyih,jkL=Σh,kWh,kyih,jkL
这个等式告诉我们,其实ConvNet的Backpropagation其实也是一个ConvNet,不过需要做一定的padding, padding的量为[height, width], 这个结果应该就是很多代码中的element-wise operation。
Question: 如果 strides != 1呢?
Answer(我也不知道对不对): if strides.shape = (stride1, stride2)个人认为解决方法可以是对输出矩阵Y各元素之间加上(stride1-1, stride2-1)个0
另外还有∂L∂Wi,j\frac{\partial{L}}{\partial W_{i,j}}Wi,jL
∂L∂Wi,j=Σh,k∂yi−h,j−k∂Wi,j∂L∂yi−h,j−k=Σh,kxh,k∂L∂yi−h,j−k\frac{\partial{L}}{\partial W_{i,j}} = \Sigma_{h,k} \frac{\partial y_{i-h,j-k}}{\partial W_{i,j}}\frac{\partial{L}}{\partial y_{i-h,j-k}} = \Sigma_{h,k} x_{h,k} \frac{\partial{L}}{\partial y_{i-h,j-k}}Wi,jL=Σh,kWi,jyih,jkyih,jkL=Σh,kxh,kyih,jkL

<think>嗯,用户让我介绍一下对反向传播(backpropagation)的理解。首先,我需要回忆反向传播的基本概念。反向传播是神经网络中用来训练模型的关键算法,它通过计算损失函数对各个参数的梯度,然后利用梯度下降来更新参数,从而最小化损失。 接下来,我要考虑用户可能的背景。他们可能已经了解一些神经网络的基础,比如前向传播,但想深入理解反向传播的具体机制。用户可能想知道反向传播为什么有效,或者它具体是如何计算梯度的。也有可能用户在学习过程中遇到了困难,比如不明白链式法则在其中的应用,或者对计算图的概念不太清楚。 然后,我需要结构化回答。首先应该定义反向传播,然后解释它的基本原理,包括链式法则和计算图。接着,详细描述反向传播的步骤,分为前向传播和反向传播两个阶段。可能还需要比较反向传播与其他优化方法的区别,比如数值梯度计算,强调其高效性。此外,应该提到反向传播的局限性,比如梯度消失或爆炸的问题,以及现代解决方案如ReLU、残差连接等。 用户可能存在的疑问点包括:为什么需要反向传播而不是直接计算梯度?这里需要解释计算效率的问题,以及链式法则如何分解复杂导数。另外,可能需要举例说明,比如一个简单的神经网络的反向传播过程,让读者更容易理解。 还要注意避免使用过于专业的术语,或者在使用时给出简单解释。比如,提到计算图时,可以说明这是将计算过程分解为节点和边的表示方法,方便应用链式法则。同时,需要强调反向传播在深度学习中的重要性,它是训练深网络的基础。 最后,检查是否有遗漏的重要点,比如实际应用中的技巧,如梯度裁剪、不同的优化器等,但可能这些属于扩展内容,用户可能主要关注基础原理。因此,保持回答集中在核心概念上,结构清晰,逐步引导用户理解反向传播的工作机制和意义。</think>以下是关于反向传播(Backpropagation)的详细解释: --- ### **一、核心定义** **反向传播**是神经网络中用于高效计算梯度的算法,通过**链式法则(Chain Rule)**将损失函数对模型参数的导数逐分解,指导参数更新以最小化损失。 - **本质**:一种自动微分技术,利用计算图(Computational Graph)逆向传播误差信号。 - **对比**:与数值梯度计算(通过微小扰动近似)相比,反向传播更精确且计算量低。 --- ### **二、基本原理** #### 1. **链式法则的数学基础** 假设复合函数 $L = f(g(h(x)))$,其导数可分解为: $$ \frac{\partial L}{\partial x} = \frac{\partial L}{\partial f} \cdot \frac{\partial f}{\partial g} \cdot \frac{\partial g}{\partial h} \cdot \frac{\partial h}{\partial x} $$ 反向传播即从输出到输入计算这些局部梯度并累积。 #### 2. **计算图(Computational Graph)** 将神经网络前向计算过程表示为有向图: - **节点**:操作(如加法、乘法、激活函数) - **边**:数据流动(输入/输出张量) **示例**:对于单神经元 $y = \sigma(wx + b)$,计算图如下: ``` x → (wx + b) → σ → y ↑ ↑ w b ``` --- ### **三、反向传播的步骤** #### **阶段1:前向传播(Forward Pass)** 1. 输入数据逐计算,得到预测值 $\hat{y}$。 2. 计算损失函数 $L$(如均方误差、交叉熵)。 #### **阶段2:反向传播(Backward Pass)** 1. **计算输出梯度**:$\frac{\partial L}{\partial \hat{y}}$ 2. **逐逆向计算局部梯度**: - 对每一的参数(如权重$W$、偏置$b$)计算 $\frac{\partial L}{\partial W}$ 和 $\frac{\partial L}{\partial b}$ - 对输入数据计算 $\frac{\partial L}{\partial x}$(用于上一的梯度传播) 3. **更新参数**:使用梯度下降等优化算法调整参数: $$ W \leftarrow W - \eta \cdot \frac{\partial L}{\partial W} $$ ($\eta$为学习率) --- ### **四、关键公式示例** 以简单全连接为例: - 前向计算:$z = Wx + b$, $a = \sigma(z)$ - 反向传播: 1. 输出梯度:$\frac{\partial L}{\partial a}$ 2. 激活函数梯度:$\frac{\partial L}{\partial z} = \frac{\partial L}{\partial a} \cdot \sigma'(z)$ 3. 权重梯度:$\frac{\partial L}{\partial W} = \frac{\partial L}{\partial z} \cdot x^T$ 4. 偏置梯度:$\frac{\partial L}{\partial b} = \sum \frac{\partial L}{\partial z}$(沿样本维度求和) --- ### **五、反向传播的意义** 1. **高效性**:计算复杂度与网络前向传播相当($O(n)$),远优于直接计算每个参数的数值梯度($O(n^2)$)。 2. **通用性**:适用于任意可微分的网络结构(如CNN、RNN、Transformer)。 3. **自动化实现**:现代框架(如PyTorch、TensorFlow)通过自动微分(Autograd)隐式完成反向传播。 --- ### **六、局限性及改进** #### 1. **梯度消失/爆炸问题** - **现象**:深网络中,梯度逐指数级缩小(消失)或放大(爆炸)。 - **解决方案**: - 改进激活函数(ReLU代替Sigmoid) - 权重初始化(He初始化、Xavier初始化) - 结构设计(残差连接、LSTM) #### 2. **局部最优与鞍点** - 优化器改进:动量(Momentum)、Adam、Adagrad等加速收敛。 --- ### **七、反向传播 vs 其他方法** | **方法** | **计算方式** | **适用场景** | |--------------------|----------------------------------|---------------------------| | 反向传播 | 解析梯度(链式法则) | 神经网络训练(标准方法) | | 数值梯度 | 微小扰动近似计算 | 梯度验证(调试用) | | 符号微分 | 数学表达式直接求导 | 简单函数(不适用于复杂网络)| --- ### **八、实例演示** 假设网络结构:输入 → 全连接(激活函数ReLU) → 输出(损失函数MSE) 1. **前向传播**: - 输入 $x = [2, 3]$, 权重 $W = \begin{bmatrix}1 & -1 \\ 0 & 2\end{bmatrix}$, 偏置 $b = [1, 0]$ - 计算:$z = Wx + b = [2*1 + 3*(-1) + 1, 2*0 + 3*2 + 0] = [0, 6]$ - ReLU激活:$a = \max(0, z) = [0, 6]$ - 预测值 $\hat{y} = a$, 真实值 $y = [0, 5]$, 损失 $L = \frac{1}{2}(0^2 + (6-5)^2) = 0.5$ 2. **反向传播**: - 输出梯度:$\frac{\partial L}{\partial \hat{y}} = [0, 1]$(MSE导数) - ReLU梯度:$\frac{\partial L}{\partial z} = [0 \cdot 0, 1 \cdot 1] = [0, 1]$(ReLU在$z=0$处导数为0,$z=6$处导数为1) - 权重梯度:$\frac{\partial L}{\partial W} = \frac{\partial L}{\partial z} \cdot x^T = \begin{bmatrix}0 \\ 1\end{bmatrix} \cdot [2, 3] = \begin{bmatrix}0 & 0 \\ 2 & 3\end{bmatrix}$ - 参数更新:若学习率 $\eta=0.1$,则 $W \leftarrow W - 0.1 \cdot \frac{\partial L}{\partial W}$ --- ### **总结** - **反向传播是神经网络训练的引擎**:通过梯度计算与参数更新,使模型逐步拟合数据。 - **核心价值**:将高维参数空间的优化问题转化为可计算的局部梯度传递。 - **实践要点**:结合梯度裁剪(Gradient Clipping)、批量归一化(BatchNorm)等技巧提升稳定性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值