当前位置: 首页 > 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.指定间隔、等间隔、指数学习率衰减对比

在这里插入图片描述

今天的分享到此结束。

相关文章:

  • C++ 第二阶段:类与对象 - 第三节:成员函数与访问权限
  • 在windows上使用file命令
  • Flink SQL Connector Kafka 核心参数全解析与实战指南
  • linux----------------进程VS线程
  • EMD与PI:战略与执行的协同
  • “MOOOA多目标鱼鹰算法在无人机多目标路径规划
  • RabbitMQ从入门到实践:消息队列核心原理与典型应用场景
  • 文心一言(ERNIE Bot):百度打造的知识增强大语言模型
  • Cache Travel-09-从零开始手写redis(17)v1.0.0 全新版本架构优化+拓展性增强
  • 客户需求频繁变动时,如何快速同步各项目变更?
  • 关于计算机基础知识的详细讲解(从属GESP一级内容)
  • C# 数组(数组协变和数组继承的有用成员)
  • 北京华宇信息技术有限公司系统服务工程师招聘面试题(笔试)
  • 大模型和ollama一起打包到一个docker镜像中
  • windows 访问ubuntu samba配置
  • C#设计模式-Builder-生成器-对象创建型模式
  • 【软考高级系统架构论文】# 论软件设计方法及其应用
  • 2025年SVN学习价值分析
  • PostgreSQL全栈部署指南:从零构建企业级高可用数据库集群
  • DataX 实现 Doris 和 MySQL 双向同步完全指南
  • 手机网站自动适配/专业seo培训学校
  • wordpress多人聊天室/宿州百度seo排名软件
  • 网站建设几大技巧/百度热搜的含义
  • 银川网站制作报价/乐云seo官网
  • 济阳做网站哪家好/杭州优化公司在线留言
  • dede 如何做视频网站/企业seo关键词优化