孪生神经网络(Siamese Neural Network)的原理与相似度学习过程
一、题目描述
孪生神经网络是一种特殊的深度神经网络架构,用于学习两个输入之间的相似度或距离度量。它由两个或多个结构相同、参数共享的子网络组成,通过对比两个输入的表示来计算它们的相似程度。这种网络在面部验证、签名认证、文本相似度匹配等领域有广泛应用。我们需要理解其核心思想、网络结构设计、损失函数选择以及训练过程。
二、孪生网络的核心思想
孪生网络的核心是通过学习一个特征映射函数,将输入数据转换到一个新的特征空间,在这个空间中,相似样本的距离很近,不相似样本的距离很远。它的关键特性包括:
- 参数共享:两个子网络使用相同的权重参数,确保相同的输入经过相同变换
- 对比学习:通过比较两个输入的输出来衡量相似度
- 度量学习:学习一个有效的距离度量或相似度函数
三、网络结构详解
3.1 基本架构组成
一个标准的孪生神经网络包含以下部分:
输入A → 子网络(权重W) → 特征向量f(A)
输入B → 子网络(权重W) → 特征向量f(B)
特征向量f(A)和f(B) → 距离计算 → 相似度分数
3.2 子网络设计
子网络可以是任何类型的神经网络:
- 卷积神经网络(CNN):用于图像输入
- 循环神经网络(RNN/LSTM):用于序列数据
- 全连接网络(MLP):用于结构化数据
3.3 参数共享机制
两个子网络共享权重参数,这意味着:
- 权重矩阵W₁ = W₂,偏置b₁ = b₂
- 在反向传播时,两个子网络的梯度会合并更新共享参数
- 这种设计减少了参数量,防止过拟合,并确保对称性
四、距离度量与相似度计算
4.1 特征向量的距离计算
获得两个特征向量f(A)和f(B)后,计算它们之间的距离:
欧氏距离(常用):
d = ||f(A) - f(B)||₂
曼哈顿距离:
d = Σ|fᵢ(A) - fᵢ(B)|
余弦相似度:
similarity = (f(A)·f(B)) / (||f(A)||·||f(B)||)
4.2 相似度转换为概率
对于二分类(相似/不相似),通常将距离转换为相似度概率:
p(similar) = σ(-w·d + b)
其中σ是sigmoid函数,w和b是可学习参数。
五、损失函数设计
5.1 对比损失(Contrastive Loss)
这是最常用的损失函数,由Yann LeCun提出:
L(A,B,y) = y·d² + (1-y)·max(margin - d, 0)²
其中:
y = 1表示A和B是相似样本(正样本对)y = 0表示A和B是不相似样本(负样本对)d是特征向量之间的欧氏距离margin是一个超参数,表示负样本对的最小距离
物理意义:
- 当y=1(相似)时,最小化d,拉近正样本对
- 当y=0(不相似)时,如果d < margin,则惩罚网络,推开负样本对
5.2 三元组损失(Triplet Loss)
这是另一种流行的损失函数,需要三个样本:锚点(Anchor)、正样本(Positive)、负样本(Negative)。
L(A,P,N) = max(||f(A)-f(P)||² - ||f(A)-f(N)||² + α, 0)
其中α是边界超参数。
约束条件:
||f(A)-f(P)||² + α < ||f(A)-f(N)||²
确保正样本比负样本更接近锚点至少α的距离。
5.3 交叉熵损失
对于相似度概率预测,可以使用二元交叉熵:
L = -[y·log(p) + (1-y)·log(1-p)]
六、训练过程详解
6.1 数据准备
训练孪生网络需要样本对或样本三元组:
- 正样本对:来自同一类别的两个样本
- 负样本对:来自不同类别的两个样本
- 三元组:(锚点, 正样本, 负样本)
6.2 前向传播步骤
以对比损失为例,前向传播过程:
- 输入样本对(A, B)和标签y(0或1)
- 样本A通过子网络得到特征向量f(A)
- 样本B通过相同的子网络得到特征向量f(B)
- 计算欧氏距离:d = ||f(A)-f(B)||₂
- 计算对比损失:L = y·d² + (1-y)·max(margin-d, 0)²
6.3 反向传播与参数更新
反向传播需要计算损失对网络参数的梯度:
-
计算损失L对距离d的梯度:
- 如果y=1:∂L/∂d = 2d
- 如果y=0且d < margin:∂L/∂d = -2(margin-d)
- 如果y=0且d ≥ margin:∂L/∂d = 0
-
计算距离d对特征向量的梯度:
∂d/∂f(A) = (f(A)-f(B))/d ∂d/∂f(B) = (f(B)-f(A))/d -
通过链式法则,计算损失对网络参数的梯度
-
由于参数共享,合并两个子网络的梯度
-
使用优化器(如Adam)更新参数
6.4 训练技巧
- 难例挖掘:特别关注那些d接近margin的负样本对
- 动态margin调整:根据训练进度调整margin大小
- 批次内负采样:在一个批次内构造负样本对
- 数据增强:对正样本对进行相同的数据增强
七、推理过程
训练完成后,使用孪生网络进行相似度判断:
- 输入两个样本A和B
- 分别通过子网络得到f(A)和f(B)
- 计算距离d = ||f(A)-f(B)||₂
- 如果d < 阈值θ,判断为相似;否则判断为不相似
- 阈值θ可以通过验证集确定
八、变体与扩展
8.1 伪孪生网络(Pseudo-Siamese)
当两个输入模态不同时(如图像和文本),可以使用不同结构的子网络,不共享参数。
8.2 多孪生网络
扩展到三个或更多子网络,用于多模态匹配或多个样本比较。
8.3 与注意力机制结合
在子网络中引入注意力机制,关注输入的重要部分,提高相似度判断的准确性。
九、优缺点分析
9.1 优点
- 不需要大量标注数据,只需要相对标注(相似/不相似)
- 可以处理训练时未见过的类别
- 参数共享减少过拟合风险
- 对称性确保f(A,B)=f(B,A)
9.2 缺点
- 需要精心设计样本对或三元组
- 训练过程可能不稳定,需要仔细调参
- 推理时需要两前向传播,速度较慢
十、应用实例
以人脸验证为例:
- 输入两张人脸图片
- 通过共享的CNN提取特征
- 计算特征向量的L2距离
- 距离小于阈值判定为同一人
孪生神经网络通过学习一个有效的特征空间和距离度量,实现了强大的相似度判断能力,成为度量学习中的重要工具。