histogram loss[1] 用来做 embedding learning,思路是最小化 negative pair 相似性比 positive pair 还大的可能性/概率,其中相似性用 embeddings 的内积表示:sij=<xi,xj>s_{ij}=<x_i,x_j>sij=<xi,xj>,按 positive/negative 分成 s+s^+s+s−s^-s 两拨,对应文中 S+S^+S+S−S^-S 两个集合。将 embeddings 做 L2 normalization,相似性范围就是 [−1,1][-1,1][1,1]

上述的那个概率就是文中的公式 3:
preverse=∫−11p−(x)[∫−1xp+(y)dy]dx(a)p_{reverse}=\int_{-1}^1p^-(x)\left[\int_{-1}^xp^+(y)dy\right]dx \tag{a}preverse=11p(x)[1xp+(y)dy]dx(a)
其中 p−(⋅)p^-(\cdot)p()s−s^-s 的分布, p+(⋅)p^+(\cdot)p+()s+s^+s+ 的分布,需要估计。

Density Estimation

密度估计的思路见 [3],这里符号尽量沿用 [1],省去 +/- 上标因为两者都是这么估计。先将密度函数的极限定义式写出来:
p(tr)=lim⁡Δ→0Φ(tr+1)−Φ(tr−1)2Δp(t_r)=\lim_{\Delta\rightarrow0}\frac{\Phi(t_{r+1})-\Phi(t_{r-1})}{2\Delta}p(tr)=Δ0lim2ΔΦ(tr+1)Φ(tr1)
文中在 [−1,1][-1,1][1,1] 均匀插了 R 个点,Δ=2R−1\Delta=\frac{2}{R-1}Δ=R12 是组距,trt_rtr 是其中一个插的点,r∈{1,…,R}r\in\{1,\dots,R\}r{1,,R}Φ(⋅)\Phi(\cdot)Φ()p(⋅)p(\cdot)p() 对应的累积分布函数。于是离散地估计 (a) 式:
Φ(tr+1)−Φ(tr−1)≈ϕr+1−ϕr−1=∑s∈[tr−1,tr+1]1∣S∣\Phi(t_{r+1})-\Phi(t_{r-1})\approx\phi_{r+1}-\phi_{r-1}=\sum_{s\in[t_{r-1},t_{r+1}]}\frac{1}{|S|}Φ(tr+1)Φ(tr1)ϕr+1ϕr1=s[tr1,tr+1]S1
此处 ϕr\phi_rϕr 是离散的累积分布函数,
p(tr)≈hrΔ=#s∈[tr−1,tr+1]2∣S∣1Δp(t_r)\approx\frac{h_r}{\Delta}=\frac{\#s\in[t_{r-1},t_{r+1}]}{2|S|}\frac{1}{\Delta}p(tr)Δhr=2S#s[tr1,tr+1]Δ1
这可以看成直方图:第 r 个矩形,Δ\DeltaΔ 为组距,分子统计落入 trt_rtr 邻域的点数,第一项是区间的概率和(分母的 2 是因为对于 sij∈[tx,tx+1]s_{ij}\in[t_x,t_{x+1}]sij[tx,tx+1],会分别在考虑 p(tx)p(t_x)p(tx)p(tx+1)p(t_{x+1})p(tx+1) 被考虑,相当于被算了两次),除以组距得到密度。

由 [3] 可以看到,这种估计可以改写成核函数的形式:
hr=1∣S∣∑(i,j)12⋅1(∣sij−tr∣Δ≤1)(b)h_r=\frac{1}{|S|}\sum_{(i,j)}\frac{1}{2}\cdot1(\frac{|s_{ij}-t_r|}{\Delta}\leq1)\tag{b}hr=S1(i,j)211(Δsijtr1)(b)
其中所用的核可以看成:KΔ(x−tr)=12⋅1(∣x−tr∣Δ≤1)K_{\Delta}(x-t_r)=\frac{1}{2}\cdot1(\frac{|x-t_r|}{\Delta}\leq1)KΔ(xtr)=211(Δxtr1)。于是一种自然的扩展就是:用别的核函数。文中用了 triangular kernel[8],公式 (2) 可以改写成:
δi,j,r=(1−∣sij−tr∣Δ)⋅1(∣sij−tr∣Δ≤1)(c)\delta_{i,j,r}=(1-\frac{|s_{ij}-t_r|}{\Delta})\cdot1(\frac{|s_{ij}-t_r|}{\Delta}\leq1)\tag{c}δi,j,r=(1Δsijtr)1(Δsijtr1)(c)
于是公式 (1) 就是:
hr=1∣S∣∑(i,j)(1−∣sij−tr∣Δ)⋅1(∣sij−tr∣Δ≤1)(d)h_r=\frac{1}{|S|}\sum_{(i,j)}(1-\frac{|s_{ij}-t_r|}{\Delta})\cdot1(\frac{|s_{ij}-t_r|}{\Delta}\leq1)\tag{d}hr=S1(i,j)(1Δsijtr)1(Δsijtr1)(d)
和 (b) 式对比着看,换这个核使得 hrh_rhr 里带有 sijs_{ij}sij,从而可以回传梯度。

可以验证这个 {hr}\{h_r\}{hr} 序列是一个合法的概率分布:易知 0<hr≤10<h_r\leq10<hr1,而要计算 ∑r=1Rhr\sum_{r=1}^Rh_rr=1Rhr,考虑到对于 sij∈[tk,tk+1)s_{ij}\in[t_k,t_{k+1})sij[tk,tk+1),它会分别在 hkh_khk 时贡献 tk+1−sijΔ\frac{t_{k+1}-s_{ij}}{\Delta}Δtk+1sij、在 hk+1h_{k+1}hk+1 时贡献 sij−tkΔ\frac{s_{ij}-t_k}{\Delta}Δsijtk,所以:
∑r=1Rhr=1∣S∣∑(i,j)[sij−tkΔ+tk+1−sijΔ]=∑(i,j)1∣S∣=1\begin{aligned}\sum_{r=1}^Rh_r&=\frac{1}{|S|}\sum_{(i,j)}[\frac{s_{ij}-t_k}{\Delta}+\frac{t_{k+1}-s_{ij}}{\Delta}] \\ &=\sum_{(i,j)}\frac{1}{|S|}=1 \end{aligned}r=1Rhr=S1(i,j)[Δsijtk+Δtk+1sij]=(i,j)S1=1

Histogram Loss

最终对 (a) 式的估计就写成文中公式 (4),即 histogram loss:
L=∑r=1R(hr−∑q=1rhq+)L=\sum_{r=1}^R(h_r^-\sum_{q=1}^rh_q^+)L=r=1R(hrq=1rhq+)

Code

  • tensorflow 1.12
#import tensorflow as tf
def cos(X, Y=None):"""C(i,j) = cos(Xi, Yj)"""X_n = tf.math.l2_normalize(X, axis=1)if (Y is None) or (X is Y):return tf.matmul(X_n, tf.transpose(X_n))Y_n = tf.math.l2_normalize(Y, axis=1)return tf.matmul(X_n, tf.transpose(Y_n))def sim_mat(label, label2=None):"""S[i][j] = 1 <=> i- & j-th share at lease 1 label"""if label2 is None:label2 = labelreturn tf.cast(tf.matmul(label, tf.transpose(label2)) > 0, "float32")def histogram_loss(X, L, R=151):"""histogram lossX: [n, d], feature WITHOUT L2 normL: [n, c], labelR: scalar, num of estimating point, same as the paper"""delta = 2. / (R - 1)  # step# t = (t_1, ..., t_R)t = tf.lin_space(-1., 1., R)[:, None]  # [R, 1]# gound-truth similarity matrixM = sim_mat(L)  # [n, n]# cosine similarity, in [-1, 1]S = cos(X)  # [n, n]# get indices of upper triangular (without diag)S_hat = S + 2  # shift value to [1, 3] to ensure triu > 0S_triu = tf.linalg.band_part(S_hat, 0, -1) * (1 - tf.eye(tf.shape(S)[0]))triu_id = tf.where(S_triu > 0)# extract triu -> vector of [n(n - 1) / 2]S = tf.gather_nd(S, triu_id)[None, :]  # [1, n(n-1)/2]M_pos = tf.gather_nd(M, triu_id)[None, :]M_neg = 1 - M_posscaled_abs_diff = tf.math.abs(S - t) / delta  # [R, n(n-1)/2]# mask_near = tf.cast(scaled_abs_diff <= 1, "float32")# delta_ijr = (1 - scaled_abs_diff) * mask_neardelta_ijr = tf.maximum(0, 1 - scaled_abs_diff)def histogram(mask):"""h = (h_1, ..., h_R)"""sum_delta = tf.reduce_sum(delta_ijr * mask, 1)  # [R]return sum_delta / tf.maximum(1, tf.reduce_sum(mask))h_pos = histogram(M_pos)[None, :]  # [1, R]h_neg = histogram(M_neg)  # [R]# all 1 in lower triangular (with diag)mask_cdf = tf.linalg.band_part(tf.ones([R, R]), -1, 0)cdf_pos = tf.reduce_sum(mask_cdf * h_pos, 1)  # [R]loss = tf.reduce_sum(h_neg * cdf_pos)return loss

References

  1. (paper)Learning Deep Embeddings with Histogram Loss
  2. (code)madkn/HistogramLoss
  3. 什么是核密度估计?如何感性认识?
  4. 2.8. 概率密度估计(Density Estimation)
  5. 核密度估计
  6. 非参数方法——核密度估计(Kernel Density Estimation)
  7. 核密度估计Kernel Density Estimation(KDE)概述 密度估计的问题
  8. Kernel (statistics)
  9. 核函数
  10. 《Learning Deep Embeddings with Histogram Loss》笔记

histogram loss笔记相关推荐

  1. AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss笔记

    文章目录 网络结构 说话人编码器 内容编码器 解码器 声码器 实验 论文: AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder L ...

  2. Rep Loss笔记

    Repulsion Loss https://gitee.com/jacke121/repulsion_loss_ssd https://github.com/AAA-Fan/Repulsion_lo ...

  3. Focal Loss笔记

    Focal Loss升级: Focal Loss升级:让Focal Loss动态化,类别极端不平衡也可以轻松解决_jacke121的专栏-CSDN博客 GFocalloss: Focal Loss改进 ...

  4. Triplet Loss笔记

    在有监督学习中,一般都有固定数量的类别.通常我们可以用Softmax结合Cross Entropy Loss来做分类. 在监督学习中,会有变化数量的类别,这个时候我们可以用Triplet Loss来表 ...

  5. 论文笔记:KD-Net

    Escape from Cells: Deep Kd-Networks for the Recognition of 3D Point Cloud Models 1.四个问题 要解决什么问题? 3D点 ...

  6. 目标检测 YOLOV5:loss介绍

    目录 1.BCEWithLogitsLoss 1.1pytorch源码中的相关代码 1.2 数学原理 2.FocalLoss 2.1 pytorch源码 2.2 数学原理 1.BCEWithLogit ...

  7. NIPS 2018 迁移学习相关论文

    文章目录 [NIPS2018](https://nips.cc/Conferences/2018/Schedule) Unsupervisedly Learned Latent Graps as Tr ...

  8. NIPS 2016 Highlighted Papers

    今天看到NIPS官网开放了部分录用文章的Spotlight Videos,迫不及待撸了一遍,特别将一些有趣.有料的highlight出来分享给大家.文章链接均为油管视频,戳前请翻墙(排名不分先后,但根 ...

  9. word2vec及其优化

    1.算法背景: (1)N-gram:n-1阶的Markov模型,认为一个词出现的概率只与前面n-1个词相关:统计预料中各种词串(实际应用中最多采用n=3的词串长度)的出现次数,并做平滑处理(应对cou ...

  10. 美颜换妆之BeautyGAN

    论文:BeautyGAN: Instance-level Facial Makeup Transfer with Deep Generative Adversarial Network 官网:http ...

最新文章

  1. 特殊图像的色彩特征工程:非自然图像的颜色编码
  2. 实现linux作为server时与windows间的数据同步
  3. Windows Phone 7 Tip (13) -- 如何搜集应用使用数据
  4. 微服务架构及分布式事务解决方案
  5. python3菜鸟教程-Python3 循环语句
  6. ASP的Server.UrlEncode和Asp.Net的Server.UrlEncode的返回结果不同
  7. 校省选赛第一场A题Cinema题解
  8. Devoxx 2017美国大会首日重要演讲一览
  9. 【剑指offer】面试题60:n个骰子的点数(Java)
  10. 【Java中级篇】Dom4j解析xml数据
  11. 程序员为什么值得写博客
  12. centos 宝塔面版 运行 thinkjs
  13. linux dd克隆系统后,Ubuntu14.04 dd命令克隆系统镜像安装到另一台机器上
  14. Mysql 中时间日期函数
  15. 文献阅读(245)Roller
  16. 【进销存管理系统——开题报告 分享(仅供参考呀)】
  17. sklearn实现随机森林回归预测
  18. 计算机英语念法,电脑的英文读音标准带音标的
  19. hiho 满减优惠(暴力)
  20. 汪延谈王志东离职问题 (转)

热门文章

  1. 饥荒联机版服务器控制台本地和在线,服务器,控制台饥荒服务器控制台命令,指令,常用命令,管理命令 - Welcome to XiongTianQi.CN...
  2. 赛场上的 AI 务实派:经典招式,也能作出“新解”!
  3. FPGA之旅设计99例之第九例-----驱动0.96寸OLED屏
  4. STM32驱动0.96寸OLED屏幕
  5. Opencv创建纯色图
  6. [java 手把手教程][第二季]java 后端博客系统文章系统——No7
  7. 计算机裸机是指,计算机中裸机是指
  8. Mac音频录制软件哪个好 怎么录制屏幕声音
  9. 论程序员如何正确上班摸鱼
  10. vue给列表添加序号_element-UI——el-table添加序号