另辟蹊径:聊聊DFL3小样本深度学习(一)

之前写了一篇《LAXCUS集群操作系统是个啥》,放到网上后收到网友私信,要求讲讲DFL3小样本深度学习。老实说,我本人不在AI研发团队,让我来讲DFL3,有点班门弄斧的感觉。但是我们团队和AI团队交流颇多,来往互动非常频繁,他们开发的AI编程接口都是交给我们,一起做LAXCUS集群操作系统的联调联试工作。思量下来,今天就越俎代疱一把,说说DFL3。咱们还是老规矩,只做通俗介绍,不涉及过于深奥的技术内容。原因一是DLF3目前尚未成型,很多技术仍处于变化状态,不便说得太多,免得误人子弟打脸脸;二是我本人对DFL3底层技术了解有限,怕说错了让诸位怡笑大方。所以,这篇文章只针对小白,AI技术大牛请绕行。

先说名字,DFL3是“Deep Few Learning”的首字母缩写,目前发展到第三个代次。中文名称,现在有直译成“深度微学习”,也有意译成“小样本深度学习”。在我们团部内部,经常使用的是“小样本深度学习”,这个名称更能表达我们开发工作的本来意思。

开发DFL小样本深度学习,主要源自LAXCUS集群操作系统研发团队这样两个动机:

  1. LAXCUS集群操作系统承载着海量的计算机资源、业务调度、分布计算服务,如果用人力来管理这些工作,成本高效果差并且不稳定,而采用人工智能技术应该能够弥补这一个短板。
  2. 在此基础上,开发出一套低成本可迁移的智能设备管理方案。

目前第一个项已经通过DFL1和DFL2达到,LAXCUS集群操作系统的网络流量控制、资源管理、任务分配、负载平衡等工作,都实现了自主调节、自主控制和自主分派。

DFL3针对第二个项,它基于DFL1和

### YOLO训练中的损失函数 #### Epoch Epoch表示在整个训练集中完成次前向传播和反向传播的过程。每次迭代都会更新网络权重,直到达到预定的epoch次数或满足特定条件为止[^1]。 #### GPU_mem GPU内存指用于存储模型参数、中间激活值以及梯度的空间大小。在YOLO训练期间,如果遇到`out of memory`错误,则可能是因为分配给该进程的显存不足所致。 #### Box Loss (边界框回归损失) Box loss衡量预测边界框与真实标注之间的差异程度。具体来说,它通过计算中心坐标(x,y)、宽度w及高度h这四个属性来评估定位精度。通常采用均方误差(MSE) 或者IoU(Intersection over Union)形式的距离度量方法来进行量化: ```python def compute_box_loss(pred_boxes, target_boxes): # pred_boxes 和 target_boxes 的形状均为 [N, 4], N 是 batch size center_diff = torch.sum((pred_boxes[:, :2] - target_boxes[:, :2]) ** 2, dim=1) wh_ratio_clip = torch.clamp(target_boxes[:, 2:] / pred_boxes[:, 2:], min=0.2, max=5.) scale_weight = 2. - target_boxes[:, 2:].prod(dim=-1) return ((center_diff * scale_weight).mean() + F.smooth_l1_loss(torch.sqrt(wh_ratio_clip), torch.ones_like(wh_ratio_clip)).mean()) ``` #### Class Loss (分类置信度损失) Class loss负责监督目标类别预测的质量。对于多类别的检测任务而言,般会利用交叉熵(Cross Entropy)作为评价标准之,在正样本上最大化正确标签的概率分布;而在负样本处则最小化所有非背景类别的得分总和。 ```python import torch.nn.functional as F def class_loss(predictions, targets): positive_mask = targets != 0 negative_mask = ~positive_mask pos_class_loss = F.cross_entropy( predictions[positive_mask], targets[positive_mask].long(), reduction=&#39;sum&#39; ) neg_confidence_loss = F.binary_cross_entropy_with_logits( predictions[negative_mask][:, :-1], # 排除最后维代表背景类 torch.zeros_like(predictions[negative_mask][:, :-1]), reduction=&#39;sum&#39; ) total_samples = positive_mask.sum().float() if total_samples.item() > 0: avg_pos_class_loss = pos_class_loss / total_samples else: avg_pos_class_loss = 0. num_negatives = negative_mask.sum().float() if num_negatives.item() > 0: avg_neg_confidence_loss = neg_confidence_loss / num_negatives else: avg_neg_confidence_loss = 0. return avg_pos_class_loss + avg_neg_confidence_loss ``` #### DFL Loss (Distribution Focal Loss) DFL旨在缓解类别不平衡带来的影响,特别是当某些细粒度子类别数量较少时尤为明显。其核心思想在于引入额外的组离散概率分布变量z_ij∈{0,...,k−1},用来描述每个锚点位置i下的最佳匹配真值j相对于预定义网格间距Δx/Δy的比例关系。最终得到的整体代价函数由两部分组成:是常规意义上的CE项;二是针对上述辅助变量施加KL散度约束力矩T(z|x),从而实现更加鲁棒的学习效果。 ```python from scipy.stats import norm def distribution_focal_loss(logits, labels, alpha=0.25, gamma=2.0): p_t = logits.gather(-1, labels.unsqueeze(-1)) modulating_factor = (alpha * (1-p_t)**gamma).squeeze() z_distribution = [] k = 9 # 假设我们有九个候选比例区间 [-4,-3,...,+4] delta_x = 1./8 # 步长为八分之单位长度 for i in range(k): mu_i = (-4+i)*delta_x sigma_squared = (delta_x**2)/12 pdf_values = norm.pdf(labels.float(), loc=mu_i, scale=torch.sqrt(sigma_squared)) normalized_pdf = pdf_values/(pdf_values.sum(axis=-1, keepdims=True)+1e-7) z_distribution.append(normalized_pdf) stacked_z_dist = torch.stack(z_distribution,dim=-1) kl_divergence = -(stacked_z_dist*logits.softmax(-1)).sum(-1)*(modulating_factor*(p_t<=0.5)) return kl_divergence.mean() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值