【论文阅读】(FedPer)Federated Learning with Personalization Layers

论文链接:https://arxiv.org/abs/1912.00818

摘要

       The emerging paradigm of federated learning strives to enable collaborative training of machine learning models on the network edge without centrally aggregating raw data and hence, improving data privacy.

       联邦学习的新范式试图使在网络边缘上实现机器学习模型的协作训练,而无需集中聚合原始数据,从而提高数据隐私。

This sharply deviates from traditional machine learning and necessitates design of algorithms robust to various sources of heterogeneity.

这与传统的机器学习有很大的不同,需要设计对各种异质性来源具有鲁棒性的算法。

Specifically, statistical heterogeneity of data across user devices can severely degrade performance of standard federated averaging for traditional machine learning applications like personalization with deep learning.

尤其是,跨用户设备数据的统计异构性会严重降低标准联邦平均对传统机器学习应用的性能,比如深度学习的个性化。

This paper proposes FedPer, a base + personalization layer approach for federated training of deep feed forward neural networks, which can combat the ill-effects of statistical heterogeneity.

本文提出了FedPer,一种用于深度前馈神经网络联邦训练的基础+个性化层方法,该方法可以对抗统计异构性的不良影响。

We demonstrate effectiveness of FedPer for nonidentical data partitions of CIFAR datasets and on a personalized image aesthetics dataset from Flickr.

我们证明了FedPer CIFAR 数据集的不相同数据分区和来自 Flickr 的个性化图像美学数据集的有效性

联邦学习的新范式试图使在网络边缘上实现机器学习模型的协作训练,而无需集中聚合原始数据,从而提高数据隐私。这与传统的机器学习有很大的不同,需要设计对各种异质性来源具有鲁棒性的算法。尤其是,跨用户设备数据的统计异构性会严重降低标准联邦平均对传统机器学习应用的性能,比如深度学习的个性化。本文提出了FedPer,一种用于深度前馈神经网络联邦训练的基础+个性化层方法,该方法可以对抗统计异构性的不良影响。我们证明了FedPer对 CIFAR 数据集的不相同数据分区和来自 Flickr 的个性化图像美学数据集的有效性

1 引言

联邦学习产生的背景:

现代移动、可穿戴设备、家庭助理和其他互联网启用设备拥有复杂的硬件和软件功能来支持各种应用程序并生成大量上下文和用户数据。由于网络边缘的隐私问题和日益增长的计算和存储能力,将数据本地保存在用户/客户端/边缘设备上,并在具有本地可用数据的设备上执行机器学习(ML)模型训练计算,以及偶尔与聚合参数服务器进行通信,变得越来越有吸引力。

这种训练 ML 模型的方法称为联邦学习,与传统的依赖于原始数据中央聚合的 ML 训练和预测流程形成鲜明对比。

联邦学习中存在统计异构性的挑战:

Li等人(2019)最近的概述文章阐明了联邦学习系统面临的许多独特的挑战。一个挑战是,不同客户端的有效数据分布在(可能数百万)参与设备之间可能会有很大差异。

统计异构性的不利之处:

这种统计异质性可能不利于ML训练算法在个性化、推荐、欺诈检测等应用中的性能,因为传统的ML训练算法是为中央或分布式的计算环境设计的,其中数据分区可以被严格控制。克服联邦学习中统计异构性的不良影响是最近几项工作的一个活跃研究领域。

【注】另一个挑战是系统异构性:在FedProx中有相应的解决方案。

(https://blog.csdn.net/qq_56483157/article/details/133362441?spm=1001.2014.3001.5501)

作者的工作:

在这里,我们研究了个性化设置作为深度前馈神经网络联邦学习中统计异质性的来源的影响。

对个性化进行介绍:

个性化作为 ML 的一个关键应用,它是可以实现的,因为用户在原始用户数据中捕获的偏好上有所不同。在边缘设备属于用户的联邦设置中,这必然意味着个性化数据在统计上是异构的。

之前的工作:

为了通过推荐进行个性化,ud din 等人(2019)首次尝试将协同过滤扩展到联邦设置;

Chen 等人(2018)设计了一种用于联邦训练的元学习方法。

不足之处:

虽然这些方法被证明在MovieLens 100k数据集上表现良好,但如何将它们扩展到深度神经网络模型或协同过滤无法解决的问题并不明确。

作者的看法:

我们相信个性化联邦学习的正确方法是研究界几乎没有触及表面的一个非常重要的问题。特别是,挑战来自多个方面,包括但不限于:

  • 个性化图像美学 (Ren et al., 2017) 和个性化高光检测 (Garcia del Molino and Gygli, 2018) 等许多个性化任务在数据中没有明确的用户特征,需要在训练期间提取这些特征。因此,相同的输入数据可以从不同的用户接收不同的标签,这意味着个性化模型必须因用户而异,以便能够为相似的测试数据预测不同的标签。这已经超出了标准联邦学习 (McMahan et al., 2017) 的范围,它学习一个全局模型并在每个客户端本地有效地复制它。
  • 每个用户的训练样本数量不足以单独训练单个 ML 模型。因此,需要一些沟通和协作来利用人群的智慧。然而,协同过滤算法可能不适用,因为它们需要不同用户评分的项目之间有相当大的重叠。根据Ren等人(2017);Garcia del Molino和Gygli(2018),在个性化图像美学的典型数据集中,足够的重叠条件失败,并在其他任务之间进行个性化高光检测。

1.1作者的贡献

贡献点1:提出新算法框架FedPer

我们建议通过将深度学习模型视为基础 + 个性化层来捕获联邦学习中的个性化方面,如图 1 所示。我们的训练算法包括通过联合平均(或其某些变体)训练的基础层,以及仅从具有随机梯度下降(或其某些变体)的本地数据训练个性化层。我们证明了没有联邦平均 (FedAvg) 程序的个性化层可以帮助对抗统计异质性的不良影响。

贡献点2:与标准联邦学习对比进行性能验证

通过将其性能与我们的联邦个性化方法在以下两个数据集进行比较,证明标准联邦学习设置非常不适合个性化任务:

(a)非相同分区的 CIFAR-10 / CIFAR-100 数据集,以及

(b)来自 Ren 等人的 FLICKR-AES 数据集。有趣的是,标准联邦学习在 FLICKR-AES 数据集上的失败在定性和定量上与其在非相同分区的 CIFAR-100 数据集上性能不佳有很大不同。

1:所提出的联邦个性化方法的形象化视图。所有用户设备共享一组具有相同权重(蓝色)的基本层,并且具有不同的个性化层,可以潜在地适应单个数据。基础层与参数服务器共享,而个性化层由每个设备私有保存

2 相关工作

我们的研究建立在文献中的几个观点的基础上。我们在下面列出重叠和不同之处。

联邦学习

前人工作:

这种在用户/客户端/边缘设备上训练ML模型的范例首先是通过McMahanKonecny等人的论文提出的。最初的重点是在保持学习全局模型的统计性能的同时减少通信开销。

四大挑战:

由于这些早期的工作,研究人员致力于阐明使联邦系统工作(除了统计异质性通信开销之外还包括系统异质性隐私泄露)和各种应用场景的潜在解决方案的其他挑战。这些在最近的Li等人的概述文章中都有所提及。

FedPer仅解决统计异质性问题:

虽然我们承认,要实现联邦学习系统,需要在这四个挑战上取得进展,但我们在这项工作中的新颖性仅限于统计异质性方面,同时保持与当前解决其他三个挑战的方法的可组合性。

FedPer的优势:

我们的联邦学习的基础 + 个性化层”概念有效地学习不同的重叠局部模型,以更好地捕获统计异质性。这种方法扩展了联邦学习的原始范围,即训练一个全局模型,并在所有用户设备上基本上复制它。众所周知,在病理和/或高度不相同的数据分区上进行训练时,原始的FedAvg算法可能是不收敛的。

多任务和迁移学习:

多任务和迁移学习领域的建模和算法技术通过利用在同一数据集上定义的多个任务之间的潜在关系,尝试使用较少的训练数据进行学习。

前人工作:

Smith等人首先认识到,多任务学习模型可以有效地用于研究联邦学习设置的各种异质性,并纳入局部模型的个性化方面。他限制了对多任务学习的凸/双凸公式的考虑,这些公式不能轻易扩展到神经网络模型(因为其在深度学习中无法保证强对偶性)。

作者的主要灵感:

由于深度学习模型根据其分层结构而自然地产生多任务公式(Ruder2017),因此应该研究联邦深度多任务学习设置,该设置概括了Smith等人(2017)的假设。这确实是本文提出的基础 + 个性化层公式的主要灵感。

FedPer框架层的描述:

直观地说,基础层可以作为多任务学习模型中的共享层并捕捉人群的智慧,而个性化层可以作为同一多任务学习模型的任务特定层来捕获用户特定方面

医疗领域工作:

例证医疗领域也存在类似的拆分原则:

在另一项由医疗保健领域的场景驱动的工作(Chen 等人,2019Vepakomma 等人,2018)中,提出了一种联邦迁移学习方法来解决个性化问题。这种方法中的一个隐藏假设是可以将全局训练步骤与随后的本地个性化步骤分开。

我们不知道这样的假设是否有任何直观的理由适用于医疗保健领域之外的用例,但它绝对不适用于 Ren 等人的个性化图像美学和个性化高光检测任务。

在医疗保健领域,单独的组织可以被认为是不允许共享原始数据的设备,但可以通过联邦学习技术共同训练机器学习模型(Yang等人,2019)

Vepakomma等人激发了各种方法,将联邦深度学习模型跨组织边界分割,以满足垂直分区数据的数据共享的不同约束。

对比医疗保健领域的拆分原则:

尽管我们的基础 + 个性化层结构也基于拆分原则,但我们的特定拆分与医疗保健领域中考虑的拆分不同,并且我们的动机是在完全不同的数据集和更小的数据量分布上进行评估。

分布式个性化与推荐:

用于个性化和推荐的集中式算法及其分布式算法已针对各种应用进行了广泛的研究。

过去的工作以及缺点:

许多分布式机器学习算法的关键假设是可以严格控制数据分区并且通信延迟是独立同分布的。值得注意的是,即使在Miao等人(2015)这样的异步分布式算法也可以在这些假设下享受强大的理论和经验属性(如凸损失的次线性收敛)

现在需要解决的问题:

然而,由于统计和通信异构性,联邦设置需要仔细重新设计和分析个性化和推荐算法。

已有工作:

ud din等人(2019)开发了第一个联邦协同过滤算法;

Chen等人(2018)制定了一种用于推荐的联邦元学习方法。

已有工作的缺点:

目前,这些工作忽略了深度学习模型,这是一个重大的缺点。

3 建模和算法设置

3.1 模型

         考虑图 1 所示的设置,其中所有用户设备共享相同的基础层,并具有构成深度前馈神经网络模型的独特个性化层。

基本和个性化层数表示方法

我们分别由正整数KBKP表示每个客户端的基本和个性化层数,并允许使用n个用户设备。

基础层权重矩阵的符号:

让我们用 WB,1, WB,2 , … , WB,KB表示指定基础层权重矩阵,其对应的向量值激活函数为aB,1, aB,2 , … , aB,KB。虽然基础层权重矩阵可能具有不同的维度,但稍微滥用符号,我们将指定元组 (WB,KB , … , WB,2, WB,1) 作为 WB 使用了张量符号表示

个性化层权重矩阵的符号:

类似地,对于 j ∈ {1, 2 , … , N },我们让第 j 个用户设备的个性化层权重矩阵指定为 WPj ,1, WPj ,2 , … ,  WPj ,KP ,对应的向量值激活函数用 aPj ,1, aPj ,2 , … , aPj ,KP 表示, 指定元组 (WPj ,KP , … , WPj ,2, WPj ,1) WPj 符号表示。

对符号定义可能出现的问题进行解释:

我们不会在本文中使用任何非平凡的张量演算,因此符号的滥用不应引起任何混淆。

此外,我们不会明确跟踪任何权重矩阵的维度,因为维度与本文中的阐述无关。

向量值激活函数的唯一维度的隐含性质,并提到了在第 j 个设备上的前向传播操作:

域的维度和向量值激活函数的范围是隐式唯一的,以满足第 j 个设备上任何输入数据点 x 的前向传递/推理操作。

公式1:用于计算前向传播的具体表达式,展示了如何通过一系列的激活函数和权重矩阵操作来进行前向传播

为简洁起见,我们将第 j 个设备上的这种前向传递操作表示为 y = f (x; WB , WPj)。因此,我们隐含地假设权重张量 WPj 在第 j 个设备上捕获了个性化的各个方面。

公式2:定义了个性化总体风险函数,目标是优化模型在所有设备上的个性化风险

稍微滥用符号,我们用Pj表示第j个设备上生成(数据、标签)对的联合分布。令 l(·,·) 表示所有设备共有的每个样本损失函数,我们设置中的学习目标是最小化相对于权重张量 WB,WP1 , … , WPN 的平均个性化总体风险函数。由于训练过程中真实的数据生成分布Pj是未知的,我们将使用第j个设备上的经验风险作为对应种群风险E(x,y)∼Pj [l(y, f (x;WB, WP))]的代理,其中nj为第j个设备可用的训练样本数,(xj,i, yj,i)i ∈ {1 , … , nj }的第i个样本。

公式3:引入经验风险作为训练过程中的风险替代,以实现对个性化风险的估计和优化

参数定义:

符号

含义

KB

客户端模型基本层数量

KP

客户端模型个性化层数量

N

设备总数

αB,1, αB,2 , … , αB,KB

基本层的激活函数

αPj ,1, αPj ,2 , … , αPj ,KP

个性化层的激活函数

WB​=(WB,1​,...,WB,KB​​)

基本层权重矩阵

WPj​​=(WPj​,1​,...WPj​,KP​​)

第j个客户端的个性化层的权重矩阵

b

数据集的批次大小

ek

数据集的迭代次数

η

学习率

3.2 算法

算法需要指定的内容(子程序,决策变量及其初始值,批量大小,epoch 数,学习率):

         我们将使用随机梯度下降 (SGD) 作为我们提出的算法中的子程序。用于最小化经验风险函数(如方程 3)的 SGD 标准公式需要我们指定以下内容:

(a) SGD 更新的决策变量及其初始值;

(b) 划分数据集 {(xj,i, yj,i) | 1 ≤ i ≤ nj } 的批量大小以及该数据集上的 epoch 数;

(c) 学习率。

我们将SGD(B , P , η, e, b)表示为决策变量(WB , WP)在损失函数( (WB , WP)下,以学习率η和批量大小b,在数据集上执行e个时期时的更新值。(WB , WP)的初始值为(B , P)。我们假设对于一个时期的数据集的随机排列在所提出的算法之外是独立定义的。

j个客户端的执行步骤:

1:客户端初始化自己的个性化层权重,使初始化为一个随机值

2:第j个客户端将设备上可用的训练样本数送到服务器端。

3k表示迭代轮数,客户端每轮执行以下步骤:

4:客户端接收服务器端聚合后的权重,将用于本地个性化训练。

5:为了既实现个性化又联合联邦学习的优势,使用了全局聚合的参数,也使用了设备本地个性化的权重矩阵,并以本设备的学习率执行SGD,显然,括号里的三个参数SGDj(,  , ),除了第一个基本层全局权重之外, 以及在不同设备几乎都是不一样的,SDG更新后的值简单的以()表示。

6:并且只将传输到服务器,这是为了保护隐私。

7:在两个服务器之间如4步骤-6往复,直到迭代完毕。

FedPer的服务器组件的步骤:

1:将基本层的权重矩阵初始化

2:接受各设备传来的可用样本数,使用进行计算,计算方法有点类似加权,得出一个新的参数,用于聚合权重。

3:为各设备发送基本层权重数据

4:进行k轮迭代,在每轮迭代中:

5:接受来自各设备(或第j个设备)更新过的基本层权重矩阵

6:使用进行权重聚合,得到新的基本层权重数据

7:共享基本层权重数据到客户设备端。

8:循环执行步骤5-7,直至迭代结束。

总体流程描述:

1.服务器端初始化基本层权重

2.客户端初始化自己的个性化层权重

3.服务器端将 发送到各个客户端。

4.服务器端和客户端都执行相同的循环:客户端收到服务器传来的基本层权重,然后利用本地数据来进行SGD更新:

SGD(B , P , , e, b)

其中表示当前学习率,e为本地训练轮数,bbatch size

5.本地训练完毕后只将基本层权重传回服务器。

6.服务器聚合所有客户端的基本层权重,然后分发给所有客户端,进行下一轮通信。

FedPer框架解释:

我们提出的个性化联邦训练算法FedPer通过算法1和算法2描述。FedPer 的服务器组件步骤在算法 2 下详细说明,第 j 个客户端的步骤在算法 1 下描述。

直观地说,服务器采用基于 FedAvg 的方法来全局训练基础层,而每个客户端则使用 SGD 样式算法在本地(在连续的全局聚合之间)更新其基础层和个性化层。

用于解决统计异构性的假设:

为了使阐述简单且与个性化驱动的统计异质性相关,我们做了以下假设,这些假设可以在实现中轻松放宽:

(a) 任何客户端的数据集在全局聚合中都不会改变,

(b) 批量大小 b 迭代次数 e 在客户端和全局聚合中保持不变,

(c) 每个客户端使用 SGD 来更新(WB , WPj ) 全局聚合之间,

(d) 所有 N个用户设备在整个训练过程中都处于活动状态。

符号解释:

我们用上标中的 (k) 表示第 k 次迭代期间假设的值。在第 k 个和第 (k + 1) 个全局聚合之间,第 j 个设备执行学习率为  SGD,并让更新后的值 SGD(,(B, P , , e, b) 用简写 SGDj(B, P ,) 表示。在第k个全局聚合期间,服务器使用权重对所有客户端j ∈ {1, . . . , N }  进行加权组合,以得到

4 实验

我们评估了 FedPer 在多个数据集和深度学习模型系列中的性能,并将其与 FedAvg 的行为进行了对比。

对比发现FedPer FedAvg的关系:

我们注意到,当 KP = 0 时,即不存在个性化层时,FedPer 会减少到 FedAvg

行文框架:

4.2 节和第 4.3 节分别介绍了统计异质性和改变 KP CIFAR 数据集实验的影响。 4.5 节介绍了 FLICKR-AES 数据集的相应结果。

本着可重复性的精神,我们提供了所有数据集、实验实现和结果:https://bit.ly/35dKebE.

4.1 数据集、模型架构和实现细节
数据集采用CIFAR-10CIFAR-100以及FLICKR-AES):

1. CIFAR-10 CIFAR-100 分别是具有 10 100 个标记类的图像分类数据集。两者都有 50,000 个训练样本和 10,000 个测试样本。每个图像都有一个唯一的标签。

2. FLICKR-AES数据集由Ren等人编译,以研究个性化的图像美学。它有 40,000 张来自 www.flickr.com 的照片,具有通过 Amazon Mechanical Turk 收集的美学评级(在 1 5 之间)。每个图像都由 5 个不同的用户评分,共有 210 个用户。每个用户评分在 60 290 张图像之间,平均评分为 160。我们将每个用户的数据随机分成 80% 的训练集和 20% 的测试集。

模型架构:

使用ResNet-34MobileNet-v1卷积神经网络系列。

虽然ResNet模型系列在许多图像分类任务中实现了最先进的性能,但MobileNet是一个适用于具有低计算资源的移动视觉应用的高效模型系列。

这两个系列都是通过多次组合它们各自的基本块构建的。ResNet-34MobileNet-v1分别具有16个和11个基本块。

ResNet的基本块是一个由两个卷积层和一个残差连接组成的残差块;

MobileNet的基本块包含深度卷积层和逐点卷积层。

我们将基本块的单位中的基础层和个性化层区分开来。

实现细节:

         对每个实验进行了100次全局聚合,在连续的全局聚合之间进行了e = 4 个时期的SGD

在全局聚合和客户端之间使用恒定的学习率 = 0.01。

  1. FLICKR-AES数据集的实验使用了30个用户的随机子集作为客户端,SGD的批量大小设置为b = 4。这个数据集在nj方面天然不平衡,并且在Pj方面统计上是异质的。
  2. CIFAR-10CIFAR-100的实验使用了10个客户端,SGD的批量大小设置为b = 128。数据量在nj方面对客户端进行了平衡,但在Pj方面通过将任何特定客户端的样本限制为最多k类来进行了非一致的分割。特定类别的样本数量在被允许从中进行采样的客户端之间平均分配,统计异质性的程度通过改变k的值而变化。

4.2统计异构性的影响

2根据不同的统计异质程度(k ∈ {4, 8, 10}),展示了在ResNet-34MobileNet-v1FedAvgFedPer(客户端平均)在全局聚合轮数上的测试准确率。k = 4表示非常不一致的数据分割,而k = 10则表示客户端之间的数据分割是相同的。

3展示了在MobileNet-v1FedAvgFedPerk = 4情况下,测试准确率在不同客户端之间的变化(通过阴影区域表示)。

对于这两个图中的结果,分类器层(最终的全连接层)和紧接着的基本块被用作FedPer的个性化层。

从图2中我们可以观察到,与全局聚合轮数相比,FedPer在收敛速度和客户端平均测试准确率方面都显著优于FedAvg。有趣的是,随着数据分割越来越一致(由参数k4增加到10),FedPer的性能逐渐接近于FedAvg。即使将CIFAR-10替换为CIFAR-100,并选择k ∈ {40, 80, 100}(请参阅补充材料中的图表),这些结果的定性性质仍然保持不变。

3显示,FedPer也导致了客户端之间测试准确率的变化较小。这对于学习的公平性很重要。对于FedAvg来说,客户端之间的测试准确率差异较大,这有些令人惊讶。然而,当数据分割的非一致性通过将k4增加到10来减小时,这种差异的幅度也会减小(请参阅补充材料中的图表)。

4.3个性化图层的效果

         我们将个性化层定义为包括分类器层(最后的全连接层)和最后几个基本块。由于我们以基本块为单位来划分个性化层,为了方便,我们使用KP来表示个性化层中包含的基本块数量。当KP = 4时,表示分类器层和个性化层中包含的最后3个基本块,而当KP = 1时,表示只有分类器层包含在个性化层中。

         图表4FedPerResNet-34MobileNet-v1上的CIFAR-10测试准确率(平均每个客户端)作为全局聚合轮次的函数绘制,对于不同个性化层的数量(KP ∈ {1, 2, 3, 4})。有趣的是,除了至少有一个个性化层有所帮助外,KP与客户端平均测试准确率之间似乎没有明显的相关性。对于MobileNet-v1ResNet-34KP = 2CIFAR-10上取得最佳性能,而KP = 1CIFAR-100上最佳。

4.4 基础层学到了什么吗?

在理论上,个性化层可能足以完成当前的学习任务,使得基础层变得多余。为了测试这种情况是否发生,我们 用线性全连接层替换每个客户端的基础层,并使用FedPer进行训练。如果基础层是多余的,那么训练这个模型时测试准确率不应显著下降(与ResNet-34MobileNet-v1相比)。图5和图6证明了这并非如此,至少对于CIFAR-100而言。事实上,纯粹的本地训练的表现证实了每个客户端的训练样本数量不足以高度准确地学习个体客户端模型。

4.5 FLICKR-AES的性能

Figure 78展示了MobileNet-v1ResNet-34模型在FLICKR-AES数据集上的测试性能。从结果可以看出,FedAvg方法不适合用于个性化任务建模。使用FedAvg训练的MobileNet模型的性能与其在CIFAR数据集上的表现在数量上存在很大的差异,并且类似于随机猜测。这是因为FedAvg方法无法捕捉用户的个人偏好,因为它在所有客户端上都有相同的模型副本。

使用我们的FedPer方法训练的模型通过个性化层捕捉用户的偏好。虽然本文中使用的模型在此任务上并非最先进的,但它提供了足够的证据表明我们的FedPer方法具有建模个性化任务的能力。在图9中给出了将模型的基础层替换为线性层后,在MobileNet-v1模型上的实验结果。与CIFAR-100数据集类似,我们观察到模型的性能下降,再次验证了我们的假设,即基础层通过联邦训练捕捉了复杂的图像特征。

5 结论

         本文中,我们提出了一种新颖的方法FedPer,用于在联邦学习中捕捉用户个性化方面。FedPer通过将深度学习模型视为基础层和个性化层来实现这一目标。基础层采用现有的联邦学习方法进行协作训练,而个性化层则在本地进行训练,从而使我们的方法能够捕捉用户的个性化方面。结果表明,采用基础层和个性化层有助于解决统计异质性的不良影响。FLICKR-AESCIFAR数据集上的实证结果表明了FedAvg的无效性以及FedPer在建模个性化任务方面的有效性

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值