DyLoRA: Parameter-Efficient Tuning of Pretrained Models using Dynamic——使用动态无搜索低秩适应进行预训练模型的参数高效微调

这篇文章的核心内容是介绍了一种名为 DyLoRA(Dynamic Low-Rank Adaptation) 的技术,用于在预训练模型(如RoBERTa和GPT)上进行参数高效的微调。DyLoRA通过动态调整低秩适配器(LoRA)的秩,解决了传统LoRA在秩选择和动态调整方面的局限性。以下是文章的主要内容总结:

研究背景

  • 预训练模型的微调成本:随着预训练模型(PMs)规模的不断增长,对它们进行微调变得越来越昂贵且资源密集。

  • 低秩适配器(LoRA):通过引入可学习的低秩模块(LoRA块)来微调预训练模型,保持主要权重不变,从而提高参数效率。然而,LoRA存在两个主要问题:

    1. 固定的秩大小:训练后无法修改,需要重新训练。

    2. 秩的优化需要穷举搜索:耗时且计算成本高。

研究方法

  • DyLoRA技术:提出了一种动态低秩适应技术,通过在训练过程中对不同秩的学习表示进行排序,为一系列秩而非单一秩训练LoRA块。

    • 动态性:DyLoRA在推理时可以动态调整秩,无需重新训练。

    • 无搜索:避免了为LoRA选择最佳秩的昂贵搜索过程。

实验与结果

  • 实验设置:在自然语言理解(GLUE基准测试)和语言生成任务(E2E、DART和WebNLG)上评估DyLoRA,使用不同大小的预训练模型(如RoBERTa和GPT)。

  • 性能提升:DyLoRA在训练速度上比LoRA快4到7倍,且在性能上没有显著妥协。

  • 秩范围:DyLoRA在更广泛的秩范围内表现一致良好,而LoRA则需要针对每个任务单独训练不同秩的模型。

关键结论

  • 动态性和效率:DyLoRA通过动态调整秩,显著提高了训练效率,同时保持了与LoRA相当的性能。

  • 无搜索优势:DyLoRA避免了为LoRA选择最佳秩的搜索过程,降低了计算成本。

  • 广泛的适用性:DyLoRA在多种自然语言处理任务上表现出色,适用于不同的预训练模型和任务类型。

局限性

  • 超参数选择:尽管DyLoRA在秩选择上具有优势,但选择最佳的标量参数仍需进一步研究。

  • 分布影响:需要进一步研究不同分布对不同下游任务的影响。

  • 秩范围选择:需要进一步研究选择特定秩范围的影响。

总结

DyLoRA通过动态调整低秩适配器的秩,解决了传统LoRA在秩选择和动态调整方面的局限性,显著提高了预训练模型微调的效率和灵活性。这里是自己的论文阅读记录,感兴趣的话可以参考一下,如果需要阅读原文的话可以看这里,如下所示:

摘要
随着预训练模型(PMs)规模的不断增长,对它们进行微调变得越来越昂贵且资源密集。作为一种解决方案,低秩适配器(LoRA)保持模型的主要预训练权重不变,仅引入一些可学习的截断奇异值分解模块(称为LoRA块)。尽管LoRA块在参数效率方面表现出色,但它们存在两个主要问题:首先,这些块的大小是固定的,在训练后无法修改(例如,如果我们需要更改LoRA块的秩,则需要从头开始重新训练);其次,优化它们的秩需要进行穷举搜索和努力。在本工作中,我们引入了一种动态低秩适应(DyLoRA)技术,同时解决了这两个问题。我们的DyLoRA方法通过在训练过程中对不同秩上学习到的表示进行排序,为一系列秩而非单一秩训练LoRA块。我们在不同的自然语言理解(GLUE基准测试)和语言生成任务(E2E、DART和WebNLG)上评估了我们的解决方案,使用了不同大小的预训练模型,如RoBERTa和GPT。我们的结果表明,使用DyLoRA训练动态无搜索模型至少比LoRA快4到7倍(具体取决于任务),且在性能上没有显著妥协。此外,我们的模型在比LoRA更广泛的秩范围内表现一致良好。

1 引言
预训练/微调已成为自然语言处理(NLP)(Devlin等,2018;Liu等,2019;Brown等,2020)和计算机视觉(Simonyan和Zisserman,2014;He等,2016;Howard等,2019;Bochkovskiy等,2020;Chen等,2020;Dosovitskiy等,2020)中解决许多任务的流行范式。近年来,预训练语言模型(PLMs)(Devlin等,2018;Brown等,2020)和预训练视觉-语言模型(Lu等,2019;Li等,2019;Su等,2019;Xia等,2021)取得了显著进展。随着这些预训练模型规模的不断增长,在下游任务上对它们进行微调变得越来越昂贵。此外,随着模型参数数量相对于标记数据的比例增加,微调过程更容易过拟合(Karimi Mahabadi等,2021)。解决方案分为两类:第一,模型压缩(Jafari等,2021;Chen等,2021);第二,参数高效微调(PET)(Houlsby等,2019a;Karimi Mahabadi等,2021;Mao等,2021)。文献中针对Transformer基础模型有许多不同的模型压缩技术,如矩阵分解(Noach和Goldberg,2020;Tahaei等,2021)、剪枝(Wang等,2019)、量化(Tao等,2022;Prato等,2020)和知识蒸馏(Hinton等,2015;Li等,2021;Jafari等,2021;Passban等,2021;Rashid等,2021)。文献中也有不同类型的PET技术,如低秩适配器(Wang等,2020;Karimi Mahabadi等,2021;Houlsby等,2019b;Hu等,2021b)和基于提示的技术(Lester等,2021)。

尽管模型压缩解决方案在近年来的文献中已经得到了很好的建立,但将它们应用于大型语言模型可能会非常昂贵,因为压缩技术通常需要训练(或微调)原始的大型模型。一个典型案例是知识蒸馏,它依赖于对大型教师模型进行微调,甚至如(Jiao等,2019)所建议的,对学生的模型进行预训练。此外,使用压缩技术通常会导致模型性能下降。PETs可以作为压缩方法的替代方案,特别是当我们希望在轻量级训练努力下充分利用大型预训练模型的全部容量时(例如,语言模型即服务场景(Sun等,2022))。在PET技术中,低秩适配器受到了很多关注,因为与基于提示的技术相比,低秩适配器不会增加序列长度,训练速度更快,性能更好(Karimi Mahabadi等,2021)。尽管文献中有几种低秩适应技术,如适配器(Houlsby等,2019b)、Compacter(Karimi Mahabadi等,2021)和LoRA(Hu等,2021b);它们都存在两个主要的共同问题:首先,不清楚如何选择它们的秩大小(尽管它们的性能对秩选择非常敏感);其次,它们的训练是静态的,这意味着如果基于特定秩大小训练了一个低秩模型,它将无法在其他秩值上良好工作(即,对于任何其他秩值,我们需要训练一个单独的模型)。

本文提出了一种动态低秩适配器技术(DyLoRA),以解决这两个问题。不失一般性,我们专注于LoRA(Hu等,2021a),并通过在训练过程中对不同秩上学习到的表示进行排序,为一系列秩而非单一秩训练LoRA块。尽管我们的模型更加灵活,但它可以在更广泛的秩范围内超越LoRA,而不会增加训练时间。此外,我们的技术不需要额外的训练来搜索秩。我们总结我们的贡献如下:

  • 动态LoRA:在LoRA的基础上,我们开发了一种新算法(DyLoRA),使其在推理时动态,而不会产生额外成本。

  • 无搜索LoRA:我们证明了通过在性能上做出微不足道的妥协,可以避免为LoRA选择最佳秩的昂贵搜索过程。

图1:DyLoRA:我们提出方法的整体示意图。在每次迭代中,我们从一个预定义的随机分布中采样,这将帮助我们在LoRA(Hu等,2021a)目标中截断上投影和下投影矩阵。

2 相关工作
本节回顾了用于参数高效微调的低秩适应技术以及可能的现有解决方案,以使这些技术动态化和无搜索。在(Aghajanyan等,2020)中已经表明,对于自然语言理解(NLU)等分类任务,PLMs具有低内在维度。这一观察结果激励了使用低秩适配器进行参数高效微调。文献中有几种低秩适配器,如LoRA(Hu等,2021b)、适配器(Houlsby等,2019b)、Compacter(Karimi Mahabadi等,2021)和平行适配器(PA)(He等,2021)。LoRA是一种低秩上投影/下投影变换,没有在关键和值注意力矩阵上应用任何非线性,而是并行进行。LoRA的主要优势在于,经过训练后,适配器模块可以集成到模型的原始权重矩阵中,这反过来又可以导致非常高效的推理时间。适配器也具有低秩上投影/下投影变换,但中间有非线性。适配器模块与前馈网络(FFN)串联应用。将适配器模块与其他模型块并行应用可以增加模型的推理时间。PA是适配器的更快版本,可以与FFN块并行应用。紧凑器是适配器的更节省内存的版本,它部署了Kronecker积的和来重构每个上投影和下投影矩阵。所有这些低秩适配器都存在两个主要问题:首先,找到最佳秩需要进行大量的穷举训练和搜索;其次,调整后的适配器模块只适用于特定的秩。

尽管文献中有一些关于动态网络的努力,如DynaBERT(Hou等,2020)和GradMax(Evci等,2022),据我们所知,对于分解网络和低秩适配器的这个问题仍然是开放的。DRONE(Chen等,2021)提出了一种数据感知的低秩模型压缩技术,但他们的方法不是无搜索的,而且也不是动态的。DynaBERT引入了一种两阶段方法来训练宽度和深度动态网络。然而,DynaBERT需要在任务上微调教师模型来训练其子网络,这使得它不适合PET技术。GradMax是一种逐渐向网络中添加神经元的技术,而不触及已经训练过的神经元。但尚不清楚GradMax如何部署以缓解低秩适配器中的秩搜索问题。Wang等(2019)提出了一种结构化剪枝技术,称为分解低秩剪枝(FLOP)。FLOP将网络的权重矩阵分解为秩-1分量的和,这些分量在训练过程中被正则化以获得稀疏性。值得一提的是,FLOP旨在压缩主模型,即使它可以用于在完整权重矩阵的低秩表示中找到好的秩,最终的低秩模型也不会是动态的(即,它只针对一个秩训练良好,而不是一系列秩,与LoRA相同)。在本文中,我们提出了一种新方法,用于同时训练多个秩的低秩模块,而不是一次训练一个单一秩的适配器(而不改变训练预算)。受嵌套Dropout(Rippel等,2014)思想的启发,我们追求用新配方对低秩适配器模块的瓶颈表示进行排序。据我们所知,这是首次在训练PLMs中部署排序表示的概念。

3 背景

3.1 嵌套Dropout

受Dropout(Hinton等,2012)的启发,嵌套Dropout(Rippel等,2014)是一种针对训练自编码器的随机正则化技术,旨在强制执行有序表示。嵌套Dropout添加了一个隐含偏置(Dropout中不存在),以在训练中倾向于有序。例如,在Dropout中,我们可以随机丢弃网络中的任何节点或单元,但在嵌套Dropout中,如果我们随机选择第k个单元,那么我们保留索引从1到k的所有单元,并丢弃索引大于k的单元。因此,嵌套Dropout倾向于将更重要的信息容纳在较低索引中,同时学习表示。按照(Rippel等,2014)的符号,嵌套Dropout假设一个自编码器映射N个训练样本{yi}Ni=1 ∈ Y,Y ⊂ RD到它们对应的表示{xi}Ni=1 ∈ X,X ⊂ RK,使用函数fθ:Y → X,参数为θ;然后使用另一个函数gψ:X → Y,参数为ψ来解码这些表示以重建输入。重建损失可以定义如下:

假设我们想在我们的表示向量x中随机丢弃一些单元。在这方面,我们从预定义的分类分布pB(.)中采样一个随机变量b ∼ pB(.),b ∈ {1, 2, ..., K},并将函数fθ和gψ截断以保留它们对应的索引从1到b的单元,并丢弃索引从b+1到K的单元。让我们定义向量x的b截断版本为x↓b,函数fθ和gψ的b截断版本分别为fθ↓b和gψ↓b。在这种情况下,重建损失被重新定义为b截断模型如下:

 在最后阶段,可以通过求解以下优化问题来获得该模型的参数。

尽管我们在这项工作中的灵感来源于嵌套Dropout中建议的排序信息特征,但我们可以从几个方面将我们的工作与嵌套Dropout区分开来:

  1. 嵌套Dropout技术用于向向量表示添加顺序信息;然而,我们正在向低秩矩阵分解中添加顺序信息,以使其在一系列秩上而不是单一秩上工作。

  2. 我们的训练算法在选择分布函数pB(.)方面与嵌套Dropout不同,并且我们提出了一个比嵌套Dropout中的线性求和损失(检查原始论文(Rippel等,2014)中的方程2和11)更有效的每个截断矩阵的单独损失。嵌套Dropout的原始提议是使用一个包含混合截断示例的批次。为了提高效率并解决次优性,我们提出在我们的方法中固定整个批次的截断。 3.2 LoRA:低秩适配器
    在LoRA(Hu等,2021a)中,一些预训练权重的密集层的PLMs与并行的线性低秩适配器模块相加。在微调过程中,原始的预训练权重保持冻结状态;LoRA模块可以被更新。例如,假设W0 ∈ Rm×d是网络中的一个预训练权重矩阵,它伴随着一个LoRA模块∆W = WupWdw,其中Wup ∈ Rm×r,Wdw ∈ Rr×d,且r ≪ min(m, d)。然后,该层的输出可以表示为

请注意,Wup矩阵被初始化为零矩阵,Wdw矩阵被初始化为零均值高斯分布,其中α是一个常数缩放超参数。在LoRA中,秩r是一个超参数,需要针对每个任务进行调整。此外,LoRA是一个静态低秩适配器,只适用于特定大小的r,该r是在其上训练的。

4 我们的方法:DyLoRA
在本节中,我们在低秩适配器技术的基础上,介绍了解决动态低秩适配器问题的方案,使其能够在一系列秩上而不是单一特定秩上进行训练和部署(在固定的训练预算下)。这种灵活性可以让我们免于通过多次训练模型来寻找最佳秩。不失一般性,我们基于LoRA(Hu等,2021a)这一文献中突出的低秩适配器技术来解释我们的解决方案。在每个LoRA模块中,我们有一个上投影(Wup ∈ Rm×r)和一个下投影矩阵(Wdw ∈ Rr×d)。假设我们希望在r ∈ Range[rmin, rmax]的范围内训练LoRA模块,其中rmin和rmax可以被视为新的超参数。为了使LoRA模块在一系列秩上而不是单一秩上工作,我们需要确保增加或减少秩不会显著损害模型的性能。一种实现这种行为的方法是在LoRA模块的训练过程中对不同秩的信息内容进行排序。在这方面,我们在每个训练步骤中从预定义的分类分布(其支持在Range[rmin, rmax]范围内)中采样b ∼ pB(.),b ∈ {rmin, rmin + 1, ..., rmax},并相应地截断Wdw和Wup矩阵。

Wdw↓b和Wup↓b分别是Wdw和Wup的b截断版本(见图1以获取可视化)。此外,让我们定义Wb dw为Wdw的第b行;Wb up对应于Wup的第b列。

然后,在训练期间,这个截断的LoRA模块的前向传播将被计算如下:

为了简化,假设我们网络中只有一个LoRA模块(即在方程8中描述的那个)。让我们首先考虑网络f(x; Wdw, Wup)的常规静态损失函数LS,其中Wdw和Wup是可调参数,对于N个给定的输入-输出对(x, y)= (xi, yi)Ni=1:

其中l(f, y)是一个损失函数,用于衡量网络预测与目标标签之间的差异。然后,让我们将训练损失扩展为考虑b截断过程的动态网络。我们可以将我们的动态损失函数LDY定义如下。

请注意,我们的损失函数与嵌套Dropout损失有主要区别,这使其更加高效。嵌套Dropout损失的形式是∑rmaxb=rmin pB(b)LDY ↓b (x, y; Wdw↓b, Wup↓b),它需要在所有可能的秩范围内对损失进行求和,计算成本高昂。为了克服这一计算限制,我们将其替换为在每个时间步优化模型参数以适应每个目标秩。我们证明了这种方案相当有效。与嵌套Dropout的另一个区别是,在参数更新阶段,我们向训练中添加了一个新的模式(称为冻结)作为超参数。这个新模式建议在更新阶段只更新在截断阶段采样的b对应的行和列(即,一次只更新一个行或列,以防止在前一个时间步中学习到的参数被遗忘)。这种方法以较小的性能成本为代价,可以进一步提高我们算法的效率。

表4展示了仅更新“b”与更新从1到b的列和行之间的差异。我们的技术总结在算法1中。

5 实验
在本节中,我们描述了用于在自然语言理解(NLU)和自然语言生成(NLG)任务上评估我们的DyLoRA模型的实验。为了与原始LoRA方法保持公平,我们尽量保持实验设置与LoRA论文(Hu等,2021a)相似。因此,同样地,我们选择了预训练的RoBERTa(Liu等,2019)基础模型作为GLUE基准测试(开发集)的LoRA和DyLoRA实验的骨干网络,以及GPT-Medium用于NLG任务。在我们的实验中,我们没有进行任何超参数调整,也没有搜索验证周期,也没有使用MLNI技巧(使用MLNI检查点而不是预训练权重)来增强模型的性能。更多关于超参数的细节可以在附录B中的表8中找到。总共,我们进行了200多次实验,并评估了1600多个模型,详细信息可以在附件中找到。

5.1 基线

  • 微调:为了展示我们提出方法的相对上限性能,我们对模型中的所有参数进行了微调。尽管我们有大量的可训练参数,但这可以帮助我们更好地了解更高秩模型的性能。

  • LoRA:作为DyLoRA的基线,我们采用了原始的LoRA模型及其调整后的超参数(Hu等,2021a)。作为LoRA的基线,我们采用了原始的LoRA模型及其调整后的超参数(Hu等,2021a)。为了确保与LoRA的公平比较,我们尽量保持实验设置与LoRA论文(Hu等,2021a)相似。因此,同样地,我们选择了预训练的RoBERTa(Liu等,2019)基础模型作为GLUE基准测试(开发集)的LoRA和DyLoRA实验的骨干网络,以及GPT-Medium用于NLG任务。在我们的实验中,我们没有进行任何超参数调整,也没有搜索验证周期,也没有使用MLNI技巧(使用MLNI检查点而不是预训练权重)来增强模型的性能。更多关于超参数的细节可以在附录B中的表8中找到。总共,我们进行了200多次实验,并评估了1600多个模型,详细信息可以在附件中找到。

  • FLOP:由于其灵活性,分解低秩剪枝(FLOP)(Wang等,2019)可以应用于任何矩阵乘法,因此可以用来避免我们的问题中的搜索。然而,这个基线缺乏DyLoRA的动态特性。我们使用它来展示基于正则化的技术的性能及其优缺点。

5.2 LoRA秩选择问题
在LoRA算法中,没有明确的指导如何确定秩。从LoRA论文(Hu等,2021a)中可以看出,模型的性能随着不同秩的变化而有很大差异(例如,参见LoRA论文中的表15和18),并没有显示出任何明确的趋势。我们在GLUE基准测试中也观察到了同样的问题。我们可能会认为,理论上,表现最好的秩总是最高的。然而,高秩会在适应过程中引入更多的参数,这可能并不理想。实际上,如表1所示,最有效的秩取决于任务。例如,根据MRPC的结果,表现最差的秩是16,而表现最好的秩是32。这与SST-2不同,在SST-2中,秩1是最不表现的秩,而秩8是最有效的秩。许多因素可能导致这种差异,包括但不限于数据集的大小、超参数选择、硬件配置和优化。

5.3 动态低秩适应
例如,假设我们有一个神经网络,我们希望将其部署在具有不同配置的各种设备上。使用更高秩可能会给非常敏感的设备带来问题,因为它们有更多的参数。因此,我们必须要么为每种配置训练多个模型,要么找到最优化的秩。与之相关的成本是显著的,因为即使在LoRA的设置中,我们也需要为每个任务和每个设备找到最佳秩。然而,使用DyLoRA,每个任务只需要训练一个模型,并且由于我们的方法在推理时是自适应的,我们可以根据需要进行部署。在表2中,我们展示了DyLoRA的动态特性。为了确保公平比较,表中的所有LoRA和DyLoRA模型都具有相同的模型大小,我们使用了相同的代码和评估过程,所有模型都训练到了相同的程度。在LoRA中,我们在较低秩上进行推理时会损失性能。这是因为该模型在训练期间仅针对秩8进行了训练。在DyLoRA中,我们在较低秩上保持了高水平的性能,同时在秩8上与LoRA竞争良好。

5.4 无搜索低秩适应
如前所述,选择特定秩的过程可能非常昂贵。在表5中,我们展示了LoRA和DyLoRA在这种搜索相关的成本。例如,如果有人想在秩的整个范围内(例如,在实验中为64)进行搜索,那么他们需要训练和评估64个不同的模型,以确定适当的秩。如果搜索整个秩空间,成本会更高。在均匀搜索的情况下,成本较低,但仍然比我们提出的方法更昂贵(在实验中为7倍)。因此,对于LoRA(搜索),我们针对秩=1,2,4,8,16,32,64进行了实验,并报告了最佳结果。结果表明,我们提出的方法以更低的成本具有竞争力。

5.5 DyLoRA的鲁棒性
如表2所示,DyLoRA对随机性相当鲁棒,能够由于稳定收敛而产生一致良好的结果。

5.6 正则化和剪枝
避免搜索问题的另一种方法是使用正则化/剪枝技术来确定权重矩阵的内在秩。通过这种方式,我们可以减少原始矩阵的参数数量;然而,我们在推理时将不会有动态模型。为了说明这些方法与DyLoRA之间的差异,我们在表3中报告了其中一个模型FLOP(Wang等,2019)的性能。FLOP利用低秩分解创建新的矩阵来表示原始权重矩阵。因此,它们将拥有更少的总参数,但需要更多的可训练参数才能达到与DyLoRA相当的性能。

5.7 生成任务
在本实验中,我们在不同的自然语言生成(NLG)任务上评估了我们模型的性能,例如E2E NLG挑战(Novikova等,2017)、DART(Nan等,2020)和WebNLG(Gardent等,2017)。E2E任务的结果如表6所示,由于空间限制,其他两个任务的结果在附录C中展示。生成任务显示出与NLU任务相似的模式,表明我们的模型能够在比LoRA更广泛的秩范围内良好工作。

5.8 消融研究
在本小节中,我们研究了DyLoRA中的两个设计选择的影响:首先,我们技术中的新分布PB超参数;其次,更新Wb dw和Wb up参数而不是整个Wdw↓b和Wup↓b的影响。分布PB改变了在训练过程中不同秩的相对重要性。为了检验所选分布对DyLoRA性能的影响,我们使用了几何和均匀两种分布。如表4所示,几何分布提供了一种更好的方法来优化较低秩,因为它在训练过程中更加关注较低秩,而均匀分布将在所有秩上提供更好的性能。我们在大多数实验中选择了均匀分布,以避免添加另一个超参数,这是几何分布的要求。此外,我们证明了可以通过仅更新与秩b相关的唯一参数(这些参数不与较低秩重叠),来确保秩b的优化不会对较低秩(1到b-1)的性能产生负面影响,同时表现合理良好。此外,在表7中,我们展示了在相同设置下使用我们的单独损失(方程9)与嵌套Dropout原始目标函数之间的结果。如图所示,我们提出的目标函数既有效又高效。此外,重要的是要注意,当涉及许多秩时,求和损失是不可扩展的。我们还在附录A中讨论了LoRA和DyLoRA的时间复杂度。

6 结论
在本文中,我们提出了我们的解决方案DyLoRA,以解决低秩适配器中的两个问题,即秩选择和使其动态化。我们证明了DyLoRA可以在不需要多次重新训练的情况下选择秩,并且能够在推理时使LoRA动态化。因此,我们可以避免在许多现实场景中寻找最优化秩的过程。已经证明DyLoRA的性能与LoRA相当,然而,我们可以在不增加额外时间和努力的情况下支持更广泛的秩范围。

局限性
根据LoRA(Hu等,2021a),适当选择标量可以改善结果。为了确定最佳选择,需要进一步调查。尽管我们证明了均匀分布可以与特定的几何分布一样有效,但需要进一步调查以评估不同分布对不同下游任务的影响。如本文所示,我们的算法在广泛的秩范围内工作,但需要进一步研究以了解选择特定范围的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Together_CZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值