Prompt-Tuning原始论文解读

前言

如今,预训练语言的模型变得越来越大,对应的参数量高达百亿、千亿,而在实际应用的过程中通常需要对相应的预训练模型进行微调,如果对全部的参数进行微调,那所需要花费的成本是不可想象的,如果能够只对其中部分参数进行微调的话就可以节省很多资源。谷歌研究院提出的高效微调方法prompt-tuning在这方面就起到了很好的作用,在应用时只需要调整少量的参数就能够达到与全量微调相似的效果。
论文链接:The Power of Scale for Parameter-Efficient Prompt Tuning
开源代码:https://github.com/google-research/prompt-tuning

摘要

Prompt Tuning是一种简单有效的机制,主要用于学习“软提示”,使冻结语言模型能够执行特定的下游任务。与GPT-3使用的离散文本提示不同,软提示是通过反向传播来学习的,并且可以进行调整,以合并来自任意数量标记示例的信号。这是一种端到端的学习,对应的效果比GPT-3中采用的少样本学习方法有好很多。更值得注意的是,通过对T5对模型大小进行消融,发现prompt tuning随着规模的增加而变得更有竞争力:当模型参数超过数十亿时,论文中提到的方法“缩小了差距”,与模型调优(对所有模型权重进行调优)的强大性能不相上下。这一发现尤为重要,因为大模型的共享和服务成本很高,而在多个下游任务中重复使用一个冻结模型的能力可以减轻这种负担。prompt-tuning可以看做是对prefix-tuning的简化。使用软提示对冻结模型进行调节,可以提高对领域转移的稳健性,并实现高效的“提示集成”。

引言

随着预训练大语言模型的成功,出现了一系列的技术来使这些通用模型适应下游任务。ELMo提出冻结预先训练好的模型,并学习其每层表征的特定任务加权。然而,自从GPTBERT以来,占主导的技术一直是模型调整(或fine-tuning),即在适应过程中对所有模型参数进行调整。
GPT-3中提出文本提示在调节模型行为方面具有惊人的效果,而对应的提示通常是由任务描述/或几个例子组成。这种对“冻结”预训练模型的回归是很有吸引力的,特别是随着模型规模的不断增加。一个通用的模型不需要为每个下游任务单独复制一个模型,而是可以同时服务于许多不同的任务。
遗憾的是,基于提示的适应有几个关键的缺点,任务描述容易出错,需要人工参与,且提示的有效性受限于模型输入中可容纳的调节文本的数量。因此下游任务的质量仍然远远落后于经过调整的模型。如在GPT-3 175B的模型上使用少样本的性能与经过微调后的T5-XXL模型相比仍然差了17.5个点(71.8对89.3),尽管使用的参数是后者的16倍。
除了人为设计提示以外,也有人提出了自动提示设计的方法,如AutoPrompt提出了一种以下游应用训练数据为指导的单词搜索算法。虽然这种方法优于人为提示设计,但与模型微调相比仍然存在差距。Prefix-Tuning在生成任务上表现出了很好的效果,这种方法会冻结模型参数,并将调整到编码器堆栈中的每个层的prefix激活期间反向传播对应的误差(包括输入层)。WARP对前一个方法进行了简化,将可训练参数限制在遮蔽语言模型的输入和输出子网络中,并在分类任务上也得到了合理的结果。
这篇论文中提出了“Prompt-Tuning”方法,作为自适应语言模型的进一步简化,作者冻结了整个预训模型,并且只允许每个下游任务向输入文本中添加额外的k个可调整的标记。这种“软提示”是经过端到端训练的,可以压缩来自完整标记数据集的信号,使得对应的方法比少样本提示更好,并通过模型调整缩小质量差距,具体情况如下图所示。
在这里插入图片描述
同时,由于所有的下游任务都会循环使用一个预先训练好的模型,因此保留了冻结模型的高效服务优势,具体情况如下图所示:
在这里插入图片描述这篇论文证明了,仅仅通过提示调整(没有中间层前缀或特定任务的输出层)就足以与模型调整相媲美。证明了语言模型能力是这些方法成功的关键因素,随着模型规模的不断扩大,prompt tuning会变得更有竞争力。这篇论文主要做的贡献有:

  • 在大语言模型体系中提出了prompt tuning并展示其于模型微调的竞争性;
  • 消融许多设计选择,并显示出质量和鲁棒性随着模型规模的扩大而提高;
  • 在域转移问题上,显示出prompt tuning比模型微调效果更好;
  • 提出了“提示集成”并显示出其有效性。

提示微调

按照T5的“文本到文本”方法,本文将所有的任务都看做是文本生成,不再将分类建模为给定输入的输出类的概率 P r ( y ∣ X ) Pr(y|X) Pr(yX),其中X是一系列标记,y是单个类别标签,而是将其建模为条件生产,其中Y是代表类别标签的标记序列。T5将分类模型建模为 P r θ ( Y ∣ X ) Pr_{\theta} (Y|X) Prθ(YX),参数是有构成其编码器和解码器的权重 θ \theta θ
提示是指在生成Y的过程中,为模型添加额外的信息作为条件。通常,提示是通过在输入X中添加一系列标记P来实现的。这样在模型参数 θ \theta θ保持不变的情况下,模型就能最大化Y的可能性 P r θ ( Y ∣ [ P ; X ] ) Pr_{\theta} (Y|[P;X]) Prθ(Y[P;X])。在GPT-3中,提示符 P = p 1 , p 2 , . . . , p n P={p1, p2, ..., pn} P=p1,p2,...,pn是模型词嵌入表的一部分,参数为冻结的 θ \theta θ。因此要找到最佳提示符,需要通过人工搜索或无差别搜索方法来选择提示符。提示符调整笑出了提示符P必须由 θ \theta θ参数化的限制;相反,提示符由自己的专用参数 Θ P \Theta _P ΘP,可以更新。提示符设计涉及从固定的冻结嵌入词库中选择提示符,而提示符调整则可以看做是使用固定的特殊提示符,只有这些提示符的嵌入词库可以更新。现在,新的条件生成是 P r θ ; θ P ( Y ∣ [ P ; X ] ) Pr_{\theta;\theta _P}(Y|[P;X]) Prθ;θP(Y[P;X]),可以通过反向传播最大化Y的可能性来训练,同时只对 θ P \theta _P θP进行梯度更新。
给定一些n个标记 x 1 , x 2 , . . . , x n {x1, x2, ..., xn} x1,x2,...,xn,T5首先要做的是嵌入标记,形成一个矩阵 X e ∈ R n × e X_e \in \mathbb{R}^{n\times e} XeRn×e,其中e是嵌入空间的维度。论文中的软提示表示参数为 P e ∈ R p × e P_e \in \mathbb R ^{p\times e} PeRp×e,其中p是提示符的长度。然后,对应的提示符与嵌入式输入相连接,形成一个矩阵 [ P e ; X e ∈ R ( p + n ) × e [P_e;X_e \in \mathbb R^{(p+n)\times e} [Pe;XeR(p+n)×e,然后像正常情况一样流过编码器-解码器。训练模型的目的是最大化Y的概率,但只更新提示参数 P e P_e Pe

设计方案

初始化提示符表示法的方法有很多种。最简单的方法是使用随机初始化从头开始训练。更复杂的选择是将每个提示标记初始化为从模型词汇中提取的嵌入。从概念上讲,论文中的软提示调节冻结网络的行为与输入前的文本相同,因此类似单词的表示法可以作为一个很好的初始化点。对于分类任务来说,第三种方法就是用枚举输出类别的嵌入来初始化提示,类似于PET方法中的"verbalizers"。由于我们希望模型在输出中产生这些标记,因此用有效目标标记的嵌入来初始化这些提示,应能使模型将其输出限制在合法的输出类别中。
另一个设计考虑的因素是提示符的长度,该方法的参数代价是EP,其中E是标记嵌入维度,P是提示符长度。提示符越短,需要调整的新参数就越少,因此我们的目标是找到一个仍然表现良好的最小长度。

取消学习跨度的损坏

与GPT-3等自回归语言模型不同,论文中实验使用的T5模型是编码器解码器架构,并对跨度损坏目标进行了预训练。具体来说,T5的任务是“重建”输入文本中被掩盖的跨度,这些跨度都标有唯一的前哨标记。目标输出文本由所有的屏蔽内容组成,由哨兵分割,再加上一个最终的哨兵。
虽然T5模型架构和预训练目标比传统语言建模更有效,但假设这种设置并不适合生成一个可通过提示调整很容易地控制的冻结模型。特别是专门针对跨度损坏进行预训练的T5模型,从未见过真正自然的输入文本(不含哨兵标记),也从未被要求预测真正自然的目标。事实上,由于T5的跨度损坏预处理细节,每个预训练目标都会从哨兵开始。虽然这种输出哨兵的“不自然”倾向很容易通过微调来克服,但作者认为,由于编码器的先验值无法调整,要想仅通过提示来推翻这种倾向要困难得多。
考虑到这些模型,在下面三种情况下对T5模型进行了实验:

  • “跨度破坏”:使用预训练的T5现成模型作为冻结模型,并测试其为下游任务输出预期文本的能力;
  • “跨度破坏+哨兵”:使用相同的模型,但在所有下游目标前加上哨兵,以便更接近预训练中的目标;
  • “LM适应”:将T5的自我监督训练继续进行少量额外的步骤,但使用T5模型讨论过的“LM”目标:给定一个自然文本前缀作为输入,模型必须生成自然语言文本延续作为输出。至关重要的是,这种适应只发生一次,产生的是一个单一的冻结模型,我们可以在任何数的下游任务中重复使用该模型进行及时调整。
    通过LM适应,作者希望将T5“快速”转变为与GPT-3更为相似的模。GPT-3总是输出真实的文本,而且作为“少样本学习者”对提示的反应良好。与从头开始的预训练相比,这种后期转换的成功率并不明显,由于以前没有人对这方面的内容进行过研究,因此作者尝试了各种适应长度,最多可到100K步。

结果

对应冻结模型是建立在预先训练好的各种尺寸上(小型、基本型、大型、XL型、XXL型)的T5检查点上,利用的是公开的T5 1.1检查点,其中包括对原始T5的改进。
作者使用的“默认”配置是经过额外10万步训练的LM适配版T5,使用类标签进行初始化,并使用100个标记的提示长度。虽然比Prefix-Tuning中使用的默认10个令牌前缀要长,但论文中的方法仍然使用更少的特定任务参数,因为作者只调整了输入层,而不是覆盖所有网络层的激活。
每一条提示信息都在单一的SuperGLUE任务中进行训练;没有多任务设置,也没有在不同任务中混合训练数据。将每个SuperGLUE数据集翻译成文本到文本的格式,但省略了在输入前标明示例属于哪个SuperGLUE任务的任务名称。
作者使用T5的标准交叉熵损失对提示进行了30,000步的训练,学习了恒定为0.3, 批量大小为32。检查点是通过在开发集上提前停止来选择的,其中停止指标是数据集的默认指标,或者使用多种指标评估的数据集的指标平均值。

缩小差距

为了将对应的方法与标准微调模型进行比较,使用了T5库中指定的默认超参数对SuperGLUE上的公开T5 1.1检查点进行了调整, 考虑了两种baseline:

  • 模型调整: 为了进行公平比较,对每个任务分别进行调整,就像在prompt-tuning设置中的一样;
  • 模型调整(多任务):使用T5的多任务调整设置来实现更有竞争力的baseline。这种情况下,对所有任务联合调整一个模型,并用文本前缀标明任务名称。
    随着规模的增加,提示调优会随着模型调优变得越来越有竞争力,在XXL大小(110亿参数)下,紧固那特定任务的参数少了20,000倍,但提示调整甚至可以与更强的多任务模型调整基线相匹配。
    为了与提示设计进行比较,在SuperGLUE开发分割了GPT-3的少样本性能,同时提示调整的性能比GPT-3的提示设计要好很多,提示调整的T5-Small与GPT-3 XL相当(大16倍以上),提示调整的T5-Large比GPT-3 175B要好(大220倍以上。)

消融研究

提示长度:对每个模型的大小训练提示,同时在{1, 5, 20, 100, 150}中改变提示长度,并将其他设置固定为默认配置。从下图中可以看出,对于大多数模型大小而言,在单个标记外增加提示长度对于实现良好的性能至关重要。值得注意的是,XXL模型在单标记提示下仍能取得很好的效果,这表明模型越大,实现目行为所需的调节信号就越少。在所有模型中,超过20个标记的模型只会产生边际收益。
在这里插入图片描述
提示初始化:通过训练所有大小的模型来消除提示初始化的影响,同时将其他超参数固定到它们的默认值上。对于随机初始化,从[-0.5, 0.5]范围内均匀采样。当从采样词汇初始化时,只使用T5的SentencePiece词汇表中最常见的5000个标记,这是在训练前语料库中按可能性排序的。对于“类标签”的初始化,采用下游任务中每个类的字符串表示的嵌入,并用它们来初始化提示中的标记。在提示符长度较长的情况下,往往会在初始化所有提示符之前就用完类标签。在这种情况下,会退回到抽样词汇策略来填充提示。下图显示了对不同模型大小的初始化策略的消融,发现基于类的初始化效果最好。在较小的规模尺寸下,不同初始化之间存在较大差距,但一旦模型扩展到XXL尺寸(11B),这些差距就会消失。
在这里插入图片描述
通过“类标签”初始化,可以观察到类标签通常会出现在学习到的提示中,最近的标记嵌入(用余弦距离表示)就会与用于初始化的标签相匹配。除此之外,并没有发现学习到的提示是可解释的。
预训练目标:从下图中可以看到预训练目标对提示调整质量有明显的影响,T5的“跨度损坏”目标并不适合训练冻结的模型,因为这些模型随后会收到提示的影响。直观地说,为读写前哨标记而预先训练的模型很难直接应用于没有前哨标记的文本读写任务,从左图中你可以看出,即使是在下游目标中添加哨兵的“变通方法”也没什么效果。虽然LM适应性为所有尺寸的模型都带来了价值,但是最大的XXL模型的宽容度最高,即使在跨度损坏的情况下也能取得很好的效果。
在这里插入图片描述
考虑到LM适应的好处,论文还讨论了多长时间的适应才有帮助。上面右侧的图表示,适应的时间越长,收益越大,最高可到10W步。这表明,从跨度破坏到语言建模目标的“过渡”并不是一个微不足道的变化,有效的转换需要投入一定的训练资源(原始T5预训练步数的10%)。同时与其他消融一样,可以观察到XXL模型对非理想配置也很稳健。在这种尺寸下,适应所带来的收益相当有限。
在非最优的“跨度破坏”设置中,可以观察到不同大小模型的不稳定性,小模型优于较大的基础模型、大型模型和超大型模型。通过观察可以发现在许多任务中,这些中型模型从未学会输出合法的类别标签,因此得分率为0%。最常见的两种错误模式是从输入中复制子跨度和预测空字符串。此外,这种糟糕的性能并不是由于提示调整中的随机变量造成的,因为在每种大小的3次运行中观察到的差异很小。这些结果表明,使用具有“跨度损坏“为目标的预训练模型可能并不可靠,5个模型中只有2个模型运行良好,而LM适配版本在所有模型中都运行可靠。

与类似方法对比

这一节将回顾有关连续提示学习的工作,并与论文中的方法进行比较。如下图所示,比较重要的一个点是每种方法所需的特定任务参数的数量。
在这里插入图片描述
在具有可学习参数的方法中,提示调整是参数效率最高的方法,对于超过10亿个参数的O型,所需的特定任务参数小于0.01%。
Prefix-Tuning在学习的时候是学习每个Transformer层预置的前缀序列,这类似于学习在每个网络层的实例中固定的Transformer激活。相比之下,论文中提出的提示调整使用的是单个提示表示法,该表示法除了更少的参数外,还允许Transformer根据输入示例的上下文更新中间层任务表征。Prefix-Tuning的工作是建立在GPT-2BART的基础上,而论文中的方法侧重于T5,冰眼就开了随着模型规模的增加,性能和设计选择的鲁棒性的变化。当使用BART时,prefix-tuning包括编码器和解码器上的前缀,而prompt-tuning只需要编码器上的提示。prefix-tuning还依赖对前缀的重新参数化来稳定学习,这就在训练过程中增加了大量的参数,而论文中的配置就不需要重新参数化,并且在SuperGLUE任务和模型大小方面鲁棒性都非常好。
WARP是在输入层当中添加提示参数,这种方法适用于遮蔽语言模型,依靠[MASK]标记和可学习输出层将掩码投射到类对数中。这种方法将模型进行了限制,只能产生单一输出,使其仅限于分类。提示调整则不需要对输入和特定任务头进行任何修改,同时提示调整的性能也接近于模型微调的强大性能。
P-Tuning使用基于人工设计的模型,在嵌入输入中交错可学习的连续提示。prompt-tuning只需要在输入前加上提示,从而消除了这一复杂性。为了获得强大的SuperGLUE结果,P-tuning必须与模型调整结合起来使用,即模型联合更新提示符和主要模型参数,而promot-tuning是保持原始语言模型的冻结状态。
Qin和Eisner使用“软词”来学习提示,以便从预先训练过的语言模型职工提取知识。提示根据手工设计的提示原型与输入相关定位,每一层都包含一个学习到的 Δ i ℓ \Delta _i ^\ell Δi参数,因此参数成本会随着模型深度的增加而增加。
Few-shot Sequence Learning with Transformers使用可学习的前置标签来是Transformer模型适应各种任务,但它们关注的是为适应组合任务表示而设计的小型合成数据集,而不是更大的真实世界数据集。对应的基础模型食欲任务表征一起从头开始训练的小型Transformer。而Prompt-Tuning则是冻结基础模型,使用更大的Transformer研究扩展规律。
更一般的说,任务提示方面的工作与“适配器”方面的工作密切相关,“适配器”是在冻结的预训练网络层之间插入的小型瓶颈层。适配器提供了另一种减少特定任务参数的方法,Adapter Tuning在冻结BERT-Large并只增加了2-4%额外参数的情况下,GLUE性能接近完全微调。MAD-X在多语言环境中使用多个适配器,将于元理解与任务规范明确分开,这与论文中使用的方法类似,适配器与提示微调之间的核心区别在于这两种方法如何改变模型行为。适配器修改作用于输入表示的实际功能,通过允许重写任何给定层的激活来参数化。提示调整通过保留函数固定并添加可能影响后续输入处理方式的新输入表示来修改行为。

适应领域转换

通过冻结核心语言模型参数,提示微调可防止模型修改其对语言的一般理解。相反,提示表征会间接调节输入的表示。这就降低了模型通过记忆特定词汇线索和虚假相关性来过度拟合数据集的能力。
论文研究了问题解答(QA)和释义检测两项任务中零样本领域转移的问题。在QA方面,使用了MRQA 2019关于泛化的共享任务。这项任务以统一的格式收集抽取式质量保证数据集,并测试在“域内”数据集上训练的模型在“域外”数据集上进行评估时的表现。
从下表中可以看到,在大多数域外数据集上,提示调整都比模型调整要好,在TextbookQA上,两种方法的F1差距高达12.5分。同时可以观察到,在领域转移较大的情况下(如在BioASQ中转移到生物医学或在TextbookQA中转移到教科书),提示微调可以获得更大的收益。在模型调整效果较好的数据集中,可以看到DROP和SQuAD共享一个域(维基百科),因此是最小的领域转移。
在这里插入图片描述
作为对领域转移鲁棒性的第二项测试,论文探索了GLUE的两个释义检测任务中的转移。第一个任务是QQP,它询问社区问答网站Quora上的两个问题是否“重复”。第二个任务是MRPC,它询问从新闻文章中提取的两个句子是否是专属,测试的是双向迁移( Q Q P ⇔ M R P C QQP \Leftrightarrow MRPC QQPMRPC)。和前面一样,是在”域内“任务中进行训练,通过域内验证选择检查点,并在”域外“任务中进行零样本的评估。
下表显示,在QQP数据上训练轻量级提示符并在MRPC上进行评估,比调整整个模型的性能要好得多(准确率+3.2和F1+3.1)。另一个方向的结果则更为接近,提示微调显示准确率略有提高,而F1则略有下降。这些结果支持这样一种观点,即模型调整可能会过度参数化,更容易过度拟合训练任务,从而对不同领域的类似任务造成损害。
在这里插入图片描述

提示集成

据广泛观察,在相同数据上通过不同初始化训练的神经模型集成可提高任务性能,并有助于评估模型的不确定性。而随着模型大小的增加,集成可能变得不切实际。除了存储N个模型所需的空间外,运行N个不同的模型(无论是并行还是串行)还需要大量的推理成本。
提示调整提供了一种更有效的方法,可以对预先训练好的语言模型进行多种调整。通过在同一任务重训练N个提示,可以为一个任务创建N个独立的“模型”,同时仍然共享核心语言建模参数。除了大幅降低存储成本外,提示的集成还可以提高推理的效率。在处理一个例子时,无需计算N个不同模型的前向传播,而只需执行一个批次规模为N的前向传播,在整个批次中复制例子并改变提示。
为了验证提示集成的可行性,作者使用一个具有默认超参数的冻结的T5-XXL模型,为每个SuperGLUE任务训练了五个提示语。使用简单的多数投票来计算集合的预测结果。从下表中可以看出,在所有任务重,集成预测的结果比单个提示的平均值都要好,并且优于或者可以与最好的单个提示相匹配。
在这里插入图片描述

可解释性

理想情况下,可解释的提示语应该是由自然语言组成,可以清楚地描述手头的任务,明确的要求模型获得相应的结果或操作,并能让人很容易地理解为什么提示语会引起模型的这种行为。
由于提示调整实在连续的嵌入空间而非离散的标记空间进行的,因此想要解释对应的提示就变得更加困难。为了测试所学软提示的可解释性,作者从冻结模型的词汇中计算出每个提示标记的最近邻居。使用词汇嵌入向量和提示标记表示之间的预先距离作为相似度量。
可以观察到,对于给定的学习提示标记,前5个最近的邻居会形成紧密的语义聚类。如可以看到词义相似的聚类,如{Technology/technology/Technologies/technological/technologies},也可以看到多样化但仍然紧密相关的聚类,如{entirely/completely/totally/altogether/100%}。这些集群的性质表明,提示实际上是在学习“类似单词”的表征。可以发现,从嵌入空间抽取的随机向量并没有显示出这种语义聚类。
在使用“类标签”策略初始化提示时,经常会发现类标签会在训练中持续存在。具体来说,如果一个提示标记被初始化为一个给定的标签,那么经过调整后,该标签往往会成为所学标记的近邻。在使用“随机统一”或“抽样词汇表”方法进行初始化时,类标签也可以在提示符的最近邻域中找到;但它们往往会作为多个提示符的邻域出现。这表明,模型正在学习将预期的输出类别作为参考存储在提示中,而将提示初始化为输出类别会使这一过程变得更容易、更集中。在研究较长的提示(例如100个)时,经常会发现多个提示语具有相同的近邻。这说明提示符的容量过大,或者提示符表征缺乏序列结构,使得模型难以将信息定位到特定位置。
虽然作为序列学习的提示语几乎没有显示出可解释性,但确实观察到,在BoolQ数据集上训练的提示语中,科学、技术和工程等词作为近邻词的频率很高,约20%的问题属于“自然/科学”类别。虽然还需要进行更多的研究,但这表明提示的作用之一可能是为模型提供在特定领域或环境(如“科学”)中解释输入的素材。

结论

在这篇论文中,作者证明了提示微调是一种有竞争力的技术,可使冻结的预训练语言模型适应下游任务。在流行的SuperGLUE基准测试中,它的任务性能可与传统的模型调整技术相匹配,而随着模型规模的扩大,差距也在逐渐缩小。在零样本领域转移方面,作者发现提示调整可提高泛化能力。这似乎表明,冻结通用语言理解参数并将下游学习限制在轻量级参数范围内,有助于避免对特定领域的过度拟合。
除了任务质量指标外,作者还讨论了在存储和服务成本方面专项冻结预训练模型的吸引力。这一举措既能实现高效的多任务服务,也可以实现高效高性能的提示集成。因此作者认为在未来将任务定义参数与一般语言建模参数区分开来是令人兴奋的一步,可以为新的研究开辟很多途径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

nlp_xiaogui

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

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

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

打赏作者

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

抵扣说明:

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

余额充值