zoukankan      html  css  js  c++  java
  • ArcFace层问题分析

    Arcface训练问题分析

    1、现象

    使用ArcFace 层时,训练前期准确率一直为0,到后面才逐渐上升;

    2、分析

    从代码入手

    output = (y * phi) + ((1.0 - y) * cosine)

    output *= s

    y 是one-hot形式的真实label,phi=cos(θ+m),cosine=cosθ,θ即特征向量与权值向量的夹角。则:

    (1)     label = 0 -> y=[1, 0] -> output = [s*cos(θ1+m), s*cosθ2]

    (2)     label = 1 -> y=[0,1] -> output = [s*cosθ1, s*cos(θ2+m)]

    然后经过softmax操作进行概率转换;

     

    初始时,θ1和θ2在高维空间中均接近pi/2,m一般为正数(这里为0.05)。针对softmax的输出使用CE-loss进行约束,形式如下:

     

    则:

    (1)   label = 0 ->  损失函数会朝着s*cos(θ1+m) >> s*cosθ2 的方向约束,结合cos函数在[0, pi]上的单调递减性,则(θ1+m) 应越来越小于 θ2;但是初始时 θ1=θ2=pi/2,则θ1+m 在训练初期都大于θ2,即训练初期 s*cos(θ1+m) < s*cosθ2 ,即label = 0 时, prediction =1;

    (2)   label = 1时的情况同上

    所以训练初期:label = 0 的样本都被判为负样本,label = 1的样本都被判为正样本,所以训练初期acc = 0%。

    而随着训练的不断进行,比如对于label = 0时, θ1从pi/2缩小到pi/2 -m 至更小时,则acc开始上升。

    备注:m值需为正数,它代表着类别在角度空间中的margin。若m为负数,则根据上面的分析可知:训练初期就有θ1+m<θ2,从而导致对于θ1没有惩罚作用。(训练时acc均为100%)

  • 相关阅读:
    CAP 可用性理解
    如何真正理解设计模式
    jdk concurrent 中 AbstractQueuedSynchronizer uml 图.
    test 博客园功能 和 搜索 seo 能力
    异或运算进行两数交换
    基本排序之冒泡排序
    对数器的使用(用来生成随机数组来判断排序算法是否正确)
    全双工,半双工,单工的概念
    mac下彻底卸载mysql方法
    AngularJs学习第一课 Hello World
  • 原文地址:https://www.cnblogs.com/zf-blog/p/14273357.html
Copyright © 2011-2022 走看看