【Pytorch神经网络理论篇】 14 过拟合问题的优化技巧(一):基本概念+正则化+数据增大

简介: 【Pytorch神经网络理论篇】 14 过拟合问题的优化技巧(一):基本概念+正则化+数据增大

同学你好!本文章于2021年末编写,获得广泛的好评!

故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现,


Pytorch深度学习·理论篇(2023版)目录地址为:


CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录


本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲解与分析,通过将深度学习知识与Pytorch的高效结合,帮助各位新入门的读者理解深度学习各个模板之间的关系,这些均是在Pytorch上实现的,可以有效的结合当前各位研究生的研究方向,设计人工智能的各个领域,是经过一年时间打磨的精品专栏!

https://v9999.blog.csdn.net/article/details/127587345


欢迎大家订阅(2023版)理论篇

以下为2021版原文~~~~

c0cc78b1be2244479f8c4df899b6cfb6.png


1 过拟合问题的描述


1.1 过拟合问题概述


深度额学习训练过程中,在训练阶段得到了较好的准确率,但在识别非数据集数据时存在精度下降的问题,这种现象称为过拟合现象。


主要原因:由于模型的拟合度过高,导致模型不仅学习样本的群体规律,也学习样本的个体规律。


1.2 过拟合问题模型的设计


1.2.1 构建数据集---Over_fitting.py(第1部分)


import sklearn.datasets
import torch
import numpy as np
import  matplotlib.pyplot as plt
from LogicNet_fun import LogicNet,moving_average,predict,plot_decision_boundary
# 1 构建数据集
np.random.seed(0) # 设置随机数种子
X , Y =sklearn.datasets.make_moons(40,noise=0.2) # 生成两组半圆形数据
arg = np.squeeze(np.argwhere(Y==0),axis=1) # 获取第1组数据索引
arg2 = np.squeeze(np.argwhere(Y==1),axis=1) # 获取第2组数据索引
# 显示数据
plt.title("train moons data")
plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label = 'data1')
plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label = 'data2')
plt.legend()
plt.show()


91dd9da0dc874357b10498bb2c0a6d92.png


1.2.2 搭建网络模型---Over_fitting.py(第2部分)


# 2 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=500,outputdim=2) # 实例化模型,增加拟合能力将hiddendim赋值为500
optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器:反向传播过程中使用。


1.2.3 训练模型,并将训练过程可视化---Over_fitting.py(第3部分)


# 3 训练模型+训练过程loss可视化
xt = torch.from_numpy(X).type(torch.FloatTensor) # 将numpy数据转化为张量
yt = torch.from_numpy(Y).type(torch.LongTensor) # 将numpy数据转化为张量
epochs = 1000 # 定义迭代次数
losses = [] # 损失值列表
for i in range(epochs):
    loss = model.getloss(xt,yt)
    losses.append(loss.item()) # 保存损失值中间状态
    optimizer.zero_grad() # 清空梯度
    loss.backward() # 反向传播损失值
    optimizer.step() # 更新参数
avgloss = moving_average(losses) # 获得损失值的移动平均值
plt.figure(1)
plt.subplot(211)
plt.xlabel('step number')
plt.ylabel('Training loss')
plt.title('step number vs Training loss')
plt.show()


1.2.4 将模型结果可视化,观察过拟合现象---Over_fitting.py(第4部分)


# 4 模型结果可视化,观察过拟合现象
plot_decision_boundary(lambda x: predict(model,x),X,Y)
from sklearn.metrics import accuracy_score
print("训练时的准确率",accuracy_score(model.predict(xt),yt))
# 重新生成两组半圆数据
Xtest,Ytest = sklearn.datasets.make_moons(80,noise=0.2)
plot_decision_boundary(lambda x: predict(model,x),Xtest,Ytest)
Xtest_t = torch.from_numpy(Xtest).type(torch.FloatTensor) # 将numpy数据转化为张量
Ytest_t = torch.from_numpy(Ytest).type(torch.LongTensor)
print("测试时准确率",accuracy_score(model.predict(Xtest_t),Ytest_t))


405a5e362bf944e7a2e3e092237865ff.png


1.2.5 模型代码总览---Over_fitting.py(总结)


#####Over_fitting.py
import sklearn.datasets
import torch
import numpy as np
import  matplotlib.pyplot as plt
from LogicNet_fun import LogicNet,moving_average,predict,plot_decision_boundary
# 1 构建数据集
np.random.seed(0) # 设置随机数种子
X , Y =sklearn.datasets.make_moons(40,noise=0.2) # 生成两组半圆形数据
arg = np.squeeze(np.argwhere(Y==0),axis=1) # 获取第1组数据索引
arg2 = np.squeeze(np.argwhere(Y==1),axis=1) # 获取第2组数据索引
# 显示数据
plt.title("train moons data")
plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label = 'data1')
plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label = 'data2')
plt.legend()
plt.show()
# 2 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=500,outputdim=2) # 实例化模型,增加拟合能力将hiddendim赋值为500
optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器:反向传播过程中使用。
# 3 训练模型+训练过程loss可视化
xt = torch.from_numpy(X).type(torch.FloatTensor) # 将numpy数据转化为张量
yt = torch.from_numpy(Y).type(torch.LongTensor) # 将numpy数据转化为张量
epochs = 1000 # 定义迭代次数
losses = [] # 损失值列表
for i in range(epochs):
    loss = model.getloss(xt,yt)
    losses.append(loss.item()) # 保存损失值中间状态
    optimizer.zero_grad() # 清空梯度
    loss.backward() # 反向传播损失值
    optimizer.step() # 更新参数
avgloss = moving_average(losses) # 获得损失值的移动平均值
plt.figure(1)
plt.subplot(211)
plt.xlabel('step number')
plt.ylabel('Training loss')
plt.title('step number vs Training loss')
plt.show()
# 4 模型结果可视化,观察过拟合现象
plot_decision_boundary(lambda x: predict(model,x),X,Y)
from sklearn.metrics import accuracy_score
print("训练时的准确率",accuracy_score(model.predict(xt),yt))
# 重新生成两组半圆数据
Xtest,Ytest = sklearn.datasets.make_moons(80,noise=0.2)
plot_decision_boundary(lambda x: predict(model,x),Xtest,Ytest)
Xtest_t = torch.from_numpy(Xtest).type(torch.FloatTensor) # 将numpy数据转化为张量
Ytest_t = torch.from_numpy(Ytest).type(torch.LongTensor)
print("测试时准确率",accuracy_score(model.predict(Xtest_t),Ytest_t))


LogicNet_fun.py


### LogicNet_fun.py
import torch.nn as nn #引入torch网络模型库
import torch
import numpy as np
import matplotlib.pyplot as plt
# 1.2 定义网络模型
class LogicNet(nn.Module): #继承nn.Module类,构建网络模型
    def __init__(self,inputdim,hiddendim,outputdim): #初始化网络结构 ===》即初始化接口部分
        super(LogicNet,self).__init__()
        self.Linear1 = nn.Linear(inputdim,hiddendim) #定义全连接层
        self.Linear2 = nn.Linear(hiddendim,outputdim) #定义全连接层
        self.criterion = nn.CrossEntropyLoss() #定义交叉熵函数
    def forward(self,x):# 搭建用两个全连接层组成的网络模型 ===》 即正向接口部分:将网络层模型结构按照正向传播的顺序搭建
        x = self.Linear1(x)# 将输入传入第一个全连接层
        x = torch.tanh(x)# 将第一个全连接层的结果进行非线性变化
        x = self.Linear2(x)# 将网络数据传入第二个全连接层
        return x
    def predict(self,x):# 实现LogicNet类的预测窗口 ===》 即预测接口部分:利用搭建好的正向接口,得到模型预测结果
        #调用自身网络模型,并对结果进行softmax()处理,分别的出预测数据属于每一个类的概率
        pred = torch.softmax(self.forward(x),dim=1)# 将正向结果进行softmax(),分别的出预测结果属于每一个类的概率
        return torch.argmax(pred,dim=1)# 返回每组预测概率中最大的索引
    def getloss(self,x,y):# 实现LogicNet类的损失值接口 ===》 即损失值计算接口部分:计算模型的预测结果与真实值之间的误差,在反向传播时使用
        y_pred = self.forward(x)
        loss = self.criterion(y_pred,y)# 计算损失值的交叉熵
        return loss
# 1.5 训练可视化
def moving_average(a,w=10): #计算移动平均损失值
    if len(a) < w:
        return a[:]
    return [val if idx < w else sum(a[(idx - w):idx]) / w for idx, val in enumerate(a)]
def moving_average_to_simp(a,w=10): #
    if len(a) < w:
        return a[:]
    val_list = []
    for idx, val in enumerate(a):
        if idx < w:# 如果列表 a 的下标小于 w, 直接将元素添加进 xxx 列表
            val_list.append(val)
        else:#  向前取 10 个元素计算平均值, 添加到 xxx 列表
            val_list.append(sum(a[(idx - w):idx]) / w)
def plot_losses(losses):
    avgloss = moving_average(losses)#获得损失值的移动平均值
    plt.figure(1)
    plt.subplot(211)
    plt.plot(range(len(avgloss)),avgloss,'b--')
    plt.xlabel('step number')
    plt.ylabel('Training loss')
    plt.title('step number vs Training loss')
    plt.show()
# 1.7 数据可视化模型
def predict(model,x): #封装支持Numpy的预测接口
    x = torch.from_numpy(x).type(torch.FloatTensor)
    model = LogicNet(inputdim=2, hiddendim=3, outputdim=2)
    ans = model.predict(x)
    return ans.numpy()
def plot_decision_boundary(pred_func,X,Y): #在直角模型中实现预测结果的可视化
    #计算范围
    x_min ,x_max = X[:,0].min()-0.5 , X[:,0].max()+0.5
    y_min ,y_max = X[:,1].min()-0.5 , X[:,1].max()+0.5
    h=0.01
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    #根据数据输入进行预测
    Z = pred_func(np.c_[xx.ravel(),yy.ravel()])
    Z = Z.reshape(xx.shape)
    #将数据的预测结果进行可视化
    plt.contourf(xx,yy,Z,cmap=plt.cm.Spectral)
    plt.title("Linear predict")
    arg = np.squeeze(np.argwhere(Y==0),axis=1)
    arg2 = np.squeeze(np.argwhere(Y==1),axis=1)
    plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+')
    plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o')
    plt.show()


2 改善过拟合现象的方法


2.1 过拟合现象产生的原因


因为神经网络在训练过程中,只看到有限的信息,在数据量不足的情况下,无法合理地区分哪些属于个体特征,哪些属于群体特征。而在真实场景下,所有的样本特征都是多样的,很难在训练数据集中将所有的样本情况全部包括。


2.2 有效改善过拟合现象的方法


2.2.1 early stopping


在发生过拟合之前提前结束训l练。这个方法在理论上是可行的,但是这个结束的时间点不好把握。


2.2.2 数据集扩增(data augmentation)


让模型见到更多的情况,可以最大化满足全样本,但实际应用中,对于未来事件的颈测却显得力不丛心。


2.2.3 正则化


通过范数的概念,增强模型的泛化能力,包括L1正则化、L2正则化(L2正则化也称为weight decay).


2.2.4 dropout


每次训练时舍去一些节点来增强泛化能力


3 正则化

在神经网络计算损失值的过程中,在损失后面再加一项。这样损失值所代表的输出与标准结果间的误差就会受到干扰,导致学习参数w和b无法按照目标方向来调整。实现模型无法与样本完全拟合的结果,达到防止过拟合的效果。


3.1 正则化效果描述


不加正则化训练出来的模型:


bdc1c6726bdf4a028345297f19aa20d0.png


加了正则的模型表现


4d42a75c5eaf4d6dadacce252575c9dd.png


可以看到训练出来的模型太复杂,会影响使用,容易过拟合。


3.2 正则化的分类与公式


3.2.1 干扰项的特性


当欠拟合(模型的拟合能力不足)时,希望它对模型误差影响尽量小,让模型快速来拟合实际。

当过拟合(模型的拟合能力过强)时,希望它对模型误差影响尽量大,让模型不要产生过拟合的情况。


3.2.2 范数


L1:所有学习参数w的绝对值的和


L2:所有学习参数w的平方和,然后求平方根


3.2.3 正则化的损失函数-L1


69e60e6c2d5144d2b64c841030d6c6ab.png

173751a980404ee8abcfb117f59a3644.png


75e7a99a92074b6f8e34af363ca50169.png


3.2.4 正则化的损失函数-L2


e33c56062773403089faeb1d05e2632d.png


63a2e44f303f4e7983db15c717525b8c.png


977904309f2643f6817907c2d8582d77.png

e7f6eada6c6c4a4fa86b517616cce329.png


3.3 L2正则化的实现


3.3.1 正则化实现


使用weight_decay参数指定权重衰减率,相当于L2正则化中的正则化系数,用来调整正则化对loss的影响。


weight_decay参数默认对模型中的所有参数进行L2正则化处理,包括权重w和偏置b。


3.3.2 优化器参数的方式实现正则化:字典的方式实现


optimizer =torch.optim.Adam([{'params':weight_p,'weight_decay':0.001},
                            {'params':bias_p,'weight_decay':0}],
                             lr=0.01)


字典中的param以指的是模型中的权重。将具体的权重张量放入优化器再为参数weight_decay赋值,指定权重值哀减率,便可以实现为指定参数进行正则化处理。


如何获得权重张量weight_p与bias_p?


# 主要通过实例化后的模型对象得到
weight_p , bias_p =[],[]
for name , p in model.named_parameters():
    if 'bias' in name:
        bias_p += [p]
    else:
        weight_p += [p]


3.4 使用L2正则化改善模型的过拟合状况


3.4.1 修改Over_fitting.py 中的优化器部分


import sklearn.datasets
import torch
import numpy as np
import  matplotlib.pyplot as plt
from LogicNet_fun import LogicNet,moving_average,predict,plot_decision_boundary
# 1 构建数据集
np.random.seed(0) # 设置随机数种子
X , Y =sklearn.datasets.make_moons(40,noise=0.2) # 生成两组半圆形数据
arg = np.squeeze(np.argwhere(Y==0),axis=1) # 获取第1组数据索引
arg2 = np.squeeze(np.argwhere(Y==1),axis=1) # 获取第2组数据索引
# 显示数据
plt.title("train moons data")
plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label = 'data1')
plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label = 'data2')
plt.legend()
plt.show()
# 2 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=500,outputdim=2) # 实例化模型,增加拟合能力将hiddendim赋值为500
#optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器:反向传播过程中使用。
# 修改为:
#添加正则化处理
weight_p , bias_p =[],[]
for name , p in model.named_parameters(): # 获取模型中的所有参数及参数名字
    if 'bias' in name:
        bias_p += [p] # 收集偏置参数
    else:
        weight_p += [p] # 收集权重
optimizer =torch.optim.Adam([{'params':weight_p,'weight_decay':0.001},
                            {'params':bias_p,'weight_decay':0}],
                             lr=0.01) # 带有正则化处理的优化器


3.4.2 regularization01.py 总览


import sklearn.datasets
import torch
import numpy as np
import  matplotlib.pyplot as plt
from LogicNet_fun import LogicNet,moving_average,predict,plot_decision_boundary
# 1 构建数据集
np.random.seed(0) # 设置随机数种子
X , Y =sklearn.datasets.make_moons(40,noise=0.2) # 生成两组半圆形数据
arg = np.squeeze(np.argwhere(Y==0),axis=1) # 获取第1组数据索引
arg2 = np.squeeze(np.argwhere(Y==1),axis=1) # 获取第2组数据索引
# 显示数据
plt.title("train moons data")
plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label = 'data1')
plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label = 'data2')
plt.legend()
plt.show()
# 2 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=500,outputdim=2) # 实例化模型,增加拟合能力将hiddendim赋值为500
#optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器:反向传播过程中使用。
# 修改为:
#添加正则化处理
weight_p , bias_p =[],[]
for name , p in model.named_parameters(): # 获取模型中的所有参数及参数名字
    if 'bias' in name:
        bias_p += [p] # 收集偏置参数
    else:
        weight_p += [p] # 收集权重
optimizer =torch.optim.Adam([{'params':weight_p,'weight_decay':0.001},
                            {'params':bias_p,'weight_decay':0}],
                             lr=0.01) # 带有正则化处理的优化器
# 3 训练模型+训练过程loss可视化
xt = torch.from_numpy(X).type(torch.FloatTensor) # 将numpy数据转化为张量
yt = torch.from_numpy(Y).type(torch.LongTensor) # 将numpy数据转化为张量
epochs = 1000 # 定义迭代次数
losses = [] # 损失值列表
for i in range(epochs):
    loss = model.getloss(xt,yt)
    losses.append(loss.item()) # 保存损失值中间状态
    optimizer.zero_grad() # 清空梯度
    loss.backward() # 反向传播损失值
    optimizer.step() # 更新参数
avgloss = moving_average(losses) # 获得损失值的移动平均值
plt.figure(1)
plt.subplot(211)
plt.xlabel('step number')
plt.ylabel('Training loss')
plt.title('step number vs Training loss')
plt.show()
# 4 模型结果可视化,观察过拟合现象
plot_decision_boundary(lambda x: predict(model,x),X,Y)
from sklearn.metrics import accuracy_score
print("训练时的准确率",accuracy_score(model.predict(xt),yt))
# 重新生成两组半圆数据
Xtest,Ytest = sklearn.datasets.make_moons(80,noise=0.2)
plot_decision_boundary(lambda x: predict(model,x),Xtest,Ytest)
Xtest_t = torch.from_numpy(Xtest).type(torch.FloatTensor) # 将numpy数据转化为张量
Ytest_t = torch.from_numpy(Ytest).type(torch.LongTensor)
print("测试时准确率",accuracy_score(model.predict(Xtest_t),Ytest_t))


4 数据集扩增(data augmentation)


4.1 数据集增广


增加数据集


4.2 通过增大数据集的方式改善过拟合的状况


4.2.1 修改Over_fitting.py 中的优化器部分


# 2 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=500,outputdim=2) # 实例化模型,增加拟合能力将hiddendim赋值为500
optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器:反向传播过程中使用。
# 3 训练模型+训练过程loss可视化
# xt = torch.from_numpy(X).type(torch.FloatTensor) # 将numpy数据转化为张量
# yt = torch.from_numpy(Y).type(torch.LongTensor) # 将numpy数据转化为张量
# epochs = 1000 # 定义迭代次数
# losses = [] # 损失值列表
# for i in range(epochs):
#     loss = model.getloss(xt,yt)
#     losses.append(loss.item()) # 保存损失值中间状态
#     optimizer.zero_grad() # 清空梯度
#     loss.backward() # 反向传播损失值
#     optimizer.step() # 更新参数
# avgloss = moving_average(losses) # 获得损失值的移动平均值
# 修改为
epochs = 1000 # 定义迭代次数
losses = [] # 损失值列表
for i in range(epochs):
    X ,Y = sklearn.datasets.make_moons(40,noise=0.2)
    xt = torch.from_numpy(X).type(torch.FloatTensor)
    yt = torch.from_numpy(Y).type(torch.LongTensor)
    loss = model.getloss(xt,yt)
    losses.append(loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()


4.2.2 Data_increase.py


import sklearn.datasets
import torch
import numpy as np
import  matplotlib.pyplot as plt
from LogicNet_fun import LogicNet,moving_average,predict,plot_decision_boundary
# 1 构建数据集
np.random.seed(0) # 设置随机数种子
X , Y =sklearn.datasets.make_moons(40,noise=0.2) # 生成两组半圆形数据
arg = np.squeeze(np.argwhere(Y==0),axis=1) # 获取第1组数据索引
arg2 = np.squeeze(np.argwhere(Y==1),axis=1) # 获取第2组数据索引
# 显示数据
plt.title("train moons data")
plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label = 'data1')
plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label = 'data2')
plt.legend()
plt.show()
# 2 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=500,outputdim=2) # 实例化模型,增加拟合能力将hiddendim赋值为500
optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器:反向传播过程中使用。
# 3 训练模型+训练过程loss可视化
# xt = torch.from_numpy(X).type(torch.FloatTensor) # 将numpy数据转化为张量
# yt = torch.from_numpy(Y).type(torch.LongTensor) # 将numpy数据转化为张量
# epochs = 1000 # 定义迭代次数
# losses = [] # 损失值列表
# for i in range(epochs):
#     loss = model.getloss(xt,yt)
#     losses.append(loss.item()) # 保存损失值中间状态
#     optimizer.zero_grad() # 清空梯度
#     loss.backward() # 反向传播损失值
#     optimizer.step() # 更新参数
# avgloss = moving_average(losses) # 获得损失值的移动平均值
# 修改为
epochs = 1000 # 定义迭代次数
losses = [] # 损失值列表
for i in range(epochs):
    X ,Y = sklearn.datasets.make_moons(40,noise=0.2)
    xt = torch.from_numpy(X).type(torch.FloatTensor)
    yt = torch.from_numpy(Y).type(torch.LongTensor)
    loss = model.getloss(xt,yt)
    losses.append(loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
plt.figure(1)
plt.subplot(211)
plt.xlabel('step number')
plt.ylabel('Training loss')
plt.title('step number vs Training loss')
plt.show()
# 4 模型结果可视化,观察过拟合现象
plot_decision_boundary(lambda x: predict(model,x),X,Y)
from sklearn.metrics import accuracy_score
print("训练时的准确率",accuracy_score(model.predict(xt),yt))
# 重新生成两组半圆数据
Xtest,Ytest = sklearn.datasets.make_moons(80,noise=0.2)
plot_decision_boundary(lambda x: predict(model,x),Xtest,Ytest)
Xtest_t = torch.from_numpy(Xtest).type(torch.FloatTensor) # 将numpy数据转化为张量
Ytest_t = torch.from_numpy(Ytest).type(torch.LongTensor)
print("测试时准确率",accuracy_score(model.predict(Xtest_t),Ytest_t))
目录
相关文章
|
2月前
|
机器学习/深度学习 人工智能
类人神经网络再进一步!DeepMind最新50页论文提出AligNet框架:用层次化视觉概念对齐人类
【10月更文挑战第18天】这篇论文提出了一种名为AligNet的框架,旨在通过将人类知识注入神经网络来解决其与人类认知的不匹配问题。AligNet通过训练教师模型模仿人类判断,并将人类化的结构和知识转移至预训练的视觉模型中,从而提高模型在多种任务上的泛化能力和稳健性。实验结果表明,人类对齐的模型在相似性任务和出分布情况下表现更佳。
65 3
|
9天前
|
机器学习/深度学习 人工智能 PyTorch
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
本文探讨了Transformer模型中变长输入序列的优化策略,旨在解决深度学习中常见的计算效率问题。文章首先介绍了批处理变长输入的技术挑战,特别是填充方法导致的资源浪费。随后,提出了多种优化技术,包括动态填充、PyTorch NestedTensors、FlashAttention2和XFormers的memory_efficient_attention。这些技术通过减少冗余计算、优化内存管理和改进计算模式,显著提升了模型的性能。实验结果显示,使用FlashAttention2和无填充策略的组合可以将步骤时间减少至323毫秒,相比未优化版本提升了约2.5倍。
26 3
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
|
4月前
|
机器学习/深度学习 并行计算 PyTorch
优化技巧与策略:提高 PyTorch 模型训练效率
【8月更文第29天】在深度学习领域中,PyTorch 是一个非常流行的框架,被广泛应用于各种机器学习任务中。然而,随着模型复杂度的增加以及数据集规模的增长,如何有效地训练这些模型成为了一个重要的问题。本文将介绍一系列优化技巧和策略,帮助提高 PyTorch 模型训练的效率。
364 0
|
15天前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
42 8
|
1月前
|
监控 PyTorch 数据处理
通过pin_memory 优化 PyTorch 数据加载和传输:工作原理、使用场景与性能分析
在 PyTorch 中,`pin_memory` 是一个重要的设置,可以显著提高 CPU 与 GPU 之间的数据传输速度。当 `pin_memory=True` 时,数据会被固定在 CPU 的 RAM 中,从而加快传输到 GPU 的速度。这对于处理大规模数据集、实时推理和多 GPU 训练等任务尤为重要。本文详细探讨了 `pin_memory` 的作用、工作原理及最佳实践,帮助你优化数据加载和传输,提升模型性能。
62 4
通过pin_memory 优化 PyTorch 数据加载和传输:工作原理、使用场景与性能分析
|
3月前
|
机器学习/深度学习 PyTorch 调度
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
在深度学习中,学习率作为关键超参数对模型收敛速度和性能至关重要。传统方法采用统一学习率,但研究表明为不同层设置差异化学习率能显著提升性能。本文探讨了这一策略的理论基础及PyTorch实现方法,包括模型定义、参数分组、优化器配置及训练流程。通过示例展示了如何为ResNet18设置不同层的学习率,并介绍了渐进式解冻和层适应学习率等高级技巧,帮助研究者更好地优化模型训练。
183 4
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
|
2月前
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
33 1
|
2月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化卷积神经网络(Bayes-CNN)的多因子数据分类识别算法matlab仿真
本项目展示了贝叶斯优化在CNN中的应用,包括优化过程、训练与识别效果对比,以及标准CNN的识别结果。使用Matlab2022a开发,提供完整代码及视频教程。贝叶斯优化通过构建代理模型指导超参数优化,显著提升模型性能,适用于复杂数据分类任务。
|
3月前
|
机器学习/深度学习
小土堆-pytorch-神经网络-损失函数与反向传播_笔记
在使用损失函数时,关键在于匹配输入和输出形状。例如,在L1Loss中,输入形状中的N代表批量大小。以下是具体示例:对于相同形状的输入和目标张量,L1Loss默认计算差值并求平均;此外,均方误差(MSE)也是常用损失函数。实战中,损失函数用于计算模型输出与真实标签间的差距,并通过反向传播更新模型参数。
|
4月前
|
机器学习/深度学习 数据采集 PyTorch
构建高效 PyTorch 模型:内存管理和优化技巧
【8月更文第27天】PyTorch 是一个强大的深度学习框架,被广泛用于构建复杂的神经网络模型。然而,在处理大规模数据集或使用高性能 GPU 进行训练时,有效的内存管理对于提升模型训练效率至关重要。本文将探讨如何在 PyTorch 中有效地管理内存,并提供一些优化技巧及代码示例。
225 1