课程地址 https://youtu.be/hE7eGew4eeg?si=KBM0lY7eY_AdD8Wr
PPT地址 https://github.com/wangshusen/DeepLearning
第一节 Few-Shot Learning Basics
第二节 Siamese Network
第三节 Pretraining + Fine Tuning
(以图像识别举例)
support set:数量很少的样本集合,为模型完成任务而提供更多的信息。
query:模型的输入样本,其并未出现在训练集中,其所属类别肯定包含在支持集中。
小样本学习(few shot learnning)是一种元学习(meta learning)方法。
元学习:自己学会学习(learn to learn)。
监督学习:测试样本之前并未见过(这个样本并不在训练集中),样本属于已知类(这个类别在训练集中有)。
小样本学习:查询样本之前并未见过,样本属于未知类。
k-way:支撑集有k类,k越大预测准确率越低。
n-shot:每个类别有n个样本,n越大预测准确率越高。
称呼支持集时,带上前缀k-way n-shot support set。
小样本学习的基本思想:学习一个相似度函数(similarity function)。
1、用一个很大的训练集学习一个相似度函数。
2、给定一个query样本,用相似度函数与support set判断出其所属类别(计算support set中的样本与query样本的相似度,取相似度最高的类别作为预测)
下面介绍两种方法:连体网络,预训练+微调。
将训练集
D
=
{
I
1
,
.
.
.
,
I
n
}
D=\{I_1, ..., I_n\}
D={I1,...,In}重新构造为包含同样数量的正样本与负样本的新训练集。
正样本:
(
I
i
,
I
j
)
(I_i, I_j)
(Ii,Ij),两张图像属于同一类,其标签为1。
负样本:
(
I
i
,
I
j
)
(I_i, I_j)
(Ii,Ij),两张图像属于不同类,其标签为0。
给卷积神经网络
f
(
⋅
)
f(\cdot)
f(⋅)输入正样本,其输出为输入的特征:
h
i
=
f
(
I
i
)
h_i = f(I_i)
hi=f(Ii)
h
j
=
f
(
I
j
)
h_j = f(I_j)
hj=f(Ij)
z
i
j
=
∣
h
i
−
h
j
∣
z_{ij} = |h_i - h_j|
zij=∣hi−hj∣
将
z
i
j
z_{ij}
zij输入至全连接层,得到一个标量,预测两个图片间的相似度,其中激活函数用sigmoid,输出区间为
[
0
,
1
]
[0,1]
[0,1]。
注:
h
,
z
h, z
h,z为向量
计算样本的标签与预测值的损失函数,反向传播更新卷积网络与全连接网络的权重。
预测:
将支持集中的所有样本分别与query构造成一对新样本
(
q
,
s
i
)
(q,s_i)
(q,si)输入给网络,预测两者相似度。
选出相似度最高的一对样本
(
q
,
s
j
)
(q,s_j)
(q,sj),query便属于
s
j
s_j
sj的类别。
这是另一种训练卷积神经网络的方法。
训练集中随机抽样作为一个anchor(锚点)。
从achor所属的类别中随机抽样一个样本,记为正样本。
再从除achor所属的类别外的剩余训练集中随机抽样一个样本,记为负样本。
三个样本同时输入卷积网络:
f
(
x
+
)
,
f
(
x
a
)
,
f
(
x
−
)
f(x^+), f(x^a), f(x^-)
f(x+),f(xa),f(x−)
计算特征间的距离:
d
+
=
∣
f
(
x
+
−
f
(
x
a
)
)
∣
2
d^+ = |f(x^+ - f(x^a))|_2
d+=∣f(x+−f(xa))∣2
d
−
=
∣
f
(
x
−
−
f
(
x
a
)
)
∣
2
d^- = |f(x^- - f(x^a))|_2
d−=∣f(x−−f(xa))∣2
注:
d
d
d为标量
计算损失函数:
如果
d
−
≥
d
+
+
α
d^- \geq d^+ + \alpha
d−≥d++α,则
l
o
s
s
=
0
loss=0
loss=0;否则
l
o
s
s
=
d
+
+
α
−
d
−
loss=d^+ + \alpha - d^-
loss=d++α−d−。
其中,
α
>
0
\alpha > 0
α>0。
注:上述就是max函数。
补充:卷积神经网络将图片映射为特征空间中的一点
通过损失函数,训练出卷积网络 f ( ⋅ ) f(\cdot) f(⋅)。
预测:
通过
f
(
⋅
)
f(\cdot)
f(⋅)计算query与所有支持集样本的特征,然后计算出query与所有支持集样本的距离
d
(
q
,
s
i
)
d(q,s_i)
d(q,si)。
选出距离最近的一对样本
(
q
,
s
j
)
(q,s_j)
(q,sj),query便属于
s
j
s_j
sj的类别。
两个向量的cosine similarity:
c
o
s
θ
=
x
T
w
/
(
∣
x
∣
2
⋅
∣
w
∣
2
)
cos \theta = x^Tw/(|x|_2 \cdot |w|_2)
cosθ=xTw/(∣x∣2⋅∣w∣2)。
如果
x
,
w
x,w
x,w为单位向量,则
c
o
s
θ
=
x
T
w
cos \theta = x^Tw
cosθ=xTw,即相似度为两个单位向量内积。
单位向量内积较大表示,一个向量在另一个向量上的投影较大。
softmax函数:将向量
ϕ
\phi
ϕ映射为一个概率分布
p
p
p。
p
i
>
0
,
Σ
i
p
i
=
1
p_i > 0, \Sigma_i p_i = 1
pi>0,Σipi=1.
预训练(pretraining)一个卷积网络用于特征提取。
注:特征提取也称embeding。
(以3-way 2-shot support set举例)
支撑集每个类别的特征向量为该类所有样本的特征向量求平均,再进行归一化,得到
μ
1
,
μ
2
,
μ
3
\mu_1, \mu_2, \mu_3
μ1,μ2,μ3。
同理,对query也做同样的步骤,得到
q
q
q
矩阵
M
=
[
μ
1
μ
2
μ
3
]
M = [μ1μ2μ3]
计算一个三维向量
p
=
s
o
f
t
m
a
x
(
M
q
)
p = softmax(Mq)
p=softmax(Mq)
p
p
p中最大元素为
p
i
p_i
pi,则
q
q
q属于支持集中的
i
i
i类
在卷积网络后面接一层全连接: p = s o f t m a x ( W ⋅ f ( x ) + b ) p = softmax(W \cdot f(x) + b) p=softmax(W⋅f(x)+b)
之前不进行微调,即 W = M , b = 0 W=M, b=0 W=M,b=0,而学习 W , b W,b W,b称为微调。
损失函数:
l
o
s
s
=
c
o
r
s
s
E
n
t
r
o
p
y
(
y
,
p
)
loss = corssEntropy(y, p)
loss=corssEntropy(y,p)
其中,
y
y
y为真实标签,是一个one hot向量。
反向传播,训练出
W
,
b
W,b
W,b
介绍三个小技巧:
1、初始化权重
W
=
M
,
b
=
0
W=M, b=0
W=M,b=0
2、为防止过拟合,加入正则化。(下面介绍熵正则化)
一个query预测结果为
p
=
s
o
f
t
m
a
x
(
W
⋅
f
(
x
)
+
b
)
p = softmax(W \cdot f(x) + b)
p=softmax(W⋅f(x)+b)
熵
H
(
p
)
=
−
Σ
i
p
i
l
o
g
(
p
i
)
H(p)=-\Sigma_i p_i log(p_i)
H(p)=−Σipilog(pi)
熵正则化为所有query的熵的平均。
我们希望熵正则化越小越好。
3、结合余弦相似度与softmax分类器,即先将
W
W
W的行向量与
f
(
x
)
f(x)
f(x)作归一化,再计算矩阵向量乘积。
p
=
s
o
f
t
m
a
x
(
W
⋅
f
(
x
)
+
b
)
p = softmax(W \cdot f(x) + b)
p=softmax(W⋅f(x)+b)