Deep Hashing Network for Efficient Similarity Retrieval

时间:2022-09-23 17:44:20

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 ,每一个是一个D维的特征向量, xRD 。每一对特征向量之间有一个相似性的label sij ,如果 xi xj 相似, sij=1 ;如果 xi xj 不相似, sij=0 。我们的目标就是学习到非线性的hashing function f:xh{1,1}Kh=f(x)
在本篇论文中,作者提出了如下图所示的网络结构,网络的输入是一组 {xi,xj,sij} 三元组。
Deep Hashing Network for Efficient Similarity Retrieval
figure1 显示的图片是AlexNet的修改,原始AlexNet网络结构con1-con5是5个卷积层,fc6-fc8是三个全连接层。对于每一个全连接层l总会学习到一个非线性的mapping。

zli=al(Wlzl1i+bl)

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

图像的label已知的,通过label可以得到相似性的矩阵 S={sij} ,那么最好的目标就是在相似性矩阵已知的情况下,根据贝叶斯公式可知,后验的概率与先验概率和似然函数的乘积正相关:
logp(H|S)logp(S|H)p(H)=si,jSlogp(sij|hi,hj)p(hi)p(hj)(1)

上式中, p(S|H) 是似然函数, p(H) 是先验。对于每一对输入的三元组,给定hash code hi,hj 和图像相似性label,可以通过计算内积来表示 p(sij|hi,hj)
p(sij|hi,hj)={σ(zli,zlj),1σ(zli,zlj),sij=1sij=0=σ(zli,zlj)sij(1σ(zli,zlj))1sij(2)

这里 σ(x)=11+ex 是sigmod函数, hi=zli 。分析上述函数,两种图片之间的海明距离 distH(hi,hj) 越小,内积 hi,hj 越大, p(1|hi,hj) 越大,说明 hi hj 应该分为相似的,同理 p(0|hi,hj) 越大,说明 hi hj 应该分为不相似的。由于 hi{1,1}K 是离散的,不可导,没办法找到梯度,所以要对 hi 进行放松,变为在[-1,1]区间的连续取值。但是这样做带来了两个问题:(1)存在量化误差(2)内积空间的近似误差变大。所以作者提出了如下所示的bimodal Laplacian prior:
p(hi)=12ϵexp(|||hi|1||1ϵ)(3)

函数的图像如下图所示:
Deep Hashing Network for Efficient Similarity Retrieval
把公(2)(3)带入到公式(1)可以得到最优化的目标:
minΘC=L+λQ(4)

上式中 λ=1/ϵ Θ {Wl,bl} 集合,L是交叉熵损失,Q是量化损失。
L=sijS(log(1+exp(zli,zlj))sijzli,zlj)(5)

Q=sijS(|||zli1||1+|||zli1||1),(6)

公式(6)中的1为全是1的K维的单位向量。由于Q是不可导的,所以需要对Q进行如下替换 |x|logcos(x) ,公式(6)变成了如下所示的可导形式,就可以根据梯度计算下降方向,可到最优解。
Q=si,jSk=1K(logcosh(|zlik|1)+logcosh(|zljk|1))(7)

最后通过sgn函数对 zl 进行二值化:
sgn(x){1,1,x>0x<0

Learning Algorithm

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

CijLij+λQij=log(1+exp(zli,zlj))sijzli,zlk+λk=1K(logcosh(|zlik|1)+logcosh(|zljk|1))(8)

单张图片关于网络第l-th层的k-th单元的参数 Wlk 进行求导可以得到损失函数的梯度:
CiWlk=2j:sijS(LijWlk+λQijWlk)=2j:sijS(Lijz^lik+λQijz^lik)z^likWlk=2δlikzl1l(9)

这里 z^lik=Wlzl1i+bl 是第l层在激活函数之前的形式。 δlikj:sijS(Lijz^lik+λQijz^lik) xi 在经过l层第k个节点与其他point产生的误差的和。
对于输出层的导数计算,可以利用直接的输出结果:
δlik=j:sijS([δ(zli,zll)sij]zljk)a˙lz^lik+λj:sijStanh(|zlik|1)sgn(zlik)a˙lz^lik,(10)

对于其他层的导数计算,直接利用中间的输出结果进行计算:
δl1ik=(k=1ulWlkk)a˙l1z^l1ik(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张作为训练集。和其他方法做出了对比试验,结果如下图所示:
    Deep Hashing Network for Efficient Similarity Retrieval
    准确率和召回率图4所示:
    Deep Hashing Network for Efficient Similarity Retrieval

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