【王树森】Few-Shot Learning (2/3): Siamese Network 孪生网络(个人向笔记)
Learning Pairwise Similarity Scores
Training Data
-
训练集有很多个类别的图片,每个类别的图片都有标注
-
Positive Sample:我们需要正样本来告诉神经网路什么东西是同一类
-
Negative Sample:负样本可以告诉神经网路事物之间的区别
-
我们用CNN来提取图片的特征:
-
把两张图片用同一个CNN提取特征向量,然后把得到的两个特征向量取差的绝对值: z = ∣ h 1 − h 2 ∣ z=|h_1-h_2| z=∣h1−h2∣,然后通过一个全连接层变为一个数后放到 Sigmoid 激活函数里面。我们的标签是 1,可以利用交叉熵损失函数来反向传播计算梯度,然后梯度下降来更新参数。
-
其中的参数有CNN的参数和全连接层的参数
-
训练的时候我们要准备同样数量的正样本和负样本
TripLet Loss
- 随机选择一张图片作为锚点anchor,抽取它同种类的一张图为正样本,不同种类的一张图为负样本
- 把三张图片都放入一个CNN里面提取特征向量,然后分别计算锚点与正样本和负样本的二范数平方,我们期望 d + d^+ d+ 很小,因为锚点和正样本属于同类别。期望 d − d^- d− 很大,因为锚点与负样本不是同类别
- CNN 可以把图片提取特征向量投射到特征空间中,两张相似图片在特征空间的距离应该尽可能接近,而不同种图片的距离应该尽可能远离,这样才能够比较好区分
- 由上我们可以得出损失函数:如果 d + d^+ d+ 和 d − d^- d− 差别足够大,那么 Loss 为 0。但是如果差别没有那么大就会有 Loss,那么我们就可以通过这个损失来更新 CNN 的参数了
- 在做预测的时候,我们计算 Query 和 Support Set 的距离即可