论文研读系列——“FCT-GAN Enhancing Table Synthesis via Fourier Transform”

FCT-GAN Enhancing Table Synthesis via Fourier Transform

arxiv [Submitted on 12 Oct 2022]

链接:arXiv:2210.06239

摘要

本文介绍了 FCT-GAN,这是一种创建合成表格数据的新方法,它使用一种特殊技术,可以考虑整个数据,不会混淆数据列的顺序,从而遵守 GDPR 等隐私法。它在变压器风格的设置中结合使用特征标记化和傅里叶网络,以更好地捕获数据中的详细和广泛模式,旨在生成与原始非常相似的合成数据。该方法已在各种数据集上进行了测试,结果表明,该方法生成的合成数据对机器学习更有用,在统计学上与原始数据更相似,因此表现优于现有方法。FCT-GAN 的架构包括一种处理数据的新方法,使用傅里叶变换技术以有利于生成和区分真实数据和合成数据的方式改进表格数据的处理。该文章表明,FCT-GAN可以稳定地抵御数据列顺序的变化,这是先前方法的常见问题,使其成为合成高质量表格数据的可靠解决方案。

I. INTRODUCTION(引言)

尽管数据共享对于知识发展至关重要,但隐私问题和严格的法规(例如,欧洲通用数据保护条例GDPR)限制了其完全有效性。利用机器学习模型生成的合成数据是一种新兴的解决方案。合成数据已经通过生成对抗网络GAN为各种类型的数据提供了支持,例如图像、文本到图像和表格。

由于其在医学和金融等领域的应用场景丰富,合成表格数据成为了一个突出的研究方向。与图像数据相比,表格数据的一个关键区别在于它由不同类型的列组成,如连续的、分类别或混合变量。因此,为图像合成设计的GAN不能直接应用于表格数据。先前的工作为不同类型的数据提出了特征工程解决方案,例如对分类型变量使用独热编码。独热编码被证明对于表格GAN更好地恢复分类型变量分布并捕获所有列之间的相互依赖性是更好的。然而,独热编码不可避免地增加了数据维度。高维度数据对表格GAN来说学习全局关系是具有挑战性的。先前的研究表明,采用CNN作为生成器和鉴别器的表格GAN算法,比使用纯全连接神经网络实现了更好的合成质量。这是因为CNN能够很好地提取局部空间特征。直接采用CNN对表格数据建模的第一个限制是,由于卷积滤波器的大小,它可能忽略了列之间的全局关系。当对分类型变量应用独热编码时,这种限制加剧了。其次,虽然排列列,例如按其类型重新排序列,没有任何语义意义,但由卷积层提取的局部特征表示被扭曲了。当使用CNN进行表格GAN时,一个表格行通过将每个列值映射到一个像素来转换为一个固定大小的图像。在真实图像中,距离很远的像素之间的关系,例如左上角的像素和右下角的像素,可能不影响图像分类。但对于包装成图像的表格数据,这两个像素可以代表高度相关的列。

为了解决上述两个限制,作者提出了一个带有傅里叶网络块FNBs的条件表格GAN。FNBs的目标是在频率域中学习空间位置之间的交互。作者为鉴别器和生成器使用FNBs,并采用不同的设计。傅里叶层是FNB的关键部分,包含三个操作:(i) 2D离散傅里叶变换,(ii) 频率域特征与可学习权重的逐元素乘法,以及@@(iii) 2D逆离散傅里叶变换。此外,作者以transformer风格的标记化方式处理输入数据。CNN基础的滤波器应用于原始数据以捕获局部空间特征,并将它们转换为特征标记。傅里叶层将标记转换为频率域,然后可学习权重应用于所有频率以学习全局关系。我们的结果表明,FCT-GAN在7个数据集上的机器学习效用方面比最先进的SOTA提高了高达27.8%,在统计相似性方面提高了高达26.5%。由于傅里叶块能够捕获局部和全局关系,作者的结果还表明,在三种不同的列顺序中,FCT-GAN在所有比较中的合成质量变化最小。实验表明,在一个高维数据集上,由于数据维度问题,有3个SOTA算法无法训练,FCT-GAN仍然保持其性能和稳定性高于所有比较。

本研究的主要贡献可以总结如下: (1)作者将傅里叶变换引入到表格式GAN训练中,并设计了一个生成器和鉴别器的体系结构。(2)结合转换器风格的输入标记器,新的体系结构可以捕获表格数据的局部和全局关系,从而实现列排列不变性。(3)作者在8个数据集上对5个FCT-GAN的合成器进行了广泛的评估,特别关注高维真实世界数据。

II. RELATED WORK(相关工作)

作者介绍了各种表格数据合成方法和傅里叶网络。

A. 表格数据合成器

有多种方法可以合成表格数据。概率模型如Copulas使用Copula函数来模拟多变量分布。但是,分类型数据不能通过高斯Copula来建模。Synthpop通过逐变量的方式工作,通过拟合一系列回归模型并从相应的预测分布中抽取合成值。由于它是逐变量进行的,训练过程计算量大。贝叶斯网络被用来合成分类型变量,但缺乏生成连续变量的能力。当前最先进的方法引入了几种表格GAN算法。Table-GAN引入了一个辅助分类模型以及鉴别器训练,以增强合成数据中的列依赖性。CT-GAN和CTAB-GAN通过引入几种预处理步骤来改善数据合成,这些步骤针对分类型、连续型或混合数据类型,将数据列编码为GAN训练的适当形式。CT-GAN设计的有条件向量后来由CTAB-GAN改进,也帮助GAN训练减少少数类别上的模式崩溃。CTAB-GAN+、PATE-GAN和IT-GAN通过采用差分隐私或在GAN训练期间控制真实记录的负对数密度来生成表格数据,而不会冒险泄露原始数据的隐私。然而,据作者所知,以前没有工作研究过专注于对抗训练数据列排列顺序对最终合成数据质量影响的表格GAN算法。

B. 傅里叶网络

傅里叶变换在图像处理中扮演了几十年的重要角色,例如JPEG压缩。将傅里叶变换纳入神经网络架构设计已在许多视觉工作中进行了研究。最近的工作还利用傅里叶变换设计深度神经网络来解决偏微分方程(PDE)和自然语言处理(NLP)任务。作者的傅里叶网络块架构设计主要受到全局滤波网络(GFNet)的启发。作者采用了GFNet中的输入标记化和全局滤波层的设计,并将其用于他们为表格GAN设计的生成器和鉴别器。

在这里插入图片描述

III. ANALYSIS ON PERMUTATION INVARIANCE(排列不变性分析)

表格 I: 在三种不同列顺序下,原始数据和合成数据之间统计相似性差异的平均值。

在这里插入图片描述

作者通过实验展示了先前最先进方法对训练数据中列的排列顺序的不稳定性。在第“实验”部分提供了数据集和评估指标的详细信息。作者考虑了三种列顺序:(i) 原始:正如其名,保持从数据集源下载时的顺序。(ii) 按数据类型排序:将所有连续列放在前面,所有分类型列放在后面。(iii) 按数据相关性排序:首先计算所有列之间的成对相关性。然后根据绝对相关值对列进行排序,高度相关的对排在前面,相关性较低的对排在后面。跳过重复的列。作者使用所有分类列的平均Jensen-Shannon散度(Avg-JSD)和所有连续列的平均Wasserstein距离(Avg-WD)来评估真实和合成表之间的统计差异。最后,Diff. Corr.表示真实和合成数据的相关性矩阵之间的平均距离。这些指标越低,合成数据的质量越好。对于指标M和数据集D, L = { V D M N , V D M N . . . V D M N } L = \{V^N_{DM}, V^N_{DM} ... V^N_{DM}\} L={VDMN,VDMN...VDMN}表示在不同列顺序下的评价值。我们定义最大绝对变化(MAV)如下:

M A V = m a x ( L ) − m i n ( L ) MAV = max(L) − min(L) MAV=max(L)min(L)

在这里插入图片描述

MAV表示所有顺序结果中最大的成对差异。请注意,不同的评估指标可能在不同的尺度上。为了更容易地跨所有指标和不同算法进行比较,我们进一步定义了归一化的MAV如下:

归一化的 M A V ( % ) = ( M A V / m i n ( L ) ) × 100 归一化的 MAV (\%) = (MAV / min(L)) × 100 归一化的MAV(%)=(MAV/min(L))×100

图 1展示了5个最先进算法在5个分类数据集(即,Loan、Adult、Intrusion、Credit和Covertype)上的合成质量的归一化MAV。CTAB-GAN、CTAB-GAN+和Table-GAN使用CNN作为生成器和鉴别器,而TVAE和CT-GAN使用全连接网络。Table-GAN是唯一使用最小-最大归一化来编码所有列类型的方法。其余四种算法对分类型列使用独热编码。这显著增加了特征空间的维度,使得学习全局关系更加困难。使用CNN加独热编码使CTAB-GAN和CTAB-GAN+对列排列更加敏感。全连接网络减少了这种影响,但变化仍然不可忽视。Table-GAN在所有指标上是最稳定的,但其绝对性能在所有最先进方法中最差。表 I展示了在相同三个列排序上,每个指标的平均绝对结果。可以看出,尽管CTAB-GAN和CTAB-GAN+在结果中经历了一些不稳定性,它们的性能范围仍然比其他算法更好。没有一个最先进的算法能够提供既高质量又对列排列不变的表格数据合成。

IV. FCT-GAN

在本节中,我们首先介绍傅里叶网络块(FNB)的基础知识,然后描述将它们集成到表格GAN中的设计。

A. 傅里叶网络块(FNB)入门

输入标记化过程和傅里叶网络块被探索用于图像分类,并可以结合在以下架构中,如图2所示。这个架构是构建FCT-GAN生成器和鉴别器的基础。编码后的表格数据的每一行通过一个补丁嵌入层被分割成标记。然后,FNB的重复层从标记中提取特征。在生成器中,提取的特征直接表示生成的数据。在鉴别器中,它们被送入一个最终层进行分类。对于输入数据标记化(即,图2中的补丁嵌入),我们首先将原始图像分割成小部分以提取局部空间特征(与ViT、MLP-Mixer和GFNet类似)。我们定义了一个具有k×k内核和与内核大小相同的步长的CNN层。因此,对于一个大小为N×N的图像,在嵌入后,我们有 N k × N k \frac Nk × \frac Nk kN×kN个标记。傅里叶网络块由两部分组成:(1) 傅里叶层和 (2) 前馈网络。正如GFNet建议的,我们使用实数快速傅里叶变换(rFFT)(即,2D FFT阶段)在傅里叶层中,因为我们的输入是一个实数张量,没有虚部。由于实数张量的FFT是共轭对称的,可以在不丢失信息的情况下减半频率域特征,这有助于减半频率域中可学习权重的数量,从而加快计算速度。输入标记化和FNB设计可以混合代表不同空间位置的标记,允许这种架构同时考虑局部和全局关系。

B. FCT-GAN设计

图3展示了FCT-GAN的总体结构。作者首先介绍了数据特征工程方法,然后是生成器和鉴别器的网络架构以及如何集成FNB。最后,作者讨论了训练过程及其各自的损失函数。

  1. 数据特征工程: 在将表格数据输入FCT-GAN之前,作者采用了CTABGAN+的数据编码器:对分类型变量使用独热编码,对连续变量使用变分高斯混合(VGM)。对于具有特定分布的变量,例如均匀或正态分布,以及对于高维分类型变量,应用最小-最大归一化。最后,对于具有缺失值的列,使用Mixed-type编码器。
  2. 条件GAN: 由于通过GAN控制生成数据的约束,条件GAN的使用日益增多。对于每个训练批次,相同的条件向量附加到噪声潜在变量上,作为生成器的输入,并且也连接到真实和生成的数据上,作为鉴别器的输入。然后条件GAN的生成器和鉴别器的总输入维度是原始输入加上条件向量维度的总和。FCT-GAN的条件向量设计也采用了CTABGAN+,它指示所选分类型列中的特定类别,或者如果它使用变分高斯混合来近似分布,则指示所选连续列中的确切高斯模式。
  3. 生成器: 生成器的目标是捕获所有列的联合概率分布,以合成高保真数据。在FCT-GAN中,作者利用FNB实现上述目标。作者选择基于CNN的GAN设计,它在不同阶段逐步提高分辨率。因此,他们的生成器逐渐增加输入大小,并在每个阶段减少嵌入维度。图3描述了一个目标分辨率为32×32的生成器设计示例。噪声潜在变量和条件向量被送入一个嵌入层(即,一个多层感知机,其输入维度与噪声潜在变量和条件向量组合相同,输出维度是N = H0 × W0 × C0)将它们转换为一个H0 × W0 × C0(默认情况下我们使用H0 = W0 = 4,C0 = 256)的向量。然后,该向量被重塑为一个H0 × W0分辨率的特征映射,每个点都是一个C0维的嵌入。结果被送入第一个傅里叶网络块。每个FNB之后,作者插入一个上采样模块。有几种选择可以实现分辨率放大,例如双三次插值或转置卷积操作。为了减轻内存使用和计算,他们使用PIXELSHUFFLE函数。这通过将特征映射的分辨率放大2倍,同时将嵌入维度减少到四分之一。作者重复FNB和UpScale阶段,直到达到目标分辨率。最终的线性展平层用于将嵌入投影到1维。
  4. 鉴别器: 图3显示了作者鉴别器的架构。鉴别器的目标是区分真实和假数据。作者利用图2中的重复层的傅里叶网络块来提取特征。由于FCT-GAN采用了Wasserstein GAN加上梯度惩罚(WGAN+GP)的训练结构,作者的鉴别器输出一个单一值而不是概率向量。这是通过最终的归一化、dropout和线性层组实现的。生成器生成的数据和条件向量被连接起来,被包装成图像(用零填充缺失值),并送入鉴别器的补丁嵌入层。在补丁嵌入中,有一个k × k内核(默认设置k = 8)、C1(C1 = 256默认)输出通道的CNN滤波器,步长与内核大小相同。与生成器不同,FNB的输入和输出使用恒定维度。经过4个连续的FNB之后,提取的特征被展平和缩小到一个单一值。
  5. GAN训练损失: 为了提高GAN训练的稳定性,FCT-GAN采用了WGAN+GP[7]损失。并且为了提高合成性能,为生成器增加了三个额外的训练损失:(1) 下游损失,(2) 信息损失, (3) 生成器损失。FCT-GAN按照建议,结合了一个辅助分类器/回归器。对于每个合成数据项,分类器/回归器使用合成特征输出一个预测值。下游损失量化了合成值和预测值之间的差异。这有助于增加合成记录的语义完整性。信息损失匹配合成和真实记录的一阶(即,均值)和二阶(即,标准差)统计数据。这导致合成记录具有与真实记录相同的统计特性。生成器损失测量给定条件和生成器输出类别之间的差异。这个损失帮助生成器学习产生与给定条件完全相同的类别。

在这里插入图片描述

V. EXPERIMENT(实验)

在本节中,作者评估了由FCT-GAN生成的合成数据在保持全局相关性和与原始数据高统计相似性方面的有效性,这导致高质量的下游机器学习分析。

A. 实验设置

数据集。所有算法都在8个机器学习数据集上进行测试。Intrusion、Adult和Covertype来自UCI机器学习存储库。Credit和Loan来自Kaggle。这五个表格数据集被定义为具有分类型变量作为目标,以进行分类任务。为了包括回归任务,作者使用来自Kaggle的Insurance和King的另外两个数据集,其中目标变量是连续的。最后,Youth是一个来自荷兰政府的数据集。它不包含目标变量。包括Youth,因为它包含许多高维分类型变量,这些变量在独热编码下会导致维度爆炸。这个数据集特别被选为测试算法在高维数据中捕获全局关系的能力以及对不同训练数据列排列顺序的稳定性。由于计算资源限制,我们随机地以分层的方式从Covertype、Credit和Intrusion数据集中抽取了50K行数据,以目标变量为依据。Adult、Loan、Insurance、King和Youth数据集则采用其全部内容。每个数据集的详细信息显示在表II中。我们假设在训练之前知道每个变量的数据类型。为了在列排列顺序分析中保持稳定性,作者考虑了三种列顺序:(1)原始,(2)按数据类型排序,(3)按数据相关性排序,这些已在“排列不变性分析”部分定义。

表II: 分类©和回归®数据集的描述。Con.和Cat.分别代表连续和分类型列的数量。Total Cat.表示所有分类型列的类别总数。

数据集问题训练/测试分割Con.Cat.Total Cat.
AdultC.39k/9k59104
CovertypeC.40k/10k104594
CreditC.40k/10k1302
IntrusionC.40k/10k2220175
LoanC.4k/1k6717
InsuranceR.1k/3003414
KingR.17k/4k137179
Youth-19k/5k172365774

B. 实验指标

FCT-GAN与5种其他最先进的表格数据合成算法进行比较:CTAB-GAN、CTAB-GAN+、Table-GAN、CT-GAN和TVAE。为了分别显示生成器和鉴别器的效用,作者还测试了FCT-GAN的两个变体:FCT-GANG和FCT-GAND。FCT-GANG/FCTGAND只保留FCT-GAN的生成器/鉴别器,并使用CTAB-GAN+中的基于CNN的鉴别器/生成器作为对应部分。为了进行公平比较,所有算法都使用Pytorch实现,超参数和网络结构均按照原始论文中的设置。为确保所有算法收敛,作者在除Loan和Insurance外的所有数据集上训练150个周期,由于它们的规模较小,分别训练了300和500个周期。每个实验重复3次,并报告平均结果。

实验在一台装有32 GB内存、GeForce RTX 2080 Ti GPU和10核Intel i9 CPU的机器上进行,操作系统为Ubuntu 20.04。

C. 评估指标

合成数据从两个方面进行评估:(1)机器学习效用,(2)统计相似性。

1.机器学习效用:

分类和回归数据集使用不同的指标进行量化,但它们共享相同的评估过程。作者首先在训练数据上训练每种算法,并使用训练好的模型生成与训练数据大小相同的合成数据。然后,作者使用训练数据和合成数据来训练同一组机器学习算法。对于分类数据集,作者选择了决策树分类器、线性支持向量机(SVM)、随机森林分类器、多项式逻辑回归和MLP。对于回归数据集,作者选择了线性回归、岭回归、套索回归和贝叶斯岭回归模型。最后,作者使用测试集分别测试在原始数据和合成数据上训练的两组机器学习模型。作者使用准确率、F1分数和AUC作为分类的评估指标,以及平均绝对百分比误差(MAPE)、解释方差分数(EVS)和R2分数作为回归的指标。最后,作者计算每项指标上两组机器学习模型结果之间的差异。由于作者报告的是差异,结果越低,合成质量越好。

2.统计相似性:

使用三个指标来量化真实数据和合成数据之间的统计相似性。

平均Jensen-Shannon散度(Avg-JSD)。JSD提供了一种量化真实和合成数据中个别分类型变量的概率质量分布差异的度量。这个指标在0和1之间有界,并且是对称的,允许容易解释结果。

平均Wasserstein距离(Avg-WD)。类似地,Wasserstein距离用于捕捉合成数据在模仿真实数据的连续变量分布方面的表现。我们使用WD,因为JSD指标在评估连续变量的质量时数值不稳定,特别是当合成数据和原始数据之间没有重叠时。因此,作者求助于更稳定的Wasserstein距离。

成对相关性的差异(Diff. Corr.)。为了评估合成数据中列依赖性的保持,我们首先分别计算真实和合成数据集中列的成对相关性矩阵。皮尔逊相关系数用于任何两个连续变量之间,范围在[−1, +1]之间。类似地,不确定性系数用于测量任何两个分类型特征之间的相关性,范围在[0, 1]之间。分类和连续变量之间的相关比率也使用,范围也在[0, 1]之间。请注意,dython库用于计算这些指标。最后,计算真实和合成数据集的成对相关性矩阵之间的差异。

D. 结果分析

1.合成数据的质量:作者首先分析算法在分类和回归数据集上的性能。然后,作者展示了在Youth这个更大的真实世界数据集上的结果。表III显示了8种算法在7个数据集上的ML效用和统计相似性结果。值得注意的是,由于结果总结了原始数据和合成数据之间的差异,值越低,结果越好。表格分为三部分:回归数据集上平均ML效用结果,分类数据集上平均ML效用,以及所有7个数据集上平均统计相似性。突出显示了最佳结果。可以看出,FCT-GAN在所有指标上都优于所有基线。除了它自己的变体外,FCT-GAN在大多数指标上还显著优于第二佳算法,即CTAB-GAN+。请注意,我们的许多分类数据集具有不均匀的类别分布,因此F1分数是比准确率更合适的指标。结果表明,FCT-GAN在F1分数上比CTABGAN+提高了27.8%,这表明新架构增强了捕获全局列依赖性的能力。在FCT-GAN及其变体中,FCT-GAND显示出与FCT-GAN相对接近的性能。FCT-GANG仍然优于大多数SOTA,但与FCT-GAN相比,它比FCT-GAND退化得更多。这表明生成器如果没有一个设计良好的鉴别器,就不能完全展示其能力,但一个更强的鉴别器可以通过更好地识别假数据从而迫使生成器提高生成数据的保真度,从而提升生成器的合成能力。

2.列排列的稳定性:作者在表IV中展示了所有算法在三种列顺序下每个指标的最大绝对变化。FCT-GAN在9个指标中的7个上实现了最小的MVA,在另外2个指标上是第二好的。这意味着无论使用哪种列顺序,FCT-GAN总能比其他任何基线更好地捕获(全局和局部)列依赖性。由于TVAE仅使用全连接网络层作为生成器和鉴别器,它也显示出更好的稳定性。相同的结论并不适用于CTAB-GAN,即使它也仅使用全连接网络。我们可以得出结论,全连接网络可以帮助一些生成模型对抗训练数据列排列顺序对合成数据质量的影响,但这并不是保证的。此外,可以注意到更改训练数据列顺序通常对ML效用的影响大于统计相似性。这意味着对于大多数表格GAN算法来说,捕获尤其是全局列依赖性比对每个单一变量的分布建模更为困难。

3.在Youth数据集上的结果:对Youth数据集的分析被单独列出,因为它包含许多具有大量类别的分类型列。使用独热编码对这些列进行编码,转化为高维数据,即65774(见表II)。此外,像CT-GAN和CTAB-GAN这样的算法是条件GAN,需要一个额外的条件向量。这进一步加剧了维度问题。为了为这些类别构建条件向量,我们需要另一个65774维向量,以便可以指示每个类别。这强调了资源需求,作者甚至无法在Youth数据集上训练TVAE、CT-GAN和CTAB-GAN,即使批量大小设置为1。使用自己的特征工程,作者可以通过最小-最大归一化对一些高维分类型列进行编码,降低资源占用。表V总结了所有可以在Youth数据集上训练的算法的结果。ED Dim.是训练数据的编码数据维度。这也是生成器输出的生成数据的维度。CV Dim.代表条件向量维度。表V中的前4种算法生成的数据是32×32(即,从376上尺度到k×k,k是2的整数幂),鉴别器的输入维度是32×32(即,从376+343=719上尺度到k×k)。结果表明,FCT-GAN在合成质量和稳定性方面都优于所有基线。FCT-GAN和CTAB-GAN+在Diff. Corr.上的差异表明,基于CNN的GAN无法随着数据维度的增加而很好地捕获全局关系。尽管Table-GAN是一个基于CNN的解决方案,它的最小-最大归一化没有改变数据维度,并且在Diff. Corr.上优于CTAB-GAN+。这是因为它在较小规模的图像(8×8)上操作,这使得捕获像素(列)依赖性更容易。尽管如此,它的整体性能仍然远远落后于FCT-GAN。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

VI. CONCLUSION(结论)

在本文中,作者提出了一种新的表格GAN算法——FCT-GAN。FCT-GAN利用transformer风格的标记器和傅里叶网络块来设计生成器和鉴别器。对于鉴别器,标记器使用基于CNN的滤波器从原始输入数据中提取局部空间特征,并将它们标记化为傅里叶网络块。傅里叶网络块的关键组件——傅里叶层,使用 2 D F F T / I F F T 2D FFT/IFFT 2DFFT/IFFT​将输入标记转换到频率域,并在频率特征上应用可学习的滤波器,以便于学习全局关系。这种设计既考虑了局部特征,也考虑了全局特征。生成器模仿了基于CNN的GAN的设计,它堆叠傅里叶网络块,并在每一层通过2倍的放大来增加特征维度,直到达到目标大小。所提出的方法在性能上超越了现有的最先进技术,特别是在高维数据上。它还显示出卓越的稳定性,能够对抗训练数据列排列顺序对合成数据质量的影响。

最后感谢你看到这里,以上观点均为本人对原论文的个人理解,仅作个人学习使用,如有错误或侵权,麻烦联系我,本人定修改或删除。

祝你天天开心,多笑笑。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值