论文题目:《L2-constrained Softmax Loss for Discriminative Face Verification》
论文地址:https://arxiv.org/pdf/1703.09507.pdf

1. 简介

CNN近年来取得了很大的成功,人脸识别也受益匪浅。人脸识别的一个基准包括一个序列网络和一个Softmax标准。在这篇论文中,作者分析了Softmax损失的一些劣势,然后提出一种基于约束条件的Softmax损失,即L2 Softmax损失。
       Softmax损失优化出来的特征不具有较高的类内相似度得分及较低的类间相似度得分。论文增加了特征描述子的L2约束,使得特征分布在具有固定半径的超球上。

2. Softmax为什么不适合做人脸验证任务

softmax loss只是保证学习到的特征不用做任何matric learning的时候,能够使得人脸特征可分。但是softmax loss并没有保证positive pairs学到的特征足够近而negative pairs学到的特征足够远,因此不是很适合去做人脸验证任务。另外一点是,softmax loss是要最大化给定的mini-batch中所有样本的条件概率。但是,由于高质量的人脸图像的特征​范数较大,低质量人脸图像的特征​范数较小,如果直接让容易验证的样本的​范数比较大,让难以验证的样本的​范数较小,则可以得到最小化的softmax loss。因此,如果直接使用softmax loss只关注了mini-batch中高质量的人脸图像,而忽略了该mini-batch中较少的低质量的人脸图像。

作者做了一个实验验证了Softmax损失训练,高质量具有较大的L2-norm的特征性能最好,如下图所示:


       如上图所示,低质量的图像对验证准确率最差,而高质量的图像对验证准确率最高,证明了作者上述观点。

3. L2-Softmax

L2_Softmax表达式如下:

上述公式解释如下:

● x_i 是规模为 M 的 mini-batch 内的一张输入图像
● y_i 是第 i 个目标
● f(x_i) 是最后的全连接层之前的 d 维特征描述量
● C 是类别的数量
● W 和 b 是网络中可训练的权重和偏差

上面的第一个公式是普通的 softmax 损失公式,第二个公式是约束公式。α 是最有意思的一项:用作所有特征向量的一个范数约束。好在其仅为网络引入了单个缩放参数,所以不会影响整体的训练速度。
       为什么要为网络添加一个 L2 范数约束?你可以这样看:其工作是更多地关注“坏”样本(有更多光照变化、视角变化等)。然后,好特征和坏特征都会被固定在一个超球面上,而且由于 L2 范数,它们会得到相似的关注度。对于没有约束的环境而言,给所有样本平均化的关注是极其重要的。当它能很好地泛化到质量较差的样本上时,它就可被视为为 softmax 分类器降低了非常好的样本的相对重要性。如果这个过程在人脸验证问题中实现,那么这就能强化验证信号:通过迫使同一类别的图像在这个归一化特征空间中更接近彼此,不同类别的图像距离更远,这样正例对和负例对之间的边界将变得更大。可以简单理解为:由于​损失函数使得所有人脸图像的特征的​范数大小相同,所以softmax loss不会只偏重于对easy samples的学习,也会对diffcult samples进行学习;由于特征的​范数大小一致,所以所有的特征样本的特征都分布于一个固定半径的超球面上,此时最小化softmax loss等价于最大化positive pairs之间的余弦相似度,同时最小化negative pairs之间的余弦相似度。


       上图为在MNIST上使用不同损失的聚类结果,显示了分别使用softmax和L2-softmax训练LeNet的效果,输出特征为2维(正常输出肯定不止两维,为了可视化简化了),可以发现两种特征的区别:一是L2-softmax损失学到的特征类内角度方差变小了,二是softmax损失学到的特征具有更大的幅值,而特征norm对L2-softmax损失影响较小。因此可以说L2-softmax学到的特征拉近了同类特征,拉远了不同类特征。


       如上图所示,作者使用了两个层来建立这种约束:一个L2归一化层和一个缩放层。公式如下:


       公式分别对应于这两层所完成的工作(只是建模这个约束等式)。L2 归一化层将输入特征向量 x 归一化成单位向量 y。然后缩放层根据参数 α 将输入单元向量 y 按固定尺度缩放。该网络中只引入了一个缩放参数,这个参数可以训练得到,也可人工设定。

训练时,需要将损失的梯度传过这个模块,应当根据 α(对于可训练的 α)使用链式法则计算缩放因子α的梯度,如下:


       尺度因子要么在训练中固定一个值,要么让网络学习。但是网络学习到的α比较大,L2-约束较为宽松。更好的方式是将α固定在较小的常量。但另一方面,非常小的α将导致训练无法收敛,因为小的α会导致超球的面积太小。论文提出了α的理论低值,假设类别数目C比特征维度小2倍,这样分布在球面上的每两类中心至少距离90°。假设分类器的权值Wi是指向类别中心的单位向量,正确分类特征的平均softmax概率为:



       上图显示了不同类别数目C,及不同尺度因子α对概率得分的影响,从图中可以看出,为了得到p=0.9的概率,大的C需要较大的α,给定p,α的下边界为:

4. 网络结构:Face-ResNet

使用Face-ResNet进行实验,该网络包含27个卷积层,2个全连接层,在FC层后增加L2-norm层及scale层,网络结构为:

【人脸识别】L2_Softmax Loss详解相关推荐

  1. 【人脸识别】arcface详解

    论文题目:<ArcFace Additive Angular Margin Loss for Deep Face Recognition > 论文地址:https://arxiv.org/ ...

  2. 【人脸识别】FaceNet详解

    论文题目:<FaceNet: A Unified Embedding for Face Recognition and Clustering> 论文地址:FaceNet 1.概述 Face ...

  3. 人脸识别动画实现详解(SurfaceView + ObjectAnimator + 三角函数 = 炫酷动画)

    前言 开门见山,先来看下效果吧. 看到这么酷炫的效果图,不得不赞叹一下我们的设计师.然而,站在程序员的角度上看,除了酷炫之外更多的是复杂.但是,上面我们所看到的还只是最简单的一种形态而已.更加复杂的情 ...

  4. 关于人脸识别SDK的详解。包括【face++ 、微众、有盾等】

    其实关于三方的人脸识别SDk 来讲,都差不多,只有有点基础,跟着文档走,完全是没问题的.今天在这先给大家介绍一下有盾SDK: 很多人听到有盾SDK很陌生,其实它是连连支付下的,这下明白清楚了很多吧. ...

  5. 【人脸识别】人脸验证算法Joint Bayesian详解及实现(Python版)

    人脸验证算法Joint Bayesian详解及实现(Python版) Tags: JointBayesian DeepLearning Python 本博客仅为作者记录笔记之用,不免有很多细节不对之处 ...

  6. 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】

    卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10) 在上一章已经完成了卷积神经网络的结构分析,并通过各个模块理解 ...

  7. matlab车牌匹配时读取,基于Matlab的车牌识别(完整版)详解.doc

    基于Matlab的车牌识别(完整版)详解.doc 基于Matlab的车牌识别 摘要:车牌识别技术是智能交通系统的重要组成部分,在近年来得到了很大的发展.本文从预处理.边缘检测.车牌定位.字符分割.字符 ...

  8. 人脸识别:arcFace Loss详解

    论文链接:ArcFace: Additive Angular Margin Loss for Deep Face Recognition  作者开源代码:https://github.com/deep ...

  9. 读书笔记-深度学习入门之pytorch-第四章(含卷积神经网络实现手写数字识别)(详解)

    1.卷积神经网络在图片识别上的应用 (1)局部性:对一张照片而言,需要检测图片中的局部特征来决定图片的类别 (2)相同性:可以用同样的模式去检测不同照片的相同特征,只不过这些特征处于图片中不同的位置, ...

最新文章

  1. Java高并发编程基础之AQS
  2. 1.1 欢迎-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授
  3. WF4.0 基础篇 (二) Activity介绍及WriteLine Activity的使用
  4. vcruntime140.dll 丢失64位系统(mysql8安装失败提示)
  5. boost::contract模块实现equal的测试程序
  6. php清空dns缓存文件,dns清空-windows刷新本地DNS缓存的几种方法
  7. LeetCode 1318. 或运算的最小翻转次数(位运算)
  8. 开发人员应该用好的一些网站
  9. HTML的文本格式化
  10. python wmi 重启网卡_python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法...
  11. matlab2008设置子函数断点无效,程序不在断点处停止
  12. 微信停机断网可充话费;苹果正研发可折叠屏幕 iPad;Rust 1.36.0 发布 | 极客头条...
  13. HDU 6274 Master of Sequence (暴力+下整除)
  14. 我的第一个WM5程序
  15. 强化学习论文分析3---蜂窝网络联合频谱和功率分配的深度强化学习--《Deep Reinforcement Learning for ......》
  16. Java LocalDate类| 带示例的getMonth()方法
  17. becon帧 wifi_beacon帧
  18. 无线服务器功能,无线自组织互联网的用户管理——Radius服务器的功能设计与实现...
  19. 解除控制伽卡他卡控制
  20. Java中线程基础-线程间的共享-volatile

热门文章

  1. 下划线_Python中下划线的5种含义
  2. STM32编码器的学习笔记
  3. 【C语言】Simple Sorting(结构)
  4. c++ 项不会计算为接受 0 个参数的函数_OFFSET函数从入门到进阶之进阶操作篇(与MATCH组合)...
  5. console_init_r()函数分析
  6. 在ROS中使用Neato XV-11 激光雷达
  7. 菜鸟学习笔记:Java提升篇5(IO流1——IO流的概念、字节流、字符流、缓冲流、转换流)
  8. Django学习之Cookie和Session
  9. Android 的Android Device Monitor 打不开出现 A error has occured
  10. 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)