few-shot learning 竞赛学习
# Few-shot Learning 竞赛学习-1
最近离一个比赛结束还有不到一周,准备来快速学习下 few-shot learning 看能不能摸到奖(大雾)
# 01、问题描述
1.1 数据描述
- 训练集有 49990 张图像,分为10类,每张图像的尺寸为 32 x 32
- 其中有 20 张有标注,每类2张,剩下 49970 张图像无标注
- 验证集有10类,每类1张
- 测试集有 10000 张
1.2 竞赛问题定义
按照 Few-shot learning 的定义来讲,训练集中随机抽取 C 个类别,每个类别 K 个样本(总共 CK 个数据),成为C-way K-shot 问题。
该竞赛的任务被定义为 10-way 2-shot 问题,也就是 10 类,每类 2 张有标注
# 02、竞赛学习
# 2.1 参考资料[1] & 参考资料 [2]
这里首先学习下参考资料[1]与参考资料[2]
支撑集(Support Set):即 C 类,每类 K 个样本所组成的 CK 个数据
查询集(Query Set):类似测试集,包含 Q 张未分类图像即这里的 10000 张
这里重点关注下 Metric Based 方法,看起来比较容易实现。Metric Based 方法通过度量 batch 集中的样本和 support 集中样本的距离,借助最近邻的思想完成分类。
度量学习的基本思想是学习单个数据(如图像)之间的距离函数。它已被证明对于解决小样本分类任务非常有效:度量学习算法通过将查询集图像与已标记的支持集图像进行比较来进行分类。
- 将支持集和查询集的所有图像提取 Embedding,
- 查询集中的每张图像都根据其与支持集图像的距离来进行分类,例如欧氏距离/余弦距离 以及 KNN 算法
可以使用孪生网络(Siamese Network)
训练时,通过组合的方式构造不同的成对样本,输入网络进行训练,在最上层通过样本对的距离来判断他们是否属于同一类,并产生对应的概率分布。
在预测阶段,将测试样本集和支撑集之间每一个样本对都进行推理,预测结果为支撑集上概率最高的类别
可以使用原型网络(Prototype Network)
- 每个类都存在一个原型表达,该类的原型是 support set 在 embedding 空间中的均值
- 分类问题即可变成在 embedding 空间中的最近邻问题
Relation Network
- 认为度量方式也是网络中重要的一环,需要对其进行建模
该文章提出了统一的 Encode-Induction-Relation 描述框架
# 2.2 参考资料[3]
参考资料[3] 解释了 Meta-learning 方法的步骤
训练时
将训练集采样成 Support Set 以及 Query Set
基于Support Set 生成分类模型 F
利用模型 F 对 Query Set 进行分类预测生成 predict labels(pseudo-label)
通过 query labels 和 predicted labels 进行 loss 的计算,从而更新网络参数
测试时:
- 利用分类模型 F 对 Query Set 进行预测
# 2.3 参考资料[4]
参考资料[4] 介绍了Metric Learning 中的损失函数
- Contrastive loss
- 输入:两个样本组成的样本对,label 为该样本对是否属于同一类
- 超参数 maigin,表示不同类样本之间的距离应该超过该 margin 值
- Triplet loss:
- 输入:一个三元组,query + positive sample + negative sample
- Triplet loss 要求 query 到 负样本的距离与 query 到正样本的距离之差要大于 margin 值
- Contrastive loss和triplet loss都很常用,一般来说,Triplet-Loss 的效果比 Contrastive Loss 的效果要好,因为他考虑了正负样本与锚点的距离关系。然而,这两种loss函数如果单独使用则会遭遇收敛速度慢的问题。在学习过程的后期,大多数样本都能满足损失函数的约束条件,这些样本对应进一步学习的贡献很小。因此,这两种损失函数都需要配合hard sample mining的学习策略一起使用,例如 FaceNet 提出的 simi-hard negative sample mining方法。
- N-pair-ms loss
- 考虑 query 与多个类别的负样本之间的关系,促使 query 与其他所有类之间都保持距离,能够加快模型的收敛速度
- Lifted Struct loss
- 基于 mini-batch 中的所有正负样本对来计算 loss
- 对于每一个正样本对{i,j},挖掘出最困难的负样本,与 i 和 j 距离最近的负样本用于计算 triplet loss
- 优点:动态构建最困难的三元组
- Ranked list loss
- 上述方法的缺点
- 上述损失函数提出加入负样本来获得结构化的信息,但是使用的负样本只是一小部分
- 这些损失函数没有考虑类内的数据分布,都追求将同一类压缩到同一个点上
- 上述方法的缺点
- Multi-Similarity loss
- 自相似性:根据样本对自身计算出的相似性,这是一种最常用也是最重要的相似性。例如,当一个负样本对的余弦相似性较大时,意味着很难把该样本对所对应的两种类别区分开来,这样的样本对对模型来说是困难的,也是有信息量的,对于模型学习更有区分度的特征很有帮助。另一方面,自相似性很难完整地描述embedding空间的样本分布情况。
- 正相对相似性:不仅考虑当前样本对自身的相似性,还考虑局部邻域内正样本对之间的相对关系。
- 负相对相似性:不仅考虑当前样本对自身的相似性,还考虑局部邻域内负样本对之间的相对关系。
# 2.4 参考资料 [5]
[5] 中比较清晰地说出了几种方法
- 度量学习:提特征,算距离,KNN 等方式分类
- FSL 定制的数据增强:增加数据的量用于 fine-tuning
- 元学习:在任务级别上学习而不是在样本上学习
# 2.5 Paperwithcode SOTA 论文的方法
- Image Clustering on CIFAR-100 (opens new window)
- Accuracy 0.584:https://paperswithcode.com/paper/spice-semantic-pseudo-labeling-for-image
- Accuracy 0.543:https://paperswithcode.com/paper/improving-unsupervised-image-clustering-with
- Accuracy 0.507:https://paperswithcode.com/paper/learning-to-classify-images-without-labels
- Few-Shot Image Classification on CIFAR-FS 5-way (1-shot) (opens new window)
- Accuracy 87.79:https://paperswithcode.com/paper/transfer-learning-based-few-shot
- Accuracy 87.73:https://paperswithcode.com/paper/sill-net-feature-augmentation-with-separated
- Accuracy 87.69:https://paperswithcode.com/paper/leveraging-the-feature-distribution-in
# 2.6 kaggle 竞赛的方法
参考资料[6] 和[7] 两篇是知乎 “砍手豪” 大神所写的 kaggle 上 few-shot 竞赛的文章,值得学习,可以先看看是否能找到 baseline.
tricks
- 实现 LR finder
EDA
- 查找重复图像
- 模型可视化:https://www.kaggle.com/martinpiotte/whale-recognition-model-with-score-0-78563
- t-SNE 特征可视化
Siamese Network 神经网络
- Siamese神经网络比较两个图像,并确定这两个图像是从同一条鲸鱼还是从不同的鲸鱼中获取
- https://www.kaggle.com/martinpiotte/whale-recognition-model-with-score-0-78563/data
- https://www.kaggle.com/seesee/siamese-pretrained-0-822
- https://www.kaggle.com/voglinio/siamese-two-pretrained-weights-0-855
Metric Learning 神经网络
- Metric Learning 使用网络提取 Embedding,再比较 Embedding 之间的距离来进行分类
- https://www.kaggle.com/c/humpback-whale-identification/discussion/74647
- https://www.kaggle.com/iafoss/similarity-densenet121-0-805lb-kernel-time-limit
Winner model
- 1st solution: https://www.kaggle.com/c/humpback-whale-identification/discussion/82366
- 四通道:RGB + Masks 作为输入(我们可以将RGB + Edges + Masks 作为输入)
- 2nd solution: https://www.kaggle.com/c/humpback-whale-identification/discussion/83885
- 三种 loss:arcface loss + triplet loss + focal loss
- 三个backbone:resnet101,seresnet101,seresnext101
- 4th solution: https://www.kaggle.com/c/humpback-whale-identification/discussion/82356
- 4th Place Solution: SIFT + Siamese
- 介绍了一些降低复杂度的方法
- 1st solution: https://www.kaggle.com/c/humpback-whale-identification/discussion/82366
# 2.7 其他方法
Deep Clustering (opens new window)
- https://vissl.readthedocs.io/en/latest/ssl_approaches/deepclusterv2.html
- https://github.com/facebookresearch/vissl/blob/master/docs/source/ssl_approaches/deepclusterv2.rst
Simsiam
- https://github.com/facebookresearch/simsiam
孪生网络和对比学习有什么不同?
- 孪生网络一般针对半监督问题设置
- 对比学习一般针对无监督问题设置
2.2 Rotation Loss 是什么
# 参考资料
[1] https://zhuanlan.zhihu.com/p/61215293
[2] https://zhuanlan.zhihu.com/p/110075024
[3] https://zhuanlan.zhihu.com/p/149983811
[4] https://zhuanlan.zhihu.com/p/82199561
[5] https://zhuanlan.zhihu.com/p/258562899
[6] https://zhuanlan.zhihu.com/p/87969454
[7] https://zhuanlan.zhihu.com/p/111644699
- 02
- README 美化05-20
- 03
- 常见 Tricks 代码片段05-12