MMD讲解

MMD讲解

描述一个随机变量

去描述一个随机变量,最直接的方法就是给出它的概率分布函数f(x)。一些简单的分布可以这么干,比如正态分布给出均值和方差就可以确定,但是对于一些复杂的、高维的随机变量,我们无法给出它们的分布函数。

这时候我们可以用随机变量的来描述一个随机变量,比如一阶中心矩是均值,二阶中心矩是方差等等。如果两个分布的均值和方差都相同的话,它们应该很相似,比如同样均值和方差的高斯分布和拉普拉斯分布。但是很明显,均值和方差并不能完全代表一个分布,这时候我们就需要更高阶的矩来描述一个分布。

举个例子,就好比描述人一样,如果两个人身高、轮廓都一样,我们会说这两个人很像。但是如果要说这两个人是一个人的话,我们如要更多的信息,比如血型、DNA等更加复杂的信息

而MMD的基本思想就是,如果两个随机变量的任意阶都相同的话,那么两个分布就是一致的。而当两个分布不相同的话,那么使得两个分布之间差距最大的那个矩应该被用来作为度量两个分布的标准。

衡量两个随机变量的差异

MMD常被用来度量两个分布之间的距离,是迁移学习中常用的损失函数。定义如下,x的分布为py的分布为q

(1)MMD[F,p,q]=supfH1(Ep[f(x)]Eq[f(y)])

其中sup表示求上界,Ep表示求期望,f(·)表示求映射函数,sup下面表示的式子在再生希尔伯特空间中的范数应该小于等于1。

式子中的f就相当于将x映射到高阶上去,比如xn,那么对应的期望值就相当于在求n阶矩,然后将他们的上确界(最大值)作为MMD的值。

如何表示一个随机变量的任意阶矩

两个分布应该是由高阶矩来描述的,那么如何获得一个随机变量的高阶矩呢?核函数。高斯核函数,它对应的映射函数恰好可以映射到无穷维上,映射到无穷维上再求期望,正好可以得到随机变量的高阶矩,这个方法有一个更高大上的名字,叫做kernel embedding of distributions,这个简单理解就是将一个分布映射到再生希尔伯特空间(每个核函数都对应一个RKHS)上的一个点,这样两个分布之间的距离就可以用两个点的内积进行表示!

(2)MMD[F,p,q]=supfH1(Ep[f(x)]Eq[f(y)])

其中Ep[f(x)]=Xp(dx)f(x)=Xp(dx)k(x,·),fHk=Xp(dx)k(x,·),fHk=μp,fHk

fH1目的也是为了上界避免随意取到无穷大

第一个等号就是利用期望展开;第二个等号利用的是RKHS的再生性,其实就是RKHS中的f(x)都可以写成一个无穷维的向量 k(x,·)与基底向量f的内积;第三个等号利用的是内积的性质;最后一个等号μp表示的就是kernel mean embedding。意义就是将x利用k(x,·)映射到无穷维上,然后在每一个维度上都求期望。

这样一来MMD的公式就变为

(3)MMD[F,p,q]=supfH1(μpμq,fH)

根据内积的性质a,bab,MMD公式可以写为

(4)MMD(p,q,H)=μpμqH

但是μp无法直接计算,可以使用均值代替,因为均值是期望的无偏估计。

假设Xp,Yq,而且X有n个样本,Y有m个样本,则

(5)MMD[F,X,Y]=1ni=1nf(xi)1mj=1mf(yi)H

到这里我们还算是没有办法求,因为f(xi)是无穷维的。但是核技巧的关键就在于不需要显式地表示映射函数f(x)来求两个向量的内积。因此我们对MMD进行平方,化简得到内积并用核函数表达

(6)MMD^(P,Q)2=1mxiϕ(xi)1nyiϕ(yi)22

(7)=1mxiϕ(xi)2+1nyiϕ(yi)221mxiϕ(xi)1nyiϕ(yi)

(8)1mxiϕ(xi)2=1m2(ϕ(x1)+ϕ(x2)++ϕ(xm))T(ϕ(x1)+ϕ(x2)++ϕ(xm))

(9)=1m2{ϕ(x1)Tϕ(x1)++ϕ(x1)Tϕ(xm)

(10)+ϕ(x2)Tϕ(x1)++ϕ(x2)Tϕ(xm)

(11)+ϕ(xm)Tϕ(x1)++ϕ(xm)Tϕ(xm)}

(12)=1m2{k(x1,x1)+k(x1,x2)++k(x1,xm)+k(x2,x1)++k(x2,xm)+}

(13)=1m2i,jk(xi,xj)

同理

(14)1nyiϕ(yi)2=1n2i,jk(yi,yj)

(15)1mxiϕ(xi)1nyiϕ(yi)=1mni,jk(xi,yj)

所以有

(16)MMD^2=1m2i,jk(xi,xj)+1n2i,jk(yi,yj)2mni,jk(xi,yj)

转载/参考:https://zhuanlan.zhihu.com/p/163839117

https://www.cnblogs.com/zhangcn/p/13710192.html

posted @   Jason66661010  阅读(1807)  评论(0编辑  收藏  举报
编辑推荐:
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
阅读排行:
· 趁着过年的时候手搓了一个低代码框架
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现
历史上的今天:
2020-04-08 PAT (Advanced Level) Practice 1105 Spiral Matrix (25分)
2020-04-08 PAT (Advanced Level) Practice 1104 Sum of Number Segments (20分)
2020-04-08 PAT (Advanced Level) Practice 1111 Online Map (30分) (两次迪杰斯特拉混合)
点击右上角即可分享
微信分享提示