本篇BLOG整合了各种调参技巧,
推荐两个好用的种子
其他可以试用的
def rgb_norm(image):
r, g, b = cv2.split(image)
r = (r - np.mean(r)) / np.std(r)
g = (g - np.mean(g)) / np.std(g)
b = (b - np.mean(b)) / np.std(b)
return cv2.merge((r, g, b))
其中,(x_1)和(x_2)是两个输入样本,(y_1)和(y_2)是对应的标签,(lambda)是一个在[0, 1]之间的超参数,用于控制混合的比例。通过这种方式,mixup可以生成新的训练样本,从而提高模型的泛化能力。在CV中几乎必定涨点。
focal loss(Lin et al., 2017)是一种针对样本不均衡问题的损失函数,通过调整难易样本的权重来提高模型对难分类样本的关注度。其定义为:
[mathcal{L}(p_t) = -alpha_t (1 - p_t)^gamma log(p_t) ]
其中,(p_t)是模型对正确类别的预测概率,(alpha_t)是类别的权重,(gamma)是调节难易样本的超参数。通过这种方式,focal loss可以有效缓解样本不均衡问题,提高模型对少数类的识别能力。
学习任务中,loss可能包含多个成分,loss = a * loss1 + b * loss2 + c * loss3 怎么设置 ?这时候需要平衡各个loss的尺度。常见的做法有:
不同任务可能需要不同的损失函数。选择合适的损失函数可以帮助模型更好地学习各个任务的特征。
Adam和SGDM是最常用的两个,前者能快速收敛,后者收敛慢但最终精度更高。现在大家会先使用Adam快速收敛,后面再用SGDM提升精度。
代码分别如下:
# Adam
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# SGDM
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
如果你在计算机视觉里用Adam之类的自适应优化器,得到的结果很有可能会离SGD的baseline差好几个点。主要原因是,自适应优化器容易找到sharp minima,泛化表现常常比SGD差得显著。如果你训练Transformer一类的模型,Adam优化得更快且更好。主要原因是,NLP任务的loss landscape有很多“悬崖峭壁”,自适应学习率更能处理这种极端情况,避免梯度爆炸。
训练的最后阶段,如果不主动把learning rate降下去,loss根本就不会自己收敛到一个比较小的值.
一般来说,越大的batch-size使用越大的学习率。原理很简单,越大的batch-size意味着我们学习的时候,收敛方向的confidence越大,我们前进的方向更加坚定,而小的batch-size则显得比较杂乱,毫无规律性,因为相比批次大的时候,批次小的情况下无法照顾到更多的情况,所以需要小的学习率来保证不至于出错。可以看下图损失Loss与学习率Lr的关系:
warmup and decay一起使用
实验证明,有了warmup之后模型能够学习的更稳定。可以直接调用库函数代码
from torch.optim.lr_scheduler import LambdaLR
def lr_lambda(epoch):
if epoch
[eta_t=frac{1}{2}left(1+cosleft(frac{tpi}{T}right)right)eta ]
我们不是要求我们的模型为正确的类别预测 1,而是要求它为正确的类别预测 1-ε,并将所有其他类别预测为 ε. 它被视为一种正则化技术,因为它限制了softmax 函数的最大概率使最大概率不会比其他标签大得多(防止模型过度自信)。
import torch.nn.functional as F
def reduce_loss(loss, reduction='mean'):
return loss.mean() if reduction=='mean' else loss.sum() if reduction=='sum' else loss
class LabelSmoothingCrossEntropy(nn.Module):
def __init__(self, epsilon:float=0.1, reduction='mean'):
super().__init__()
self.epsilon = epsilon
self.reduction = reduction
def forward(self, preds, target):
n = preds.size()[-1]
log_preds = F.log_softmax(preds, dim=-1)
loss = reduce_loss(-log_preds.sum(dim=-1), self.reduction)
nll = F.nll_loss(log_preds, target, reduction=self.reduction)
return linear_combination(loss/n, nll, self.epsilon)
[W sim mathcal{N}(0, frac{2}{n_{in} + n_{out}}) ]
[W sim mathcal{N}(0, frac{2}{n_{in} cdot k^2}) ]
其中,(n_{in})和(n_{out})分别是输入和输出的神经元数量,(k)是卷积核的大小。缺点:Xavier初始化有一定限制,其推导过程假设激活函数在零点附近接近线性函数,且激活值关于0对称。Relu函数很明显是不对称的。[W sim mathcal{N}(0, frac{2}{n_{in}}) ]
其中,(n_{in})是输入神经元的数量。
知识蒸馏(Knowledge Distillation)是一种通过大型模型(Teacher)指导小型模型(Student)学习的模型压缩技术,其核心思想是将复杂模型的知识“蒸馏”到轻量模型中,在保持性能的同时提升效率。
训练大型模型(Teacher Network)
目标:在数据集上训练一个高性能但复杂的模型(如ResNet、BERT等)。
计算软标签(Soft Labels)
通过温度参数(Temperature, T) 调整Softmax的输出平滑度:
[text{Softmax}(z_i) = frac{e^{z_i / T}}{sum_j e^{z_j / T}} ]
T的作用:
举个例子,Teacher原始输出logits为[2.9, 0.1, 0.23]
[mathcal{L}_{text{distill}} = text{KL}left(text{Softmax}(text{Student}/T) parallel text{Softmax}(text{Teacher}/T)right) ]
其二是监督损失(Supervised Loss): 利用交叉熵度量与真实硬标签的误差:
[mathcal{L}_{text{supervised}} = text{CE}(text{Student}, y_{text{true}}) ]
总损失可以表示为
[mathcal{L}_{text{total}} = alpha cdot mathcal{L}_{text{distill}} + (1-alpha) cdot mathcal{L}_{text{supervised}} ]
其中,(alpha) 控制软/硬标签的权重(通常(alpha=0.7))
参与评论
手机查看
返回顶部