Embedding—通过对比学习微调模型以获取学术文献句子嵌入:CLASSIFICATION AND CLUSTERING OF SENTENCE-LEVEL EMBEDDINGS OF SCIENT

CLASSIFICATION AND CLUSTERING OF SENTENCE-LEVEL EMBEDDINGS OF SCIENTIFIC ARTICLES GENERATED BY CONTRASTIVE LEARNING

通过对比学习生成的科学文章句子级嵌入的分类和聚类

paper: https://arxiv.org/abs/2404.00224

github: https://github.com/myblindcode/sentence_embeddings

该论文的目标是微调一个针对学术文献的句子特征,使用科学文献数据集,通过有监督对比学习的方式微调scibert和MiniLM,标签为:背景,目标,方法,结果,其他。对文章中标题为相应标签的章节中的句子打标为相应的标签,从而进行微调。

Dataset:CSAbstruct、PubMed-RCT 20k和 PMC-Sents-FULL

1.背景动机

介绍文献定位任务的背景:

文章的结构可能各不相同,但通常都有一个共同的结构,描述如下。

  • 背景:说明问题和开展研究的动机。
  • 目标:包含研究目的。
  • 方法:详细说明开展研究的所有步骤,以确保可重复性。
  • 结果:报告研究结果。

虽然这些元素可能存在于文章中,但相应的部分可能没有明确定义。因此,必须在文章文本中检测和定位这些元素。

介绍本文的工作:

在这项工作中,通过对比学习对 sentences transformer 模型进行了微调,以根据上述科学文章的标签生成句子级嵌入。

微调过程包括按照特定的训练目标对现有的预训练神经网络进行训练。在我们的工作中,我们采用了对比学习,重新安排句子在嵌入空间中的空间分布。因此,通过对比学习,相同标签的句子在嵌入空间中的位置会越来越近,而不同标签的句子则会被推开。对 ST 模型进行微调后,我们在下游的监督和非监督任务中对生成的嵌入进行了评估:聚类和分类

我们使用了三个数据集进行微调,一个来自计算机科学领域,两个来自医学领域。在后者中,我们引入了 PMC-Sents-FULL,这是一个从 PubMed 科学文章全文中提取句子的新型数据集。研究证实了以下问题:

问题 1:使用微调句子嵌入进行聚类优于使用非微调嵌入
问题 2:与非微调嵌入式相比,使用微调句子嵌入式时,传统分类器的性能会提高
问题 3:使用经过微调的句子嵌入作为分类器的输入特征,其性能优于直接作为句子分类器进行微调的模型

2.MODEL

这项工作包括使用 CSAbstruct、PubMed-RCT 20k和 PMC-Sents-FULL 数据集中句子的相应标签,通过对比学习对 ST 模型进行微调。

1.Contrastive learning,对比学习:

Triplet Loss函数如公式 1 所示,其中 d 是距离函数(如欧几里得),a 是锚点,p 是相似的正样本,n 是不相似的负样本,m 是 p 和 n 之间的强制差值。
L Θ r + t = max ⁡ ( d ( a , p ) − d ( a , n ) + m , 0 ) (1) \mathcal{L}_{\mathit{\Theta r+t}}=\max(d(a,p)-d(a,n)+m,0) \tag{1} LΘr+t=max(d(a,p)d(a,n)+m,0)(1)

2.PMC-Sents-FULL Dataset Creation:

PMC-Sents-FULL以PubMed Central为基础,下载了约 300,000 篇文章,并通过以下生成了最终数据集:

1.筛选出标题中包含四个标签(背景、目标、方法_和_结果)的文章。使用了精确匹配的关键词列表,只保留了包含所有四个标签的文章;
2.用标记符号(即 @table@fig)替换表格和数字的引用,从而对文本进行了清理;
3.使用spaCy 将章节文本分割成句子;
4.使用相应的章节标题作为标签为每个句子标注,包括第五个其他标签

Training,训练:

本文选择了两个模型进行微调:SciBERT 和 all-MiniLM-L6-v2(MiniLM)。

SciBERT是一个基于 BERT 的科学领域语言模型。该模型是在Semantic Scholar数据库中的 114 万篇文章的全文上进行训练的。SciBERT 的输入限制为 512 个词组,生成的嵌入维数为 768 维。

all-MiniLM-L6-v2 是一个 ST 模型,由的预训练 MiniLM 模型在超过 10 亿对样本的基础上微调而成。它的输入限制为 256 个词组,生成的嵌入维数为 384 维。用以下参数对模型进行了微调:

  • Epochs:20。
  • Batch size:所有数据集的 all-MiniLM-L6-v2 为 32;SciBERT 为 32(仅 CSAbstruct);其余数据集的 SciBERT 为 16。
  • 学习率:2e-5。
  • warm up:训练数据的 10%。
  • pooling method:平均池化。
  • Loss:BatchAllTripletLoss.

SciBERT 和 MiniLM 作为分类器也进行了微调,即在所有三个数据集中都进行了标签预测,而不是生成嵌入。这些分类器的训练时间为 20 个epochs,batch size为 16,[CLS] 标记被用作分类的句子表示。

3.原文阅读

ABSTRACT

科学文章是长篇文本文档,按章节编排,每个章节描述研究的各个方面。由于可用文章数量的增加,分析科学成果变得越来越具有挑战性。在这种情况下,我们的方法包括微调transformer语言模型,以便从科学文章中生成句子级嵌入,同时考虑以下标签:背景、目的、方法、结果和结论。我们通过对比学习在三个数据集上对模型进行了训练。其中两个数据集来自计算机科学和医学领域的文章摘要。此外,我们还引入了 PMC-Sents-FULL,这是一个从医学文章全文中提取句子的新数据集。我们在聚类和分类任务中比较了微调模型和基线模型,以评估我们的方法。平均而言,聚类一致性测量值高出五倍。在分类测量方面,在最佳情况下,我们的 F1-micro 平均提高了 30.73%。结果表明,通过对比学习微调句子transformer,并在下游任务中使用生成的嵌入是科学文章句子分类的可行方法。我们的实验代码可在 GitHub 上获取。

1.Introduction

介绍文献定位任务的背景:

在科学界,知识的传播主要是通过发表文章来完成的。科学文章是长篇文本文件,按章节编排。尽管文章的结构可能各不相同,但它们通常都有一个共同的结构,可以描述如下。

  • 背景:说明问题和开展研究的动机。
  • 目标:包含研究目的。
  • 方法:详细说明开展研究的所有步骤,以确保可重复性。
  • 结果:报告研究结果。

虽然这些元素可能存在于文章中,但相应的部分可能没有明确定义。因此,必须在文章文本中检测和定位这些元素。

在自然语言处理(NLP)中,嵌入将文本表示为固定大小的实数向量。嵌入可以表示单个单元(如单词),也可以表示较长的序列(如句子或整个文档)。嵌入可以通过在文本数据集上训练一个名为 "sentence transformer(ST)模型 "的深度人工神经网络来学习。

介绍本文的工作:

与预测标签的分类模型不同,ST 模型输出的是嵌入。在这项工作中,我们通过对比学习对 ST 模型进行了微调,以根据上述科学文章的标签生成句子级嵌入。

微调过程包括按照特定的训练目标对现有的预训练神经网络进行训练。在我们的工作中,我们采用了对比学习,重新安排句子在嵌入空间中的空间分布。因此,通过对比学习,相同标签的句子在嵌入空间中的位置会越来越近,而不同标签的句子则会被推开。对 ST 模型进行微调后,我们在下游的监督和非监督任务中对生成的嵌入进行了评估:聚类和分类

我们使用了三个数据集进行微调,一个来自计算机科学领域,两个来自医学领域。在后者中,我们引入了 PMC-Sents-FULL,这是一个从 PubMed 科学文章全文中提取句子的新型数据集。

最后,我们的研究还探讨了如何在监督和非监督任务中使用对比微调模型生成的句子嵌入。因此,我们的工作有以下研究问题(RQ):

问题 1:使用微调句子嵌入进行聚类是否优于使用非微调嵌入?
问题 2:与非微调嵌入式相比,使用微调句子嵌入式时,传统分类器的性能是否会提高?
问题 3:使用经过微调的句子嵌入作为分类器的输入特征,其性能是否优于直接作为句子分类器进行微调的深度学习模型?

2 Related Works

在这项工作中,我们训练了具有对比学习能力的 ST 模型,以便从科学文章中生成句子级嵌入,并考虑到以下标签:背景、目的、方法、结果和结论。

在本节中,我们将分三组介绍相关工作。第一组涉及句子分类,即训练一个分类器来标记每个句子。第二组涉及文本聚类。最后一组涉及科学文章的表示,其中一个模型输出文档级嵌入。

Dernoncourt 和 Lee的研究重点是序列句子分类(SSC)任务。该任务涉及给由 n 个连续句子组成的输入句子标注每个句子。他们的研究在 SCC 任务中引入了 PubMed-RCT 20k 和 PubMed-RCT 200k 数据集,并使用了人工神经网络。

Jin 和 Szolovits通过实施层次序列标签网络 (HSLN) 模型来解决 SCC 问题。他们的 HSLN 架构有一个上下文丰富层,可捕捉并纳入输入序列周围句子的上下文信息。训练和测试在 PubMed-RCT 数据集上进行。

Cohan 等人[5]为科学文章摘要中的 SCC 提出了一个模型架构。该模型在每个 [SEP] 上都有一个分类层,[SEP] 是 SciBERT 模型 [6] 中一个特殊的句子分隔符。因此,给定一组[SEP]分隔的句子,每个句子都会被归类到一个特定的标签下。他们还发布了 CSAbstruct 数据集,这是一个人工标注的计算机科学摘要句子数据集。

Brack 等人[7]为跨领域科学文章中的 SCC 提出了一种统一的方法。他们使用 SciBERT 生成词嵌入,使用 HSLN 进行句子分类。在实验中,他们使用了四个数据集:两个来自摘要,两个来自文章全文。此外,他们还通过混合这四个数据集创建了第五个数据集。

接下来,我们将介绍以文本聚类为重点的相关工作,即对相似文本进行分组。

Subakti 等人[8]的研究比较了术语频率反向文档频率(TF-IDF)和 BERT 表示法之间的文本聚类。TF-IDF 仅使用术语频率生成文本的向量表示,而 BERT 则通过考虑术语在文本中的位置来捕捉上下文。在 36 项指标中,BERT 有 28 项优于 TF-IDF。

Ravi 和 Kulkarni [9]在两个主题的社交媒体数据上使用 k-means 聚类算法探索了四种单词嵌入表示法。研究表明,BERT 模型的准确率最高,达到 98%,在使用 K-means 算法进行聚类时表现最佳。在接下来的段落中,我们将讨论属于第二组的相关工作,主要围绕为科学文章创建表征。

SPECTER [10] 是一种神经语言模型,可从科学文章的标题和摘要文本的连接中生成文档级嵌入。该模型是通过使用三重边际损失(Triplet Margin Loss)对 SciBERT 进行微调而创建的,其中引用被用作文章相关性的信号。这样,每个样本都由一篇锚文章、一篇被视为正样本的引用文章和一篇作为负样本的非引用文章组成。因此,生成的嵌入旨在捕捉文章之间的相似性。

Ostendorff 等人[11]探索了不同的采样策略,以训练与 SPECTER 具有相同相似性目标的模型。他们的抽样方法使用了引文图嵌入的近邻策略,与 SPECTER 相比,改进了大部分结果。

如前所述,相关工作都基于 SSC 或文档级嵌入生成。大多数方法只使用标题和摘要文本,而使用全文时,数据集的文章数量较少,如文献[7],只有 225 篇文章。

与已提交的相关作品相比,本作品的创新之处在于

  1. 对生成的句子级嵌入进行对比学习微调;
  2. 在下游聚类和分类任务中使用这些微调嵌入;
  3. 发布从 1,569 篇科学文章全文中提取的句子的新数据集。

3 Methodology

这项工作包括使用 CSAbstruct、PubMed-RCT 20k和 PMC-Sents-FULL 数据集中句子的相应标签,通过对比学习对 ST 模型进行微调。随后,我们评估了将这些嵌入作为分类器模型和聚类算法的输入特征的有效性。

我们的方法如图 1 所示,包括两个阶段。在第一阶段(以绿色标出),我们通过对比学习微调 ST 模型,利用每个句子的相应标签生成句子级嵌入。随后,我们通过将句子编码成嵌入词,并根据相应的标签训练分类器来评估每个微调后的 ST 模型。至于聚类,我们使用生成的嵌入。

接下来的 3.1 小节详细介绍了对比学习的微调。3.2 小节介绍了 PMC-Sents-FULL 的创建。第 3.3 小节包含所有数据集的特征和分析。最后,第 3.4 小节介绍了评估过程。

在这里插入图片描述

3.1.Contrastive learning

对比学习会调整网络权重,使相似样本在嵌入空间中越来越近,而不相似样本则越来越远。对比学习有两个著名的损失函数:对比损失和三重损失。

对比损失以 ( a , b , ρ ) (a,b,\rho) (a,b,ρ) 格式检测样本,其中 a a a b b b 是一对样本, ρ = { 0 , 1 } \rho=\{0,1\} ρ={0,1} 是标签, 0 0 0 表示不相似的样本对, 1 1 1 表示相似的样本对。三元组损失(Triplet Loss)希望样本为 ( a , p , n ) (a,p,n) (a,p,n) 三元组格式,其中 α \alpha α 为锚样本, p p p 为与 α \alpha α 相似的样本, n n n 为与 α \alpha α 不相似的样本。

相比之下,对比损失(Contrastive Loss)的缺点是会将所有相似样本推向嵌入空间的同一点,因为它会迫使相似样本对之间的距离为零。另一方面,Triplet Loss 可以最小化锚点和正样本之间的距离,同时最大化负样本之间的距离,从而保留标签内的方差,并在出现异常值时进行更好的调整。

三重损失函数如公式 1 所示,其中 d 是距离函数(如欧几里得),a 是锚点,p 是相似的正样本,n 是不相似的负样本,m 是 p 和 n 之间的强制差值。
L Θ r + t = max ⁡ ( d ( a , p ) − d ( a , n ) + m , 0 ) (1) \mathcal{L}_{\mathit{\Theta r+t}}=\max(d(a,p)-d(a,n)+m,0) \tag{1} LΘr+t=max(d(a,p)d(a,n)+m,0)(1)
在这项工作中,微调方法以 [14] 为基础,该方法在维基百科文章中使用了双向长短期记忆(Bi-LSTM)神经网络架构中的三重损失(Triplet Loss)。他们指出,“属于同一版块的句子通常比出现在不同版块的句子在主题上更相关”。

Sentence BERT (SBERT) 源自 [15],是一个生成句子和短文本级嵌入的框架。在可用的损失中,BatchAllTripletLoss 接受(s, ρ)格式的成批样本,其中 s 是一个句子,ρ 是相应的标签。我们使用 BatchAllTripletLoss 函数对我们的模型进行了微调。

BatchAllTripletLoss 会计算批次中每个有效三元组的损失。这意味着它将相同值的 ρ 视为相似样本,而将不同值的ρ 视为不相似样本。BatchAllTripletLoss 背后的概念是,通过对整个数据集进行长时间的迭代,所有潜在的正对都变得可以观察到。

3.2.PMC-Sents-FULL Dataset Creation

PMC-Sents-FULL以PubMed Central为基础,PubMed Central以XML格式提供医学论文子集的开放访问。我们下载了约 300,000 篇文章,并通过以下程序生成了最终数据集:

1.筛选出标题中包含四个标签(背景、目标、方法_和_结果)的文章。我们使用了精确匹配的关键词列表,只保留了包含所有四个标签的文章;
2.用标记符号(即 @table@fig)替换表格和数字的引用,从而对文本进行了清理;
3.使用[16]中的 spaCy 将章节文本分割成句子;
4.使用相应的章节标题作为标签为每个句子标注,包括第五个其他标签

最后,由于在步骤 1 中进行了过滤,PMC-Sents-FULL 共有 1,569 篇文章和 173,092 个句子。PMC-Sents-FULL按80%/10%/10%的比例对训练集/验证集/测试集进行了分层(138,473;17,309;17,310)。下一节,我们将对本研究中使用的三个数据集进行分析。

3.3.Datasets Characteristics and Analysis

表 1 总结了用于微调模型的三个数据集的特点:CSAbstruct、PubMed-RCT 20k和 PMC-Sents-FULL。

在分析数据集时,我们发现了句子文本相同但标签不同的样本:CSAbstruct 中有 85 个,PubMed-RCT 20k 中有 161 个。我们将这些样本排除在所有训练集、验证集和测试集中。

在这里插入图片描述

表 2 列出了训练集的标签分布情况。从中我们可以看出以下亮点:

  • 这三个数据集共享_背景_、目标、_方法_和_结果_标签;
  • PubMed-RCT 20k 是唯一有_conclusion_标签的数据集,但缺少_other_标签。然而,other 标签对于识别目标标签之外的句子是必不可少的。
  • PMC-Sents-FULL 考虑的是文章全文,因此它的 other 标签比例要高得多。
  • 比较 CSAbstruct 和 PMC-Sents-FULL,如果我们将相关(背景目标方法_和_结果)和不相关(其他)的二进制值标签进行转换,在 CSAbstruct 中,相关样本占 99.40%,不相关样本仅占 0.60%,而在 PMC-Sents-FULL 中,相关样本占 46.34%,不相关样本占 53.66%,分布更为均匀。

最后,如第 3.1 节所述,由于我们使用三重损失进行微调,因此我们创建了验证集,每个样本包含一个三重损失,随机选择正样本和负样本。

3.4.Models Evaluation

为了评估我们的模型,我们使用五种分类算法和一种聚类算法比较了基线(非微调)模型和微调模型生成的嵌入。

在聚类方面,我们使用调整后兰德指数(ARI)和调整后互信息(AMI)聚类一致性度量以及剪影得分(Sil)对微调模型进行评估。ARI 和 AMI 是生成的分区与已知分区之间的一致性度量。因此,我们使用测试集的地面实况标签作为已知分区。至于 Sil,它通过计算簇内和簇间样本的平均距离来衡量簇内样本的凝聚力和簇的分离度。

4 Experiments

在本节中,我们将介绍在第 3 节介绍的三个数据集中对 ST 模型进行的微调训练以及我们的评估方法。

Training

我们选择了两个模型进行微调:SciBERT 和 all-MiniLM-L6-v2(MiniLM)。

之所以选择[6]中的 SciBERT,是因为它是一个基于 BERT 的科学领域语言模型。该模型是在Semantic Scholar数据库中的 114 万篇文章的全文上进行训练的。值得注意的是,SciBERT 的输入限制为 512 个词组,生成的嵌入维数为 768 维。

MiniLM 是一种用知识提炼技术训练的语言模型,这种技术将一个较大的模型(教师模型)压缩成一个较小的模型(学生模型)。学生模型的性能与教师模型相似,甚至更好,但参数更少,微调和推理所消耗的计算资源更少。all-MiniLM-L6-v2 是一个 ST 模型,由的预训练 MiniLM 模型在超过 10 亿对样本的基础上微调而成。它的输入限制为 256 个词组,生成的嵌入维数为 384 维。

用以下参数对模型进行了微调:

  • Epochs:20。
  • Batch size:所有数据集的 all-MiniLM-L6-v2 为 32;SciBERT 为 32(仅 CSAbstruct);其余数据集的 SciBERT 为 16。
  • 学习率:2e-5。
  • warm up:训练数据的 10%。
  • pooling method:平均池化。
  • Loss:BatchAllTripletLoss.

SciBERT 和 MiniLM 作为分类器也进行了微调,即在所有三个数据集中都进行了标签预测,而不是生成嵌入。这些分类器的训练时间为 20 个epochs,batch size为 16,[CLS] 标记被用作分类的句子表示。

4.1.Evaluation

我们的评估方法包括通过聚类和分类,对基准 ST 模型和微调 ST 模型生成的句子嵌入进行比较。

为了进行聚类,我们在测试集上使用了 k-means 算法,并计算了 ARI、AMI 和 Silhouette 分数。ARI 和 AMI 是使用 k-means 算法生成的分区计算的,而已知分区则是贴有标签的测试集。我们设定聚类的总数等于每个相应测试集中不同标签的总数。

在分类任务中,我们使用 ST 微调模型生成的句子嵌入作为输入特征来训练每个分类器。至于分类器的训练参数,只改变了 KNN 的默认参数。我们使用样本总数的平方根作为 “邻居数量”,并将 "权重函数 "设置为 “距离”,这样在分配标签时,距离较近的邻居会有更大的影响力。

5 Results

在这里插入图片描述

聚类和分类结果分别见表 3 和表 4。黑体表示每个 ST 模型(MiniLM 或 SciBERT)中的最高值,下划线表示所有分类器中的最高值,与 ST 模型无关。

第一个研究问题(RQ1)是评估微调对聚类的影响。因此,表 3 列出了每个测试集中测得的 ARI、AMI 和 Sil 值。测试集中的聚类一致性测量值。

为了提供可视化信息,我们使用 t 分布随机邻域嵌入(t-SNE)将 CSAbstruct 和 PubMed-RCT 的样本绘制成二维图。图 2 给出了基线模型和微调后的 SciBERT 模型在二维嵌入空间中样本分布的全貌。这种可视化显示了聚类效果的显著提高。

研究问题 RQ2RQ3 与使用微调模型的嵌入进行分类的性能有关。表 4 列出了使用 F1-micro 对每个测试集进行分类的结果。RQ3 也需要微调 SciBERT 和 MiniLM 作为分类器模型。我们使用 [CLS] 标记作为句子表示。在表 4 中,这两行分别为第 6 行和第 17 行。

在这里插入图片描述

6 Discussion

在这里插入图片描述

在这里插入图片描述

在本节中,我们将讨论与研究问题 RQ1RQ2RQ3 相关的结果。

首先,如表 3 所示,我们看到微调模型的所有聚类指标都有了巨大改善。就 SciBERT 而言,其平均值是基线模型的五倍多。比较 SciBERT 和 MiniLM,我们发现 SciBERT 的 ARI 和 AMI 较高,但 Sil 较低。因此,使用三重损失(Triplet Loss)进行微调可以大大提高聚类效果,这就回答了_RQ1_的问题。

在分类方面,在比较相同分类器的结果时,经过微调的嵌入优于除 CSAbstruct 的 SVM 之外的所有基线模型。SciBERT 基线模型的性能更优,分别为 76.20 和 75.76(表 4 第 16 行和第 22 行)。不过,两者的差距仅为 0.44。

表 5、表 6 和表 7 以表格形式列出了分类对比数据。所有表格中都有一个 delta 百分比 (D%) 栏,显示微调模型和基线模型之间的差异。

表 5 列出了每个数据集的最佳分类器结果。经过微调后,MiniLM 和 SciBERT 均有所改进。值得注意的是,MiniLM 的平均改进幅度是 SciBERT 的三倍多,分别为 30.73% 和 8.45%。造成这种差异的原因是,SciBERT 是在科学文本中进行训练的,并且拥有特定的词汇,因此它已经更加适应这一领域。这一观察结果凸显了在分类的背景下,词汇本身对嵌入表征的重要影响。

对比学习微调对使用距离作为推理相似性度量的分类器大有裨益。KNN 就是这种情况,它在推理时会在向量空间中搜索最接近的相似样本。因此,表 6 比较了微调模型和基线模型的 KNN 性能。结果表明,KNN 有了相当大的改进。我们还引入了最后一列,显示 KNN 与表 5 中最佳分类器之间的微小差异。

根据表 5 和表 6 的结果,我们得出结论:用于分类的微调嵌入式性能优于非微调嵌入式,回答了 RQ2 的问题。

最后,表 7 比较了我们的方法与作为句子分类器训练的 SciBERT 和 MiniLM 语言模型。在所有数据集中,我们的方法都优于这些分类器。其中对 RQ3 的回答是肯定的。

7.CONCLUSION

这项研究提出了一种对科学文章进行句子分类的方法,即通过对比学习微调 ST 模型,并使用生成的嵌入进行聚类和分类。针对两个基线(非微调)模型,特别是 SciBERT 和 MiniLM,对微调模型进行了评估。

至于 MiniLM 和 SciBERT,后者的总体性能最佳。我们认为原因如下:a) SciBERT 拥有科学领域的词汇;b) SciBERT 支持的输入大小是 MiniLM 的两倍(512/256),输出的嵌入大小是 MiniLM 的两倍(768/384)。
对于引言(第 1 节)中提出的三个研究问题,我们都做出了积极的回应,因为微调模型的性能优于基线模型。
最后,对于未来的工作,重要的是要评估更大批次规模的结果,因为这会在损失函数中产生更多变化,并影响训练过程。此外,考虑到更大的上下文,定义新的方法来丰富生成嵌入的语义,最后,探索其他对比损失函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值