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), $D_1, D_2,…, D_M$,每个 domain 有自己的 label space,希望在这些数据集上训练得到的模型直接应用到新的 domain/dataset 得到好的效果,而不需要更新模型。
The network:
- the encoding subnets: $g_{\phi}$
- mapping subnets: gallery image embedding—>classifier’s weight vector
- memory bank: store all classifiers in training domains
Encoding Subnet(最基本的分类损失): MobilenetV2,这个也是 (MobilenetV2,另外一篇 distill 也是) 。假设在融合后的 $M$ 个数据集中一共有 $C$ 个行人,每个 mini-batch 中取 $C_b$ 个行人,对于每个行人 $l_i$,取两张图片,分别设置为 gallery $\tilde{x}_i$ 和 probe $x_i$,所以在每个 batch 中有 $2C_b$ 个行人图片,组成 $2C_b$ pairs(两张图片可以调过来)。
最基本的分类损失:
其中 $xi$ 表示输入图片,$l_i$ 表示标签,$g{\phi}$ 表示 encoding subnet,得到的是 D 维特征向量,$f_{\theta}$表示分类器,$\theta \in R^{D\times C}$
Mapping Subnet:相对于传统的分类权重 $\theta_{\cdot,j}$ 作为模型参数的一部分,作者直接生成分类权重 identity classifier weight vector:
其中 mapping subnet $h_w$ 可以理解成 hyper-network(不懂,难道为其他网络生成参数就是 hyper-network),这里可以使用简单的 multi-layer perception (MLP)。
对于给定的 gallery image $\tilde{x}j$ and probe image $x_i$,得到 $\hat{\theta}{\cdot,j}$,进而得到 logit vector $p$:
然后对 $p_j$ 进行softmax,这是表示对于 probe image $x_i$, 所有的 gallery images $\tilde{x}_j$ 根据相似度进行排序,亦或者可以理解成 gallery images 为基本分类向量,判断 probe image 属于哪类,真值为如果 probe image 和 gallery image 是同一类,设为1,否则设为0,根据之前写的 mini-batch 的取法,只有一个为1,剩下都为0,可以理解成基本的分类损失。
这里 logit vector $p$ 有两种写法,一种是 $p\in R^C$,表示 probe image 属于哪类,优点是具有 discriminative power,一种是 $p\in R^{C_b}$,表示 probe image 与 mini-batch 的哪张相似,优点是容易收敛训练。为了兼顾 scalability and discriminativity,引入 memory bank.
Memory Bank:Memory bank is a weight matrix$W\in R^{D\times C}$。每个 mini-batch 的 gallery branch 中,有 $Cb$ 个不同 id 的样本,$[ \tilde{x}_1, \tilde{x}_2,…, \tilde{x}{C b}]$,经过 encoding subnet $g {\phi}$ and the mapping subnet $hw$,得到 $C_b$ 个 predicted weight vector $\lbrace \hat{\theta}{\cdot, j}, j=[ 1,2,…, C_b] \rbrace$,即 $\hat{\theta}\in R^{D\times C_b}$.
然后根据 id 更新 $W$,这里的更新还蛮奇怪的,和 ECN 的更新不一样。
先得到 $\hat{W}$: 复制 $W$,$\hat{W} \gets W$,再复制 $\hat{\theta}$,$\hat{W} {\cdot, L(j)} \gets \hat{\theta}{\cdot, j}, \forall j\in [ 1,2,…,C_b]$($L(j)$ 表示第 $j$ 张图片的 id),
然后用类似 ECN 那样,用分类损失
与 ECN 不同地是,第一,ECN 没有真值,所以只能自己像自己,DIMN 有真值,第二,ECN 用的是未更新的 memory,DIMN 用的是半旧半新的 memory。
最后更新:
作者发现有两个 trick 可以帮助稳定训练:对 $W$ 进行二范约束;$W$ 更新前后变化比较小。
Question: 对 $L_{reg}$ 的出现表示存疑,感觉出现的很勉强
Training Objective: 三元组损失,对于 $xi$,$\tilde{x}_i$ 为正样本,其他的 $\hat{W} {\cdot, j’}| {j’\not = i}$ 为负样本,得到 $p=h_w(g{\phi}(\tilde{xi}))\cdot g{\phi}(xi)$,$n=\hat{W} {\cdot, j’}\cdot g {\phi}(x_i)|{j’\not = i}$,归一化为 $S(xi, \tilde{x}_i)$, $S(x_i, \tilde{x}_j’| {j’\not = i})$,从而有
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)$ and mapping subnet $h_w(\cdot)$,在测试阶段,给定 query image $x_i$ and gallery image $\tilde{x}_j$,两张图片的相似度定义为 $h_w(g{\phi}(\tilde{x}j))\cdot g {\phi}(x_i)$.
备注:
- 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 $\alpha=0.5$
- triplet loss margin $\triangle=0.8$
- weight of loss $\lambda_1=\lambda_3=1, \lambda_2=0.01$
4.3 Ablation Study
Question: 直接使用 memory 进行分类损失和使用 fc 进行分类损失有区别吗?前向计算过程是一样的,memory 的权重等同于 fc 的权重。反向求导过程不一样,memory 使用 running average 并进行二范归一化进行更新,fc 的权重使用链式求导进行更新,memory 和 fc 的 feature 反向求导也是一样的公式。也就是说两种唯一的不同在于权重的更新方式,memory 更新时其权重是固定的,fc 更新时其权重是变化的,memory 更新时会进行二范归一化,fc 更新时没有这个操作。这些区别足以产生这么大的影响吗?可能更需要其他理论上的支持
从 ablation study 上看,缺失每一个对最终结果的影响都不大。