histogram loss笔记
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)−Φ(tr−1)
文中在 [−1,1][-1,1][−1,1] 均匀插了 R 个点,Δ=2R−1\Delta=\frac{2}{R-1}Δ=R−12 是组距,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)−Φ(tr−1)≈ϕr+1−ϕr−1=s∈[tr−1,tr+1]∑∣S∣1
此处 ϕ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=2∣S∣#s∈[tr−1,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=∣S∣1(i,j)∑21⋅1(Δ∣sij−tr∣≤1)(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Δ(x−tr)=21⋅1(Δ∣x−tr∣≤1)。于是一种自然的扩展就是:用别的核函数。文中用了 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−Δ∣sij−tr∣)⋅1(Δ∣sij−tr∣≤1)(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=∣S∣1(i,j)∑(1−Δ∣sij−tr∣)⋅1(Δ∣sij−tr∣≤1)(d)
和 (b) 式对比着看,换这个核使得 hrh_rhr 里带有 sijs_{ij}sij,从而可以回传梯度。
可以验证这个 {hr}\{h_r\}{hr} 序列是一个合法的概率分布:易知 0<hr≤10<h_r\leq10<hr≤1,而要计算 ∑r=1Rhr\sum_{r=1}^Rh_r∑r=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+1−sij、在 hk+1h_{k+1}hk+1 时贡献 sij−tkΔ\frac{s_{ij}-t_k}{\Delta}Δsij−tk,所以:
∑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=1∑Rhr=∣S∣1(i,j)∑[Δsij−tk+Δtk+1−sij]=(i,j)∑∣S∣1=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=1∑R(hr−q=1∑rhq+)
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
- (paper)Learning Deep Embeddings with Histogram Loss
- (code)madkn/HistogramLoss
- 什么是核密度估计?如何感性认识?
- 2.8. 概率密度估计(Density Estimation)
- 核密度估计
- 非参数方法——核密度估计(Kernel Density Estimation)
- 核密度估计Kernel Density Estimation(KDE)概述 密度估计的问题
- Kernel (statistics)
- 核函数
- 《Learning Deep Embeddings with Histogram Loss》笔记
histogram loss笔记相关推荐
- AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss笔记
文章目录 网络结构 说话人编码器 内容编码器 解码器 声码器 实验 论文: AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder L ...
- Rep Loss笔记
Repulsion Loss https://gitee.com/jacke121/repulsion_loss_ssd https://github.com/AAA-Fan/Repulsion_lo ...
- Focal Loss笔记
Focal Loss升级: Focal Loss升级:让Focal Loss动态化,类别极端不平衡也可以轻松解决_jacke121的专栏-CSDN博客 GFocalloss: Focal Loss改进 ...
- Triplet Loss笔记
在有监督学习中,一般都有固定数量的类别.通常我们可以用Softmax结合Cross Entropy Loss来做分类. 在监督学习中,会有变化数量的类别,这个时候我们可以用Triplet Loss来表 ...
- 论文笔记:KD-Net
Escape from Cells: Deep Kd-Networks for the Recognition of 3D Point Cloud Models 1.四个问题 要解决什么问题? 3D点 ...
- 目标检测 YOLOV5:loss介绍
目录 1.BCEWithLogitsLoss 1.1pytorch源码中的相关代码 1.2 数学原理 2.FocalLoss 2.1 pytorch源码 2.2 数学原理 1.BCEWithLogit ...
- NIPS 2018 迁移学习相关论文
文章目录 [NIPS2018](https://nips.cc/Conferences/2018/Schedule) Unsupervisedly Learned Latent Graps as Tr ...
- NIPS 2016 Highlighted Papers
今天看到NIPS官网开放了部分录用文章的Spotlight Videos,迫不及待撸了一遍,特别将一些有趣.有料的highlight出来分享给大家.文章链接均为油管视频,戳前请翻墙(排名不分先后,但根 ...
- word2vec及其优化
1.算法背景: (1)N-gram:n-1阶的Markov模型,认为一个词出现的概率只与前面n-1个词相关:统计预料中各种词串(实际应用中最多采用n=3的词串长度)的出现次数,并做平滑处理(应对cou ...
- 美颜换妆之BeautyGAN
论文:BeautyGAN: Instance-level Facial Makeup Transfer with Deep Generative Adversarial Network 官网:http ...
最新文章
- 特殊图像的色彩特征工程:非自然图像的颜色编码
- 实现linux作为server时与windows间的数据同步
- Windows Phone 7 Tip (13) -- 如何搜集应用使用数据
- 微服务架构及分布式事务解决方案
- python3菜鸟教程-Python3 循环语句
- ASP的Server.UrlEncode和Asp.Net的Server.UrlEncode的返回结果不同
- 校省选赛第一场A题Cinema题解
- Devoxx 2017美国大会首日重要演讲一览
- 【剑指offer】面试题60:n个骰子的点数(Java)
- 【Java中级篇】Dom4j解析xml数据
- 程序员为什么值得写博客
- centos 宝塔面版 运行 thinkjs
- linux dd克隆系统后,Ubuntu14.04 dd命令克隆系统镜像安装到另一台机器上
- Mysql 中时间日期函数
- 文献阅读(245)Roller
- 【进销存管理系统——开题报告 分享(仅供参考呀)】
- sklearn实现随机森林回归预测
- 计算机英语念法,电脑的英文读音标准带音标的
- hiho 满减优惠(暴力)
- 汪延谈王志东离职问题 (转)
热门文章
- 饥荒联机版服务器控制台本地和在线,服务器,控制台饥荒服务器控制台命令,指令,常用命令,管理命令 - Welcome to XiongTianQi.CN...
- 赛场上的 AI 务实派:经典招式,也能作出“新解”!
- FPGA之旅设计99例之第九例-----驱动0.96寸OLED屏
- STM32驱动0.96寸OLED屏幕
- Opencv创建纯色图
- [java 手把手教程][第二季]java 后端博客系统文章系统——No7
- 计算机裸机是指,计算机中裸机是指
- Mac音频录制软件哪个好 怎么录制屏幕声音
- 论程序员如何正确上班摸鱼
- vue给列表添加序号_element-UI——el-table添加序号