BP、梯度消失/爆炸与ResNet

深度学习最底层的理论,竟有些生疏了。

反向传播算法

首先是bp反向传播,其核心idea就是,从后向前,一层层的梯度传递。
高数中求偏导的时候就有个链式法则,对所有路径的偏导乘积求和,就是该参数的偏导
在这里插入图片描述
bp算法就是通过自后向前的偏导计算,避免了重复的计算。每一个节点的偏导值,都可以在前一级的偏导计算中用到

下面举个简单反向传播的直链例子:
在这里插入图片描述
ω \omega ω b b b是参数, h h h是隐含层神经元激活后的值, f f f是激活函数。
g i g_i gi我把它叫做梯度参数,每次更新和缓存的也是这个。
且很容易推得 g i = g i + 1 ⋅ ω i + 1 ⋅ f ′ ( ω i h i + b i ) g_i=g_{i+1}\cdot\omega_{i+1}\cdot f^\prime(\omega_ih_i+b_i) gi=gi+1

### 梯度爆炸梯度消失的成因 在深度神经网络中,梯度不稳定是基于梯度学习的根本问题,梯度消失和梯度爆炸属于梯度不稳定的范畴。产生梯度不稳定的根本原因是前面层上的梯度是来自后面层上梯度的乘积,当存在过多的层时,就会出现梯度不稳定场景,比如梯度消失和梯度爆炸BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,计算梯度包含了对激活函数进行求导。如果此部分大于1,那么层数增多的时候,最终求出的梯度更新将以指数形式增加,即发生梯度爆炸;如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。二者都表现为当前面隐藏层的学习速率低于后面隐藏层的学习速率,即随着隐藏层数目的增加,分类准确率反而下降了[^1][^3]。 ### 梯度爆炸梯度消失的解决方案 #### 梯度爆炸的解决方案 - **梯度裁剪**:对梯度进行裁剪,限制梯度的最大值,避免梯度过大。例如在PyTorch中可以使用`torch.nn.utils.clip_grad_norm_`函数: ```python import torch import torch.nn as nn # 定义一个简单的模型 model = nn.Sequential( nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 1) ) # 定义优化器 optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 模拟损失 loss = torch.randn(1) # 反向传播计算梯度 loss.backward() # 梯度裁剪 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) # 更新参数 optimizer.step() ``` - **使用合适的激活函数**:选择导数不会过大的激活函数,如ReLU及其变种,ReLU的导数在正数部分为1,不会出现梯度爆炸的问题。 ```python import torch import torch.nn as nn model = nn.Sequential( nn.Linear(10, 20), nn.ReLU(), # 使用ReLU激活函数 nn.Linear(20, 1) ) ``` - **正则化**:如L1和L2正则化,通过在损失函数中添加正则项,限制模型参数的大小,从而缓解梯度爆炸。 #### 梯度消失的解决方案 - **使用合适的激活函数**:选择导数不会过小的激活函数,如ReLU、LeakyReLU等。ReLU在正数部分的导数为1,不会出现梯度消失的问题。 ```python import torch import torch.nn as nn model = nn.Sequential( nn.Linear(10, 20), nn.LeakyReLU(negative_slope=0.01), # 使用LeakyReLU激活函数 nn.Linear(20, 1) ) ``` - **Batch Normalization**:在神经网络中添加Batch Normalization层,对输入进行归一化处理,使得每一层的输入分布相对稳定,缓解梯度消失问题。 ```python import torch import torch.nn as nn model = nn.Sequential( nn.Linear(10, 20), nn.BatchNorm1d(20), # 添加Batch Normalization层 nn.ReLU(), nn.Linear(20, 1) ) ``` - **残差连接**:在深度神经网络中使用残差块,如ResNet中的残差结构,允许信息直接跳过一些层,使得梯度能够更有效地传播。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值