核心结论:参数初始化 决定模型能否顺利学习,正则化能避免模型 "学太死",两者都是深度学习训练的关键操作。
一、参数初始化:给模型一个好的起点
参数(主要是全连接层的权重和偏置)就像模型的 "初始技能点",选对了能让模型快速学出规律,选错了可能直接 "学废"。
1. 为啥不能随便初始化?
- 全设为 0 或相同值:模型所有权重更新都一样,相当于 "所有技能点都一样",没法学习不同特征,完全没用。
- 数值太大 / 太小:会导致梯度消失(学不动)或梯度爆炸(学乱了),模型没法收敛。
2. 常用的初始化方法(对应不同激活函数)
- 常数初始化:全设为 0、1 或某个固定值,不推荐(除了偏置偶尔设为 0)。
- 正态 / 均匀分布初始化:随机给权重赋符合正态或均匀分布的值,是基础且通用的选择。
- Xavier (Glorot)初始化:专门适配 Sigmoid、Tanh 激活函数,能让每层输入输出的 "信号强度" 保持稳定,避免梯度消失。
- He (kaiming)初始化:专门适配 ReLU 及其变体(比如 Leaky ReLU),是目前隐藏层最常用的初始化方法之一。
相关代码如下:
import torch.nn as nn
linear = nn.Linear(5, 2)
#正态分布初始化
#参数初始化为制定均值和标准差的正态分布
nn.init.normal_(linear.weight,mean=0,std=1)
print(linear.weight)
#均与分布初始化
#参数初始化为指定范围均匀分布
nn.init.uniform_(linear.weight,a=0,b=10)
#Xavier正态分布初始化
nn.init.xavier_normal_(linear.weight)
#Xavier均匀分布初始化
nn.init.xavier_uniform_(linear.weight)
#He初始化
nn.init.kaiming_normal_(linear.weight)
#He初始化
nn.init.kaiming_uniform_(linear.weight)
二、正则化:防止模型 "死记硬背"
模型训练时容易 "学太细",把训练数据里的噪音都记住(这叫过拟合),导致换个新数据就出错。正则化就是给模型 "松绑",让它学通用规律而非细节。
1. 核心方法:Dropout(随机失活)
- 原理:训练时随机 "关掉" 一部分神经元,让模型没法依赖某个特定神经元,被迫学更通用的特征。
- 操作:
- 训练时:按概率(比如 50%)随机关闭神经元,没被关闭的神经元输出会稍微放大,保证信号强度不变。
- 测试时:所有神经元都工作,不关闭也不放大。
- 优点:简单有效,不管是全连接层还是卷积层都能用,尤其适合复杂模型。
简单代码如下:
#正则化,随机失活
import torch
dropout = torch.nn.Dropout(p = 0.5) #p参数:表示随机失活的概率
#torch.randint(low, high, size)
x = torch.randint(1,10,(10,),dtype=torch.float) #创建一个10行1列的随机数
print("dropout前", x)
print("dropout后", dropout(x))
三、通俗总结
- 初始化:给模型选 "初始技能点",He 配 ReLU、Xavier 配 Sigmoid/Tanh,别全设 0 或乱设值。
- 正则化:用 Dropout 随机 "关掉" 部分神经元,让模型不 "死记硬背",换数据也能表现好。