当前位置: 首页 > news >正文

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

论文题目:”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.部分实验结果

在这里插入图片描述

相关文章:

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

论文题目:”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/insightfac…...

递归方法读取任意深度的 JSON 对象的键值

有以下json字符串 {"name":"John","age":30,"address":{"city":"New York","state":"NY","zip":"10001","coordinates":{"latitude":40.712776,&q…...

黑马redis学习记录:分布式锁

一、基本原理和实现方式对比 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行…...

对React-Fiber的理解,它解决了什么问题?

对React-Fiber的理解,它解决了什么问题?Fiber用来解决什么问题?Fiber是什么?Fiber是如何解决问题的?Fiber用来解决什么问题? JavaScript引擎和页面渲染引擎两个线程是互斥的,当其中一个线程执行…...

【Linux】初学Linux你需要掌握这些基本指令(二)

目录 1.man指令 2.cp指令 3.mv指令 4.tree指令 5.echo指令 6.more指令 7.less指令(重要) 8.head与tail指令 9.date指令 显示时间常用参数: 设置时间常用参数: 10.cal指令 11.find & whereis & which指令 …...

Linux中VI/VIM 编辑器

1、概述所有Linux系统都会内置vi文本编辑器vim是vi的升级版,可以主动以字体颜色分辨语法的正确性,代码补完和编译,错误跳转等功能。2、vi和vim的三种模式基本上 vi/vim 共分为三种模式,分别是一般模式、编辑模式、命令模式2.1、一…...

PDF怎么转换成Word?两种PDF免费转Word方法推荐

不知道你们有没有发现,我们在网上下载的很多资料都是PDF格式的,尽管PDF文件也可以通过专门的PDF编辑器来编辑,但是PDF文档作为版式文档,编辑起来还是存在很多局限性,所有当我们需要大量编辑修改文档的时候,…...

极兔一面:Dockerfile如何优化?注意:千万不要只说减少层数

说在前面 在40岁老架构师 尼恩的读者交流群(50)中,面试题是一个非常、非常高频的交流话题。 最近,有小伙伴面试极兔时,遇到一个面试题: 如果优化 Dockerfile? 小伙伴没有回答好,只是提到了减少镜像层数。…...

SpringBoot+Vue实现酒店客房管理系统

文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏…...

自适应多因素认证:构建不可破解的企业安全防线|身份云研究院

打开本文意味着你理解信息安全的重要性,并且希望获取行业最佳实践来保护你所在组织的信息安全。本文将带你了解多因素认证(MFA:Multi-Factor-Authentication)对于企业信息安全的重要性以及实施方法。 多因素认证(MFA&…...

阶段二8_集合ArrayList_学生管理系统_详细步骤

一.学生管理系统案例 1.需求: 针对目前我们的所学内容,完成一个综合案例:学生管理系统! 该系统主要功能如下: 1.添加学生:通过键盘录入学生信息,添加到集合中 2.删除学生:通过键盘录…...

一篇解决Linux 中的负载高低和 CPU 开销并不完全对应

负载是查看 Linux 服务器运行状态时很常用的一个性能指标。在观察线上服务器运行状况的时候,我们也是经常把负载找出来看一看。在线上请求压力过大的时候,经常是也伴随着负载的飙高。 但是负载的原理你真的理解了吗?我来列举几个问题&#x…...

关于IDM下载器,提示:一个假冒的序列号被用来注册……idea项目文件路径报红

关于IDM下载器,提示:一个假冒的序列号被用来注册……到C:\Windows\System32\drivers\etc 修改目录下面的hosts文件(如果没有修改的权限就右键属性hosts文件修改user的权限为完全控制),在hosts里面增加以下内容&#xf…...

JVM - 高效并发

目录 Java内存模型和内存间的交互操作 Java内存模型 内存间的交互操作 内存间交互操作的规则 volatile特性 多线程中的可见性 volatile 指令重排原理和规则 指令重排 指令重排的基本规则 多线程中的有序性 线程安全处理 锁优化 锁优化之自旋锁与自适应自旋 锁优…...

中小学智慧校园电子班牌系统源码 Saas云平台模式

智慧电子班牌区别于传统电子班牌,智慧校园电子班牌系统更加注重老师和学生的沟通交流和及时数据交互。学校为每个教室配置一台智能电子班牌,一般安装于教室门口,用来实时显示学校通知、班级通知,可设置集中分布式管理,…...

记录一次服务器被攻击的经历

突然收到阿里云发过来的异常登陆的信息: 于是,急忙打开电脑查看对应的ECS服务器的记录: 发现服务器的cpu占用率异常飙升,所以可以大概断定服务器已经被非法入侵了。 通过自己的账号登陆后,发现sshd服务有异常的链接存…...

Python解题 - CSDN周赛第29期 - 争抢糖豆

本期问哥是志在必得,这本算法书我已经觊觎许久,而之前两次因为种种原因未能如愿。因此,问哥这几天花了不少时间,把所有之前在每日一练做过的题目重新梳理了一遍。苦心人,天不负,感谢官方大大! 第…...

C代码中访问链接脚本中的符号

一、目的在之前的《GNU LD脚本命令语言(一)》、《GNU LD脚本命令语言(二)》我们介绍了GNU链接脚本的知识点,基本上对链接脚本中的SECTION、REGION、以及加载地址与执行地址的关系等内容有了一定的了解。本篇主要讲解链…...

MySQL 8:MySQL索引

索引就是通过一定的算法建立数据模型,用于快速查找某一列中具有特定值的行。如果没有索引,MySQL 必须从第一条记录开始读取整个表,直到找到相关的表。表越大,查询数据所花费的时间就越多。如果表中查询的列有索引,MySQ…...

JVM详解

一,JVM 1,JVM区域划分 类装载器,运行时数据区,字节码执行引擎 2,JVM内存模型(运行时数据区) 由本地方法栈,虚拟机栈,堆,方法区,和程序计数器组成。…...

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

GitHub 趋势日报 (2025年06月06日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...