【机器学习】最大均值差异MMD详解

MMD(最大均值差异)是一种用于测试两组样本是否来自不同分布的方法,其基本原理是在再生希尔伯特空间中对样本进行映射并求和,以此表述两个数据的分布差异。MMD在风格迁移和迁移学习中应用广泛,尤其作为神经网络的损失函数,用于最小化两个网络间的分布差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

最大均值差异(maximum mean discrepancy, MMD)提出时候是用来测试两个样本,是否来自两个不同分布p和q,如果均值差异达到最大,就说明采样的样本来自完全不同的分布。

原理

MMD的基本原理如下所述:假设有一个满足P分布的数据集Xs=[xs1,...,xsn]和一个满足Q分布的数据集Xt=[xt1,...,xtm] 并且存在一个再生希尔伯特空间H(RKHS) 存在一个映射函数ϕ(⋅):X−>H表示从原始空间到希尔伯特空间的一个映射,并且当n,m 趋于无穷时Xsx 和Xtx的最大均值差异可以表示为下式:

p和q相同时,MMD=0。

进一步,


通过上式可以看出,其原理是对每一个样本进行投影并求和,利用和的大小表述两个数据的分布差异。

 

优势

不用借助额外的参数

 

运用

MMD在最近的风格迁移中运用的比较多,其神经网络主要是通过最小化两个网络的分布差异,同时MMD在吴恩达提出最近10年要火的迁移学习中应用很广,很多迁移学习神经网络就是把MMD做为最后的损失函数而进行优化的,并且提出了很多改进方法。
 

转载自:https://blog.youkuaiyun.com/he_min/article/details/69397975

### 关于深度学习中最大均值差异MMD)的概念 最大均值差异(Maximum Mean Discrepancy, MMD)是在统计学和机器学习领域内广泛应用的一个概念,用于量化两个概率分布之间的距离。具体而言,在高维特征空间中,如果两个分布相同,则它们的样本在该空间内的平均表示也应相等;反之亦然。因此,MMD可以作为检验两组数据是否源自同一分布的有效工具[^1]。 对于给定的概率分布 \(P\) 和 \(Q\) ,以及映射至再生核希尔伯特空间 (RKHS) 的函数 \(\phi(x)\),MMD被定义为: \[ \text{MMD}(P,Q)=\left \| E_{x∼P}[\phi(x)]−E_{y∼Q}[\phi(y)] \right \|_H^2 \] 其中 \(E_x\) 表示期望运算符,\(H\) 则代表 RKHS 中向量间的范数平方差。此表达式直观反映了当且仅当 P=Q 时,上述方程的结果才可能趋近零的事实[^3]。 ### 最大均值差异的应用场景 MMD不仅限于理论研究,在实际应用方面同样表现出色。特别是在无监督学习、生成对抗网络(GANs)训练过程中的模式崩溃问题解决上有着不可替代的作用。此外,在迁移学习特别是域适配任务里,利用MMD来最小化源域与目标域间输入变量分布上的差距成为了一种常见策略[^2]。 ### 使用 PyTorch 实现 MMD 损失函数 为了便于开发者快速集成并应用于各种深度学习框架之中,社区提供了诸如 `MMD_Loss.Pytorch` 这样的开源库支持。下面给出一段简单的 Python 代码片段展示如何基于 PyTorch 计算 MMD: ```python import torch from torch import nn class MMDLoss(nn.Module): def __init__(self, kernel_mul=2.0, kernel_num=5): super(MMDLoss, self).__init__() self.kernel_num = kernel_num self.kernel_mul = kernel_mul self.fix_sigma = None @staticmethod def guassian_kernel(source, target, kernel_mul=2.0, kernel_num=5, fix_sigma=None): n_samples = int(source.size()[0]) + int(target.size()[0]) total = torch.cat([source, target], dim=0) total0 = total.unsqueeze(0).expand(int(total.size(0)), int(total.size(0)), int(total.size(1))) total1 = total.unsqueeze(1).expand(int(total.size(0)), int(total.size(0)), int(total.size(1))) L2_distance = ((total0-total1)**2).sum(2) bandwidth = [] if fix_sigma: bandwidth.append(fix_sigma) else: for i in range(kernel_num): bandwidth.append((L2_distance.max()/kernel_mul ** i).item()) bandwidth_torch = torch.tensor(bandwidth).to(device='cuda' if source.is_cuda else 'cpu') kernels_value = [torch.exp(-L2_distance / band) for band in bandwidth_torch] return sum(kernels_value) def mmd_loss(source_features, target_features): batch_size = int(source_features.size()[0]) kernels = MMDLoss.guassian_kernel( source_features, target_features, kernel_mul=MMDLoss().kernel_mul, kernel_num=MMDLoss().kernel_num, fix_sigma=None ) XX = kernels[:batch_size, :batch_size] YY = kernels[batch_size:, batch_size:] XY = kernels[:batch_size, batch_size:] YX = kernels[batch_size:, :batch_size] loss = torch.mean(XX + YY - XY -YX) return loss ``` 这段代码实现了多尺度高斯径向基函数(RBF)核下的MMD计算方式,并将其封装成易于调用的形式以便与其他神经网络组件组合使用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值