当前位置: 首页 > news >正文

深度学习: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.指定间隔、等间隔、指数学习率衰减对比

在这里插入图片描述

今天的分享到此结束。

http://www.lryc.cn/news/573854.html

相关文章:

  • 【redis使用场景——缓存——双写一致性】
  • 文心一言(ERNIE Bot):百度打造的知识增强大语言模型
  • 一键打包利器:gopack - 极简Go程序编译与压缩工具
  • Ollama按照与使用
  • openapi-generator-maven-plugin自动生成HTTP远程调用客户端
  • Java面试复习指南:基础、面向对象、Java 8新特性及并发编程
  • ASP.NET Core API文档与测试实战指南
  • 编程江湖-Git
  • 分库分表下的 ID 冲突问题与雪花算法讲解
  • 【数据结构】_二叉树部分特征统计
  • python基础(3)
  • 【论文阅读 | CVPR 2024 |Fusion-Mamba :用于跨模态目标检测】
  • 利用通义大模型构建个性化推荐系统——从数据预处理到实时API部署
  • 算法-动态规划-钢条切割问题
  • 简单工厂模式,工厂模式和注册工厂模式
  • Go 循环依赖的依赖注入解决方案详解
  • Cache Travel-09-从零开始手写redis(17)v1.0.0 全新版本架构优化+拓展性增强
  • AI三步诊断心理:比ChatGPT更懂人心
  • C#Halcon从零开发_Day14_AOI缺陷检测策略1_Bolb分析+特征分析_饼干破损检测
  • JavaScript性能优化实战
  • MySQL索引分类有哪些?
  • RA4M2开发IOT(9)----动态显示MEMS数据
  • 基于python代码的通过爬虫方式实现TK下载视频(2025年6月)
  • 支付宝携手HarmonyOS SDK实况窗,开启便捷停车生活
  • 湖北理元理律师事务所:构建可持续债务优化的双轨解法
  • all()函数和any()函数
  • Linux->进程概念(精讲)
  • JavaEE-Mybatis进阶
  • 图灵完备之路(数电学习三分钟)----门的多路化
  • 创客匠人行业洞察:创始人 IP 的核心能力构建与长期主义实践