【论文阅读12】Circle Loss:一统 Softmax 与 Triplet,从“线性”到“圆形”的优化视角

论文题目:《Circle Loss: A Unified Perspective of Pair Similarity Optimization》

目录

前言:两大门派的恩怨

派系一:基于分类的学习 (Classification-based)

派系二:基于度量的学习 (Metric Learning / Pairwise Learning)

为什么要提这个?(Circle Loss 的动机)

1. 万物归一 —— 统一视角 ()

1.1 统一 Loss 公式

1.2 计算量的“降维打击”

2. 证明 Softmax 和 Triplet 都是“特例”

2.1 退化为 Softmax ()

2.2 退化为 Triplet ()

3. 发现缺陷 —— 拒绝“死板”的优化

3.1 什么是“不够灵活”?

3.2 引入动态权重 ()

3.3 Circle Loss 最终形态

4. 几何解释 —— 为什么叫“Circle”?

4.1 决策边界的演变

4.2 圆形的意义

5. 梯度验证 —— 数学上的实锤


前言:两大门派的恩怨

派系一:基于分类的学习 (Classification-based)

  • 代表:Softmax, SphereFace, CosFace, ArcFace。
  • 原文描述:“优化样本和权重向量之间的相似性” (optimize the similarity between samples and weight vectors)。
  • 通俗解释(找老师)

公式特征

$x \cdot W$

训练目标:学生(样本

$x$

)必须尽可能靠近自己的班主任( 

$W_{y_i}$

 ),远离别人的班主任。

逻辑:模型预先设立了 10,000 个“教室”(类别),每个教室有一个“班主任”( 

$W$

 )。

权重

$W$

:被看作是类中心(Class Center)或者代理(Proxy)

派系二:基于度量的学习 (Metric Learning / Pairwise Learning)

  • 代表:Triplet Loss, Contrastive Loss。
  • 原文描述:“优化样本之间的相似性” (optimize the similarity between samples)。
  • 通俗解释(找朋友)
    • 逻辑:模型从数据堆里随便抓两个人。
    • 训练目标:如果这两个人是同一个人(Positive Pair),就拉近他们;如果是不同人(Negative Pair),就推开他们。

公式特征

$x_1 \cdot x_2$

没有

$W$

:这里没有固定的“教室”和“班主任”。

为什么要提这个?(Circle Loss 的动机)

在 Circle Loss 之前,大家觉得这是两套完全不同的逻辑:

  • 用 Softmax (ArcFace) 的人觉得 Triplet Loss 收敛太慢,采样太麻烦(组合爆炸)。
  • 用 Triplet Loss 的人觉得 Softmax 只能处理闭集(Closed-set),不灵活。

Circle Loss 的伟大之处在于它说了一句:

“别吵了,其实你们俩在数学本质上是一回事!”

Circle Loss 认为:

Triplet:其实就是把另一个样本

$x_j$

  当作临时的“中心”。

Softmax/ArcFace:其实就是把

$W$

当作一种特殊的“样本”(只有一个样本的类)。

它们的目标都是:最大化类内相似度 ( 

$s_p$

 ),最小化类间相似度 ( 

$s_n$

 )。


1. 万物归一 —— 统一视角 (

$L_{uni}$

)

        Circle Loss 的第一步贡献,是建立了一个统一的 Loss 框架。作者敏锐地发现,无论是分类还是配对,本质目标都是:最大化正样本分数

$s_p$

,最小化负样本分数

$s_n$

1.1 统一 Loss 公式

作者首先推导出了一个通用公式

$L_{uni}$

(Unified Loss):

$L_{uni} = \log \left[ 1 + \sum_{i=1}^K \sum_{j=1}^L \exp(\gamma(s_n^j - s_p^i + m)) \right]$
$m$

:间隔(Margin)。

$\gamma$

:缩放因子(Scale Factor)。

$s_n^j$

:第

$j$

个负样本对的相似度。

$s_p^i$

:第

$i$

个正样本对的相似度。

这个公式的直观含义很简单:要在

$Loss$

最小化过程中,迫使

$(s_n - s_p)$

越小越好。

1.2 计算量的“降维打击”

上面的公式有一个双重求和

$\sum \sum$

,这意味着要计算所有正负样本的配对,计算量是

$O(K \times L)$

利用指数运算法则

$e^{a-b} = e^a \cdot e^{-b}$

,作者做了一个精彩的数学变换:

$L_{uni} = \log \left[ 1 + \underbrace{\sum_{j=1}^L \exp(\gamma(s_n^j + m))}_{\text{}} \cdot \underbrace{\sum_{i=1}^K \exp(\gamma(-s_p^i))}_{\text{}} \right]$

                                   负样本集合                 正样本集合

这一步变换至关重要。它将复杂的 “成对比较” 解耦成了独立的  “正样本组”  和  “负样本组” 计算。这解释了为什么 Circle Loss 能够像 Softmax 一样高效训练,而不需要像 Triplet Loss 那样进行繁重的样本挖掘。


2. 证明 Softmax 和 Triplet 都是“特例”

为了证明

$L_{uni}$

是真正的大一统,我们看看它是如何退化成我们熟悉的 Loss 的。

2.1 退化为 Softmax (

$L_{am}$

)

如果我们设定只有一个正样本(

$K=1$

,即当前样本

$x$

和它的类中心

$W$

),忽略常数 1,公式就变成了:

$L_{am} = - \log \frac{\exp(\gamma(s_p - m))}{\exp(\gamma(s_p - m)) + \sum_{j=1}^{N-1} \exp(\gamma s_n^j)}$

解读: 这正是我们熟悉的 CosFace / AM-Softmax

这意味着:分类 Loss 只是 Circle Loss 在

$K=1$

时的特例。

2.2 退化为 Triplet (

$L_{tri}$

)

如果我们把

$\gamma$

设为无穷大(

$\gamma \to +\infty$

),根据 LogSumExp 的极限性质,公式变成了:

$L_{tri} = \lim_{\gamma \to +\infty} \frac{1}{\gamma} L_{uni} = \max [ s_n^j - s_p^i ]_+$

解读: 这正是 Triplet Loss 的核心逻辑(Hard Mining)!

这意味着:Triplet Loss 只是 Circle Loss 在

$\gamma$

趋于无穷大时的极限情况。


3. 发现缺陷 —— 拒绝“死板”的优化

既然统一了江湖,为什么还需要 Circle Loss?

因为作者发现,之前的 CosFace/ArcFace 存在一个致命的“不够灵活”的问题。

3.1 什么是“不够灵活”?

$L_{uni}$

中,我们是在优化

$(s_n - s_p)$

。当我们对它求导时,梯度是常数(或者说是 1)。

这意味着什么?

  • 困难样本(分错了):模型用 1 的力度去推它。
  • 简单样本(分对了):模型依然用 1 的力度去推它。

这就好比老师辅导学生,对考 30 分的学生和考 99 分的学生布置一样的作业。这显然浪费了算力,且效率低下。

3.2 引入动态权重 (

$L_{circle}$

)

为了让模型懂得“因材施教”,作者引入了动态权重

$\alpha$

$L_{circle} = \log \left[ 1 + \sum_{j=1}^L \exp(\gamma \alpha_n^j s_n^j) \cdot \sum_{i=1}^K \exp(-\gamma \alpha_p^i s_p^i) \right]$

其中,权重

$\alpha$

的定义是“自我配速”(Self-paced):

$\alpha_p^i = [O_p - s_p^i]_+, \quad \alpha_n^j = [s_n^j - O_n]_+$
  • 机制详解

如果样本简单(

$s_p$

接近目标

$O_p$

),

$\alpha_p$

 变小

$\rightarrow$

几乎不练。

如果样本很难(

$s_p$

远小于目标

$O_p$

),

$\alpha_p$

变大

$\rightarrow$

加权猛练!

3.3 Circle Loss 最终形态

将动态权重

$\alpha$

和 Margin 结合,我们就得到了最终公式:

$L_{circle} = \log \left[ 1 + \sum_{j=1}^L \exp(\gamma \alpha_n (s_n - \Delta_n)) \cdot \sum_{i=1}^K \exp(-\gamma \alpha_p (s_p - \Delta_p)) \right]$

4. 几何解释 —— 为什么叫“Circle”?

这是论文最精彩的几何视角。

4.1 决策边界的演变

Circle Loss: 由于引入了与

$s$

相关的权重 

$\alpha$

,优化项变成了关于

$s$

的二次项 (

$s^2$

)。其决策边界方程演变为:

Softmax/CosFace: 优化目标是

$s_p - s_n = m$

。在坐标系中,这是一条直线

$(s_n - \frac{O_n + \Delta_n}{2})^2 + (s_p - \frac{O_p + \Delta_p}{2})^2 = C$

在特定参数下,它简化为:

$(s_n - 0)^2 + (s_p - 1)^2 = 2m^2$

4.2 圆形的意义

直线变成圆弧,不仅仅是好看。

这意味着模型在优化

$s_p$

$s_n$

时,不再是僵硬的 1:1 兑换,而是根据它们各自离“完美状态”

$(0, 1)$

的距离来动态调整梯度方向。这就赋予了 Loss 更大的灵活性。


5. 梯度验证 —— 数学上的实锤

最后,为了证明“动态权重”真的有效,作者直接给出了梯度公式:

$\frac{\partial L}{\partial s_n} \propto \alpha_n = (s_n - O_n)$
$\frac{\partial L}{\partial s_p} \propto \alpha_p = (O_p - s_p)$

一句话总结:梯度的强弱,正比于样本的难度。

这彻底解决了传统 Loss 在简单样本上浪费梯度的问题,让模型能够全神贯注地攻克那些“死活分不开”的 Hard Cases。

Read more

使用Docker安装Ollama及Open-WebUI完整教程

作者:吴业亮 博客:wuyeliang.blog.ZEEKLOG.net 一、Ollama 简介及工作原理 1. Ollama 简介及原理 * 简介:Ollama 是一款轻量级、开源的大语言模型(LLM)运行工具,旨在简化本地部署和运行大语言模型的流程。它支持 Llama 3、Mistral、Gemini 等主流开源模型,用户无需复杂配置即可在本地设备(CPU 或 GPU)上快速启动模型,适用于开发测试、本地智能应用搭建等场景。 * 工作原理: * 采用模型封装机制,将大语言模型的运行环境、依赖库及推理逻辑打包为标准化格式,实现模型的一键下载、启动和版本管理。 * 通过优化的推理引擎适配硬件架构,支持 CPU 基础运行和 GPU 加速(如 NVIDIA CUDA),减少资源占用并提升响应速度。 * 提供简洁的

前端状态管理比较:选择适合你的状态管理方案

前端状态管理比较:选择适合你的状态管理方案 毒舌时刻 状态管理?听起来就像是前端工程师为了显得自己很高级而特意发明的复杂概念。你以为随便找个状态管理库就能解决所有问题?别做梦了!到时候你会发现,状态管理库本身就是个问题。 你以为Redux是万能的?别天真了!Redux的样板代码多到让你崩溃,调试起来也非常麻烦。还有那些所谓的轻量级状态管理库,看起来简单,用起来却各种问题。 为什么你需要这个 1. 复杂状态管理:当应用变得复杂时,组件间的状态共享和管理会变得非常困难,需要一个专门的状态管理方案。 2. 可预测性:良好的状态管理方案可以让状态变化变得可预测,便于调试和测试。 3. 性能优化:状态管理方案可以帮助你优化组件渲染,提高应用性能。 4. 代码组织:状态管理方案可以帮助你更好地组织代码,提高代码的可维护性。 5. 团队协作:统一的状态管理方案可以便于团队成员之间的协作,减少沟通成本。 反面教材 // 这是一个典型的状态管理混乱的例子 import React, { useState, useEffect } from 'react'; function

Hookshot:轻量级GitHub Webhook处理工具

Hookshot:轻量级GitHub Webhook处理工具 项目基础介绍 Hookshot 是一个开源项目,它是一个用于处理GitHub post-receive hooks的轻量级库和伴随的命令行界面(CLI)工具。这个项目是用 JavaScript 编写的,提供了一个简单的方式来响应GitHub上特定分支的push事件。 项目核心功能 * 事件监听:能够监听特定的GitHub分支事件,比如push、创建和删除分支。 * 命令执行:在接收到push事件时,可以执行指定的shell命令或JavaScript函数。 * CLI工具:提供了一个命令行工具,方便用户通过简单的命令行操作来设置和运行webhook。 * 自定义路由:可以将hookshot挂载到现有express服务器的自定义路由上。 项目最近更新的功能 最近的更新中,Hookshot可能包含以下新功能或改进: * 增强的事件处理:项目可能增加了对GitHub发送的更多类型事件的处理能力。 * 安全性改进:更新可能包括了对输入验证和错误处理的增强,以提高安全性。 * 性能优化:为了更有效地处理

Webots 2025a + ROS 2 Jazzy e-puck 机器人教程

Webots 2025a + ROS 2 Jazzy e-puck 机器人教程

Webots 2025a + ROS 2 Jazzy e-puck 机器人分步使用与研究教程 本教程跳过环境安装环节,聚焦实操步骤和深度研究维度,从基础仿真启动到核心模块拆解,每一步都标注操作指令、验证方法和研究切入点,帮助你彻底掌握 e-puck 机器人的 ROS 2 集成使用。 前提确认 先执行以下命令验证环境就绪(确保无报错): bash 运行 # 加载ROS 2环境(若已添加到.bashrc可跳过) source ~/webots_ws/install/setup.bash # 验证功能包存在 ros2 pkg list | grep webots_ros2_epuck # 验证Webots版本 webots --version # 输出应包含2025a webots --version webots --version webots