Deep Hashing Network for Efficient Similarity Retrieval

Introduce

这是发表在AAAI-2016的一篇paper,下载地址
在本篇论文之前的监督Hash方法,第一步通过手动学习或者机器学习得到特征向量,第二步学习二进制的Hash Code。然而,这种方法存在明显的缺点,首先提取的特征并不一定完善,并且学习的二进制的Hash Code也有量化的误差。所以作者提出了Deep Hashing Network(DHN)。DHN模型主要从以下四个部分对之前的方法进行改进:

  • 使用CNN来学习图像的特征。
  • 使用CNN的全连接层来生成二进制码。
  • 减少交叉熵损失,使原始空间相似的图片在海明空间也相似。
  • 减少量化误差提高Hash Code的质量。
    在下面详细介绍一下改进过程:

Deep Hashing Network

相似性检索中,给定训练集N个points{xi}Ni=1\{x_i\}_{i=1}^N,每一个是一个D维的特征向量,x∈RDx\in R^D。每一对特征向量之间有一个相似性的label sijs_{ij},如果xix_i和xjx_j相似,sij=1s_{ij}=1;如果xix_i和xjx_j不相似,sij=0s_{ij}=0。我们的目标就是学习到非线性的hashing function f:x↦h∈{−1,1}Kh=f(x)f:x \mapsto h\in \{-1,1\}^K \quad h=f(x)。
在本篇论文中,作者提出了如下图所示的网络结构,网络的输入是一组{xi,xj,sij}\{x_i,x_j,s_{ij}\}三元组。

figure1 显示的图片是AlexNet的修改,原始AlexNet网络结构con1-con5是5个卷积层,fc6-fc8是三个全连接层。对于每一个全连接层l总会学习到一个非线性的mapping。

zli=al(Wlzl−1i+bl)

z_i^l=a^l(W^lz_{i}^{l-1}+b^l)
这里 zliz_i^l是原始的数据 xix_i在l层的表示, Wl,blW^l,b^l分别表示l-th 层网络的权重和偏置, ala^l表示激活函数,这里采用了ReLU函数 al(x)=max(0,x)a^l(x)=\max (0,x)。由于需要将原始的数据映射为K维的hash code,作者修改了网络的第8层,将AlexNet的fc8的softmax classifier变成了有K个隐节点的fch layer。 hi=zli,l=8h_i=z_i^l,l=8 。为了保证fch layer的输出的范围在[-1,1]之间,作者将该层的激活函数修改为 al(x)=tanh(x)a^l(x)=tanh(x)。为了保证fch layer输出的hash code 性能良好,需要保持hash code 和原始的S中相似性一致,并且输出的二进制码量化误差最小。
一对二进制码 hih_i和 hjh_j,海明距离和内积之间有以下的性质

distH(hi,hj)=12(K−⟨hi,hj⟩)

dist_H(h_i,h_j)=\frac{1}{2}(K-\langle h_i,h_j \rangle)
图像的label已知的,通过label可以得到相似性的矩阵 S={sij}S=\{s_{ij}\},那么最好的目标就是在相似性矩阵已知的情况下,根据贝叶斯公式可知,后验的概率与先验概率和似然函数的乘积正相关:

logp(H|S)∝logp(S|H)p(H)=∑si,j∈Slogp(sij|hi,hj)p(hi)p(hj)(1)

\log p(H|S) \propto \log p(S|H)p(H) \\ =\sum_{s_{i,j} \in S}\log p(s_{ij}|h_i,h_j)p(h_i)p(h_j) \quad (1)
上式中, p(S|H)p(S|H)是似然函数, p(H)p(H)是先验。对于每一对输入的三元组,给定hash code hi,hjh_i,h_j和图像相似性label,可以通过计算内积来表示 p(sij|hi,hj)p(s_{ij}|h_i,h_j)。

p(sij|hi,hj)={σ(⟨zli,zlj⟩),1−σ(⟨zli,zlj⟩),sij=1sij=0=σ(⟨zli,zlj⟩)sij(1−σ(⟨zli,zlj⟩))1−sij(2)

p(s_{ij}|h_i,h_j)=\begin{cases} \sigma(\langle z_i^l,z_j^l \rangle), &s_{ij}=1 \\ 1-\sigma(\langle z_i^l,z_j^l\rangle),&s_{ij}=0\end{cases}\\ =\sigma(\langle z_i^l,z_j^l \rangle)^{s_{ij}}(1-\sigma(\langle z_i^l,z_j^l\rangle))^{1-s_{ij}}\quad (2)
这里 σ(x)=11+e−x\sigma(x)=\frac{1}{1+e^{-x}}是sigmod函数, hi=zlih_i=z_i^l。分析上述函数,两种图片之间的海明距离 distH(hi,hj)dist_H(h_i,h_j)越小,内积 ⟨hi,hj⟩\langle h_i,h_j \rangle越大, p(1|hi,hj)p(1|h_i,h_j)越大,说明 hih_i和 hjh_j应该分为相似的,同理 p(0|hi,hj)p(0|h_i,h_j)越大,说明 hih_i和 hjh_j应该分为不相似的。由于 hi∈{−1,1}Kh_i \in \{-1,1\}^K是离散的,不可导,没办法找到梯度,所以要对 hih_i进行放松,变为在[-1,1]区间的连续取值。但是这样做带来了两个问题:(1)存在量化误差(2)内积空间的近似误差变大。所以作者提出了如下所示的bimodal Laplacian prior:

p(hi)=12ϵexp(−|||hi|−1||1ϵ)(3)

p(h_i)=\frac{1}{2\epsilon}exp(-\frac{|||h_i|-1||_1}{\epsilon})\quad (3)
函数的图像如下图所示:

把公(2)(3)带入到公式(1)可以得到最优化的目标:

minΘC=L+λQ(4)

\min_{\Theta}C=L+\lambda Q \quad (4)
上式中 λ=1/ϵ\lambda=1/\epsilon , Θ\Theta是 {Wl,bl}\{W^l,b^l\}集合,L是交叉熵损失,Q是量化损失。

L=∑sij∈S(log(1+exp(⟨zli,zlj⟩))−sij⟨zli,zlj⟩)(5)

L=\sum_{s_{ij} \in S}(log(1+exp(\langle z_i^l,z_j^l \rangle))-s_{ij}\langle z_i^l,z_j^l \rangle )\quad (5)

Q=∑sij∈S(|||zli−1||1+|||zli−1||1),(6)

Q=\sum_{s_{ij} \in S}(|||z_i^l-1||_1+|||z_i^l-1||_1),\quad (6)
公式(6)中的1为全是1的K维的单位向量。由于Q是不可导的,所以需要对Q进行如下替换 |x|≈logcos(x)|x| \approx logcos(x) ,公式(6)变成了如下所示的可导形式,就可以根据梯度计算下降方向,可到最优解。

Q=∑si,j∈S∑k=1K(logcosh(|zlik|−1)+logcosh(|zljk|−1))(7)

Q=\sum_{s_{i,j}\in S}\sum_{k=1}^K(logcosh(|z_{ik}^l|-1)+logcosh(|z_{jk}^l|-1)) \quad (7)
最后通过sgn函数对 zlz^l进行二值化:

sgn(x){1,−1,x>0x<0

sgn(x)\begin{cases}1,& x>0\\-1 ,&x

Learning Algorithm

作者定义一对图片之间的损失如下所示:

Cij≜Lij+λQij=log(1+exp(⟨zli,zlj⟩))−sij⟨zli,zlk⟩+λ∑k=1K(logcosh(|zlik|−1)+logcosh(|zljk|−1))(8)

C_{ij}\triangleq L_{ij}+\lambda Q_{ij}\\ =log(1+exp(\langle z_i^l,z_j^l \rangle))-s_{ij}\langle z_i^l, z_k^l \rangle+\lambda\sum_{k=1}^K(logcosh(|z_{ik}^l|-1)+logcosh(|z_{jk}^l|-1)) \quad (8)
单张图片关于网络第l-th层的k-th单元的参数 WlkW_k^l进行求导可以得到损失函数的梯度:

∂Ci∂Wlk=2∑j:sij∈S(∂Lij∂Wlk+λ∂Qij∂Wlk)=2∑j:sij∈S(∂Lij∂z^lik+λ∂Qij∂z^lik)∂z^lik∂Wlk=2δlikzl−1l(9)

\frac{\partial C_i}{\partial W_k^l}=2\sum_{j:s_{ij}\in S}(\frac{\partial L_{ij}}{\partial W_k^l}+\lambda \frac{\partial Q_{ij}}{\partial W_k^l})\\=2\sum_{j:s_{ij}\in S}(\frac{\partial L_{ij}}{\partial \hat{z}_{ik}^l}+\lambda \frac{\partial Q_{ij}}{\partial \hat{z}_{ik}^l})\frac{\partial{\hat{z}_{ik}^l}}{\partial{W_k^l}}\\=2\delta_{ik}^lz_{l}^{l-1} \quad(9)
这里 z^lik=Wlzl−1i+bl\hat{z}_{ik}^l=W^lz_i^{l-1}+b^l是第l层在激活函数之前的形式。 δlik≜∑j:sij∈S(∂Lij∂z^lik+λ∂Qij∂z^lik)\delta_{ik}^l\triangleq \sum_{j:s_{ij}\in S}(\frac{\partial L_{ij}}{\partial \hat{z}_{ik}^l}+\lambda \frac{\partial Q_{ij}}{\partial \hat{z}_{ik}^l}) 是 xix_i在经过l层第k个节点与其他point产生的误差的和。
对于输出层的导数计算,可以利用直接的输出结果:

δlik=∑j:sij∈S([δ(⟨zli,zll⟩)−sij]zljk)a˙lz^lik+λ∑j:sij∈Stanh(|zlik|−1)sgn(zlik)a˙lz^lik,(10)

\delta_{ik}^l=\sum_{j:s_{ij}\in S}([\delta(\langle z_i^l,z_l^l\rangle)-s_{ij}]z_{jk}^l)\dot{a}^l \hat{z}_{ik}^l +\lambda\sum_{j:s_{ij}\in S}tanh(|z_{ik}^l|-1)sgn(z_{ik}^l)\dot{a}^l \hat{z}_{ik}^l,\quad (10)
对于其他层的导数计算,直接利用中间的输出结果进行计算:

δl−1ik=(∑k′=1ulWlk′k)a˙l−1z^l−1ik(11)

\delta_{ik}^{l-1}=(\sum_{k'=1}^{u_l}W_{k'k}^l)\dot{a}^{l-1} \hat{z}_{ik}^{l-1} \quad (11)
与标准的BP算法相比,唯一的不同就是最后一层,采用公式(10)进行更新,其他的更新方式相同。

Experiments

作者主要在三个数据集进行测试:

  • NUS-WIDE 21个类别,每一个类别有5000个图片,总共195384张图片,每个图片resize 256*256 500维视觉词典
  • CIFAR-10 60000张,10个类别,32*32 gist512
  • Flickr 25000张图片,38个语义label,256*256 3857维 sift+gist
    对于NUS-WIDE和CLFAR-10每类图片选取500张作为训练集,100张作为测试集,Flickr 随机选择1000张作为测试集,4000张作为训练集。和其他方法做出了对比试验,结果如下图所示:

    准确率和召回率图4所示:

Conclusion

个人觉得deep hash的主要是利用了深度学习的优点来学习非线性的hash function。首先要定义好目标函数,目标函数的选取有着很重要的意思,必须保证训练的过程能够BP,其次就是松弛以及松弛以后的求导,求导的过程还是需要一定的数学功底的。在膜拜学术的大牛的同时,也希望自己能不断学习,不断进步。

references

Deep Hashing Network for Efficient Similarity Retrieval Han Zhu, Mingsheng Long ,Jianmin Wang and Yue Cao AAAI -2016

Deep Hashing Network for Efficient Similarity Retrieval相关推荐

  1. 【论文笔记】《SketchMate: Deep Hashing for Million-Scale Human Sketch Retrieval》

    <SketchMate:面向百万级人类草图检索的深度哈希算法>论文阅读笔记 写在前面:水平有限,此笔记仅在本人有限的理解水平上完成,有错误希望读者批评指正. 论文和代码见网址:https: ...

  2. Bit-Scalable Deep Hashing with Regularized Similarity Learning for Image Retrieval and Person Re-ide

    总结:(1)对基于三元组学习的损失函数利用拉普拉斯矩阵增加了规则化项 (2)通过给hashing code 的每一Bit 给定一个权重,从而实现Bit-Scalable (3)设计tanh-like ...

  3. 论文阅读04:Deep Triplet Hashing Network for Case-based Medical Image Retrieval

    非常好的一篇医学图像检索文章,MIA一区.注意力机制是本文的亮点.更加幸运的是作者开源了代码. 这个团队已经沿着注意力机制发了好几篇文章了.而且都有代码. 代码地址如下: https://github ...

  4. 论文:A Deep Hashing Technique for Remote Sensing Image-Sound Retrieval

    论文:A Deep Hashing Technique for Remote Sensing Image-Sound Retrieval 跨模态图像语音哈希检索 关于网络结构 关于负样本采样 关于损失 ...

  5. Clean-label Backdoor Attack against Deep Hashing based Retrieval论文笔记

    论文名称 Clean-label Backdoor Attack against Deep Hashing based Retrieval 作者 Kuofeng Gao (Tsinghua Unive ...

  6. 论文翻译:2022_PACDNN: A phase-aware composite deep neural network for speech enhancement

    论文地址:PACDNN:一种用于语音增强的相位感知复合深度神经网络 相似代码:https://github.com/phpstorm1/SE-FCN 引用格式:Hasannezhad M,Yu H,Z ...

  7. 【每日一读】Deep Variational Network Embedding in Wasserstein Space

    目录 简介 论文简介 ABSTRACT 1 INTRODUCTION 2 RELATED WORK 3 NOTATIONS AND PROBLEM DEFINITION 3.1 Notations 3 ...

  8. 7.Deep Interest Network for Click-Through Rate Prediction论文详解

    一.总述 这是2018年阿里Guorui Zhou等人发表在KDD上的一篇论文.论文提出在CTR任务中,丰富的用户历史行为数据包含了用户多种兴趣,对于不同的候选广告,起作用的用户历史行为数据表示应该不 ...

  9. 人脸检测--Supervised Transformer Network for Efficient Face Detection

    Supervised Transformer Network for Efficient Face Detection ECCV2016 人脸检测: the cascaded network:end- ...

最新文章

  1. 《Redis设计与实现》简读
  2. binwalk windows安装和使用方法
  3. Spring:Spring相关知识介绍笔记
  4. 通讯软件通常要哪几个端口_您通常打开几个浏览器标签?
  5. net 去掉第一位和最后一位_本赛季英超门将的扑救成功率,第一位和最后一位竟来自同家俱乐部...
  6. 命名实体识别_命名实体识别的几种标注形式
  7. [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】
  8. linux入门常用命令
  9. java读取properties配置文件路径
  10. Leetcode学习成长记:天池leetcode基础训练营Task01数组
  11. 项目中出现npm WARN locking errno: -4048, npm WARN locking code: ‘EPERM‘, npm WARN locking syscall:
  12. MyBatis框架(二):多对一查询、一对多查询、ResultMap、动态SQL
  13. 【Python绘图】pyecharts绘制南丁格尔玫瑰图
  14. Cell | 共生菌群通过γδ T细胞促进肺癌的发展
  15. 产品经理必不可少的证书!
  16. element plus组件居中显示
  17. LCD1602液晶显示屏应用
  18. python多台电脑聊天室_python的多人多功能聊天室
  19. 哎呦报错啦怎么办?nginx: [emerg] “server“ directive is not allowed here in /usr/local/nginx/conf/nginx.conf53
  20. vue-color-picker-sheldon使用说明(一款基于Vue的取色器/颜色选择器)

热门文章

  1. Linux下的C语言编程——位运算
  2. 数据标准化的原因和方法
  3. 总谐波失真80_总谐波失真
  4. 清空MySQL单库下所有表数据 || 删除MySQL单库下所有表
  5. 【u025】贝茜的晨练计划
  6. 温度补偿 matlab,基于传感器温度补偿方法的双指数函数模型的温度补偿算法设计...
  7. 音视频系列九 使用soundTouch实现音视频变速
  8. R740 U盘启动设置和安装centos7报错处理
  9. python 12306查询不到车次_过年回家抢不到火车票?Python 开发 12306 查票神器
  10. NoSql的四大类型