关于 support set,包含两个元素:
k
k
k-way:support set 内样本的类别数;
n
n
n-shot:每个类别有
n
n
n个样本。
比如这是一个 4-way 2-shot 的 support set。
回到如何处理少样本学习问题,最常见的想法就是学习一个相似度函数
s
i
m
(
q
u
e
r
y
,
s
u
p
p
o
r
t
s
e
t
i
)
sim(query,supportset_{i})
sim(query,supportseti),计算出 query 与 support set 内第
i
i
i 类样本的相似度,通过取最相似的一类作为结果。比如以下情况,模型将 query 分类到结果"Otter":
我们定义一个卷积神经网络模型CNN(记作函数
f
f
f)用于提取特征,用
x
x
x表示输入样本,则输出特征信息展开至向量(Flatten操作)表示为
f
(
x
)
f(x)
f(x):
训练框架为:
比如取一个样本组合,由于该组合都是Tiger类,故标记为1,通过卷积网络提取特征得到
h
1
,
h
2
h_{1},h_{2}
h1,h2,然后计算两者的相似度:
z
=
∣
h
1
−
h
2
∣
z=|h_{1}-h_{2}|
z=∣h1−h2∣
s
i
m
(
x
1
,
x
2
)
=
s
i
g
m
o
i
d
(
N
N
(
z
)
)
sim(x_{1},x_{2})=sigmoid(NN(z))
sim(x1,x2)=sigmoid(NN(z))得到的结果
s
i
m
(
x
1
,
x
2
)
sim(x_{1},x_{2})
sim(x1,x2)为输入数据
x
1
,
x
2
x_{1},x_{2}
x1,x2之间的相似度,值在0到1之间;我们使用二元交叉熵损失函数(BCELoss)计算该相似度与标签之间的损失;
利用损失函数进行反向传播计算卷积网络模型
f
f
f中各个参数的梯度,并更新模型参数。
训练结束后,我们就能得到一个具备分辨事物异同能力的卷积网络,于是我们将该CNN用于 support set 中每一类样本和 query 比较,通过索引最大相似度的类别得到分类结果。
如上图所示,我们随机从数据集中选择某一类,取该类的一个样本作为anchor(标记为
x
a
x^{a}
xa),在该类下再取一个样本作为positive(标记为
x
+
x^{+}
x+),最后随机取一个其他类,并取该其他类下的一个样本作为negative(标记为
x
−
x^{-}
x−)。
现在同样使用卷积网络
f
f
f提取特征信息,使用同一个卷积网络分别对三个样本前向计算:
分别计算特征之间的距离:
d
+
=
∣
∣
f
(
x
+
)
−
f
(
x
a
)
∣
∣
2
2
d^{+}=||f(x^{+})-f(x^{a})||^{2}_{2}
d+=∣∣f(x+)−f(xa)∣∣22
d
−
=
∣
∣
f
(
x
−
)
−
f
(
x
a
)
∣
∣
2
2
d^{-}=||f(x^{-})-f(x^{a})||^{2}_{2}
d−=∣∣f(x−)−f(xa)∣∣22简单地考虑一个二维特征空间,我们可以发现特征间的距离有以下关系:
很明显,我们希望
d
+
d^{+}
d+更小,而
d
−
d^{-}
d−更大,如果设置一个边界值
α
>
0
\alpha>0
α>0,当存在
d
−
≥
d
+
+
α
d^{-}\geq d^{+}+\alpha
d−≥d++α时,可以设置损失为0,否则损失为
d
+
+
α
−
d
−
d^{+}+\alpha-d^{-}
d++α−d−,因此,三元组损失为:
l
o
s
s
(
x
a
,
x
+
,
x
−
)
=
m
a
x
(
0
,
d
+
+
α
−
d
−
)
loss(x^{a},x^{+},x^{-})=max(0,d^{+}+\alpha-d^{-})
loss(xa,x+,x−)=max(0,d++α−d−)因此,我们根据最小化损失去更新卷积网络
f
f
f即可得到一个能够分辨事物异同的模型。
余弦相似度是衡量向量相似程度的方法,假设有两个单位向量
x
x
x和
w
w
w,我们可以将其内积作为相似度:
c
o
s
θ
=
x
T
w
cos\theta=x^{T}w
cosθ=xTw内积的物理意义如下,结果越大,说明两个向量越相似:
如果两个向量不是单位向量,我们可以进行归一化再内积:
c
o
s
θ
=
x
T
w
∣
∣
x
∣
∣
2
∣
∣
w
∣
∣
2
cos\theta=\frac{x^{T}w}{||x||_{2}||w||_{2}}
cosθ=∣∣x∣∣2∣∣w∣∣2xTw下面继续了解softmax函数,用于将向量映射成为概率分布,假设输入向量为:
ϕ
=
[
ϕ
1
,
ϕ
2
,
ϕ
3
,
.
.
.
,
ϕ
k
]
∈
R
k
\phi=[\phi_{1},\phi_{2},\phi_{3},...,\phi_{k}]\in R^{k}
ϕ=[ϕ1,ϕ2,ϕ3,...,ϕk]∈Rk
然后我们对每个元素进行指数变换,再进行归一化即可得到softmax输出的概率分布
p
p
p:
p
=
n
o
r
m
a
l
i
z
e
(
[
e
ϕ
1
,
e
ϕ
2
,
e
ϕ
3
,
.
.
.
,
e
ϕ
k
]
)
∈
R
k
p=normalize([e^{\phi_{1}},e^{\phi_{2}},e^{\phi_{3}},...,e^{\phi_{k}}])\in R^{k}
p=normalize([eϕ1,eϕ2,eϕ3,...,eϕk])∈Rksoftmax函数常用于模型输出作为分类器。
对于一个 3-way 2-shot 的少样本数据,可以使用预训练后的CNN模型
f
f
f进行如下计算:
注意要对 query 也进行同样的操作:
上面的normalize和softmax中的一样,可以将向量的模压缩成1;同时,我们根据support set的结果构造矩阵
M
M
M:
M
=
[
μ
1
,
μ
2
,
μ
3
]
T
M=[\mu_{1},\mu_{2},\mu_{3}]^{T}
M=[μ1,μ2,μ3]T然后便可以进行预测:
p
=
s
o
f
t
m
a
x
(
M
q
)
=
s
o
f
t
m
a
x
(
[
μ
1
T
q
,
μ
2
T
q
,
μ
3
T
q
]
T
)
p=softmax(Mq)=softmax([\mu_{1}^{T}q,\mu_{2}^{T}q,\mu_{3}^{T}q]^{T})
p=softmax(Mq)=softmax([μ1Tq,μ2Tq,μ3Tq]T)根据
p
p
p最大的元素索引类别即为分类结果。
假设
(
x
j
,
y
j
)
(x_{j},y_{j})
(xj,yj)是support set中的一个样本,
x
x
x为数据,
y
y
y为标签;
f
(
x
j
)
f(x_{j})
f(xj)是经过CNN计算得到的特征信息,我们在分类器上预测为:
p
j
=
s
o
f
t
m
a
x
(
W
f
(
x
j
)
+
b
)
p_{j}=softmax(Wf(x_{j})+b)
pj=softmax(Wf(xj)+b)如果我们令
W
=
M
,
b
=
0
W=M,b=0
W=M,b=0,这就是上面提到的没有微调的方法。
如果现在我们进行微调,即在这个基础上根据support set再次训练:
m
i
n
∑
j
C
r
o
s
s
E
n
t
r
o
p
y
(
y
j
,
p
j
)
min\sum_{j}CrossEntropy(y_{j},p_{j})
minj∑CrossEntropy(yj,pj)其中,
j
j
j代表support set的第
j
j
j个样本,根据该目标更新输出层的参数
(
W
,
b
)
(W,b)
(W,b),也可以考虑更新前面的CNN模型参数,这就是微调。
随机初始化参数
ϕ
\phi
ϕ经过多次epoch更新后得到参数
θ
^
\widehat{\theta}
θ,现在我们让初始模型(参数为
ϕ
\phi
ϕ)分别在不同的任务上学习,对于第
n
n
n个任务,我们将更新后的参数记为
θ
^
n
\widehat{\theta}^{n}
θn,并计算模型(参数为
θ
^
n
\widehat{\theta}^{n}
θn)在对应数据上的损失
l
n
(
θ
^
n
)
l^{n}(\widehat{\theta}^{n})
ln(θn)。
对于所有任务,我们可以得到综合的损失:
L
(
ϕ
)
=
∑
n
=
1
N
l
n
(
θ
^
n
)
L(\phi)=\sum_{n=1}^{N}l^{n}(\widehat{\theta}^{n})
L(ϕ)=n=1∑Nln(θn)因此,可以得到MAML的初始化参数更新方法:
ϕ
=
ϕ
−
l
r
▽
ϕ
L
(
ϕ
)
\phi=\phi-lr\triangledown_{\phi}L(\phi)
ϕ=ϕ−lr▽ϕL(ϕ)其中,
l
r
lr
lr为学习率。
考虑实际的训练时间要求,通常我们仅让模型在各个任务上仅训练1个epoch,所以对于第
i
i
i个任务有:
θ
^
i
=
ϕ
−
ε
▽
ϕ
l
i
(
ϕ
)
\widehat{\theta}^{i}=\phi-\varepsilon\triangledown_{\phi}l^{i}(\phi)
θi=ϕ−ε▽ϕli(ϕ)其中,
ε
\varepsilon
ε为某个任务下的学习率。可见,
θ
^
i
\widehat{\theta}^{i}
θi与
ϕ
\phi
ϕ相关,因此,我们确实可以计算
L
(
ϕ
)
L(\phi)
L(ϕ)关于
ϕ
\phi
ϕ的梯度,从而更新
ϕ
\phi
ϕ。