【人脸识别】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里面增加以下内容…...
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内存模型(运行时数据区) 由本地方法栈,虚拟机栈,堆,方法区,和程序计数器组成。…...
MySQL数据库调优————索引数据结构
B-TREE B-TREE数据结构 B-TREE特性 根节点的子结点个数2 < X < m,m是树的阶 假设m 3,则根节点可有2-3个孩子 中间节点的子节点个数m/2 < y < m 假设m 3,中间节点至少有2个孩子,最多3个孩子 每个中间节点包含n个关…...
visual studio 改变界面语言
在使用visual studio 2019 时,开始是英文界面,后面变成了中文界面。但是看视频教学时有的是英文界面,我就想回到英文界面,所以有切换界面语言的需要。其实操作很简单:工具-> 选项 打开界面在界面里选择环境…...
2023.2.16每日一题——1250. 检查「好数组」
每日一题题目描述解题核心解法一:数论题目描述 题目链接:1250. 检查「好数组」 给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。 假如该和结果为 1&#x…...
亿级高并发电商项目-- 实战篇 --万达商城项目 八(安装FastDFS、安装Nginx、文件服务模块、文件上传功能、商品功能与秒杀商品等功能)
专栏:高并发---分布式项目 👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支…...
Viper捐款7000万韩元,合计人民币是多少钱?
Viper捐款7000万韩元,合计人民币是多少钱? #2023LCK春季赛##英雄联盟# #Viper捐款7000万韩元# Viper向大田东区捐款 7000 万,成为大田荣誉协会 105 号会员。Viper选手从 2019 年开始一直向大田东区捐款,但是他不希望这件事被公开…...
前端vue实现系统拦截跳转外链并进入跳转询问界面
跳转询问界面如下图所示: 给自己挖坑的实现方式,最终解决方案请看最底下 思路:正常情况下我们有2种方式跳转外链 第一种非a标签,我们手动添加事件进行跳转 <div class"dingdan public-padding p-item" click&quo…...
【Linux】Shell(Bash)单引号、双引号、不加引号和反引号用法和区别详解
简要总结 不加引号:不会将含有空格的字符串视为一个整体输出, 如果内容中有变量等,会先把变量解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号ÿ…...
本人使用的idea插件
文章目录🚏 本人使用的idea插件🚬 pojo to Json🚬 GsonFormatPlus🚬 EasyYapi🚬 Chinese (Simplified) Language Pack / 中文语言包🚬 MyBatis Log Free🚬 MyBatisPlusX🚬 Statistic…...
站在行业C位,谷医堂打开健康管理服务新思路
对于农村及贫困地区老百姓来说,由于交通因素和家庭经济条件制约,看病难致身体调理情况一直不太乐观,这也导致心理压力很大。然而,随着近年中医药产业崛起与快速发展,这种局面很快就会得到改观,以湖南谷医堂…...
ABO溶血症概率
[简介]ABO溶血是由于母亲和胎儿ABO血型不合引起的新生儿溶血,概率不是很大,一般出现在准妈妈是O血,准爸爸是非O血,这次容易发生血型不合,但新生儿ABO溶血概率不高,大多数症状相对较轻。ABO溶血的概率是什么…...
建设一个网站需要做哪些工作内容/网站seo是干什么的
1.1 几种常见存储设备的接口 1.IDE接口 IDE的英文全称为"Integrated Drive Electronics",即"电子集成驱动器",是曾经主流的硬盘接口。IDE接口也称之为ATA接口。ATA的英文拼写为"Advanced Technology Attachment"。2003年推…...
wordpress 长图片滑动/信息流广告素材网站
【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 Python数据分析 判断列表中元素是否全为True 判断列表中元素至少有一个为True all()和any() [太阳]选择题 以下python代码中两次输出结果分别是什么? a [1.0, True, 0, "a&quo…...
wordpress怎么自动生成内链/360站长工具seo
LinkedList实现队列简单描述:使用java.util.Queue接口,其底层关联到一个LinkedList(双端队列)实例。由于只暴露部分基于队列实现的接口,所以可以提供安全的队列实现。 LinkedList实现队列代码: package junit;import j…...
wordpress文章页设置/产品互联网推广
安装破解教程 1、下载安装包,解压缩并运行安装,选择需要安装的组件 2、阅读软件协议,勾选我接受协议 3、正在安装中,请耐心等待 4、安装成功,点击EXIT INSTALLER退出软件安装向导 5、断开网络连接,以管理员…...
网站怎么做微信扫描登录网站/whois查询 站长工具
一、修改Flex builder 1.用无格式编辑器打开FlashBuilder.ini 2.把zh_CN替换成"en_US" 二、修改MyEclipse插件 1.用无格式编辑器打开MyEclipse8.5\configuration\config.ini 2.最后添加osgi.nlen_US 三、修改Eclipse插件 1.用无格式编辑器打开eclipse.ini 2.顶部加入…...
wordpress 新安装 慢/金戈西地那非片
复制文件。 语法 FileCopy源,目标 FileCopy 语句语法包含以下命名参数: 部分说明source必需。 指定要复制的文件的名称的字符串表达式。 _源_可能包含目录或文件夹,和驱动器。目标必需。 指定的目标文件名称的字符串表达式。 _目标_可能包含目…...