笔记-《A Survey of Large Language Models》- 5 适配微调

本文介绍了如何通过指令微调和对齐微调来进一步提升大语言模型的能力,重点关注了这两种方法的原理、实例构建、效果以及在适应人类需求和保持价值观一致性方面的应用。同时,还探讨了参数高效微调技术在Transformer模型中的应用,特别是在大语言模型上的实践和比较。
摘要由CSDN通过智能技术生成
  • 5 大语言模型的适配微调
    • LLM 的能力可以进一步适配(adapting)到特定的目标。本节中,我们将介绍两种适配预训练后的 LLM 的方法:指令微调(instruction tuning)和对齐微调(alignment tuning)
      • 指令微调(instruction tuning)
        • 旨在增强(或解锁) LLM 的能力
      • 对齐微调(alignment tuning)
        • 旨在将 LLM 的行为与人类的价值观或偏好对齐。
    • 5.1 指令微调
      • 本质上,指令微调是在自然语言格式的实例(instance)集合上微调预训练后的 LLM 的方法 [62]。这种方法与有监督微调 [61] 和多任务提示训练 [28] 密切相关。
      • 首先需要收集或构建指令格式(instruction-formatted) 的实例。
      • 然后, 我们使用这种格式的实例以有监督的方式微调LLM(例如使用序列到序列的损失进行训练) 。
      • 指令微调后, LLM 可以展现出泛化到未见过任务的卓越能力 [28, 62, 64], 即使在多语言场景下也能有不错表现
      • 主要关注在 LLM 上指令微调的效果,并提供详细的实例收集和模型微调的方法和策略。此外,我们还讨论了用指令微调来满足用户实际需求的方法, 这在现有的 LLM 中被广泛应用,例如 InstructGPT [61] 和 GPT-4
      • 5.1.1 格式化实例的构建
        • 通常情况下,一个指令格式的实例包括一个任务描述(称为指令) 、一对输入-输出以及少量示例(可选) 。
        • 格式化已有数据集:
          • 作为指令微调实例的一种重要来源,用自然语言的任务描述来格式化这些多任务训练数据集是相当方便的。
          • 使用人类撰写的任务描述来增广带标注的数据集,这些描述通过解释任务目标来指导LLM 理解任务。例如,在图 5(b)中,每个问答任务的实例都添加了一个任务描述“请回答下列问题” 。在指令微调之后,LLM 可以通过遵循任务描述很好地泛化到其他未见过的任务上 [28, 62, 64]。特别地,指令被证明是影响 LLM 任务泛化能力的关键因素
          • 为了更好地为指令微调生成标注实例,一种名为 PromptSource 的众包平台 [209] 被提出,可以有效地创建、 共享和验证不同数据集的任务描述。
          • 此外, 一些研究 [28, 212, 216] 还尝试通过为指令微调特殊设计的任务描述,来反转已有实例的输入-输出对。例如,对于一个已有的问题-答案对,我们可以通过基于以问题预测答案的方式来创建一个新实例(例如, “请基于以下答案生成一个问题: ” ) 。
          • 此外,还有一些工作 [217] 利用启发式任务模板将大量无标注的文本转换为带标注的实例。
        • 格式化人类需求:
          • 尽管大量的训练实例已经通过添加指令进行格式化,但它们主要来自公共的 NLP 数据集,任务描述缺乏多样性或与人类真实需求不匹配
          • 为了解决这个问题, InstructGPT [61] 建议采用真实用户提交给 OpenAI API 的查询作为任务描述。用户查询以自然语言表示, 很适合引导出LLM 遵循指令的能力。
          • 此外,为了丰富任务的多样性,标注者还要为真实生活中的任务编写指令,包括开放式生成、开放式问答、头脑风暴和聊天等。
          • 然后让另一组标注人员直接按照将这些指令作为输出进行回答。
          • 最后, 将指令 (即采集的用户查询)和期望的输出(即人工编写的答案)配对作为一个训练实例。
          • 值得注意的是, InstructGPT 还将这些以自然语言格式化的真实世界任务用于对齐微调(在第 5.2 节中讨论) 。
          • ,GPT-4 [45] 还设计了潜在高风险的指令,并监督微调模型拒绝这些指令以确保安全。
          • 此外,为减轻人工标注的负担,几种半自动化的方法 [218–220] 提出将现有实例输入到 LLM 中生成多样的任务描述和实例来构建实例。
        • 构建实例的关键因素:
          • 指令实例的质量对模型的性能有重要影响。
          • • 增加指令:
            • 大量研究已经证明扩大任务数量可以极大地提高 LLM 的泛化能力
            • 一定数量的代表性任务可以提供相对充足的知识,而添加更多的任务可能不会带来额外的收益
            • 此外, 从例如长度、结构和创造力等多个方面增强任务描述的多样性也是有益的
            • 至于每个任务所需的实例数量, 已有研究发现少量实例通常可以使模型的泛化性能达到饱和 [62, 64]。然而,将某些任务的实例数量进一步增加(例如数百个)可能会潜在地导致过拟合并影响模型性能
          • • 设计格式:
          • 指令的格式设计也是影响 LLM 泛化性能的一个重要因素
          • 通常来说,我们可以向现有数据集的输入-输出对添加任务描述和可选的示例,
            • 其中任务描述是 LLM 理解任务 [93] 的最关键部分。
            • 此外,使用适当数量的示例作为示范 [64],对模型可以产生实质性的改进,这也减轻了其对指令工程的敏感性
            • 然而,将其他部分(例如避免事项、原因和建议)添加到指令中对 LLM 的性能提升十分轻微,甚至会产生不利的影响
          • 已经有研究表明,同时使用包含和不包含 CoT 的样本微调 LLM,可以在各种下游任务中取得良好的性能,包括需要多级推理能力的任务(例如常识问答和算术推理) ,以及不需要多级推理的任务(例如情感分析和抽取式问答)
          • 总的来说
            • 指令多样性似乎比实例数量更重要, 因为表现良好的 InstructGPT [61] 和 Alpaca [220] 使用的指令(或实例)比 Flan 系列的 LLM [62, 64] 数量更少但更加多样化。
            • 此外,邀请标注者构建人类真实需求的任务比使用特定数据集的任务更有用。
            • 但是,目前仍然缺乏如何标注来满足人类需求指令的指南,使得任务构建在某种程度上更具启发性。
            • 为减少人力成本, 我们可以重用现有的格式化数据集 (表6) , 或使用现有的 LLM 自动构建指令 [218]。
      • 5.1.2 指令微调策略
        • 指令微调可以被视为一个有监督的训练过程, 其优化过程与预训练有一些不同 [64], 比如训练目标函数 (如序列到序列的损失) 和优化参数设置 (如更小的批量大小和学习率) 。
        • 除了这些优化参数设置,指令微调还需要考虑两个重要方面:
        • 平衡数据分布:
          • 由于指令微调涉及多种任务的混合, 因此在微调过程中平衡不同任务的比例非常重要。
          • 实例比例混合策略
            • 将所有数据集合并, 然后从混合数据集中按比例采样每种实例。
          • 提高高质量数据集(例如 FLAN [62] 和 P3 [209]) 的采样比例通常可以带来性能提升。
          • 在指令微调期间通常会设置一个最大容量,以限制数据集中可以包含的最大实例数
            • 这是为了防止较大的数据集挤占整个采样集合 [87, 99]。在实践中,根据不同的数据集,最大容量通常设置为几千或几万个实例
        • 结合指令微调和预训练:
          • 为了使微调过程更加有效和稳定, OPT-IML [99] 在指令微调期间加入了预训练数据,这可以看作是对模型的正则化(regularization) 。
          • 此外,一些研究并没有使用单独的两阶段训练过程(预训练和指令微调) ,而是尝试混合使用预训练数据 (即纯文本) 和指令微调数据 (即指令格式数据) ,用多任务学习的方式从头训练模型
            • 这有可能同时获得预训练和指令微调的优势。
      • 5.1.3 指令微调的效果
        • 性能改进:
          • 表明不同规模的模型都可以从指令微调中受益 [64, 216], 随着参数规模的增加,性能也得到了提升
          • 此外,经过指令微调的较小模型甚至可以比未经微调的较大模型表现更好
          • 除了模型规模外,指令微调在不同的模型架构、预训练目标和模型适配方法上都展现出稳定的改进效果
          • 此外,与预训练相比,因为LLM 所需的指令数据数量明显较少于预训练数据,指令微调成本较低。
        • 任务泛化性:
          • 指令微调鼓励模型理解用于完成任务的自然语言指令。它赋予 LLM 遵循人类指令执行特定任务的能力(通常被视为一种涌现能力) ,即使在未见过的任务上也能够执行
          • 此外, 指令微调还被证明可以帮助缓解 LLM 的一些弱点 (例如生成重复内容或补全输入但不完成相应任务)[61, 64], 从而使 LLM 具有更强的解决现实世界任务的能力。
          • 此外,使用了指令微调训练的 LLM 可以泛化到其他语言的相关任务上。
            • 指令微调可以帮助 LLM 从仅纯英文数据集中获取通用的解决任务能力, 并将这些能力传递到其他语言上
          • 此外,研究还发现,在多语言的任务中,仅使用英文指令就可以产生令人满意的结果 [98],从而减少针对特定语言的指令工程的工作量。
    • 5.2 对齐微调
      • 这部分首先介绍对齐微调的背景,包括其定义和标准,然后重点讨论用于对齐 LLM 的人类反馈数据的收集, 最后探讨用人类反馈进行强化学习(RL)以对齐微调的关键技术。
      • 5.2.1 对齐微调的背景和标准
        • 背景:
          • 这些模型有时可能表现出预期之外的行为,例如编造虚假信息、追求不准确的目标,以及产生有害的、 误导性的和有偏见的表达
          • 为了避免这些预期外的行为,一些研究 [61, 113] 提出了人类对齐,使得LLM 的行为能够符合人类期望。
          • 但是, 与原先的预训练和适配微调(例如指令微调)相比, 对齐微调需要考虑的标准(例如有用性, 诚实性和无害性)十分不同。
          • 已有研究表明对齐微调可能会在某种程度上损害 LLM 的通用能力, 这在相关研究中被称为对齐税
        • 对齐的标准:
          • 规范 LLM 的行为制定多样化的标准
            • 我们选取三个具有代表性的对齐标准(即有用性、诚实性、无害性)作为要讨论的例子
          • • 有用性:
            • LLM 为了达到有用性,应当尽其所能以简明扼要且高效的方式帮助用户解决任务或回答问题。当需要进一步阐明问题时,更高水平的 LLM 应展示出通过提出恰当的问题来获取额外相关信息的能力,并表现出合适的敏感度、洞察力和审慎度 [222]。
            • 对齐微调实现 LLM 的有用性具有挑战性,因为准确定义和衡量用户的意图很困难
          • • 诚实性:
            • 在基本层面上,诚实的 LLM 应该向用户提供准确的内容,而不会捏造信息。更进一步,LLM 在输出时传达适当程度的不确定性至关重要,以避免任何形式的欺骗或信息误传。 这需要模型了解其能力和知识水平 (例如 “知道自己不知道什么” ) 。
            • 与有用性和无害性相比,诚实性是一个更客观的标准,因此诚实性对齐依赖的人力可能更少。
          • • 无害性:
            • 无害性要求模型生成的语言不得是冒犯性或歧视性的。在最大限度地发挥其能力的前提下,模型应能够检测到隐蔽的为恶意目的而发送的请求。理想情况下,当模型被诱导去执行危险行为(如犯罪)时,LLM 应礼貌地拒绝。
            • 然而,哪些行为被认为是有害的以及在多大程度上有害因不同的个人或社会而不同 [222],这在很大程度上取决于谁在使用 LLM、提出的问题类型以及使用 LLM 的背景(如时间) 。
          • 我们可以看到的,这些对齐的标准相当主观,是基于人类认知制定的。
            • 因此,很难将它们直接制定为 LLM 的优化目标。 但是, 在现有的研究中, 有许多方法可以在对齐微调时达到这些标准。
            • 一个有前景的技术是红队攻防 [85, 224], 它以对抗性的方式手动或自动地探测 LLM,使之生成有害输出,然后再更新模型防止此类输出。
      • 5.2.2 人类反馈的收集
        • 在预训练阶段,LLM 使用大规模语料库,以语言建模为训练目标进行训练。然而,这样的训练目标缺乏人类对 LLM 输出的主观和定性评估(在本综述中称为人类反馈) 。
        • 我们将讨论如何筛选出优秀的人类标注者来进行反馈数据收集。
        • 标注人员的选择:
          • 在现有的工作中, 生成人类反馈数据的主要方法是人工标注
          • 为了提供高质量的反馈数据,标注人员应具有合格的教育水平和优秀的英语能力。
            • 例如, Sparrow [113] 要求标注人员在英国出生,母语为英语,并且至少获得本科学历。
            • 此外,在 [223] 中,高优先级任务中的标注人员约一半是从 Amazon Mechanical Turk 平台上招募的拥有硕士学位的美国本土人员。
          • 即便如此,一些研究 [82, 225] 发现标注人员与研究人员的意图仍然会不匹配,这可能使得人类反馈质量下降并导致 LLM 产生预期外的输出。
            • 为了解决这个问题, InstructGPT [61] 进一步实施了筛选过程, 通过评估标注人员与研究人员之间意图的一致性来选择标注人员。
            • 具体而言, 研究人员首先标注少量的数据,然后衡量他们自己和标注人员之间的标注一致性。
            • 选择一致性最高的标记者继续后续的标注工作。
        • 人类反馈的收集:
          • 主要有三种方法从人类标注者中收集反馈和偏好数据。
          • • 基于排序的方法:
            • 在早期的工作中 [225, 227],标注人员通常以较为粗略的方式 (即只选择最佳的候选结果) 评估模型生成的输出结果, 而不考虑更精细的对齐标准。 然而, 不同的标注者可能对最佳候选结果的选择持有不同的意见;同时, 这种方法忽略了未被选中的样本。这可能导致不准确或不完整的人类反馈。
            • 为了解决这个问题,随后的研究 [113, 223] 引入了 Elo 评分系统 ,通过一一比较所有候选输出结果来生成一个偏好排序。候选输出的排序将用于调整模型更倾向的输出,从而产生更可靠和更安全的结果。
          • • 基于问题的方法:
            • 此外,通过回答研究人员设计的特定问题, 标注人员可以提供更详细的反馈 [72], 这些问题能够覆盖不同的对齐标准以及其他对 LLM 的约束条件。
            • 在WebGPT [72] 中,为了帮助模型从检索到的文档中过滤和利用相关信息,标注人员需要回答关于检索到的文档对于回答给定输入是否有帮助的选择题。
          • • 基于规则的方法:
            • 作为一个经典例子, Sparrow [113] 不仅选择了标注人员挑选的最佳回复,还设计了一系列规则来测试模型生成的回复是否符合有用、正确和无害的对齐标准。
            • 通过这种方式, 研究人员可以获得两种类型的人类反馈数据: (1) 通过一一比较模型输出结果的质量来获得偏好反馈,和(2)通过收集人类标注者的评估(即针对输出结果违反规则的程度打分)来获得规则反馈。
            • 此外,GPT4 [45] 利用一组(基于 GPT-4 本身的)零样本分类器作为基于规则的奖励模型,可以自动地确定模型生成的输出是否违反了一组人类编写的规则。
      • 5.2.3 基于人类反馈的强化学习
        • 为了使 LLM 与人类价值观保持一致,人们提出了 RLHF [70, 225],使用收集到的人类反馈数据对 LLM 进行微调,有助于改进对齐的指标(例如,有用性,诚实性和无害性) 。
        • RLHF 采用强化学习(RL)算法(例如,近端策略优化(Proximal Policy Optimization, PPO) [81])通过学习奖励模型使 LLM 适配人类反馈。
        • 基于人类反馈的强化学习系统:
          • RLHF 系统主要包括三个关键组件:要对齐的 PLM、从人类反馈中学习的奖励模型,以及训练 LM 的 RL 算法。
          • 具体来说,PLM 通常是一个生成模型, 它使用现有的 PLM 参数进行初始化。
            • 例如, OpenAI 在其第一个主流的 RLHF 模型 InstructGPT [61] 中使用 1750 亿参数量的 GPT-3,而 DeepMind 在其 GopherCite 模型 [226] 中使用 2800 亿参数模型 Gopher
          • 此外,奖励模型(RM) 提供(学习得到的)指导信号,这些信号反映了人类对 LM 生成的文本的偏好,通常以标量值的形式表示。
            • 奖励模型通常具有两种形式:经过微调的 LM 或使用人类偏好数据重新训练的 LM。
            • 现有工作通常采用与要对齐的 LM [61, 226] 具有不同参数尺度的奖励模型。
          • 最后,为了使用来自奖励模型的信号优化 PLM, 我们设计了一种特定的 RL 算法用于大规模模型的微调。具体地,PPO [81] 是一种在现有工作中广泛使用的 RL 对齐算法
        • 基于人类反馈的强化学习的关键步骤:
          • • 监督微调:
            • 为了使 LM 具有初步执行所需行为的能力, 通常需要收集一个包含输入提示 (指令) 和所需输出的监督数据集,以对 LM 进行微调。
            • 这些提示和输出可以在确保任务多样性的情况下由人工标注人员针对某些特定任务编写。
            • 如,InstructGPT [61] 要求人工标注者编写提示(例如, “列出五个关于我如何重拾对职业热情的想法” )和一些生成式任务(如开放域问答、头脑风暴、聊天和重写)的期望输出。
            • 注意,第一步在特定的场景中是可选的。
          • • 训练奖励模型:
            • 第二步是使用人类反馈的数据训练 RM。
            • 具体来说,我们向 LM 中输入采样的提示(来自监督数据集或人类生成的提示) ,以生成一定数量的输出文本,
            • 然后邀请人工标注员为这些输入-输出对标注偏好。
            • 标注过程可以以多种形式进行,常见的做法是对生成的候选文本进行排序标注, 这样可以减少因标注者不同带来的差异。
            • 最后,训练 RM 预测人类偏好的输出。
          • • 强化学习微调:
            • 在这一步骤中,LM 的对齐微调可以被形式化为 RL 问题。RL 问题的策略(policy) 由 PLM 给出(将提示作为输入并返回输出文本) ,行动空间(action space)是 LM 的词表,状态(state)是目前生成的token 序列,奖励(reward)则由 RM 提供。
            • 为了避免 LM 显著偏离初始(微调前)的模型,通常在奖励函数中纳入一项惩罚项。例如,InstructGPT 在使用 PPO 算法对抗 RM 来优化 LM 时,对于每个输入提示,InstructGPT 计算当前 LM 和初始 LM 生成的结果之间的 KL 散度作为惩罚项。
            • 值得注意的是,可以通过多次迭代第二步和最后一步来更好地对齐LLM。
    • 5.3 高效微调
      • 首先回顾几种用于 Transformer 语言模型的代表性参数高效微调方法,然后总结现有关于参数高效微调 LLM 的工作。
      • 5.3.1 参数高效微调方法
        • 参数高效微调 (parameter-eficient fine-tuning) [228, 228–231] 是一个重要的课题,旨在减少可训练参数的数量, 同时尽可能保持良好的性能。
        • 我们将简要回顾四种用于 Transformer 语言模型的参数高效微调方法,包括适配器微调(adapter tuning) 、前缀微调(prefix tuning) 、提示微调(prompt tuning)和低秩适配(LoRA) 。
        • 适配器微调:
          • 适配器微调在 Transformer 模型中引入了小型神经网络模块(称为适配器)
          • 为了实现适配器模块, 在 [232, 233] 中提出了一个瓶颈架构,首先将原始特征向量压缩到较小的维度(然后进行非线性变换) ,然后将其恢复到原始维度。
          • 适配器模块将被集成到每个 Transformer 层中, 通常使用串行插入的方式,分别在 Transformer 层的两个核心部分(即注意力层和前馈层)之后。
          • 另外,在 Transformer 层中也可以使用并行适配器 [234],其将两个适配器模块与注意力层和前馈层并行放置。
          • 在微调过程中,适配器模块将根据特定的任务目标进行优化,而原始语言模型的参数将在此过程中保持不变。
          • 通过这种方式,我们可以在微调过程中有效地减少可训练参数的数量。
        • 前缀微调:
          • 前缀微调 [229] 在语言模型的每个 Transformer 层前添加了一系列前缀, 这些前缀是一组可训练的连续向量。。 这些前缀向量具有任务的特异性,可以视为虚拟的 token 嵌入。
          • 为了优化前缀向量,文章 [229] 提出了一种重参数化技巧,即学习一个将较小矩阵映射到前缀参数矩阵的 MLP 函数, 而不是直接优化前缀。
          • 经证明, 该技巧对于稳定训练很有帮助。 优化后, 映射函数将被舍弃, 只保留派生的前缀向量以增强与特定任务相关的性能。 由于只有前缀参数会被训练, 因此可以实现参数高效的模型优化。
          • 类似于前缀微调,p-tuning v2 [235] 特别为自然语言理解而在 Transformer 架构中引入了逐层提示向量,并且还利用多任务学习来联合优化共享的提示。
        • 提示微调:
          • 与前缀微调不同, 提示微调 [230, 236] 主要是在输入层中加入可训练的提示向量24。
          • 基于离散提示方法 [238, 239], 它通过包含一组软提示 token(以自由形式 [236] 或前缀形式 [230])来扩充输入文本,然后将扩充后的输入用于解决特定的下游任务。
          • 在实现中,任务特定的提示嵌入与输入文本嵌入相结合,然后输入到语言模型中。
          • P-tuning [236] 提出了一种自由形式来组合上下文、提示和目标 token,适用于自然语言理解和生成的架构。他们还通过双向 LSTM 学习了软提示 token 的表示。
          • 另一种称为提示微调的代表性方法 [230] , 直接在输入前加入前缀提示。在训练过程中,只有提示嵌入会根据特定任务的监督进行学习。然而,由于该方法在输入层只包含少量可训练参数,已发现其性能高度依赖底层语言模型的能力
        • 低秩适配:
          • 低秩适配(LoRA) [231] 通过添加低秩约束来近似每层的更新矩阵, 以减少适配下游任务的可训练参数。
          • 考虑优化参数矩阵 W 的情况。更新过程可以写成一般形式: W ←W + ∆W。
          • 。LoRA 的基本思想是冻结原始矩阵 W ∈ Rm×n, 同时通过低秩分解矩阵来近似参数更新矩阵 ∆W = A · B⊤, 其中 A ∈ Rm×k和 B ∈ Rn×k是用于任务适配的可训练参数, r ≪ min(m, n) 是降低后的秩。
          • LoRA 的主要优点是可以大大节省内存和存储使用(例如 VRAM) 。
          • 此外,人们可以只保留一个大型模型副本,同时保留多个用于适配不同下游任务的特定低秩分解矩阵。
          • 此外,还有几项研究讨论了如何以更有原则的方法设置秩,例如基于重要性分数的分配 [240] 和无需搜索的最优秩选择
      • 5.3.2 大语言模型上的参数高效微调
        • LoRA [231] 已广泛应用于开源 LLM (如 LLaMA 和 BLOOM)以实现参数高效微调。
          • 在这些研究尝试中, LLaMA 及其变体因其参数高效微调而受到了广泛关注。
          • 例如,Alpaca-LoRA [242] 是通过 LoRA 训练出的 Alpaca [220] (一个经过微调的 70 亿 LLaMA 模型,包含 5.2 万个人类指示遵循演示)的轻量级微调版本。在不同语言或模型大小方面, 都有对 Alpaca-LoRA 广泛的探索,可以在收集页面找到25。
          • 此外,LLaMA-Adapter [243] 将可学习的提示向量插入到每个 Transformer 层中, 其中提出了零初始化的注意力, 通过减轻欠拟合提示向量的影响以改善训练。
          • 此外,他们还将此方法扩展到多模态设置,如视觉问答。
          • 一项实证研究 [233] 检验了不同微调方法对语言模型的影响。 他们比较了四种高效微调方法, 包括串行适配器微调 [232]、并行适配器微调 [234, 244] 和 LoRA [231],在三个开源 LLM (GPT-J (6B) 、 BLOOM (7.1B) 和 LLaMA (7B) ) 上进行评估。
            • 根据在六个数学推理数据集上的实验结果,他们发现这些高效微调方法在困难任务上表现不如参考基准模型 GPT-3.5,但在简单任务上表现相当。
            • 总体而言,LoRA 在这些比较方法中表现相对较好,同时使用的可训练参数明显较少。
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

L_serein

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

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

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

打赏作者

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

抵扣说明:

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

余额充值