小样本学习&元学习经典论文整理||持续更新
核心思想
本文提出一种直接预测分类器权重参数的小样本学习算法。作者的想法是对于普通的分类算法,无非就是将特征提取网络输出的特征向量
a
(
x
)
a(x)
a(x)输入到分类器(全连接层+softmax)中,与全连接层中的权重参数
W
W
W相乘,计算内积,再用softmax函数转化为概率值,整个过程的目的就是希望
a
(
x
)
⋅
w
y
a(x)\cdot w_y
a(x)⋅wy尽可能的大(
y
y
y表示样本
x
x
x对应的类别)。对于大规模的数据集,分类器中的权重参数是能够训练得到的,但对于小样本数据集就很难通过训练得到合适的权重,因此作者希望通过一个参数预测器
ϕ
\phi
ϕ直接输出分类器的权重参数。那么参数预测器
ϕ
\phi
ϕ要根据什么来预测分类器的权重参数呢?作者选择了特征提取网络输出的特征向量
A
y
=
{
a
(
x
)
∣
x
∈
D
l
a
r
g
e
∪
D
f
e
w
,
Y
(
x
)
=
y
}
A_y=\left \{a(x)|x\in D_{large}\cup D_{few},Y(x)=y\right \}
Ay={a(x)∣x∈Dlarge∪Dfew,Y(x)=y}的平均值
a
ˉ
y
\bar{a}_y
aˉy,这里的
a
ˉ
y
\bar{a}_y
aˉy就是类别
y
y
y的样本特征向量的平均值,可以理解为PN网络中的原型Prototype。这样做的依据是作者发现通过t-SNE将特征向量可视化后,
a
ˉ
y
\bar{a}_y
aˉy与对应类别的分类权重
w
y
w_y
wy非常接近。
如此一来整个算法的思想就很清晰了,就是利用一个网络
ϕ
\phi
ϕ,根据每类样本的特征向量平均值
a
ˉ
y
\bar{a}_y
aˉy,来预测分类器中全连接层的分类权重
w
y
=
ϕ
(
a
ˉ
y
)
w_y=\phi(\bar{a}_y)
wy=ϕ(aˉy)。但有一个问题,对于大规模的数据集
a
ˉ
y
\bar{a}_y
aˉy是具有代表性的,但对于小样本数据集,甚至某些类别的样本只有一个,那么
a
ˉ
y
=
a
y
\bar{a}_y=a_y
aˉy=ay,这种情况下再计算
a
ˉ
y
\bar{a}_y
aˉy可能就不一定适用了。如何解决这个问题呢?作者在大规模数据集上做预训练时,就允许模型随机从
A
y
A_y
Ay和
a
ˉ
y
\bar{a}_y
aˉy中采样,来作为权重预测器
ϕ
\phi
ϕ的输入
s
y
s_y
sy,作者称之为统计值,其构成的集合为统计集(statistic set)
S
l
a
r
g
e
=
{
s
y
∈
A
y
∪
a
ˉ
y
∣
y
=
1
,
2...
,
∣
C
l
a
r
g
e
∣
}
S_{large}=\left \{s_y\in A_y\cup \bar{a}_y|y=1,2...,|C_{large}|\right \}
Slarge={sy∈Ay∪aˉy∣y=1,2...,∣Clarge∣}。也就是说
s
y
s_y
sy既可以从该类别的所有样本的特征向量
A
y
A_y
Ay中选择,也可以选择该类别所有样本特征向量的平均值
a
ˉ
y
\bar{a}_y
aˉy,选择
a
ˉ
y
\bar{a}_y
aˉy的概率是
p
m
e
a
n
p_{mean}
pmean,从
A
y
A_y
Ay中选择的概率是
1
−
p
m
e
a
n
1-p_{mean}
1−pmean。整个算法的过程 如下图所示
每个类别的分类概率计算方式如下
式中
E
S
\mathbb{E}_S
ES表示期望值,这里又出现一个新的问题,那就是如果要计算
x
x
x属于
y
y
y的概率,需要计算
a
(
x
)
a(x)
a(x)和所有类别的分类权重
ϕ
(
s
y
′
)
\phi(s_{y'})
ϕ(sy′)乘积的期望值,这个过程太过繁琐了,有什么方法可以简化这个过程呢?作者提出用简单的线性变换来近似参数预测器
ϕ
\phi
ϕ,那么
ϕ
(
s
y
′
)
=
Φ
⋅
s
y
′
\phi(s_{y'})=\Phi\cdot s_{y'}
ϕ(sy′)=Φ⋅sy′,
Φ
\Phi
Φ是线性变换对应的矩阵,则上式可近似写为
其中
E
S
[
s
y
]
\mathbb{E}_S[s_y]
ES[sy]可以在训练时提前计算好并保存下来。在小样本数据集上进行训练时,对于新的类别需要更新
E
S
[
s
y
]
\mathbb{E}_S[s_y]
ES[sy],但由于小样本数量较少,计算得到的
E
S
[
s
y
]
\mathbb{E}_S[s_y]
ES[sy]可靠性不高,因此作者采用了一种混合策略。对于大规模数据集中的类别,直接使用训练得到的
E
S
[
s
y
]
\mathbb{E}_S[s_y]
ES[sy]进行预测,对于小样本数据集中的类别,使用类别
y
y
y对应的所有统计值
s
y
s_y
sy与测试图像
x
′
x'
x′的特征向量
a
(
x
′
)
a(x')
a(x′)内积的最大值,来作为分类器的输出。该过程如下图所示
实现过程
网络结构
特征提取网络可采用ResNet-50或WRN-28-10,参数预测器 ϕ \phi ϕ设计了三种结构, ϕ 1 \phi^1 ϕ1只有一个全连接层; ϕ 2 \phi^2 ϕ2有两个全连接层,第一个全连接层后带有ReLU层; ϕ 2 ∗ \phi^{2*} ϕ2∗与 ϕ 2 \phi^2 ϕ2结构相同,但训练时的损失函数不同。
损失函数
训练策略
本文的训练过程似乎只对参数预测器
ϕ
\phi
ϕ进行训练,过程如下图所示
先从
A
y
∪
a
ˉ
y
A_y\cup \bar{a}_y
Ay∪aˉy中采样得到
s
y
s_y
sy构成统计集
S
S
S,然后再从
A
y
∪
a
ˉ
y
A_y\cup \bar{a}_y
Ay∪aˉy中采样得到
a
y
a_y
ay构成训练激活集(training activation set)
T
T
T,通过参数预测器
ϕ
\phi
ϕ输出分类器权重,并利用分类器预测
a
y
a_y
ay的类别,最后计算分类损失,更新参数预测器
ϕ
\phi
ϕ中的参数。
创新点
- 通过直接预测分类器权重的方法实现小样本学习算法
- 通过随机采样,线性近似,混合策略等方式解决了算法中的许多问题
算法评价
其实这种直接预测分类器参数的方法并不少见,如果把线性变换矩阵 Φ \Phi Φ设为单位矩阵,那么 a ( x ) ⋅ Φ ⋅ E S ( s y ) a(x)\cdot \Phi \cdot \mathbb{E}_S(s_y) a(x)⋅Φ⋅ES(sy)就等价于 a ( x ) ⋅ E S ( s y ) a(x)\cdot \mathbb{E}_S(s_y) a(x)⋅ES(sy),因为 a ( x ) a(x) a(x)和 E S ( s y ) \mathbb{E}_S(s_y) ES(sy)都经过归一化处理, a ( x ) ⋅ E S ( s y ) a(x)\cdot \mathbb{E}_S(s_y) a(x)⋅ES(sy)也就相当于计算 a ( x ) a(x) a(x)和 E S ( s y ) \mathbb{E}_S(s_y) ES(sy)之间的余弦相似性,而 E S ( s y ) \mathbb{E}_S(s_y) ES(sy)的计算方法其实与PN中的原型计算过程非常类似。也就是说在本质上这一算法还是一种度量学习算法,对于类别表征(或者说原型)的计算中增加了一个随机采样的过程和一个可学习的线性变换 ϕ \phi ϕ,当然如果不把 ϕ \phi ϕ近似为线性变换,其性能可能会更高,但计算复杂度也会大幅上升了。
如果大家对于深度学习与计算机视觉领域感兴趣,希望获得更多的知识分享与最新的论文解读,欢迎关注我的个人公众号“深视”。