深度学习:PyTorch人工神经网络优化方法分享(2)
本文目录:
- 一、手动学习率衰减角度
- (一)等间隔学习率衰减(Step Decay)
- (二)指定间隔学习率衰减(Multi-Step Decay)
- (三)指数学习率衰减(Exponential Decay)
- 二、正则化方法
- (一)简述
- (二)Dropout正则化
- (三)批量归一正则化
- 附赠分享:
- 1.L1和L2正则化对比
- 2.指定间隔、等间隔、指数学习率衰减对比
前言:上一篇文章讲解了部分人工神经网络优化方法,这篇文章接着讲述从学习率角度出发的优化方法和其它方法。
一、手动学习率衰减角度
在神经网络的训练过程中,学习率衰减(Learning Rate Decay)是一种常用的策略,用于在训练后期逐步减小学习率,从而帮助模型更稳定地收敛到最优解。
(一)等间隔学习率衰减(Step Decay)
1.原理:每隔固定的训练轮次(epoch)或迭代次数(steps),将学习率乘以一个衰减因子(γ)。
2.公式:
3.特点:
(1)简单直观,易于实现;
(2)需要手动设置衰减间隔 k 和衰减因子 γ。
4.PyTorch代码实现:
例:
import torch
import matplotlib.pyplot as plt
#解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#准备x,y数据
x = torch.tensor(1.0)
y = torch.tensor(1)
w= torch.tensor(1.0, requires_grad=True)
#定义优化器
optimizer = torch.optim.SGD([w], lr=0.01)
#学习率衰减三种方式
#第一种:等间隔学习率衰减
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.5)
epoch_list, lr_list = [], []
for epoch in range(200):epoch_list.append(epoch)lr_list.append(scheduler.get_last_lr())for i in range(10):y_pred = w * xloss = (y_pred - y) ** 2/2loss.backward()optimizer.step()optimizer.zero_grad()scheduler.step()
print(w)
plt.plot(epoch_list, lr_list, label='Step LR Scheduler')
plt.xlabel('Epoch')
plt.ylabel('Learning rate')
plt.legend()
plt.show()
5.运行结果:
(二)指定间隔学习率衰减(Multi-Step Decay)
**1.原理:**在预先指定的多个训练轮次(如 epoch = [30, 60, 90])时,将学习率按衰减因子γ 逐步降低。
2.公式:
3.特点:
(1)更灵活,可以根据训练需求自定义衰减时机;
(2)适用于非均匀的训练动态(如前期快速衰减,后期缓慢衰减)。
4.PyTorch代码实现:
import torch
import matplotlib.pyplot as plt
#解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#准备x,y数据
x = torch.tensor(1.0)
y = torch.tensor(1)
w= torch.tensor(1.0, requires_grad=True)
#定义优化器
optimizer = torch.optim.SGD([w], lr=0.01)
#学习率衰减三种方式
# 第二种:指定间隔学习率衰减
milestones = [50, 125, 160]
scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=milestones, gamma=0.5)
epoch_list, lr_list = [], []
for epoch in range(200):epoch_list.append(epoch)lr_list.append(scheduler.get_last_lr())for i in range(10):y_pred = w * xloss = (y_pred - y) ** 2/2loss.backward()optimizer.step()optimizer.zero_grad()scheduler.step()
print(w)
plt.plot(epoch_list, lr_list, label="Multi Step LR Scheduler\nmilestones:{}".format(milestones))
plt.xlabel('Epoch')
plt.ylabel('Learning rate')
plt.legend()
plt.show()
5.运行结果:
(三)指数学习率衰减(Exponential Decay)
1.原理:学习率随着训练轮次或迭代次数呈指数级下降。
2.公式:
3.特点:
(1)平滑连续衰减,适用于需要精细调整的场景;
(2)衰减速度由 k 或 γ 控制(如 γ=0.95 时衰减较慢,γ=0.9 时衰减较快)。
4.PyTorch代码实现:
import torch
import matplotlib.pyplot as plt
#解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#准备x,y数据
x = torch.tensor(1.0)
y = torch.tensor(1)
w= torch.tensor(1.0, requires_grad=True)
#定义优化器
optimizer = torch.optim.SGD([w], lr=0.01)
#学习率衰减三种方式
# #第二种:指数学习率衰减
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95)
epoch_list, lr_list = [], []
for epoch in range(200):epoch_list.append(epoch)lr_list.append(scheduler.get_last_lr())for i in range(10):y_pred = w * xloss = (y_pred - y) ** 2/2loss.backward()optimizer.step()optimizer.zero_grad()scheduler.step()
plt.plot(epoch_list, lr_list, label='Multi Step LR Scheduler')
plt.xlabel('Epoch')
plt.ylabel('Learning rate')
plt.legend()
plt.show()
5.运行结果:
二、正则化方法
(一)简述
正则化L1和L2方法(之前分享):主要用于处理过拟合问题。
- 神经网络强大的表示能力经常遇到过拟合,所以需要使用不同形式的正则化策略;
- 目前在深度学习中使用较多的策略有范数惩罚,DropOut,特殊的网络层(比如批量归一化)等,此文主要讲解DropOut和常用批量归一化(其它可自学)。
(二)Dropout正则化
1.基本内容
一种用于神经网络的 正则化技术,其核心思想是在训练过程中随机丢弃(置零)一部分神经元的输出,从而防止网络对某些特定神经元的过度依赖,提高泛化能力。
-
在训练过程中,Dropout的实现是让神经元以超参数p(丢弃概率)的概率停止工作或者激活值被置为0,然后未被置为0的进行缩放(为了维持数据均衡性),缩放比例为1/(1-p)。训练过程可以认为是对完整的神经网络的一些子集进行训练,每次基于输入数据只更新子网络的参数
-
在实际应用中,Dropout参数p的概率通常取值在0.2到0.5之间
- 对于较小的模型或较复杂的任务,丢弃率可以选择0.3或更小;
- 对于非常深的网络,较大的丢弃率(如0.5或0.6)可能会有效防止过拟合。
特别注意:测试时,框架(如 PyTorch)会自动关闭 Dropout(即dropout不起作用)。
2.Dropout的优缺点:
3.PyTorch代码实现:
例:
import torch
#创建隐藏层
linear1=torch.nn.Linear(4,5)
#准备输入数据
x = torch.randn(1,4)
#输入数据进行隐藏层处理
x=linear1(x)
#输出数据
print('加权求和:',x)
x=torch.relu(x)
print('relu激活:',x)
dropout=torch.nn.Dropout(p=0.5)
x=dropout(x)
print('dropout随机失活:',x)
(三)批量归一正则化
1.概念
批量归一化(Batch Normalization,简称 BN)是深度学习中一种重要的正则化和加速训练的技术,由 Sergey Ioffe 和 Christian Szegedy 在 2015 年提出。它通过对每一层的输入进行标准化处理,显著改善了神经网络的训练速度和稳定性。
批量归一正则化通过标准化每一层的输入,使其均值接近0,方差接近1,从而加速训练并提高泛化能力。
2.计算过程:
3.批量归一化的优缺点
4.PyTorch代码实现
import torch# 生成随机数据(模拟一个batch)
data = torch.randn(32, 100) # batch_size=32, features=100# BN 的标准化效果
bn = torch.nn.BatchNorm1d(100)
output = bn(data)print("输入均值:", data.mean(dim=0)[0].item()) # 接近 0(随机初始化)
print("输入方差:", data.var(dim=0)[0].item()) # 接近 1
print("BN 输出均值:", output.mean(dim=0)[0].item()) # 接近 0
print("BN 输出方差:", output.var(dim=0)[0].item()) # 接近 1
5.输出结果
输入均值: 0.13165630400180817
输入方差: 0.7302629947662354
BN 输出均值: -1.4901161193847656e-08
BN 输出方差: 1.0322434902191162
附赠分享:
1.L1和L2正则化对比
2.指定间隔、等间隔、指数学习率衰减对比
今天的分享到此结束。