小样本学习
前几天接触小样本学习 Few-Shot Learning,感觉很是有意思。看到Shusen Wang老师的讲解,感觉很棒~持续学习~
学会学习 Lean to learn
小朋友去动物园,见到未知的动物,他虽然不知道类别,但是给他看一些卡片,让他比比看哪个长得像,他们很快的判断出所见动物的类别,这就是人类的学习。
如果机器也可以学习呢?给一张图片(Query),这张图训练集并没有出现啊,但是不要慌,有卡片(Support Set)来让模型做选择题,依次比较相似度。学会完成多选一的选择题就是元学习(Meta Learning)需要学到的模型,也就是让机器学会学习。
比较:大样本与小样本学习
传统监督学习
训练集样本大,机器根据训练集中的图片,并泛化到测试集,给出图片,识别出具体的类别。
小样本学习
小样本直接训练神经网络会产生过拟合。小样本学习是元学习(Meta Learning) 的一种,希望模型学会学习,并不是让模型区分训练集未出现的新样本,而是是让机器学会学习事物的异同,给定图片,判断是否为同一类别。
小样本学习基础
基本概念
(1)k-way n-shot Support Set
k-way: support set 中类别数n-shot: 每一类的样本数很明显,way越大,选择变多,准确率会下降,shot越大,样本数增多,准确率会增加。
(2)余弦相似度
衡量两个向量之间的的相似度,两个向量分别为x
和w
,他们的二范数(长度)为1,两向量的内积为余弦相似度,可以理解为x
在w
上投影的长度
如果两个向量长度不一致,需要将两向量归一化,取内积:
(3)softmax
softmax函数是常见激活函数,将向量映射为概率分布,常作为网络最后一层,输出的每个概率值表示对每个类别的Confidence(置信度)。让大的值变大,小的值变小,也就平和一点的max。
softmax 分类器,输入为特征值(全连接层输出的),输出为k维(k是类别数)的概率,W和b维参数,反向传播会训练。
数据集
(1)Omniglot
- 手写数据集,50种不同语言的1632个类别,每个类别有20个样本,样本尺寸为
105*105
。 - 训练集:964类,19280个样本
- 测试集:659类,13180个样本
(2)Mini-ImageNet
- Matching Networks for One Shot Learning(MAML)论文中提出,从ImageNet提取100类,每个类别600样本,样本尺寸为
84*84
- 训练集:64类,38400个样本
- 验证集:16类,9600个样本
- 测试集:20类,1200个样本
网上只有从ImagNet上的原图和CSV文件,我按照MAML的方法生成的数据集,并上传到网盘:
链接:https://pan.baidu.com/s/1nt2WTIXM-bx3s0s51_v_eg 提取码:obg7
基本思想
- 预训练:从大规模数据集中训练一个卷积神经网络
f
来提取图像特征。可以是分类网络去掉全连接层,也可以使用孪生网络(Siamese Network)。 - 小样本预测 :将query和support set 中每个样本映射到特征空间,得到特征,依次比较
query
和support set
中每个特征的相似度( Similarity),进行判定。但是更常用的方法是用support set
训练一个分类器,再进行预测,称为Fine Tuning。
预训练:孪生网络
Siamese Network, Siamese意思是连体婴儿,也就是网络的头不一样,但是脚连在一起,Siamese Network为孪生网络/连体网络。该网络最主要目的:构建卷积神经网络来比较样本之间的异同,训练网络有两种方法:
成对相似度
Pairwise Similarity,数据集取两个样本
1.训练数据集
训练集来自很大样本数据集,训练数据分为正样本,同一类抽取两张不同图片,标签为1,两样本相同;负样本,不同类别抽取两张图片,标签为0,两样本不同。
2.孪生网络结构
(1)提取特征的CNN
输入是图片,输出是特征向量,有卷积池化层的卷积神经网络就是 f
(2)整体网络结构
训练集样本(两张图片)输入到CNN,分别提取出特征向量,两个特征向量相减的绝对值为Z
,用来比较两个特征区别,再用全连接层处理 Z
得到一个值,最后用sigmoid将其转换到[0,1]
区间,这就是样本的sim
。
3.训练网络
(1)前向传播
前向传播就是计算损失,有了样本的sim
,结合正负样本标签Target
,就可以计算损失。
(2)反向传播
反向传播更新卷积神经网络f
和全连接层 Dense Layer
的参数
4.直接预测
query
和 support set
都是训练集中没出现的类别。query
和 support set
每一张作为样本,输入网络,分别得到sim
,最大的为 query
的类别。
三重损失
Triplet Loss,数据集取三个样本
1.训练数据集
在大规模数据集中,某一类别取一个样本为 Anchor,同一类别再取一个样本为Positive,不同类别取一个样本为Negative,这样构成了一组数据。
2.孪生网络结构
同样有一个卷积神经网络作为特征提取,Positive和Negative分别与Anchor的特征向量求差的二范数的平方,记作距离d
3.训练网络
(1)前向传播
距离表现在特征空间上,希望同一类离得近,不同类离得远。
所以,引入一个超参数,使得负样本距离远大于正样本距离加一个超参数,这样损失定义为
(2)反向传播
由于并没有加入全连接层,所以在反向传播时只需要更新卷积神经网络f
的参数
4.直接预测
query
和 support set
都是训练集中没出现的类别。query
和 support set
每一张作为样本,输入网络得到向量特征,计算两样本的距离(差的二范数的平方),距离最小的为 query
的类别。
分类器
希望用support set
实现一个分类器,来预测query
是哪一类别的概率。先看一下基本分类器(直接分类不训练)和使用Fine Tuning的分类器(需要用support set
训练)
基本分类器
预训练生成的特征提取网络记为f
,提取 support set
每个样本特征,如果是few-shot 提取后每类取均值(这是最简单的方法),然后归一化为[0,1]区间。
同理,提取query
的特征,将所有向量映射到特征空间
support set
三个特征记做M
,构建softmax分类器 p = softmax(W*x + b)
,赋值W=M, b=0
,x
为query
的特征q
。这样就可以做预测,显示query
属于每一类的概率 p
,概率最大为所属的类别。
Fine Tuning
基本分类器中的W,b
是固定的,如果使用support set
训练W,b
进行微调(Fine Tuning),当然也可以训练特征提取的CNN。
前向传播
训练数据是来自support set
中的有标签的样本,样本为x
,标签为y
:
计算每一个样本的损失:预测值和和真实标签求交叉熵。累加 support set
所有样本的损失
反向传播
反向传播更新softmax分类器中的W
和b
,也可以更新特征提取网络f
细节
(1)初始化
按照基本分类器赋值W=M, b=0
,作为softmax分类器的初始化
(2)正则化
增加正则化可以使训练效果更好,在损失计算后面增加正则化(Regularization)
使用熵正则化
很明显,如果各个类别概率很相近,那么他们的熵会很大,我们希望各个概率差距大,熵小一点。
(3)引入余弦相似度
分类器原先公式为
把内积替换成余弦相似度 :
相关推荐
【程序喵读论文】分类网络进阶版
【程序喵读论文】图像分类网络
【程序喵笔记】Jupyter 实用篇
扫码关注毛毛喵
一只写程序的喵
科研&生活