1.Siamese网络
Siamese network就是“连体的神经网络”,神经网络的“连体”是通过共享权值来实现的,如下图所示。共享权值意味着两边的网络权重矩阵一模一样,甚至可以是同一个网络。
如果左右两边不共享权值,而是两个不同的神经网络,叫伪孪生网络(pseudo-siamese network,伪孪生神经网络),对于pseudo-siamese network,两边可以是不同的神经网络(如一个是lstm,一个是cnn),也可以是相同类型的神经网络。
1.1 原理
Siamese网络衡量两个输入的相似程度,输出是一个[0,1]的浮点数,表示二者的相似程度。孪生神经网络有两个输入(Input1 and Input2),将两个输入feed进入两个神经网络(Network1 and Network2),这两个神经网络分别将输入映射到新的空间,形成输入在新的空间中的表示。通过Loss的计算,评价两个输入的相似度。
传统的siamese network使用Contrastive Loss(对比损失函数),如下所示:
- 其中Dw被定义为姐妹孪生网络的输出之间的欧氏距离。Dw欧式距离公式如下:
也可以是其他的距离度量方法,比如Cosine距离主要用于词汇级别的语义相似度度量。
- 其中Gw是其中一个子网络的输出。X1和X2是输入数据对。
- Y值为1或0。如果模型预测输入是相似的,那么Y的值为0,否则Y为1。
- max是表示0和m-Dw之间较大值的函数。
- m是大于0的边际价值(margin value),边际价值表示超出该边际价值的不同不会造成损失,因为希望基于实际不相似对网络进行优化。
1.2 用途
孪生神经网络用于处理两个输入“比较类似"的情况。
伪孪生神经网络适用于处理两个输入"有一定差别”的情况。
比如,我们要计算两个句子或者词汇的语义相似度,使用siamese network比较适合;如果验证标题与正文的描述是否一致(标题和正文长度差别很大),或者文字是否描述了一幅图片(一个是图片,一个是文字),就应该使用pseudo-siamese network。也就是说,要根据具体的应用,判断应该使用哪一种结构,哪一种Loss。
- 词汇的语义相似度分析,QA中question和answer的匹配,签名/人脸验证。
- 手写体识别也可以用siamese network。
- 还有kaggle上Quora的question pair的比赛,即判断两个提问是不是同一问题。
- 在图像上,基于Siamese网络的视觉跟踪算法也已经成为热点。
- 单样本学习
2.单样本学习
2.1 原理
传统的神经网络试图学习某一个类别的图像的表达,而One-Shot Learning 试图学习不同图像(可以同一类别或者不同类别) 的区别。
给定图片A和图片B, 将A转换为一个表达(embedding vector) p, 将B转换为 一个表达(embedding vector) q
• 如果 A 和 B 属于同一个类别, 那么我们希望 p 和 q 是相似的
• 如果 A 和 B 不属于同一个类别, 那么我们希望 p 和 q 是不相似的
• 相似度的度量, 欧几里得距离:
2.2 意义
1.减少训练数据
• 深度学习需要大量的数据, MNIST 为了 10 个类别的区分, 需要 60,000 张训练图像, 平均一个类别需要6000 张训练图像
• One-Shot 试图将一个类别的训练图像减少, 极端情况时减小到一张图片
2.在新类别的数据出现时, 无需重新训练
• 传统的深度神经网络无法处理没有出现在训练集中的类别
• 以员工刷脸打卡为例, 使用传统深度神经网络, 每一个新员工入职, 都是一个新的 类别, 需要重新训练深度神经网络
• 如果每天都有新员工入职, 每天都要重新训练网络, 成本非常高
• One-Shot learning 可以无需重新训练即可应用于新的类别的数据