论文精讲 | 基于昇思MindSpore实现多域原型对比学习下的泛化联邦原型学习

论文标题

Rethinking Federated Learning with Domain Shift: A Prototype View

论文来源

CVPR 2023

论文链接

https://openaccess.thecvf.com/content/CVPR2023/papers/Huang_Rethinking_Federated_Learning_With_Domain_Shift_A_Prototype_View_CVPR_2023_paper.pdf

代码链接

https://github.com/yuhangchen0/FPL_MS

昇思MindSpore作为一个开源的AI框架,为产学研和开发人员带来端边云全场景协同、极简开发、极致性能,超大规模AI预训练、极简开发、安全可信的体验,2020.3.28开源来已超过5百万的下载量,昇思MindSpore已支持数百+AI顶会论文,走入Top100+高校教学,通过HMS在5000+App上商用,拥有数量众多的开发者,在AI计算中心,金融、智能制造、金融、云、无线、数通、能源、消费者1+8+N、智能汽车等端边云车全场景逐步广泛应用,是Gitee指数最高的开源软件。欢迎大家参与开源贡献、套件、模型众智、行业创新与应用、算法创新、学术合作、AI书籍合作等,贡献您在云侧、端侧、边侧以及安全领域的应用案例。

在科技界、学术界和工业界对昇思MindSpore的广泛支持下,基于昇思MindSpore的AI论文2023年在所有AI框架中占比7%,连续两年进入全球第二,感谢CAAI和各位高校老师支持,我们一起继续努力做好AI科研创新。昇思MindSpore社区支持顶级会议论文研究,持续构建原创AI成果。我会不定期挑选一些优秀的论文来推送和解读,希望更多的产学研专家跟昇思MindSpore合作,一起推动原创AI研究,昇思MindSpore社区会持续支撑好AI创新和AI应用,本文是昇思MindSpore AI顶会论文系列第18篇,我选择了来自武汉大学计算机学院的叶茫老师团队的一篇论文解读,感谢各位专家教授同学的投稿。

昇思MindSpore旨在实现易开发、高效执行、全场景覆盖三大目标。通过使用体验,昇思MindSpore这一深度学习框架的发展速度飞快,它的各类API的设计都在朝着更合理、更完整、更强大的方向不断优化。此外,昇思不断涌现的各类开发工具也在辅助这一生态圈营造更加便捷强大的开发手段,例如MindSpore Insight,它可以将模型架构以图的形式呈现出来,也可以动态监控模型运行时各个指标和参数的变化,使开发过程更加方便。

01 研究背景

在数字化的世界中,数据隐私和安全性成为了日益关注的核心议题。正是在这样的背景下,联邦学习应运而生,作为一种保护数据隐私的分布式机器学习方法,其核心思想是让多个设备或服务器共同训练一个模型,而无需共享原始数据。这种方法可以应对多台移动设备上的机器学习任务,特别是在数据隐私和安全性需求高的情况下。

联邦学习中有个重要的待解决的问题:数据异构性。通常指的是参与学习的各节点(例如设备、服务器或组织)持有的数据可能存在巨大的差异。这些差异可能涉及数据的分布、质量、数量以及特征类型等多个方面。数据异构性问题在联邦学习中尤为重要,因为它可能直接影响模型的学习效果和泛化能力。

本文指出,针对数据异构,现有的解决方案主要关注来自同一领域的所有私有数据。当分布式数据来源于不同的领域时,私有模型在其他领域(存在领域偏移)上容易展现出退化的性能,而且全局信号无法捕获丰富公平的领域信息。因此,作者期望在联邦学习过程中通过优化的全局模型能够稳定地在多个领域上提供泛化性能。

在本文中,作者提出了一种针对领域偏移下的联邦学习的“联邦原型学习”(FPL)。核心思想是构建集群原型和无偏原型,提供丰富的领域知识和公平的收敛目标。一方面,将样本嵌入远离来自不同类别的群集原型,更接近于相同语义的群集原型。另一方面,引入了一致性正则化,以使本地实例与相应的无偏原型对齐。

论文基于昇思MindSpore进行框架开发和实验,Digits和Office Caltech任务等实验结果证明了所提出的解决方案的有效性和关键模块的高效性。

02 团队介绍

论文第一作者黄文柯目前硕博连读于武汉大学(2021-至今),导师为杜博教授和叶茫教授。本科毕业于武汉大学,主要研究方向包括联邦学习,图学习,金融科技等,目前在CVPR、IJCAI、ACM MM 国际顶级会议上以第一作者发表论文4篇。研究生期间获得国泰君安奖学金、优秀研究生等称号。曾在阿里巴巴集团、微软亚洲研究院等担任研究实习生。

论文通讯作者叶茫是武汉大学计算机学院教授、博士生导师,国家级高层次青年人才,中国科协青年托举人才。曾任阿联酋起源人工智能研究院研究科学家和美国哥伦比亚大学访问学者。主要研究方向计算机视觉、多媒体检索、联邦学习等,发表国际期刊会议论文 80 余篇,ESI 高被引论文 10 篇,谷歌学术引用 5600 余次。担任CVPR24、ACM MM23等学术会议领域主席。主持湖北省重点研发计划、国家自然科学基金面上项目等科研项目。获谷歌优秀奖学金、国际计算机视觉顶会 ICCV2021无人机目标重识别赛道冠军、2021-2022年斯坦福排行榜 “全球前2%顶尖科学家”、2022年百度AI华人青年学者等荣誉。。

研究团队MARS是由叶茫教授指导的专注研究监控视频行人/行为分析、无监督/半监督学习、跨模态理解与推理、联邦学习。

03 论文简介

3.1 介绍

基于前述的研究背景,本文提出联邦原型学习(Federated Prototype Learning),用于解决联邦多域泛化问题:私有数据来源于不同领域,不同的客户端存在差异较大的特征分布,由于本地模型会过度拟合本地分布,私有模型无法在其他领域表现好。比如说,一个在灰度图像MNIST上训练的本地模型A,在被服务器端聚合后,不能在另一个比如彩色图像SVHN数据集的客户端中表现正常,因为这个本地模型A无法学习到SVHN的领域信息,导致性能退化。

由于全局信号无法表征多个领域的知识信息,并且可能偏向主导领域的信息,导致泛化能力下降。为了让模型学习到丰富的多领域知识,使用共有信号提供多个领域信息提升泛化能力,本文提出利用集群原型表征不同领域信息,利用对比学习,增强不同领域相同类别共性,增强不同类别差异性,称为集群原型对比学习(Cluster Prototypes Contrastive Learning);为了避免朝潜在主导域优化,提升在少数域上的能力,本文利无偏原型提供公平稳定的信息,称为无偏原型一致性正则化(Unbiased Prototypes Consistent Regularization)。

cke_863.png

image.png

cke_3032.png

cke_4213.png

image.png

图2 不同种类原型表示

3.2.2 集群原型对比学习

为了解决全局原型存在的问题,本文首先使用FINCH方法进行无监督聚类,将广泛的领域知识(每个样本的特征向量)无监督地进行分离,如此一来,来自于不同域的样本由于各自特征向量存在差异,不同的领域将被聚类为不同的集群,然后对同一集群内计算这个集群的原型,如图2b,防止多域之间相互平均后远离所有有用的领域知识。

cke_7930.png

image.png

为什么这种方法有效呢?作者给出下面的分析:

cke_12413.png

cke_14493.png

cke_16687.png

image.png

04 实验结果

4.1 与State-of-the-art的实验结果对比

本文在Digits和Office Caltech数据集下进行测试,前者是数字的4种相同标签不同数据来源的数据集,后者是真实世界的4种相同标签不同数据来源的数据集。实验表明所提出的FPL不论是在单个领域上的性能还是多个领域上的平均性能,都优于当前SOTA。

image.png

4.2 消融实验

image.png

可以看出大部分情况下CPCL和UPCR共同作用能产生更好的性能。

image.png

比较两种方法采用普通的全局原型和所提出的原型所展示出的实验效果,表明集群原型和无偏原型的有效性。

4.3 昇思MindSpore代码展示

本框架基于昇思MindSpore进行开发。

4.3.1 昇思MindSpore实现集群原型对比学习

def calculate_infonce(self, f_now, label, all_f, all_global_protos_keys):
        pos_indices = 0
        neg_indices = []
        for i, k in enumerate(all_global_protos_keys):
            if k == label.item():
                pos_indices = i
            else:
                neg_indices.append(i)

        f_pos = Tensor(all_f[pos_indices][0]).reshape(1,512)
        f_neg = ops.cat([Tensor(all_f[i]).reshape(-1, 512) for i in neg_indices], axis=0)
        #aaa
        f_proto = ops.cat((f_pos, f_neg), axis=0)
        f_now = f_now.reshape(1,512)

        f_now_np = f_now.asnumpy()
        f_proto_np = f_proto.asnumpy()
        def cosine_similarity_numpy(vec_a, vec_b):
            dot_product = np.dot(vec_a, vec_b.T)
            norm_a = np.linalg.norm(vec_a, axis=1, keepdims=True)
            norm_b = np.linalg.norm(vec_b, axis=1)
            return dot_product / (norm_a * norm_b)
        l_np = cosine_similarity_numpy(f_now_np, f_proto_np)
        l = Tensor(l_np)

        #l = ops.cosine_similarity(f_now, f_proto, dim=1)
        l = ops.div(l, self.infoNCET)

        exp_l = ops.exp(l).reshape(1, -1)

        pos_num = f_pos.shape[0]
        neg_num = f_neg.shape[0]
        pos_mask = Tensor([1] * pos_num + [0] * neg_num).reshape(1, -1)

        pos_l = exp_l * pos_mask
        sum_pos_l = ops.sum(pos_l, dim=1)
        sum_exp_l = ops.sum(exp_l, dim=1)
        infonce_loss = -ops.log(sum_pos_l / sum_exp_l)
        return Tensor(infonce_loss)

4.3.3 客户端本地模型训练

def _train_net(self, index, net, train_loader):

        if len(self.global_protos) != 0:
            all_global_protos_keys = np.array(list(self.global_protos.keys()))
            all_f = []
            mean_f = []
            for protos_key in all_global_protos_keys:
                temp_f = self.global_protos[protos_key]
                all_f.append(copy.deepcopy(temp_f))
                mean_f.append(copy.deepcopy(np.mean(temp_f, axis=0)))
            all_f = [item.copy() for item in all_f]
            mean_f = [item.copy() for item in mean_f]
        else:
            all_f = []
            mean_f = []
            all_global_protos_keys = []        

        optimizer = nn.SGD(net.trainable_params(), learning_rate=self.local_lr, momentum=0.9, weight_decay=1e-5)
        criterion1 = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')
        criterion = CustomLoss(criterion1, self.loss2)
        self.loss_mse = mindspore.nn.MSELoss()
        train_net= nn.TrainOneStepCell(nn.WithLossCell(net,criterion), optimizer=optimizer)
        train_net.set_train(True)

        iterator = tqdm(range(self.local_epoch))
        for iter in iterator:

            agg_protos_label = {}
            for di in train_loader.create_dict_iterator():
                images = di["image"]
                labels = di["label"]

                #   train_net.set_train(False)
                f = net.features(images)
                #train_net.set_train(True)

                if len(self.global_protos) == 0:
                    loss_InfoNCE = 0 
                else:
                    i = 0
                    loss_InfoNCE = None

                    for label in labels:
                        if label in all_global_protos_keys:

                            f_now = f[i]
                            cu_info_loss = self.hierarchical_info_loss(f_now, label, mean_f, all_global_protos_keys)
                            xi_info_loss = self.calculate_infonce(f

05 总结与展望

在本文中,我们探讨了在异构联邦学习中领域转移下的泛化性和稳定性问题。我们的研究引入了一个简单而有效的联邦学习算法,即联邦原型学习(FPL)。我们利用原型(类的典型表示)来解决这两个问题,享受集群原型和无偏原型的互补优势:多样的领域知识和稳定的收敛信号。我们使用昇思MindSpore架构实现了FPL框架并展现其在效率和准确性上的优势。

在使用昇思MindSpore进行FPL框架开发中,我们注意到昇思MindSpore社区非常活跃,有许多华为开发者和使用者针对我们框架搭建中遇到的困难提供巨大帮助。不仅如此,借助昇思MindSpore提供的丰富的文档和教程以及社区中的实际案例和最佳实践,我们避免了许多潜在的陷阱,更快地达到了我们的研究目标。

往期回顾

论文精讲 | 基于昇思的等夹角向量基(EBVs)分类性能显著优于传统分类器详解

论文精讲 | 基于昇思MindSpore的零售商品视觉结算原型学习PLACO,实现准确率提升2.89%

论文精讲 | 使用稀疏Ising机训练深度玻尔兹曼网络

论文精讲 | 基于昇思提出的流场景下知识图谱表示学习框架

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值