梦里风林
  • Introduction
  • Android
    • activity
      • Activity四种启动模式
      • Intent Flag
      • 多task的应用
      • Task和回退栈
    • sqlite
      • 【源码】CursorWindow读DB
      • Sqlite在Android上的一个Bug
    • Chromium
    • ListView读取DB数据最佳实践
    • Android Project结构
    • 一个由Proguard与FastJson引起的血案
    • 琐碎的一些tips
  • Computer Vision
    • 特征提取
    • 三维视觉
    • 计算机视觉常用工具
    • 浅谈深度学习数据集设计
    • 随笔
  • Machine Learning
    • 技巧
      • FaceBook: 1 hour training ImageNet
      • L2 Norm与L2 normalize
    • 实践
      • Pytorch实验代码的亿些小细节
    • 工具
      • Tensorflow学习笔记
      • MXNet踩坑手记
      • PyTorch踩坑手记
      • PyTorch模型剪枝
      • Keras踩坑手记
      • mscnn
      • Matlab
        • Matlab Remote IPC自动化数据处理
    • Papers
      • Classification
      • Re-identification
        • CVPR2018:TFusion完全解读
        • ECCV2018:TAUDL
        • CVPR2018:Graph+reid
        • Person Re-identification
        • CVPR2016 Re-id
        • Camera topology and Person Re-id
        • Deep transfer learning Person Re-id
        • Evaluate
      • Object Detection
        • 读论文系列·干货满满的RCNN
        • 读论文系列·SPP-net
        • 读论文系列·Fast RCNN
        • 读论文系列·Faster RCNN
        • 读论文系列·YOLO
        • 读论文系列·SSD
        • 读论文系列·YOLOv2 & YOLOv3
        • 读论文系列·detection其他文章推荐
      • Depth
      • 3D vision
        • 数据集相关
        • 光流相关
      • Hashing
        • CVPR2018: SSAH
      • 大杂烩
        • CNCC2017 琐记
        • ECCV 2016 Hydra CCNN
        • CNCC2017深度学习与跨媒体智能
        • MLA2016笔记
    • 《机器学习》(周志华)读书笔记
      • 西瓜书概念整理
        • 绪论
        • 模型评估与选择
        • 线性模型
        • 决策树
        • 神经网络
        • 支持向量机
        • 贝叶斯分类器
        • 集成学习
        • 聚类
        • 降维与度量学习
        • 特征选择与稀疏学习
        • 计算学习理论
        • 半监督学习
        • 概率图模型
        • 规则学习
        • 强化学习
        • 附录
  • Java
    • java web
      • Servlet部署
      • 琐碎的tips
    • JNI
    • Note
    • Effective Java笔记
  • 后端开发
    • 架构设计
    • 数据库
    • java web
      • Servlet部署
      • 琐碎的tips
    • Spring boot
    • django
    • 分布式
  • Linux && Hardware
    • Ubuntu安装与初始配置
    • 树莓派相关
      • 树莓派3B+无线网卡监听模式
      • TP-LINK TL-WR703N v1.7 openwrt flashing
  • Python
    • django
    • 原生模块
    • 设计模式
    • 可视化
    • 常用库踩坑指南
  • web前端
    • header div固定,content div填充父容器
    • json接口资源
  • UI
  • kit
    • vim
    • git/github
      • 刷爆github小绿点
    • Markdown/gitbook
      • 琐碎知识点
      • gitbook添加disqus作为评论
      • 导出chrome书签为Markdown
      • Markdown here && 微信公众号
    • LaTex
      • LaTex琐记
    • 科学上网
    • 虚拟机
  • thinking-in-program
    • 怎样打日志
  • 我的收藏
  • 琐记
    • 论文心得
    • 深圳买房攻略
  • 赞赏支持
由 GitBook 提供支持
在本页
  • 问题描述
  • 常用方法
  • SSAH
  • Self supervised semantic Generation(L->F->L+H->B)
  • Feature Learning(I/T->F->L+H->B)
  • Adversarial learning
  • Training
  • 方法评估
  • Summary

这有帮助吗?

  1. Machine Learning
  2. Papers

Hashing

上一页光流相关下一页CVPR2018: SSAH

最后更新于3年前

这有帮助吗?

转载请注明作者:

这是腾讯AI Lab与西电合作的一篇CVPR2018的paper,在多模态检索任务中加入对抗网络组件,为跨模态对象生成更好的语义特征,从而提高了跨模态检索的效果。

问题描述

跨模态检索:

  • 利用一种模态的数据去检索另一种模态中的数据,比如文字搜图片

  • 寻找多种模态的数据对应的关键字

  • 常用的数据集:MSCOCO, NUS-WIDE, MIRFLICKR-25K

如果我们在检索的时候再去做特征提取,检索速度会很慢,因此通常需要预先将特征提取出来,根据相似度建立索引,从而加快检索速度,为了节省存储空间,并加快计算效率,通常会要求特征尽量短,并且是二进制表示,这样的特征我们称为Hash。

常用方法

我们要根据多模态的内容生成一个hash,希望不同模态的同个对象hash尽量相近,不同对象的hash尽量不同。由于跨模态的内容具有语义上的联系,通常的做法是将不同模态的内容映射到公共的语义空间,已经有很多这方面的工作,有监督/无监督的,Shallow的手工特征/Deep特征。得到特征之后,可以用sign操作将连续的feature向量变成离散值,从而得到更轻量的特征。

SSAH

  • 利用深度提取图像和文本特征,转为hash(I/T->F->L+H->B)

  • 利用标签生成特征,再转为hash,并希望特征能够还原回label((L->F->L+H->B)

  • 有监督地最小化不同模态特征和hash的差异

  • 加入能够区分不同来源的特征的判别器进行对抗训练,进一步减小不同模态特征的差异

接下来具体讲其中几个部分:

Self supervised semantic Generation(L->F->L+H->B)

  • 输入:某个图文对应的label,每个对象会对应多个label,one hot成01向量

  • 经过四层神经网络(L->4096->512->N)

  • 输出长度为N的向量,N=K+c,K为哈希码长度,c为label的类别个数

  • 训练目标:让生成的hash保留语义上的相关性,并能还原回原来的label

  • HlH^lHl 是根据label生成的hash,

  • BlB^lBl是由hash执行sign操作得到的二进制码

  • L^\hat{L}L^ 是由特征还原回来的label

  • LLL 是原本的label

  • Δijl=12(Fil)⊤(Fjl)\Delta_{ij}^l=\frac{1}{2}(F_i^l)^\top(F_j^l)Δijl​=21​(Fil​)⊤(Fjl​) ,即样本i和样本j的label生成的特征的余弦相似度

  • Γijl=12(Hil)⊤(Hjl)\Gamma_{ij}^l=\frac{1}{2}(H_i^l)^\top(H_j^l)Γijl​=21​(Hil​)⊤(Hjl​),即样本i和样本j的label生成的特征余弦相似度

  • SijS_{ij}Sij​ 表示样本i和j是否包含至少一个相同的label,

    • 包含为1,表示样本i和j在语义上相似

    • 不包含为0,表示样本i和j在语义上不相似

  • 对于 J1\mathcal{J}_1J1​ ,

−∑i,j=1nSijΔijl−log(1+eΔijl)-\sum_{i,j=1}^{n}{S_{ij}\Delta_{ij}^{l}-log(1+e^{\Delta_{ij}^l})}−∑i,j=1n​Sij​Δijl​−log(1+eΔijl​)

=−∑i,j=1nlog(eSijΔijl1+eΔijl)= -\sum_{i,j=1}^{n}{log(\frac{e^{S_{ij}\Delta_{ij}^{l}}}{1+e^{\Delta_{ij}^l}})}=−∑i,j=1n​log(1+eΔijl​eSij​Δijl​​)

=−∑i,j=1nlog(eΔijl1+eΔijl)ifSij=1= -\sum_{i,j=1}^{n}{log(\frac{e^{\Delta_{ij}^{l}}}{1+e^{\Delta_{ij}^l}})} if S_{ij}=1=−∑i,j=1n​log(1+eΔijl​eΔijl​​)ifSij​=1

=−∑i,j=1nlog(11+eΔijl)ifSij=0= -\sum_{i,j=1}^{n}{log(\frac{1}{1+e^{\Delta_{ij}^l}})} if S_{ij}=0=−∑i,j=1n​log(1+eΔijl​1​)ifSij​=0

=∑i,j=1n−Sijlog(eΔijl1+eΔijl)−(1−Sij)log(1−eΔijl1+eΔijl)= \sum_{i,j=1}^{n}-{S_{ij}log(\frac{e^{\Delta_{ij}^{l}}}{1+e^{\Delta_{ij}^l}})-(1-S_{ij})log(1-\frac{e^{\Delta_{ij}^{l}}}{1+e^{\Delta_{ij}^l}})}=∑i,j=1n​−Sij​log(1+eΔijl​eΔijl​​)−(1−Sij​)log(1−1+eΔijl​eΔijl​​)

所以,实际上这个loss和交叉熵loss是等效的

即Sij=1S_{ij}=1Sij​=1时,

min−∑i,j=1nlog(eΔijl1+eΔijl)=max∑i,j=1nlog(11+e−Δijl)=maxΔijlmin -\sum_{i,j=1}^{n}{log(\frac{e^{\Delta_{ij}^{l}}}{1+e^{\Delta_{ij}^l}})}=max\sum_{i,j=1}^{n}{log(\frac{1}{1+e^{-\Delta_{ij}^l}})}=max \Delta_{ij}^lmin−∑i,j=1n​log(1+eΔijl​eΔijl​​)=max∑i,j=1n​log(1+e−Δijl​1​)=maxΔijl​

最大化两个向量的余弦相似度

Sij=0S_{ij}=0Sij​=0 时,

min−∑i,j=1nlog(11+eΔijl)=max∑i,j=1nlog(11+eΔijl)=minΔijlmin -\sum_{i,j=1}^{n}{log(\frac{1}{1+e^{\Delta_{ij}^l}})}=max\sum_{i,j=1}^{n}{log(\frac{1}{1+e^{\Delta_{ij}^l}})}=min\Delta_{ij}^lmin−∑i,j=1n​log(1+eΔijl​1​)=max∑i,j=1n​log(1+eΔijl​1​)=minΔijl​

最小化两个向量的余弦相似度

  • 对于J2\mathcal{J}_2J2​ 同理,从而约束了相似的label具有相似的hash

  • 对于 J3\mathcal{J}_3J3​, 使 HlH^lHl 和 BlB^lBl 尽可能接近,从而使得Hash向量中的元素尽量接近-1,1,减少了 H -> B 时的损失

  • 对于 J4\mathcal{J}_4J4​ , 使得还原的标签与原来的标签尽可能相同

这个部分跟自编码器很像,是自监督的过程,由label生成特征,再由特征还原回label

Feature Learning(I/T->F->L+H->B)

  • 输入:图像/文本,

  • 经过神经网络提取特征(图像和文本的网络不同)

  • 输出长度为N的向量,N=K+c,K为哈希码长度,c为label的类别个数

  • 训练目标:

    • 在特征中保留语义信息,因此希望预测label与真实label相近

    • hash尽量接近binary code

    • 让特征提取得到的feature和hash与Semantic Generation得到的特征和hash尽量相同,

      • 因此监督信号做feature learning的时候还对提取feature和生成feature的相似性做约束,

      • 对提取hash和生成hash的相似性做约束

其中,图像的特征提取网络作者试用了CNN-F和VGG16(VGG16更优),文本特征提取则是一个新的多尺度融合模型:

  • 输入:文本,转为一个词袋向量,由于词袋向量非常稀疏,需要转化为一个相对稠密的向量

  • 网络:T->Multi-scale Fusion->4096->512->N

  • 输出长度为N的向量,N=K+c,K为哈希码长度,c为label的类别个数

  • Multi-scale Fusion:

    • 5个average pooling layer(1x1,2x2,3x3,5x5,10x10)+1个1x1conv

训练Loss与前面的Semantic Generation很像

其中

  • Δijl=12(Fil)⊤(Fjv,t)\Delta_{ij}^l=\frac{1}{2}(F_i^{l})^\top(F_j^{v,t})Δijl​=21​(Fil​)⊤(Fjv,t​),即样本i的标签label生成的特征和样本j的输入(图/文)提取的特征的余弦相似度,目标是使提取的特征和生成的特征尽量相近

  • Γijl=12(Hil)⊤(Hjv,t)\Gamma_{ij}^l=\frac{1}{2}(H_i^l)^\top(H_j^{v,t})Γijl​=21​(Hil​)⊤(Hjv,t​),即样本i的标签label生成的hash和样本j的输入(图/文)提取的hash的余弦相似度,目标是使提取的hash和生成的hash尽量相近

Adversarial learning

  • Motivation:不同模态提取的特征会有不同的分布,希望相同语义的对象在不同模态里的特征表达尽量接近

  • Solution:加入判别器D,希望D能区分特征是来自Feature Learning还是Semantic Generation,D越强大,越能区分两种特征,要欺骗D,就迫使Feature Learning和Semantic Generation得到的特征尽量相近

  • 判别器D的网络结构:F->4096->4096->1

  • 每个样本(图+文+label)产生3个特征 (𝑥𝑖𝑣,𝑥𝑖𝑡,𝑥𝑖𝑙)(𝑥_𝑖^𝑣,𝑥_𝑖^𝑡,𝑥_𝑖^𝑙)(xiv​,xit​,xil​)

  • 输入:图/文特征+生成特征 (𝑥𝑖𝑣,𝑥𝑖𝑙)(𝑥_𝑖^𝑣, 𝑥_𝑖^𝑙 )(xiv​,xil​) 或(𝑥𝑖𝑡,𝑥𝑖𝑙)(𝑥_𝑖^𝑡,𝑥_𝑖^𝑙)(xit​,xil​)

  • 输出: (𝑦𝑖𝑣,𝑦𝑖𝑙)(𝑦_𝑖^𝑣, 𝑦_𝑖^𝑙 )(yiv​,yil​) 或 (𝑦𝑖𝑡,𝑦𝑖𝑙)(𝑦_𝑖^𝑡, 𝑦_𝑖^𝑙 )(yit​,yil​) ,即输入向量是否来自生成特征

  • 监督信号: 𝑦𝑖𝑣𝑦_𝑖^𝑣yiv​ 或 𝑦𝑖𝑡=0𝑦_𝑖^𝑡=0yit​=0,𝑦𝑖𝑙=1𝑦_𝑖^𝑙=1yil​=1

  • 判别器的损失函数:

Training

  • 于是我们有了特征生成Loss:

    Lgen=Lv+Lt+Ll\mathcal{L}_{gen}=\mathcal{L}^v+\mathcal{L}^t+\mathcal{L}^lLgen​=Lv+Lt+Ll

图像特征提取loss+文本特征提取loss+标签生成loss

  • 以及对抗loss Ladv=Ladvv+Ladvt\mathcal{L}_{adv}=\mathcal{L}^v_{adv}+\mathcal{L}^t_{adv}Ladv​=Ladvv​+Ladvt​

  • 我们的优化目标是: (B,θv,t,l)=argminB,θv,t,lLgen(B,θv,t,l)−Ladv(θ^adv)(B,\theta^{v,t,l})=argmin_{B,\theta^{v,t,l}}\mathcal{L}_{gen}(B,\theta^{v,t,l})-\mathcal{L}_{adv}(\hat{\theta}_{adv})(B,θv,t,l)=argminB,θv,t,l​Lgen​(B,θv,t,l)−Ladv​(θ^adv​)

在最优的判别器参数 θ^adv\hat{\theta}_{adv}θ^adv​ 下,最小化特征的生成Loss

以及

θadv=argmaxθadvLgen(B^,θ^v,t,l)−Ladv(θadv)\theta_{adv}=argmax_{\theta_{adv}} L_{gen}(\hat{B}, \hat{\theta}^{v,t,l})-L_{adv}(\theta_{adv})θadv​=argmaxθadv​​Lgen​(B^,θ^v,t,l)−Ladv​(θadv​)

在最优生成器参数 B^,θ^v,t,l\hat{B}, \hat{\theta}^{v,t,l}B^,θ^v,t,l下,最小化判别器的识别误差 LadvL_{adv}Ladv​

  • 具体实现上,分为四步迭代进行优化:

    • Label自监督生成特征

    • 图像分类器feature learning

    • 文本分类器feature learning

    • 判别器训练

于是SSAH的工作机制就梳理完毕了

方法评估

生成的Hash效果是否足够好,通常由Hamming Ranking和Hash Lookup来评估,在论文中,作者还对模型本身做了Training efficiency,Sensitivity analysis,Ablation study的实验评估。

  • Hamming Ranking

    • 按照哈希码海明距离进行Ranking,计算mAP

可以看到使用VGG作为图像基础网络时,SSAH准确率领先其他方法很多。

  • Hash Lookup

    • 海明距离小于某个值认为是正样本,这个值称为Hamming Radius,改变Radius可以改变Precision-Recall的值,于是可以得到P-R曲线,P-R曲线与坐标轴围成的面积越大,说明效果越好

SSAH的PR曲线基本都是在其他模型的曲线之上

  • 对Ranking的结果计算TopN的命中率(不过这个文中好像没讲)

  • Training efficiency

    • 达到相同的效果所需训练时间

相对于另一种深度学习方法DCMH,SSAH只要比较短的时间就能得到比较好的效果

  • Sensitivity analysis

    • 超参数改变时的结果变化

可以看到,超参数变化时,准确率依然能维持在比较高的水平

  • Ablation study

    • 去除不同组件对效果的影响

其中, SSAH-1: remove LabNet SSAH-2: TxtNet改成三层全连接 SSAH-3: 去掉对抗网络 可以看到在I2T任务中,标签生成网络是很重要的,在T2I任务中对抗网络的效果更明显。

Summary

SSAH中最妙的两点是,用Label生成特征和哈希来监督feature learning,加入对抗学习来拉近不同模态特征的相似性,模型的思路足够清晰,容易复现,有很多值得学习的东西。

这篇论文提出了一个结合对抗学习的深度神经网络:

训练目标由这个Loss约束完成:

首先解释一下符号(以下数学符号用LaTeX格式显示,简书不支持公式编辑,更好的阅读体验请查看),

但又与之前的模型不同,这里的监督信号有标签和标签生成的特征,而之前的监督信号就是输入本身。

即最小化判别器的预测误差

梦里茶
cweihang.io