【论文笔记_知识蒸馏_2022】Knowledge Distillation with the Reused Teacher Classifier

请添加图片描述

(下文中的知识提炼即知识蒸馏)

摘要

知识提炼的目的是将一个强大而繁琐的教师模型压缩到一个轻量级的学生模型中,而不至于牺牲很多性能。为此,在过去的几年里,人们提出了各种方法,一般都有精心设计的知识表示,这反过来又增加了模型开发和解释的难度。相比之下,我们的经验表明,一个简单的知识提炼技术足以大大缩小师生之间的性能差距。我们直接将预先训练好的教师模型中的判别分类器重新用于学生推理,并通过单一的ℓ2损失的特征对齐来训练学生编码器。这样一来,只要他们提取的特征完全一致,学生模型就能达到与教师模型完全相同的性能。我们开发了一个额外的投影仪来帮助学生编码器与教师分类器相匹配,这使得我们的技术适用于各种教师和学生架构。广泛的实验表明,我们的技术取得了最先进的结果,但由于增加了投影仪,压缩率的代价不大。

1.介绍


在本文中,我们提出了一种简单的知识提炼技术,并证明它可以大大缩小教师和学生模型之间的性能差距,而不需要精心设计的知识表示。我们提出的 "SimKD "技术如图1所示。我们认为,教师模型强大的类别预测能力不仅归功于那些表现性的特征,而且同样重要的是归功于一个判别性的分类器。基于这一论点,并在后面得到了经验上的支持,我们在分类器的前一层通过特征对齐来训练学生模型,并直接复制教师分类器进行学生推理。这样一来,如果我们能将学生的特征与教师模型的特征完美对齐,他们的性能差距就会消失。也就是说,仅仅是特征对齐误差就占了学生推理的准确性,这使得我们的知识转移更容易被理解。根据我们的实验结果,单一的ℓ2损失用于特征对齐已经有了惊人的效果。这样一个简单的损失使我们不必像以前的工作那样,为了平衡多个损失的影响而仔细调整超参数[1,6,24,40,46,48,52,55]。

由于从教师和学生模型中提取的特征的维度通常是不同的,因此在学生特征编码器之后增加了一个投影仪来弥补这种维度不匹配。这个投影仪在教师到学生的压缩过程中一般会产生小于3%的剪枝率,但它使我们的技术适用于任意的模型结构。在少数情况下,如果增加的投影仪加上重用的教师分类器的参数数小于原来的学生分类器的参数数,剪枝率甚至可以扩大(见图7)。我们在标准的基准数据集上进行了广泛的实验,观察到我们的SimKD在各种师生结构组合下始终胜过所有比较过的最先进的方法。我们还表明,我们的简单技术在不同的场景下有很好的通用性,如多教师知识提炼和无数据知识提炼。

请添加图片描述
图1. 我们提出的SimKD的概述。在最终分类器的前一层,采用了简单的ℓ2损失进行特征对齐。在训练过程中,只有学生的特征编码器和维度投影仪被更新(有黑色边框的方框)。预先训练的教师分类器被重新用于学生的推理。

2.相关工作


为了使KD在模型压缩方面更加实用,我们需要进一步抵制教师对学生压缩中的性能下降[19, 50]。利用预先训练好的教师模型的更多信息,特别是中间层的信息,是解决这个问题的一般方法。在过去的几年里,为了寻求更好的学生表现,出现了一堆这样的工作,统称为特征提炼。他们大多提出了不同的表征来捕捉适当的转移知识,如粗略的中间特征图[40]或其转换[1, 23, 55],由配对相似性矩阵编码的样本关系[36,37,48]或通过对比学习建模[46, 51, 58]。最近,一些工作转向设计跨层关联,以充分利用教师模型的那些中间特征[6, 10]。在上述知识表征或改革后的转移策略的帮助下,学生模型将被训练,其梯度信息不仅来自最后一层,即分类器,也来自那些早期层。然而,在这些方法中,额外的超参数需要仔细调整,以平衡不同损失的影响,目前还不清楚新引入的监督信号将如何对学生模型的最终表现产生积极影响。

在某种程度上,我们重用教师分类器的关键想法与之前关于假设转移学习(HTL)的研究有关[39]。HTL的目的是利用学到的源域分类器来帮助目标域分类器的训练,条件是只有少量标记的目标数据集而没有源数据集[15,28,29] 。最近的一项工作进一步摆脱了标记目标数据集的要求,并通过采用伪标记策略将虚构的HTL扩展到无监督领域的适应性设置[31]。与此不同的是,我们的目标是在同一数据集上缩小师生的性能差距,而不是调整预先训练好的模型在另一个具有不同分布的数据集上获得良好的性能。此外,我们的SimKD比这项工作要简单得多,在标准的KD设置中仍然取得了令人惊讶的好成绩。

3.方法

3.1 传统的知识蒸馏
一般来说,当前流行的用于图像分类任务的深度神经网络可以被视为由一个具有多个非线性层的特征编码器和一个通常包含一个具有softmax激活函数的全连接层的分类器堆叠而成[22,25,33,42,57]。这两个组件将用反向传播算法进行端到端的训练。符号描述呈现如下。

给定一个来自K类分类数据集的带有one-hot标签y的训练样本x,我们将学生模型倒数第二层的编码特征表示为请添加图片描述。该特征随后被传入分类器,其权重为Ws∈R^K×C s,以获得对数gs^=W sfs∈RK以及类预测ps=σ(gs/T )∈RK,其激活为softmax函数σ(·)和温度T:
请添加图片描述
其中psi /gsi表示相应矢量的第i个元素,T是软化效应的超参数1。

传统的知识蒸馏包括两种损失[24]:一种是传统的交叉熵损失,另一种是预测ps和软目标pt之间的KL散度损失[27] 。
请添加图片描述
与交叉熵损失相比,引入的预测排列损失提供了关于不正确类别的额外信息,以促进学生培训[17,24]。由于分配给这些错误类别的概率在softmax转换后往往相当小,因此需要提高该术语中的温度T,以产生更柔和的分布,传达更多信息[24]。
3.2. 简单的知识提炼
近年来,人们提出了各种特征提炼方法。这些工作主要是收集和传输来自中间师生层对的额外梯度信息,以更好地训练学生的特征编码器(图2b)。然而,他们的成功在很大程度上取决于那些特别设计的知识表征,以引起适当的归纳偏差[3, 6],以及精心选择的超参数来平衡不同损失的影响。这两者都是劳动密集型和耗时的。也很难断定某种类型的表征在学生训练中所扮演的实际角色。

相比之下,我们提出了一种简单的知识提炼技术,名为SimKD,它摆脱了这些严格的要求,同时在广泛的实验中仍然取得了最先进的结果。如图2c所示,SimKD的一个关键成分是 "分类器重用 "操作,即我们直接借用预先训练好的教师分类器来进行学生推理,而不是训练一个新的分类器。这样就不需要标签信息来计算交叉熵损失,使特征对齐损失成为产生梯度的唯一来源。

总的来说,我们认为教师分类器中包含的鉴别性信息很重要,但在KD的文献中基本上被忽略了。然后我们为其重要作用提供了一个合理的解释。考虑到一个模型被要求处理具有不同数据分布的几个任务的情况,一个基本的做法是冻结或共享一些浅层作为不同任务的特征提取器,同时对最后一层进行微调以学习特定的任务信息[5, 13, 18, 30]。在这种单模型多任务的情况下,现有的工作认为,任务变量信息可以共享,而特定的任务信息需要独立识别,一般由最终的分类器识别。对于在同一数据集上训练具有不同能力的教师和学生模型的KD,类似地,我们有理由相信,在数据中存在一些能力不变的信息,在不同的模型中很容易获得,而强大的教师模型可能包含额外的基本能力特定信息,这对较简单的学生模型来说很难获得。此外,我们假设大多数能力特定的信息都包含在深层中,并期望重新使用这些层,甚至只有最终的分类器将有助于学生的训练。
请添加图片描述
图2. 三种知识蒸馏技术的比较。主要区别在于梯度的形式化和梯度流的起点。(a) 传统的KD计算班级预测中的梯度,并依靠这个梯度来更新整个学生模型。(b) 特征提炼通过各种知识表示从中间层收集更多梯度信息。额外的超参数需要仔细调整以获得最大的性能。(c.) 我们的SimKD在分类器的前一层计算ℓ2损失,并将这个梯度完全反向传播,以更新学生特征编码器和维度投影器。为了简单起见,(a)和(b)中比较的方法的预测和真实标签之间的交叉熵损失被省略了。

基于这一假设,我们为学生模型提供了教师分类器进行推理,并迫使他们提取的特征与下列特征的L2损失函数相匹配:
请添加图片描述
其中,投影仪P(·)被设计为以相对较小的成本匹配特征维度,同时又能有效地保证准确的对齐。实际上,这种简单的损失以前已经被利用过了[40, 52],但我们实际上是试图揭示重复使用教师分类器的潜在价值,而不是开发一个复杂的损失函数来进行特征对齐。如图3所示,从预训练的教师模型(深色)和我们的SimKD中提炼的学生模型(浅色)中提取的特征在同一类别中紧凑聚类,在不同类别中明显分离,这确保了学生特征在重用教师分类器后被正确分类。

有点令人惊讶的是,通过这种简单的技术,教师对学生的压缩的性能下降将大大缓解。伴随着高推理精度,这种单一损失的表述的简单性为我们的SimKD提供了良好的可解释性。请注意,来自预训练教师模型的重用部分被允许纳入更多的层,但不仅仅限于最终分类器。通常情况下,重用更多的层会导致更高的学生准确率,但会带来推理的负担增加。

请添加图片描述
图3. 用t-SNE[49]对CIFAR-100的测试图像进行可视化的结果。我们从100个类中随机抽取10个。教师和学生模型提取的特征分别用深色和浅色描绘,在我们的SimKD中几乎无法区分。最好以彩色观看。

4.实验

在本节中,我们进行了广泛的实验来证明我们提出的SimKD的有效性。我们首先在标准的基准数据集上将其与几个有代表性的最先进的方法进行比较。然后,我们给出了一些经验性的证据来证明我们的 "分类器重用 "操作在提高学生成绩方面的优越性。虽然我们的学生推理需要一个额外的投影仪,但实验表明,它对剪枝率的影响可以控制在一个可接受的水平。

最后,我们将我们的技术应用于多教师和无数据的知识提炼环境。
数据集和基线。我们采用了两个基准图像分类数据集,包括CIFAR-100[26]和ImageNet[41],进行了一系列的实验。我们使用标准的数据增强,并按照[22, 25, 54]的规定,通过通道平均值和标准偏差对所有图像进行归一化处理。除了虚构的KD[24],我们还复制了各种方法进行比较,包括FitNet[40]、A T[55]、SP[48]、VID[1]、CRD[46]、SRRL[52]和SemCKD[6]。除了KD本身之外,所有被比较的方法都是结合了vanilla KD损失,也就是公式。(2).
训练细节。我们遵循以前的工作[6, 46, 52]的训练程序,并报告所有竞争对手在我们随机关联的师生组合上的表现。具体来说,我们对所有的数据集都采用SGD优化器,内斯特罗夫动量为0.9。对于CIFAR-100,总的训练历时被设置为240,学习率在第150、180和210次历时被除以10。对于MobileNet/ShuffleNetseries架构,初始学习率设置为0.01,其他架构设置为0.05。小型批次大小被设置为64,权重衰减被设置为5×10-4。对于ImageNet,初始学习率被设置为0.1,然后在总共120个训练周期的第30、60、90个周期除以10。小型批次大小被设置为256,权重衰减被设置为1×10-4。除了ImageNet上的结果是以单次试验报告的,所有的结果都以4次试验的平均值(标准差)报告。在本文中,KD损失中的温度T被设定为4。更详细的可重复性描述以及更多的结果都包含在技术附录中。
4.1精度对比
表1至3介绍了基于15种网络组合的各种方法的综合性能比较,其中教师和学生模型被实例化为类似或完全不同的架构。

从表1和表2的测试精度比较中,我们可以看到,SimKD在CIFAR-100上的表现一直优于所有竞争对手,而且在某些情况下改进相当明显。例如,对于 "ResNet8x4 & ResNet-32x4 "的组合,SimKD取得了3.66%的绝对精度改进,而最好的竞争者在vanilla KD的基础上只取得了1.81%的绝对改进。此外,如表1第四列和第五列所示,给定相同的教师模型 “ResNet110x2”,SimKD可以训练一个轻量级的学生模型 “ResNet-110”,其投影仪包含0.5M的额外参数,以相当大的幅度超过所有的竞争对手,即使他们采用的是比 "ResNet110 "多0.10M参数的 “ResNet-116”。表3中不同训练历时的测试精度表明,SimKD在训练中实现了更快的收敛。

我们还发现,在 "ResNet-8x4 & WRN-40-2 "和 "ShuffleNetV2 & ResNet110x2 "组合的情况下,用SimKD训练的学生模型比其教师模型产生更高的精度,这似乎有点令人困惑,因为即使是零特征对齐损失也只能保证他们的精度完全相同。来自自我蒸馏的一个可能的解释是,方程(3)中的特征重现效应可能有助于学生模型变得更加稳健,从而取得更好的结果[12, 35]。
表1和表2
请添加图片描述
4.2. 分类器重用操作分析
在上述性能比较中,"分类器重用 "操作是我们的成功秘诀。为了更好地理解它的关键作用,我们对处理学生特征编码器和分类器的两种替代策略进行了几次实验。(1) 联合训练,(2) 顺序训练。这两种变体导致的性能下降证实了教师分类器中判别信息的价值。此外,重用更深的教师层将进一步提高学生的表现。
联合训练。如同之前的特征蒸馏方法(图2b),我们现在联合训练学生特征编码器及其相关分类器。通过引入额外KD损失来训练学生模型获得结果:
请添加图片描述
其中α是一个超参数。为了彻底评估联合训练的效果,我们使用了四个不同的师生组合以及四个均匀间隔的α值。

如图4所示,无论是基于自己的分类器还是基于重用的教师分类器,学生的表现在所有设置中都变得远不如SimKD,这表明教师分类器中的判别信息可能不容易以联合训练的方式转移到学生模型中。准确率的大幅下降也表明,增加的投影仪本身和特征对齐损失并不一定能提高最终的性能,除非我们放弃联合训练而采用更有效的策略,即使用单一的特征对齐损失进行训练并重新使用教师分类器进行推理。图4还显示,为了超越传统KD的性能,这种双损失方法需要逐个进行超参数调整。
请添加图片描述
图4. 我们用相关的分类器联合训练学生的特征编码器,然后通过使用他们自己的分类器或重用的教师分类器来报告学生模型的测试准确率。

循序训练。上述结果显示了将学生特征编码器和分类器的训练分解开来的好处。此外,"重复使用分类器 "的操作带有这样的暗示,即具有良好鉴别能力的分类器是相当难以获得的。在这一部分中,我们通过从头开始训练一个新的分类器,而不是重复使用教师的分类器,为这一信念提供证据。我们采用Tab中的那些师生组合。

我们采用表1中的那些师生组合作为例子进行评估。在用方程(3)进行特征对齐后,我们固定学生特征编码器,即冻结提取的特征,并用常规训练程序训练一个随机初始化的学生分类器(一个具有softmax激活的全连接层)。这与无监督学习评估中使用的线性评估协议完全相同。

表3. ImageNet上不同训练历时的前1名测试精度(%)比较。我们采用ResNet-18作为学生模型。
请添加图片描述

表4:从头开始训练一个新的学生分类器。
请添加图片描述
请添加图片描述
图5. Top-1测试准确率(%)和负对数可能性的比较(学生:ResNet-8x4,教师:ResNet-32x4)。

表4中给出了这种顺序训练的结果。我们发现,除了 "WRN-40-1 & WRN-40-2 "和 "ResNet-110/116 & ResNet-110x2 "之外,其他学生模型的测试准确率出现了断崖式的下降。尽管我们曾多次尝试调整初始学习率,但它只对性能产生了轻微的影响。表4的结果表明,即使提取的特征已经对齐,要训练一个令人满意的学生分类器仍然是一个挑战。一般来说,我们可以通过在分类器训练步骤中更仔细地调整超参数来实现更好的学生表现,但这是一项非难事。相比之下,直接重用预先训练好的教师分类器已经很有效了。详细的训练过程和更多的结果在附录中提供。

重复使用更多的教师层。我们现在将我们的技术推广到教师模型的更多深层被重新用于学生推理的情况,并表明学生的表现将得到进一步改善。

我们以ResNet架构为例,在CIAFR-100数据集上进行了实验。按照标准设计,ResNet架构由一个卷积层、三个构建块和一个全连接层组成,采用自下而上的方式[22]。每个构件都包含相同数量的卷积层,改变这些层数会导致不同的ResNet架构。例如,每个构件的10个层组成了一个32层的ResNet模型。然后,除了像我们的SimKD那样重复使用最后的分类器外,还通过重复使用额外的最后一个或两个构件引入了两个新的变体,它们分别表示为 "SimKD+"和 “SimKD++”。

从图5中,我们可以看到,SimKD仅通过重用教师分类器就显著降低了负对数可能性,其两个变体也如预期的那样进一步取得了更高的性能,尽管相关的复杂性也增加了。这些结果支持了我们的假设,即重用深层教师层有利于提高学生的成绩,这可能是由于大多数能力特定的信息都包含在其中。另一个解释是,重用更多的深层教师层会使浅层教师层的近似更容易实现,从而产生更少的性能下降。在实践中,只重用最后的教师分类器在性能和参数复杂性之间取得了良好的平衡。

4.3投影仪分析
我们的SimKD中的无参数 "分类器重用 "操作已经在上面得到了充分的评估。接下来,我们开始从几个方面挖掘另一个组件-投影仪。我们首先介绍了它的默认实现,然后表明它只需要少量的额外参数就可以实现最先进的性能。最后,我们提供了几个关于投影仪的消融研究。
实施。方程(3)中的投影仪P(·)的目的是完全匹配特征向量f t∈RCt和f s∈RCs。一个幼稚的实现方法是使用一个卷积层,用批量归一化和ReLU激活,它有Cs×Ct+2×Ct参数[52]。然而,由于教师和学生模型之间存在巨大的能力差距,这种单层转换可能不足以实现准确的对齐。因此,我们采用了最后的特征图和带有降维因子r的三层瓶颈转换作为替代方案,希望这些方案能够帮助特征更好地对齐。总的参数是:
请添加图片描述
这个公式意味着,如果r增加一倍,增加的参数将减少到四分之一到一半之间,这使我们能够通过改变r将参数的复杂性控制在一个可接受的水平。投影仪的详细结构和分析在技术附录中提供。

对剪枝率的影响。图6显示了不同降维系数r下top-1测试精度和剪枝率之间的权衡。我们采用以下公式计算剪枝率。
请添加图片描述
其中♯param se、♯param proj、♯param t和♯param tc/sc分别指学生编码器、投影仪、整个教师模型和教师/学生分类器的参数数。当♯param proj→0时,其上界就接近了,它可能高于传统KD的修剪率,因为♯param proj + ∆可能小于零。图6显示,增加r会提高剪枝率,但反过来会导致性能下降。这种下降可能是由于缩小投影仪的瓶颈维度会限制其表示能力,从而影响特征对齐的成功。

然后我们计算SimKD在表1和表2的14个师生组合的竞争中表现最好时的最小剪枝率成本。图7显示,在大多数情况下(10/14),我们增加的投影仪只产生了不到1%的剪枝率成本。在某些情况下,如 "MobileNetV2x2 & ResNet-32x4 "和 “ShuffleNetV1 & ResNet-32x4”,r=8,我们发现SimKD的剪枝率甚至高于vanilla KD,所有的竞争对手也相应地高于它。在本文中,我们将r等于2设为默认值,因为这个值取得了良好的平衡,即以修剪率的适度代价获得最先进的结果。完整的结果在附录中列出。
请添加图片描述
图6. 测试精度和剪枝率之间的权衡。灰色虚线表示香草KD的剪枝率。

请添加图片描述
图7. 修剪率成本的直方图。

消融研究。最后我们比较了投影仪和损失函数的几种实现方式(见附录),用于特征对齐。所有的结果都是在CIFAR-100上用 "ResNet-8x4 & ResNet-32x4 "组合获得的。

从表5来看,我们投影仪的默认实现(最后一行)取得了最好的性能。简化后的对应方案导致的准确率下降表明在特征对齐中采用相对强大的投影仪的好处。此外,较低的准确率(76.03 ±0.40),通过用三层变换将特征向量f s和f t对齐,验证了使用最后的特征图代替的有效性。由于我们的ℓ2损失反映了提取的特征之间的距离,较低的测试损失意味着越接近对齐,因此测试精度越高。这与表5的结果一致。

请添加图片描述
表5. 投影仪的比较。"1x1/3x3Conv "表示具有1x1/3x3内核大小的卷积层。"DW "表示深度可分离卷积。每层之后都使用了标准的批量归一化和ReLU激活。

请添加图片描述
表6. 多教师KD的结果。我们采用ShuffleNetV2作为学生模型,在两组预训练的教师模型下进行训练:①包括三个ResNet-32x4。②包括两个ResNet-32x4和一个ResNet-110x2。

4.4. 应用一:多教师知识提炼
然后,我们展示了我们的技术在多教师KD环境中的适用性,其中有多个预训练的教师模型可用于学生训练。我们比较了两种有代表性的方法。"A VEG "表示香草KD的一个简单变体,它平均了多个教师的预测;"AEKD "用一个自适应的加权策略聚集了教师的预测,它的改进版本通过纳入中间特征被表示为 “AEKD-F”[14]。如表6所示,SimKD总是取得最好的性能。此外,我们还提供了SimKDv的结果,其中首先使用全连接层投影仪来对齐特征向量,然后合并到相关的教师分类器。多个教师分类器的权重被平均化并重新用于学生推理,这不会产生额外的参数。

4.5. 应用二:无数据的知识蒸馏
无数据知识提炼的目的是利用预先训练好的教师模型,而不访问其训练数据集,以提高学生的成绩。一个流行的方法是先用生成模型恢复原始数据流形,然后对合成的数据集进行知识提炼[9, 16, 34]。我们的SimKD可以很容易地集成到这些现有的方法中,将他们的KD训练步骤替换为我们的 "重新使用分类器 "操作和相关的特征对齐。表7显示,在我们的SimKD的帮助下,学生在无数据知识提炼应用中的表现也得到了改善。

5.结论

在本文中,我们探索了一种简单的知识提炼技术,在这种技术中,预先训练好的教师分类器被重新用于学生推理,学生模型的训练采用单一的ℓ2损失进行特征对齐。我们设计了几个实验来分析我们的技术的工作原理,并进行了广泛的实验来证明它比最先进的方法的优越性。我们希望这项研究能成为未来研究的一个重要基线。

6. 限制性和未来工作

一个简单的参数重用被作为我们探索教师分类器的潜在价值的第一次尝试。当特征维度不匹配时,这需要一个投影仪,从而增加了模型的复杂性。如何开发一个无投影仪的替代方案需要进一步调查。另一个限制是,我们的技术只适用于有监督的知识提炼,如图像分类[24],密集预测[43]和机器翻译[45]。我们的技术也值得为无监督的学习场景开发一个成功的变体。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
数据免费知识蒸馏与软目标传输集合合成是一种通过利用现有数据集来提高深度神经网络的性能的方法。这种方法主要包括两个步骤:知识蒸馏和软目标传输集合合成。 首先,知识蒸馏是指将一个已经训练好的大型模型的知识转移到一个小型模型中。这样做的好处是,小型模型可以通过利用大型模型的知识来提高其性能。知识蒸馏的过程包括将大型模型的输出(一般是概率分布)作为目标分布,然后使用目标分布和小型模型的输出之间的交叉熵作为损失函数进行训练。通过这种方式,小型模型可以学习到大型模型的知识,并提高其性能。 其次,软目标传输集合合成是指通过合成新的目标数据集来进一步提高小型模型的性能。这是通过将已有数据集中的样本与大型模型的输出结合起来产生的。具体而言,对于每个样本,使用大型模型进行预测,并根据预测结果以及训练集中的标签来合成一个新的目标分布。然后,再次使用目标分布和小型模型的输出之间的交叉熵作为损失函数进行训练。通过这种方式,小型模型可以进一步学习到大型模型的知识,并提高其性能。 总之,数据免费知识蒸馏与软目标传输集合合成是一种提高深度神经网络性能的有效方法。通过利用已有的数据集和大型模型的知识,可以帮助小型模型更好地学习并提高其性能。这种方法在许多领域中都有广泛的应用,例如计算机视觉、自然语言处理等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值