【人脸识别】Partial-FC:让你在一台机器上训练1000万个id人脸数据集成为可能!

news2025/7/18 10:16:40

论文题目:”Killing Two Birds with One Stone: Efficient and Robust Training of Face Recognition CNNs by Partial FC“ -CVPR 2022
代码地址:https://arxiv.org/pdf/2203.15565.pdf
代码地址:https://github.com/deepinsight/insightface/tree/master/recognition/arcface_torch

1.背景

分布式训练的问题:

数据并行:将训练数据划分给每台机器,每个结点拥有完整的模型,然后将每个结点反向传播得到的梯度进行聚合,将聚合后的梯度再分发给各个结点更新参数,缺陷是需要在每个结点间传播梯度信息,因此通信开销会非常大。
模型并行:在人脸识别的场景下,假如 FC 层权重为 W ,d 是特征向量的维度,C 是人脸类别数量,那么其实 W 的第 i 列可以视作第 i 类的类中心。模型并行是将 W 按类别划分给各个结点,假如有 k 个结点,将 C 个类中心划分给每个结点,每个结点拥有 C/k 个类中心。那么需要计算样本的softmax loss时,将每个结点的样本特征先进行all_gather(即将每个结点的所有样本特征汇聚在一起再分发给所有结点)操作,这样每个结点就拥有所有样本特征,然后每个结点计算样本与其拥有的类别中心logit,然后再求指数,即可得到softmax的分母部分和,再对这个部分和进行all_reduce(将每个结点的某个tensor聚合在一起计算一个新的tensor再分配给各个结点),这样每个结点就拥有的完整的softmax的分母,即可计算每个样本的softmax loss。然后因为特征的梯度牵涉到了每个类中心,因此还需要将关于特征的梯度进行all_reduce,然后梯度在各自结点反向传播。这样需要通信的就是一个batch的特征+分母的部分和+特征的梯度。当C 增大时,可以通过增加结点数量 k 保持 C/k 恒定,但是每个结点由于需要保存所有样本,需要存储的logit的数量是 Nk * C/k > = N * C , N 是batch size的大小,而 C 往往是十万、百万的量级,因此随着 C 的增大,单个结点的显存总会捉襟见肘。

数据的问题:

长尾分布(long-taied distribution):即类别数量不平衡,少数类别(称为head class)拥有大部分样本,大多数类别(称为tail class)只有少数样本。这样优化时会更关注负类,tail class的类中心会被远离负类中心,偏离它所代表的类。
类间冲突(inter-class conflict):同一个人被分到了不同类里,例如某人既有一张图片label是0类,也有另一张图片label是1类。这样优化时肯定会发生冲突。

–SST [11] and DCQ [21] directly abandon the FC layer and employ a momentum-updated network to produce class weights. However, the negative class number is constrained to past several hundred steps and two networks need to be maintained in the GPU.

2.方法

        既然logits的数量是 N*C ,作者提出的解决单个结点显存问题的方法也很简单,减少 C —— 随机采样类别中心,称为Partial FC。具体来说,先考虑只有单个结点的情况,每次迭代会随机采样 N 个样本(batch),那么只保留这 N 个样本对应的类别中心(称为正类别中心),然后随机采样负类别中心,再计算softmax loss;而对于模型并行的多结点的情况,首先各个结点交换batch样本的信息,保留所有正类别中心,例如第零个结点的数据的类别有1,而类别中心是1、2、3、4,而第一个结点数据的类别是2,那么第零个结点应该保留1、2这两个类别中心,然后再随机采样负类别中心。通过PFC,将减少空间开销,加速训练,同时模型性能也没有显著变化,并且也能改善长尾分布与类间冲突的问题。

softmax loss(cosface、arcface等形式与其基本相同):
在这里插入图片描述

loss关于特征向量 xi 的导数(希望 xi 接近正类别中心W+):
在这里插入图片描述

类别中心 Wj 更新公式(希望Wj接近正样本)
在这里插入图片描述
softmax loss 缺点:

1)The first limitation is the gradient confusion under inter-class conflict. (第一个局限是类间冲突下的梯度混淆)
2)The second limitation is that centers of tail classes undergo too many passive updates. (第二个局限是尾部类的中心经历了太多的被动更新)
3)The third limitation is that the storage and calculation of the FC layer can easily exceed current GPU
capabilities.(第三个局限是FC层的存储和计算很容易超过当前GPU的能力)

使用PFC后,公式(2)变为公式(4):
在这里插入图片描述

–为什么PFC能缓解长尾分布问题?
        如果数据存在长尾分布问题,那么考虑公式(3),对于tail class,正样本数量会非常少甚至为0,因此对应的类别中心 Wj 只会远离负样本,而很难接近正样本,那么长此以往就无法表征正类别中心了。应用了FPC之后,由于每次迭代随机采样负类别中心,那么tail class对应的类别中心被更新的频率也降低了,缓解了上述问题。

–为什么PFC能缓解类间冲突问题?
        如果发生类间冲突,那么在(2)中负类中心 Wj 可能也能表征正类别中心,(3)中 xi 实际上可能是正样本,那么优化时肯定会发生异常,称为"gradient confusion"。使用了PFC后,概率变小了,(2)和(3)中冲突的负类别中心和负样本被选择的概率就小了,那么类间冲突的问题也能得到缓解。还有一点是应用了PFC能够过滤掉冲突的负类中心。

在这里插入图片描述

        Conflict-Hard指样本与困难负类中心的平均余弦相似度,conflict-Noise指样本与冲突类别中心的余弦相似度,(a)是没有经过负类别中心随机采样的结果,(b)是采样率为 r =0.1 时的实验结果,可以看到此时它们之间有个明显的gap,因此设定合适的阈值就可以过滤掉冲突的负类别中心(文中取0.4)。

模型并行+PFC流程
在这里插入图片描述

1.每个结点拥有部分类别中心,如图中每个CPU下拥有14个类别中心。
2.在一次迭代中,每个结点的样本的embedding进行聚合,并分发给各个结点,此时每个结点拥有该次迭代的所有样本的embedding。
3.每个结点将所有样本对应的正类别中心从CPU复制到GPU中,例如第一个结点具有的正类别中心是深红、浅蓝、橙红、浅红这四种,将它们从CPU-1复制到GPU-1中,剩余的位置随机采样负类别中心(图中的深灰色)。
4.计算每个结点的logits(即 wx ) ,结果即图中的有色网格, (i, j) 处的位置表示第 i 个embedding与第 j 个类别中心的内积结果。
5.根据阈值过滤掉冲突的负类别中心,即图中蓝色的叉叉。
6.聚合各个结点的结果。

3.部分实验结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maxwell简介、部署、原理和使用介绍

Maxwell简介、部署、原理和使用介绍 1.Maxwell概述简介 1-1.Maxwell简介 ​ Maxwell是由美国Zendesk公司开源,使用Java编写的MySQL变更数据抓取软件。他会实时监控Mysql数据库的数据变更操作(包括insert、update、delete),并将变…

【DockerCE】Docker-CE 23.0.1正式版发布

很意外啊!Docker社区版竟然直接从20.xx.xx版本,升级到23.xx.xx版本了。官网地址(For RHEL/CentOS 7.9):https://download.docker.com/linux/centos/7/x86_64/stable/Packages/23.0.1版本官方安装包如下:# l…

给初级开发人员的建议

#初学者#生产率#代码新手#学习在我超过 15 年的开发生涯中,我学到了一些可以显着提高我的效率的东西。在这篇文章中,我将与您分享这些经验教训。结构:基础建议——以下内容的重要背景和动机技术咨询——主菜推荐读物——指向非常适合入门的高…

30-Golang中的排序和查找

排序和查找排序的基本介绍交换式排序法交换式排序法-冒泡排序查找顺序查找二分查找排序的基本介绍 排序是将一组数据,依指定的顺序进行排列的过程 排序的分类: 1.内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换…

20N65-ASEMI高压MOS管20N65

编辑-Z 20N65在ITO-220AB封装里的静态漏极源导通电阻(RDS(ON))为0.42Ω,是一款N沟道高压MOS管。20N65的最大脉冲正向电流ISM为80A,零栅极电压漏极电流(IDSS)为10uA,其工作时耐温度范围为-55~150摄氏度。20N65功耗&…

Spring Boot最核心的27个注解,你了解多少?

https://blog.csdn.net/ManuMAX/article/details/129017443 导读 Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringCloud集成…

前端学习第一阶段——第五章CSS(下)

5-9 浮动 08-浮动导读 09-传统网页布局三种方式 10-为什么需要浮动 11-什么是浮动 12-浮动特性-脱标 13-浮动特性-浮动元素一行显示 14-浮动特性-浮动元素具有行内块特性 15-浮动元素经常搭配标准流的父元素 16-浮动布局练习1 <!DOCTYPE html> <html lang"en&quo…

从青铜到王者,揭秘 Serverless 自动化函数最佳配置

作者&#xff1a;丛霄 背景介绍 全托管的 Serverless 计算平台能给用户带来更少的运维代价、更强的稳定性和更快的弹性能力。 Serverless 的目标之一是免运维&#xff0c;但仍旧存在一些障碍&#xff0c;在 Serverless 场景特有的一些关键服务配置比如**“并发度”、“最小实…

史上最详细的PyCharm快速上手指南,你值得拥有

上一节中我们介绍了Python并安装了环境&#xff0c;有了Python环境我们就可以开发了吗&#xff1f;各位朋友们。 也可以也不可以&#xff01;哈哈哈不要怪我朋友们&#xff0c;我说的是事实。 如果你喜欢Python自带的Python命令开发&#xff0c;即我们所说的交互式&#xff0…

5.33 综合案例2.0 -ESP32拍照上传阿里云OSS

综合案例2.0 - ESP32拍照上传阿里云OSS案例说明连线功能实现1.阿里云平台连接2.OSS对象存储服务3.ESP32-CAM开发环境4.代码ESP32-CAM开发板代码HaaS506开发板代码测试数据转图片方法案例说明 使用ESP32拍照,将照片数据上传阿里云OSS&#xff08;通过4G网络上传&#xff09;。 …

【ArcGIS Pro二次开发】(4):ArcGIS Pro封装的窗体控件

在ArcGIS Pro&#xff0c;有一类窗体控件是系统已经封装好的&#xff0c;比如消息框、提醒框等。下面通过代码来学习一下。 新建一个项目&#xff0c;命名为【ProWindow】&#xff0c;添加5个按钮&#xff0c;命名为【Show_MessageBox、Show_NoticeBox、Show_OpenDialog、Show…

交通部互通互联码的根证书规则

引言 为了更好的服务交通互通互联码而更新这篇文章。 中金根证书其实是可以自己生成的。 代码内调整 中心公钥索引要保证自己的唯一性。 此处的唯一&#xff0c;是要保证在机具侧的唯一&#xff0c;因为他要根据这个索引去查找证书以及公钥。 提供根公钥给机具侧 生成的公钥…

“黑洞”竟是外星人的量子计算机?

宇宙中的黑洞可以用作终极量子计算机&#xff0c;我们可以从中探索它们的特征。&#xff08;图片来源&#xff1a;网络&#xff09;我们完全有理由怀疑生命在我们的宇宙中很常见&#xff0c;但是为什么我们从未发现过其他生命存在的迹象&#xff1f;这个问题几乎自现代天文学诞…

JavaScript 教程

手册简介JavaScript 是世界上最流行的脚本语言。 JavaScript 是属于 web 的语言&#xff0c;它适用于 PC、笔记本电脑、平板电脑和移动电话。 JavaScript 被设计为向 HTML 页面增加交互性。 许多 HTML 开发者都不是程序员&#xff0c;但是 JavaScript 却拥有非常简单的语法。几…

SpringBoot Data JPA配置多数据源

SpringBoot Data JPA配置多数据源1. Dependency2. Application.properties3. Code3.1 Datasource config3.2 Primary Config3.3 Second Config4. Awakening1. Dependency <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jd…

常用设计模式介绍

java设计模式类型创建型模式&#xff1a;将对象的创建与使用分离结构型模式&#xff1a;如何将类和对象按照某种布局组成更大的格局行为型模式&#xff1a;用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务23种设计模式介绍1.单例&#xff08;Singleton&…

linux高级命令之软件安装

软件安装学习目标能够使用apt-get命令安装软件1. 软件安装的介绍Ubuntu软件安装有两种方式:离线安装(deb文件格式安装&#xff09;在线安装(apt-get方式安装)2. deb文件格式安装是 Ubuntu 的安装包格式&#xff0c;可以使用 dpkg 命令进行软件的安装和卸载。命令说明dpkg安装和…

以“大数据”赋能产业链精准招商

​ 随着我国产业发展的不断迭代升级&#xff0c;传统招商模式的不足逐步凸显&#xff0c;侧重土地与税费优惠的同质化竞争招商以及来者不拒的无门槛型招商已经遏制了区域产业的发展&#xff0c;导致各产业园区很难形成产业集聚及持续的吸引力。在这样的大环境下&#xff0c;产业…

使用LogToHtml导出Airtest报告

simple_report接口&#xff0c;是个简化版的生成报告接口&#xff0c;如果仅仅需要在本地查看的话&#xff0c;用这个接口即可。 但是如果需要导出报告&#xff0c;即他人也可以正常查看&#xff0c;则需要用LogToHtml类。 参数解释 script_root&#xff0c;脚本路径 log_ro…

论一个上班族如何一次性通过PMP考试

PMP是我工作后考取的一个证书。从准备到通过&#xff0c;花了大约三个月的时间。我之前在某家互联网公司从事程序员的工作&#xff0c;工作一段时间后&#xff0c;天天敲着代码&#xff0c;改着bug&#xff0c;感觉比较迷茫&#xff0c;不知道未来的发展在哪里&#xff0c;都说…