pytorch学习笔记九:权值初始化

本文探讨了权值初始化在深度学习网络中的重要性,特别是对于梯度消失和梯度爆炸的影响。文章介绍了Xavier和Kaiming两种初始化方法,旨在保持输入和输出的方差一致,防止网络训练过程中的问题。Xavier初始化适用于sigmoid和tanh激活函数,而Kaiming初始化考虑了ReLU等非饱和激活函数。合理的权值初始化能有效提高模型训练的效率和效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念

权值初始化是指在网络模型训练之前,对各节点的权值和偏置初始化的过程,正确的初始化会加快模型的收敛,从而加快模型的训练速度,而不恰当的初始化可能会导致梯度消失或梯度爆炸,最终导致模型无法训练。
在这里插入图片描述
如上图所示的一个基本的CNN网络结构,数据在网络结构中流动时,会有如下的公式(默认没有偏置):
在这里插入图片描述
在反向传播的过程中,由于是复合函数的求导,根据链式求导法则,会有两组导数,一个是损失函数Cost对Z的导数,一个是损失函数对W的导数,
1、损失函数关于状态Z的梯度:
在这里插入图片描述
2、损失函数关于W的梯度:
在这里插入图片描述
可以看出,在网络结构中,一个参数的初始化关系到网络能否训练出好的结果或者以多快的速度收敛。所以对权值初始化有如下的要求:

  • 参数不能全部初始化为0或全为1,也不能全部初始化同一个值;(反向传播时梯度的更新值一样)
  • 参数的初始化值不能太大;(针对激活函数是sigmoid和tanh,参数太大,梯度会消失)
  • 参数的初始化值也不能太小;(针对激活函数是relu和sigmoid,参数太小,梯度会消失)

所有的参数初始化为0或者相同的数
最简单的初始化方法是将所有的参数初始化为0或者一个常数,但是使用这种特征会使网络中的所有神经元学习到的是相同的特征。
假设神经网络中只有一个有2个神经元的隐藏层,现在将偏置参数初始化为:bias=0,权值矩阵初始化为一个常数α。 网络的输入为(x1,x2),隐藏层使用的激活函数为ReLU,则隐藏层的每个神经元的输出都是relu(αx1+αx2)。 这就导致,对于loss function的值来说,两个神经元的影响是一样的,在反向传播的过程中对应参数的梯度值也是一样,也就说在训练的过程中,两个神经元的参数一直保持一致,其学习到的特征也就一样,相当于整个网络只有一个神经元。

过大或过小的初始化
如果权值的初始值过大,则会导致梯度爆炸,使得网络不收敛;过小的权值初始值,则会导致梯度消失,会导致网络收敛缓慢或者收敛到局部极小值。如果权值的初始值过大,则loss function相对于权值参数的梯度值很大,每次利用梯度下降更新参数时,参数更新的幅度也会很大,这就导致loss function的值在其最小值附近震荡。而过小的初始值则相反,loss关于权值参数的梯度很小,每次更新参数时,更新的幅度也很小,着就会导致loss的收敛很缓慢,或者在收敛到最小值前在某个局部的极小值收敛了。

所以不恰当的初始化可能会引起梯度消失或梯度爆炸,所以下面来了解一下什么是梯度消失与爆炸

二、梯度消失与爆炸

在这里插入图片描述
以上图所示的三层全连接网络为例,假设要计算W2的梯度,根据链式求导法则如下:H2 = H1 * W1
在这里插入图片描述
W2的梯度回用到上一层神经元的输出H1,如果H1的输出非常小,那么W2的梯度也会非常小,这就可能会造成梯度消失的现象,尤其是当网络层数增多时,乘以一个小值后面权值的梯度会更小,甚至会消失。这就使得损失函数得不到更新,模型的训练会停滞。而当H1的输出非常大时,W2的梯度会非常大,就会发生梯度爆炸。
在这里插入图片描述
一旦发生梯度消失或者爆炸,就会导致模型无法训练,而如果想避免这个现象,就得控制网络输出层的一个尺度范围,也就是不能让它太大或者太小。这就需要对权值进行合理的初始化,下面从代码中来理解一下:

建立一个layer=100的多层感知机,其中每层的神经元个数neural_num=256,如下:

class MLP(nn.Module):
    def __init__(self, neural_num, layers):
        super(MLP, self).__init__()
        self.linears = nn.ModuleList([nn.Linear(neural_num, neural_num, bias=False) for i in range(layers)])
        self.neural_num = neural_num

    def forward(self, x):
        for (i, lin
### 关于YOLOv3在Kaggle上的教程、项目或资源 对于希望深入研究YOLOv3模型及其应用的开发者来说,Kaggle是一个非常有价的平台。它不仅提供了丰富的数据集,还包含了大量基于YOLOv3的实际案例和教程。以下是几个可能对你有帮助的方向: #### 1. **Kaggle竞赛中的YOLOv3实现** 许多计算机视觉相关的Kaggle竞赛都涉及目标检测任务,在这些比赛中可以找到参赛者分享的解决方案。例如,“Global Wheat Detection”竞赛就是一个典型的目标检测场景[^1]。一些顶级选手会公开他们的代码库,其中部分采用了YOLOv3作为基础框架。 #### 2. **具体教程推荐** 在Kaggle Notebook区域能够搜索到多个针对YOLOv3的教学笔记。比如有一个名为《Building a Custom Object Detector with YOLOv3》的系列视频播放列表已经整理成文档形式上传至该网站上供人查阅学习。这类资料通常涵盖了从环境搭建到训练自定义数据集全流程操作指南。 #### 3. **开源项目链接** 除了官方文档外,社区贡献也是不可忽视的一部分。像这样一位作者提到他在GitHub浏览期间偶然发现了某个集合了强大而全面资源的仓库[^2],这表明通过进一步探索类似的第三方存储库可能会获得更多实用技巧与灵感。 下面给出一段简单的Python脚本用于加载预训练重文件并执行推理过程演示如何快速启动一个基本版本的应用程序: ```python import torch from models import * # 假设这是包含YOLO v3架构定义模块路径下的导入语句 device = 'cuda' if torch.cuda.is_available() else 'cpu' model = Darknet('cfg/yolov3.cfg', img_size=416).to(device) if device == 'cuda': model.load_darknet_weights('weights/yolov3.weights') else: weights = torch.load('weights/yolov3.pt')['model'].state_dict() model.load_state_dict(weights) img_path = "data/samples/zidane.jpg" detect(model, img_path) ``` 此代码片段展示了如何利用PyTorch加载Darknet风格配置文件创建网络实例,并随后读取相应权值完成初始化工作以便后续处理图像输入等功能调用。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值