MMD和LMMD

1、再生核希尔伯特空间

(1)基础概念

数学中的空间往往需要两部分构成:研究对象和内在规则。

常见空间有线性空间、度量空间、赋范空间、内积空间、希尔伯特空间、再生核希尔伯特空间等。

线性空间就是定义加法和数乘的空间。线性空间强调的是空间中元素满足线性结构,空间中的一个元素可以由其他元素线性表示出来。

度量空间就是定义距离的空间。不同的定义方式,我们可以得到不同的结果。度量空间强调的是两个元素根据某一函数得到的函数值。

赋范空间就是定义范数的空间。常见的范数使用为L0范数、L1范数、L2范数和无穷范数。

L0范数就是指向量中非零元素的个数

L1范数就是所有元素绝对值的和

L2范数就是所有元素平方和的开方

无穷范数就是所有元素中的最大绝对值

线性赋范空间就是定义加法、数乘和范数的空间,同时拥有了线性空间和范数空间的性质。

内积空间就是定义内积的空间,即点乘、标积,有夹角和正交的概念。

希尔伯特空间就是个完备的内积空间。完备性是为了取极限操作而准备的,这样才不会超出空间。

再生核希尔伯特空间将不能线性可分的数据集映射到高维空间,使其变得线性可分。

2、MMD

MMD(最大均值差异)是迁移学习,尤其是域适应中使用最广泛的一种损失函数,主要用于度量两个不同但相关的分布的距离。

如果两个随机变量的任意阶都相同,则两个随机变量分布一致。

如果两个随机变量的分布不相同,则使两个分布之间的差距最大的那个矩来度量两个分布。

获得两个分布的高阶矩,就是将映射函数映射到无穷维上再求期望,就可以得到随机变量的高阶矩。所以将一个分布映射到再生核希尔伯特空间上,将分布映射成空间上的一个点,两个分布之间的 距离用两个点的内积来表示

将源域和目标域上的特征映射到再生核希尔伯特空间,从而计算两个特征分布之间的距离。

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)
    if fix_sigma:
        bandwidth = fix_sigma
    else:
        bandwidth = torch.sum(L2_distance.data) / (n_samples**2-n_samples)
    bandwidth /= kernel_mul ** (kernel_num // 2)
    bandwidth_list = [bandwidth * (kernel_mul**i) for i in range(kernel_num)]
    kernel_val = [torch.exp(-L2_distance / bandwidth_temp) for bandwidth_temp in bandwidth_list]
    return sum(kernel_val)#/len(kernel_val)


def mmd_rbf_noaccelerate(source, target, kernel_mul=2.0, kernel_num=5, fix_sigma=None):
    batch_size_sour = int(source.size()[0])
    batch_size_tar = int(target.size()[0])
    kernels = guassian_kernel(source, target,
                              kernel_mul=kernel_mul, kernel_num=kernel_num, fix_sigma=fix_sigma)
    XX = kernels[:batch_size_sour, :batch_size_sour]
    YY = kernels[batch_size_tar:, batch_size_tar:]
    XY = kernels[:batch_size_sour, batch_size_tar:]
    YX = kernels[batch_size_tar:, :batch_size_sour]
    loss = torch.mean(XX + YY - XY -YX)
    return loss

 3、LMMD

LMMD来源于论文(Deep Subdomain Adaptation for Image Classification),是一种用于域自适应学习中的距离度量方法。

 局部最大均值差异(LMMD)是一种用于度量两个分布之间差异的方法,它引入了局部最大化的思想,即在计算最大均值差异时,将样本空间划分为多个局部区域,在每个局部区域内分别计算最大均值差异,并取最大值作为最终的度量结果。这样可以更精细地捕捉两个分布之间的差异,提高域自适应学习的效果。

因此,局部最大均值差异(LMMD)在域自适应学习中扮演着重要的角色,帮助模型更好地理解不同域之间的数据分布差异,从而提高模型的泛化能力和适应性。通过使用LMMD,可以更准确地评估源域和目标域之间的差异,有助于改善模型在目标域上的性能表现。

def lmmd(source, target, s_label, t_label, kernel_mul=2.0, kernel_num=5, fix_sigma=None):
    batch_size = source.size()[0]
    weight_ss, weight_tt, weight_st = Weight.cal_weight(s_label, t_label, type='visual', class_num=5)
    weight_ss = torch.from_numpy(weight_ss).cuda()
    weight_tt = torch.from_numpy(weight_tt).cuda()
    weight_st = torch.from_numpy(weight_st).cuda()

    kernels = guassian_kernel(source, target,
                              kernel_mul=kernel_mul, kernel_num=kernel_num, fix_sigma=fix_sigma)
    loss = torch.Tensor([0]).cuda()
    if torch.sum(torch.isnan(sum(kernels))):
        return loss
    SS = kernels[:batch_size, :batch_size]
    TT = kernels[batch_size:, batch_size:]
    ST = kernels[:batch_size, batch_size:]

    loss += torch.sum( weight_ss * SS + weight_tt * TT - 2 * weight_st * ST )
    return loss

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值