1. 前言
这篇文章和 ECN 那篇有相似的地方:Memory 记录所有的特征,并把这些记录的特征直接当做分类器使用,我觉得这样的使用应该有更合理的解释,不同点在于使用 Memory 的具体方式不同,我暂时觉得这里面还有东西可以挖。我记得我之前读过一篇 也是用 Memory 用于分类的论文,那篇直接把已知的和未知的特征都放在 memory 中,更简单巧妙。
该论文首次提到 meta-learning, few-shot learning,我简单查了查。人工智能的理论进展呈现:
Artificial Intelligence—>Machine Learning—>Deep Learning—>Deep Reinforcement Learning—>Deep Meta Learning
深度学习可以在特定的 task 上得到一个很好的模型,但是在其他 task 上效果就会很差,是否可以理解成过拟合呢?应该和过拟合不是一个角度,过拟合指得的是训练集和测试集不可能同时达到各自的最优解,但是 meta learning 更偏向于当出现一个新的少量的样本的时候,不需要巨量的训练,原始数据训练得到的模型作为先验知识,有助于学习新的样本,有点 FUNIt 的味道,又有点像之前看过的一篇 TIP2019 Progressive Learning for Person Re-Identification with One Example,暂时还说不上来这种感觉。郑哲东那个团队是直接 meta-learing 过来的思路吗?不得而知了。
举个例子:分类器可以很好地区分在各种环境下的猫狗之类的动物,这个时候给一张站着的老虎图片用于二次训练,使得二次训练后的分类器既能对于分猫狗的性能不下降,又对各种环境下的老虎图片也有相同的区分能力。如果直接从头开始训练,训练集为一张老虎+各种环境下的猫狗,显然对于老虎的区分能力很弱。
meta-leaning 现在的研究思路
- 基于记忆Memory的方法
- 基于预测梯度的方法
- 利用Attention注意力机制的方法
- 借鉴LSTM的方法
- 面向RL的Meta Learning方法
- 通过训练一个好的base model的方法,并且同时应用到监督学习和增强学习
- 利用WaveNet的方法
- 预测Loss的方法
参考链接: https://zhuanlan.zhihu.com/p/28639662
示例视频: https://zhuanlan.zhihu.com/p/46002992
其他资料: https://www.zhihu.com/topic/20140823/hot
三个趋势: 自动驾驶,强化学习,元学习
作者 Jifei Song,博三,敦煌玛丽女王大学的 SketchX 实验室,16年 BMVC,17年 ICCV,18年 CPVR,19年 CVPR,大佬发文章都白送的吗,刚不过刚不过。
2. Introduction
作者希望可以在 a set of source domains 上一次训练,直接直接应用到 unseen dataset 上,称之为 Domain-Invariant Mapping Network (DIMN),遵循 meta-learning pipeline amd sample a subset of source domain training tasks(identities) during each training episode。
现有的 cross domain person Re-ID 可以分为 unsupervised domain adaptation (UDA),domain generalization(DG)(few-shot meta learning)。
However, existing DG methods [20, 34, 23, 39] assume that the source and target domain have the same label space; whilst existing metalearning models [49, 49, 10, 35, 40] assume a fixed number of classes for target domains and are trained specifically for that number using source data.
补充: 之前看过的 UDA 论文旨在寻找 domain-invariant feature space,而 DG(domain generalization) 旨在更好地模型迅速地适应新的 domain。
DIMN 的目的是学习 a mapping between a person image and its identity classifier weight vector.
DIMN 不同于传统的 meta-learning :
- 在 target domain 中不需要更新,这一点和 ECN 有点区别,ECN 使用了 target domain 的信息
- 不同的 training tasks share a memory bank, memory bank 使用 running average strategy 的方式更新,这一点和 ECN 差不多
- 训练得到的模型可以应用于有任意数量行人的 target domain,这一点和 ECN 不一样,ECN 基本只保证了在哪训练用在哪
感觉这个目标定的要比 ECN 更高一些。
作者在实际实验的时候使用5个 datasets 作为 source domains,另外4个 datasets 作为 target domains,实验结果不是很全,比如没有做只有一个 dataset 的 source domain 的效果。所以不能完全排除因为扩大数据集而造成的性能提高。但是根据现有的使用过 memory 的论文,我觉得还是可信的。
3. Methodology
背景:已知有标签的 M 个 datasets(domains),

The network:
- the encoding subnets:
- mapping subnets: gallery image embedding—>classifier’s weight vector
- memory bank: store all classifiers in training domains
Encoding Subnet(最基本的分类损失): MobilenetV2,这个也是 (MobilenetV2,另外一篇 distill 也是) 。假设在融合后的
最基本的分类损失:
其中 $xi
Mapping Subnet:相对于传统的分类权重
其中 mapping subnet
对于给定的 gallery image $\tilde{x}j
然后对
这里 logit vector
Memory Bank:Memory bank is a weight matrix
然后根据 id 更新
先得到
然后用类似 ECN 那样,用分类损失
与 ECN 不同地是,第一,ECN 没有真值,所以只能自己像自己,DIMN 有真值,第二,ECN 用的是未更新的 memory,DIMN 用的是半旧半新的 memory。
最后更新:
作者发现有两个 trick 可以帮助稳定训练:对
Question: 对
Training Objective: 三元组损失,对于 $xi
Overall:
备注 ECN:
- memory 的使用:ECN 先计算损失后更新, DIMN 半更新计算损失后全更新
- 损失函数: ECN 使用 memory 进行了两次分类损失和一次假标签分类损失,DIMN 使用 memory 进行了一次分类损失和一次三元组损失。
- memory 的输入: ECN 中 memory 和基本分类损失用的是同一张图片,DIMN 中 memory 和基本分类损失用的不是同一张图片
- memory 的特征:ECN 中直接共享网络提取到的,DIMN 又经过了一次 mapping subnet.
Model Testing: 上述的损失函数可以学习到 encoding subnet $g{\phi}(\cdot)
备注:
- DIMN 是一个 DG method 而不是一个 one-shot learning,因为只在 source domain 上训练
- 传统的 deep ReID 的相似度计算是 $g{\phi}(\tilde{x}_j)\cdot g {\phi}(x_i)$
4. Experiments
4.1 Datasets and Settings
A Large-Scale ReID benchmark:
- source datasets: CUHK02, CUHK03, Market-1501, DukeMTMC-ReID, CUHK-SYSU PersonSearch
- test datasets: VIPeR, PRID, GRID, i-LIDS

Implementation Details:
- encoding subnet: MobileNetV2, output: 1792
- mapping subnet: a single fully-connected layer
- running average parameter
- triplet loss margin
- weight of loss
4.3 Ablation Study

Question: 直接使用 memory 进行分类损失和使用 fc 进行分类损失有区别吗?前向计算过程是一样的,memory 的权重等同于 fc 的权重。反向求导过程不一样,memory 使用 running average 并进行二范归一化进行更新,fc 的权重使用链式求导进行更新,memory 和 fc 的 feature 反向求导也是一样的公式。也就是说两种唯一的不同在于权重的更新方式,memory 更新时其权重是固定的,fc 更新时其权重是变化的,memory 更新时会进行二范归一化,fc 更新时没有这个操作。这些区别足以产生这么大的影响吗?可能更需要其他理论上的支持
从 ablation study 上看,缺失每一个对最终结果的影响都不大。