zoukankan      html  css  js  c++  java
  • MMD讲解

    MMD讲解

    描述一个随机变量

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

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

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

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

    衡量两个随机变量的差异

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

    [MMD[F,p,q]=suplimits_{Vert fVert_{mathcal{H}leqslant1}}({E_p[f(x)]-E_q[f(y)])} ]

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

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

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

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

    [MMD[F,p,q]=suplimits_{Vert fVert_{mathcal{H}}leqslant1}({E_p[f(x)]-E_q[f(y)])} ]

    其中(E_p[f(x)]=int_{mathcal{X}}p(dx)f(x)=int_{mathcal{X}}p(dx)left< k(x,·),f ight>_{mathcal{H}_k}=left<int_{mathcal{X}}p(dx)k(x,·),f ight>_{mathcal{H}_k}=left<mu_p,f ight>_{mathcal{H}_k})

    (Vert fVert_{mathcal{H}}leqslant1)目的也是为了上界避免随意取到无穷大

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

    这样一来MMD的公式就变为

    [MMD[F,p,q]=suplimits_{Vert fVert_{mathcal{H}leqslant1}}(left<mu_p-mu_q,f ight>_{mathcal{H}}) ]

    根据内积的性质(left< a,b ight>leqslant Vert aVertVert bVert),MMD公式可以写为

    [MMD(p,q,mathcal{H})=Vert mu_p-mu_qVert_{mathcal{H}} ]

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

    假设(mathbf{X}sim p,mathbf{Y}sim q),而且(mathbf{X})有n个样本,(mathbf{Y})有m个样本,则

    [MMD[F,X,Y]=Vert frac{1}{n}sumlimits_{i=1}limits^{n}f(x_i)-frac{1}{m}sumlimits^{m}limits_{j=1}f(y_i) Vert_{mathcal{H}} ]

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

    [widehat{ ext{MMD}}(P,Q)^2=left |frac{1}{m}sum_{x_i} phi(x_i) - frac{1}{n}sum_{y_i} phi(y_i) ight |^2_2 ]

    [=|frac{1}{m}sum_{x_i} phi(x_i)|^2 + |frac{1}{n}sum_{y_i} phi(y_i)|^2 - 2|frac{1}{m}sum_{x_i} phi(x_i) frac{1}{n}sum_{y_i} phi(y_i)| ]

    [|frac{1}{m}sum_{x_i} phi(x_i)|^2=frac{1}{m^2} (phi(x_1)+phi(x_2)+cdots+phi(x_m))^T(phi(x_1)+phi(x_2)+cdots+phi(x_m)) ]

    [=frac{1}{m^2}{phi(x_1)^Tphi(x_1) + cdots + phi(x_1)^Tphi(x_m) ]

    [+phi(x_2)^Tphi(x_1) + cdots + phi(x_2)^Tphi(x_m) ]

    [cdots+phi(x_m)^Tphi(x_1) + cdots + phi(x_m)^Tphi(x_m)} ]

    [=frac{1}{m^2}{k(x_1,x_1)+k(x_1,x_2)+cdots +k(x_1,x_m) + k(x_2,x_1)+cdots+k(x_2,x_m) +cdots} ]

    [=frac{1}{m^2}sum_{i,j} k(x_i,x_j) ]

    同理

    [|frac{1}{n}sum_{y_i} phi(y_i)|^2=frac{1}{n^2}sum_{i,j} k(y_i,y_j) ]

    [|frac{1}{m}sum_{x_i} phi(x_i) frac{1}{n}sum_{y_i} phi(y_i)|=frac{1}{mn}sum_{i,j}k(x_i,y_j) ]

    所以有

    [widehat{ ext{MMD}}^2=frac{1}{m^2}sum_{i,j} k(x_i,x_j)+frac{1}{n^2}sum_{i,j} k(y_i,y_j)-frac{2}{mn}sum_{i,j}k(x_i,y_j) ]

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

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

  • 相关阅读:
    使用cookie来做身份认证
    讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute
    不要使用Resource Owner Password Credentials
    nginx部署dotnet core站点
    这可能是最low的发布dotnet core站点到centos7教程
    记一个常见的ms sql server中取第N条记录的方法
    MVC基本开发介绍 (1)列表展示
    WCF 入门(29)
    WCF 入门(25,26,27,28)
    使用 Visual Studio Code 搭建 C/C++ 开发和调试环境
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/14630714.html
Copyright © 2011-2022 走看看