【模型性能杀器解读】如果项目的模型遇到瓶颈,用这些Tricks就对了!!!(二)

简介: 【模型性能杀器解读】如果项目的模型遇到瓶颈,用这些Tricks就对了!!!(二)

4、Training Refinements


4.1、Cosine Learning Rate Decay

Loshchilov等人提出了一种余弦退火策略。一种简化的方法是通过遵循余弦函数将学习率从初始值降低到0。假设批次总数为T(忽略预热阶段),那么在批次T时,学习率tm计算为:


可以看出,余弦衰减在开始时缓慢地降低了学习速率,然后在中间几乎变成线性减少,在结束时再次减缓。与step衰减相比,余弦衰减从一开始就对学习进行衰减,但一直持续到步进衰减将学习率降低了10倍,从而潜在地提高了训练进度。

import torch
optim = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)

4.2、Label Smoothing

对于输出预测的标签不可能像真是的label一样真是,因此这里进行一定的平滑策略,具体的Label Smoothing平滑规则为:

# -*- coding: utf-8 -*-
"""
qi=1-smoothing(if i=y)
qi=smoothing / (self.size - 1) (otherwise)#所以默认可以fill这个数,只在i=y的地方执行1-smoothing
另外KLDivLoss和crossentroy的不同是前者有一个常数
predict = torch.FloatTensor([[0, 0.2, 0.7, 0.1, 0],
                                 [0, 0.9, 0.2, 0.1, 0], 
                                 [1, 0.2, 0.7, 0.1, 0]])
对应的label为
tensor([[ 0.0250,  0.0250,  0.9000,  0.0250,  0.0250],
        [ 0.9000,  0.0250,  0.0250,  0.0250,  0.0250],
        [ 0.0250,  0.0250,  0.0250,  0.9000,  0.0250]])
区别于one-hot的
tensor([[ 0.,  0.,  1.,  0.,  0.],
        [ 1.,  0.,  0.,  0.,  0.],
        [ 0.,  1.,  0.,  0.,  0.]])
"""
import torch
import torch.nn as nn
from torch.autograd import Variable
import matplotlib.pyplot as plt
import numpy as np
class LabelSmoothing(nn.Module):
    "Implement label smoothing.  size表示类别总数  "
    def __init__(self, size, smoothing=0.0):
        super(LabelSmoothing, self).__init__()
        self.criterion = nn.KLDivLoss(size_average=False)
        #self.padding_idx = padding_idx
        self.confidence = 1.0 - smoothing#if i=y的公式
        self.smoothing = smoothing
        self.size = size
        self.true_dist = None
    def forward(self, x, target):
        """
        x表示输入 (N,M)N个样本,M表示总类数,每一个类的概率log P
        target表示label(M,)
        """
        assert x.size(1) == self.size
        true_dist = x.data.clone()#先深复制过来
        #print true_dist
        true_dist.fill_(self.smoothing / (self.size - 1))#otherwise的公式
        #print true_dist
        #变成one-hot编码,1表示按列填充,
        #target.data.unsqueeze(1)表示索引,confidence表示填充的数字
        true_dist.scatter_(1, target.data.unsqueeze(1), self.confidence)
        self.true_dist = true_dist
        return self.criterion(x, Variable(true_dist, requires_grad=False))
if __name__=="__main__":
# Example of label smoothing.
    crit = LabelSmoothing(size=5,smoothing= 0.1)
    #predict.shape 3 5
    predict = torch.FloatTensor([[0, 0.2, 0.7, 0.1, 0],
                                 [0, 0.9, 0.2, 0.1, 0], 
                                 [1, 0.2, 0.7, 0.1, 0]])
    v = crit(Variable(predict.log()), 
             Variable(torch.LongTensor([2, 1, 0])))
    # Show the target distributions expected by the system.
    plt.imshow(crit.true_dist)

4.3、Knowledge Distillation

在训练过程中增加了一个蒸馏损失,以惩罚Teacher模型和Student模型的softmax输出之间的差异。给定一个输入,设p为真概率分布,z和r分别为学生模型和教师模型最后全连通层的输出。损失改进为:

4.4、Mixup Training

在Mixup中,每次我们随机抽取两个例子和。然后对这2个sample进行加权线性插值,得到一个新的sample:

其中

import numpy as np
import torch
def mixup_data(x, y, alpha=1.0, use_cuda=True):
    if alpha > 0.:
        lam = np.random.beta(alpha, alpha)
    else:
        lam = 1.
    batch_size = x.size()[0]
    if use_cuda:
        index = torch.randperm(batch_size).cuda()
    else:
        index = torch.randperm(batch_size)
    mixed_x = lam * x + (1 - lam) * x[index,:] # 自己和打乱的自己进行叠加
    y_a, y_b = y, y[index]
    return mixed_x, y_a, y_b, lam
def mixup_criterion(y_a, y_b, lam):
    return lambda criterion, pred: lam * criterion(pred, y_a) + (1 - lam) * criterion(pred, y_b)

4.5、Experiment Results


5、Transfer Learning


相关文章
|
机器学习/深度学习 人工智能 自然语言处理
视觉 注意力机制——通道注意力、空间注意力、自注意力
本文介绍注意力机制的概念和基本原理,并站在计算机视觉CV角度,进一步介绍通道注意力、空间注意力、混合注意力、自注意力等。
13280 58
|
机器学习/深度学习 自然语言处理 数据可视化
UNet家族最强系列 | UNet、UNet++、TransUNet与SWin-UNet究竟哪个更强!!!
UNet家族最强系列 | UNet、UNet++、TransUNet与SWin-UNet究竟哪个更强!!!
3246 0
|
机器学习/深度学习 计算机视觉
Mobile-Unet网络综述
Mobile-Unet网络综述
2400 0
Mobile-Unet网络综述
|
9月前
|
人工智能 人机交互
清华、面壁提出创新AI Agent交互:能主动思考、预测需求
清华大学与面壁智能团队提出了一种创新的AI Agent交互模式,将基于大型语言模型的智能体从被动响应转变为主动协助。通过数据驱动的方法,研究团队开发了能够预测和主动发起任务的智能体,并创建了ProactiveBench数据集。实验结果显示,经过微调的模型在主动性方面取得了66.47%的F1分数,展示了该方法在人机协作中的潜力。论文链接:https://arxiv.org/abs/2410.12361
380 2
|
4月前
|
机器学习/深度学习 算法 文件存储
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
神经架构搜索(NAS)正被广泛应用于大模型及语言/视觉模型设计,如LangVision-LoRA-NAS、Jet-Nemotron等。本文回顾NAS核心技术,解析其自动化设计原理,探讨强化学习、进化算法与梯度方法的应用与差异,揭示NAS在大模型时代的潜力与挑战。
1102 6
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
|
10月前
|
机器学习/深度学习 资源调度 计算机视觉
RT-DETR改进策略【Conv和Transformer】| CVPR-2022 Deformable Attention Transformer 可变形注意力 动态关注目标区域
RT-DETR改进策略【Conv和Transformer】| CVPR-2022 Deformable Attention Transformer 可变形注意力 动态关注目标区域
505 15
RT-DETR改进策略【Conv和Transformer】| CVPR-2022 Deformable Attention Transformer 可变形注意力 动态关注目标区域
|
机器学习/深度学习 人工智能 文件存储
【小样本图像分割-3】HyperSegNAS: Bridging One-Shot Neural Architecture Search with 3D Medical Image Segmentation using HyperNet
本文介绍了一种名为HyperSegNAS的新方法,该方法结合了一次性神经架构搜索(NAS)与3D医学图像分割,旨在解决传统NAS方法在3D医学图像分割中计算成本高、搜索时间长的问题。HyperSegNAS通过引入HyperNet来优化超级网络的训练,能够在保持高性能的同时,快速找到适合不同计算约束条件的最优网络架构。该方法在医疗分割十项全能(MSD)挑战的多个任务中展现了卓越的性能,特别是在胰腺数据集上的表现尤为突出。
272 0
【小样本图像分割-3】HyperSegNAS: Bridging One-Shot Neural Architecture Search with 3D Medical Image Segmentation using HyperNet
|
存储 NoSQL 文件存储
TFS分布式文件系统应用
TFS是淘宝开源的一套高性能文件存储系统,在阿里广泛应用,除了自建文件系统,在应用上云的大趋势下,还可以使用阿里云的对象存储OSS服务。
9927 0
TFS分布式文件系统应用
|
机器学习/深度学习 PyTorch Shell
必知的技术知识:ImageNet数据集介绍和下载后的处理
必知的技术知识:ImageNet数据集介绍和下载后的处理
1909 0
|
数据可视化
【word visio绘图】关闭visio两线交叉的跳线(跨线)
【word visio绘图】关闭visio两线交叉的跳线(跨线)
1127 0