【论文阅读】A Deep Look into Neural Ranking Models for Information Retrieval

1.前言

2.Abstract

发展历程:传统的启发式方法->概率方法->机器学习方法->神经排序模型

==神经排序模型的强大之处在于,它能够从排序问题的原始文本输入中学习,以避免手工制作特征的许多限制。==神经网络具有模拟复杂任务的能力,这是处理排序中相关性估计的复杂性所需要的。

本文:我们将从不同的维度深入研究神经排序模型,分析其基本假设、主要设计原则和学习策略

3.Introduction

IR任务中,返回的结果通常根据某些相关概念进行排序。因此,排序模型对 IR 来说是很重要的。

过去几十年间,很多排序模型被提出:vector space模型【1】,probabilistic模型【2】,learning to rank模型(LTR)【3,4】。LTR模型已经在很多 IR 应用中取得成功(Google,Bing)

  • 一方面,大多数 LTR 模型依赖手工标注特征,设计起来费时且在定义上太具体。如果排名模型能够自动学习有用的排名特征,那将是非常有价值的。
  • 另一方面,相似度在定义上是模糊的,并且难估计。因为相似判断是基于复杂的人类认知过程的。

在本文中,我们关注的是针对于文本检索的神经排序模型,这是IR的核心。

  • 第一次成功是 2013 年的 Deep Structured Semantic Model(DSSM)【13】,是第一个直接解决 ad-hoc 检索任务的神经排序模型
  • 同年,【14】提出 DeepMatch,是一个针对基于社区的QA(CQA)和微博客匹配任务的深度匹配方法。
  • 在2014和2015年间,DSSM的变种,ARC 1, ARC2【17】,MatchPyramid【18】等模型被提出。这些研究大多关注短文本排序任务,比如 TREC QA 和 Microblog【19】
  • 2016年之后,神经排序模型的研究已经蓬勃发展,工作量巨大,讨论更加深入和严谨,应用范围也更加广泛。例如,研究人员开始讨论神经排序模型在不同排序任务中的实际效果[21,22]。神经排序模型已被应用于ad-hoc检索[23,24]、基于社区的QA[25]、会话式搜索[26]等。研究者开始越过神经排序模型的体系结构,关注神经排序模型的新训练范式[27],神经表示的替代索引方案[28],合并外部知识[29,30],以及神经方法在IR任务中的其他新应用[31,32]。
  • 目前,已经有很多好的模型,很多好的应用了。然而,仍然有很大的发展空间
    • 神经排序模型在语音识别或计算机视觉方面尚未取得神经方法所取得的突破水平;
    • 关于神经排序模型的设计原则,目前还缺乏了解和指导;
    • 我们还没有确定神经排序模型超越传统IR模型的特殊功能

与其他研究不同的是,本文不尝试去覆盖神经检索的每个方面,而是集中于,并且深入审视使用深度神经网络的排序模型。我们将从不同的维度深入研究神经排序模型,分析其基本假设、主要设计原则和学习策略,同时通过基准任务对比代表性的神经排序模型来获得综合的经验理解。

4.Major Applications of Neural Ranking Models

4.1.Ad-hoc Retrieval

概念:Ad-hoc 是经典的检索任务。用户将其信息需求通过一个 query 来查询相关文档。ad-hoc 指的是集合中的文档保持相对静态,而不断向系统提交新查询的场景。

  • 特点:查询和文档的不均匀性,这导致严重的词汇不匹配问题。
    • 查询来自一个潜在意图不明确的搜索用户,通常非常简短
    • 这些文档通常来自不同的作者,文本长度较长
  • 解决:一些理解语义的匹配可以缓解这个问题,但是精确匹配尤其是罕见 term 的匹配是必不可少的。
  • 这种非均匀性导致了不同的相似度模式,比如verbosity假设,scope假设【46】等。

ad-hoc 检索中的相关性概念很模糊,且高度依赖用户,这使得相似评价是个挑战。

4.2.Question Answering

概念:QA希望自动地基于一些信息源来回答用户以自然语言提出的问题

  • 问题可以是封闭/开放领域的
  • 信息源可以是结构化数据(知识库)或非结构化数据(文档/网页)

本文,我们关注段落回答/句子检索,因为它可以被表述为一个典型的 IR 问题,并通过深度排序模型解决。

  • 特点:
    • ad-hoc 相比,问题和答案间的非均匀性减少了
      • 一方面,问题是自然语言,比关键词查询更长且在内容描述上更清楚
      • 另一方面,答案通常是比文档短很多的文本段,有更集中的主题/语义
    • 相同的是,词汇不匹配也是 QA 的基础问题
  • 相似的定义是明确的,但评估也很难

4.3.Community Question Answering

概念:CQA致力于从 CQA 网站(Zhihu,Stack Overflow等)上存在的 QA 资源来回答用户的问题

作为检索任务,CQA可以被分为两类

  • 直接从答案池中检索答案,这与 QA 任务很像,只不过多了一些用户数据(点赞/踩)
  • 从问题池中检索相似问题,这基于一种假设:相似问题的答案可以用来回答新问题(本文CQA指这种)

由于 CQA 的输入问题与目标问题具有同质性,因此与上面两种任务有很大不同。

  • 特点:
    • CQA中的相似意味着语义相同/相似,这是清晰并且对称的
    • 但是,词汇不匹配问题仍然存在,因为问题比较短且相同内容会有不同表达

4.4.Automatic Conversation

概念:AC致力于创建一个自动的人机对话过程,用于回答问题、完成任务和社交聊天(即闲聊)【71】。

本文中,我们用IR形式将AC限制为社交聊天任务。从回话语境看,IR-based AC 可以分成单回合对话和多回合对话。

  • 特点:
    • CQA 类似,都有同质性,因为输入和回答都是短的自然语言句子
    • AC 中的相关指的是某种语义上的对应,在定义上比较广泛。因此,词汇比匹配不再是核心挑战
    • 建模关联/条理性,避免琐碎回答是关键

3.A Unified Model Formulation

神经排序模型大多是在LTR框架内研究的,本节从 LTR 问题的广义观点出发,我们给出神经排序模型的统一公式如下

  • S S S 是广义的查询集合,可以是 search queries,自然语言问题或者输入的语言
  • T T T是广义的文档集合,可以是文档,答案或者回复的集合
  • Y = { 1 , 2 , ⋯   , l } Y=\{1,2, \cdots,l\} Y={1,2,,l} 是代表分数的 label,其中 l l l 最大

现在针对具体情况

  • s i s_i si 是第 i i i 个查询
  • T i = { t i , 1 , t i , 2 , ⋯   , t i , n i } T_i=\{t_{i,1},t_{i,2},\cdots,t_{i,n_i}\} Ti={ti,1,ti,2,,ti,ni} 是与 s i s_i si 相关的文档集合
  • y i = { y i , 1 , y i , 2 , ⋯   , y i , n i } y_i=\{y_{i,1},y_{i,2},\cdots,y_{i,n_i}\} yi={yi,1,yi,2,,yi,ni}是与 s i s_i si 相关的标签集合
  • f ( s i , t i , j ) f(s_i,t_{i,j}) f(si,ti,j) 是一个将相关性评分与查询-文档对关联起来的排序函数
  • L ( f ; s i , t i , j , y i , j ) L\left(f ; s_i, t_{i, j}, \mathbf{y}_{i, j}\right) L(f;si,ti,j,yi,j) 是在 f f f 对查询-文档对及其对应标签的预测上定义的损失函数

目标:最小化下面的函数

在这里插入图片描述

可以进一步抽象成下列形式
在这里插入图片描述

  • s s s t t t 是两个输入文本
  • ψ , ϕ \psi, \phi ψ,ϕ 是分别提取 s , t s,t s,t 特征的表达函数
  • η \eta η 是从 ( s , t ) (s,t) (s,t) 对中提取特征的交叉函数
  • g g g 是基于特征表达计算相关分数的评估函数

在传统的 LTR 方法中, ψ , ϕ , η \psi, \phi,\eta ψ,ϕ,η 函数通常是固定的(人工定义的特征函数), g g g 可以是任何的机器学习模型(逻辑回归等)。在神经排序模型中,这些函数都被编码到网络结构中,这样他们都可以从训练数据中学习。

  • 传统 LTR 方法中,输入 s s s t t t 通常是原始文本
  • 神经排序模型中,输入可以是原始文本,也可以是 word embedding。也就是说, embedding映射被认为是一个基本的输入层,而不在上面三个函数中

4.Model

4.1.Symmetric vs Asymmetric Architectures

4.1.1.Symmetric Architecture

输入 s s s t t t 被认为是同质的,所以可以对输入使用对称的网络结构。对称结构指的是可以交换 s s s t t t 的位置,而不影响最终输出。

  • 两个具有代表性的对称网络结构:siamese networks(孪生神经网络),symmetric interaction networks(对称交叉网络)
    • siamese networks 字面上意味着网络结构中的对称结构。
      • DSSM【13】在统一的过程中(letter-trigram映射后面跟着MLP变换)表达两个输入文本,这里 ψ , ϕ \psi, \phi ψ,ϕ 函数是相同的。之后,使用 cos 相似度函数来分析两个表达间的相似度,这里函数 g g g 是对称的。
      • CLSM【47】将表达函数 ψ , ϕ \psi, \phi ψ,ϕ 替换成了相同的 CNN,以捕获局部词顺序信息
      • LSTM-RNN【48】将 ψ , ϕ \psi, \phi ψ,ϕ 替换成了两个相同的 LSTM,以捕获词间的 long-term 依赖
    • Symmetric interaction networks 采用了对称交互函数来表达输入
      • Arc-II【17】 在 s s s t t t 上定义了一个交互函数 η \eta η,在每个 s s s t t t 的 n-gram 对之间计算相似度,这本来就是对称的。之后,有一些卷积和 max-pooling层,这在 s s s t t t 上也是对称的
      • MatchPyramid在 s s s t t t 的每个词对之间定义了一个对称交互函数 η \eta η,来捕获细粒度交互信号。之后使用对称的评估函数

==对称结构在 CQA,AC 任务上效果很好,因为 s s s t t t 有相似的长度和形式。==有时也能用于 QA 或者 ad-hoc 检索任务,如果只使用文档标题/片段或者短的回答语句,以减少两个输入之间的异质性。

4.1.2. Asymmetric Architecture

在这里插入图片描述

两个输入被认为是异质的,因此使用不对称的网络结构。

==主要用在 ad-hoc 检索任务上,因为查询和文档本来就是异质的。==同时也可以用在QA任务上,如果需要排序的是回答的段落而不是自然语言问题。【84】

非对称结构可以主要分为三类(都是解决查询和文档间的异质性)

  • Query split 基于假设:ad-hoc 检索中的大多数查询都是基于关键词的,因此可以将查询分解成 terms 来与文档匹配

    • DRMM【21】,K-NRM【85】
  • Document split 基于假设:一个长的文档在 scope 假设下可以与查询部分相似【2】。因此可分解文档来捕获细粒度的交互信号而不是将其作为一个整体

    • HiNT【34】
  • Joint split 使用了 query split 和 document split 假设

    • DeepRank【33】

此外,在QA的神经排序模型中,还有另一个架构在引领非对称结构【one-way attention mechanism(单向注意力机制)】。它通常利用问题表示来获得对候选回答词的注意,以增强答案表示。

4.2. Representation-focused vs Interaction-focused Architectures

在这里插入图片描述

4.2.1.Representation-focused Architecture

假设:相关性依赖于输入文本的组成意义

方法:这个类别的模型通常定义复杂的表达函数 ψ , ϕ \psi, \phi ψ,ϕ(深度神经网络),但是没有交互函数,以获得输入的高层次表达,然后使用简单的评估函数 g g g(cos/MLP)来得到最终的相关性得分。

适用任务:

  • 因为基于每个输入文本的高层次表达来评估相关性,因此该结构更适用于有全局匹配需求的任务【21】
  • 同样适用于带有短输入文本的任务(因为很难从长文本中得到好的高层次表达),比如 CQA,AC
  • 该类别模型对在线计算是高效的,因为一旦 ψ , ϕ \psi, \phi ψ,ϕ 已经学习到了,就可以离线将文本表达预先计算出来

4.2.2.Interaction-focused Architecture

假设:相关性本质上是关于输入文本之间的关系,因此直接从相互作用中学习比从单独表达中学习更高效。

方法:这个类别的模型定义交互函数 η \eta η 而不是表达函数 ψ , ϕ \psi, \phi ψ,ϕ ,并且使用一些复杂的评估函数 g g g 来抽象相互作用并产生相关分数。

可以被分成两类:

  • Non-parametric Interaction functions:在没有可学习参数的情况下映射输入之间的相近/距离
    • 一些在每对输入词向量间定义:binary indicator function【18,33】,cosine similarity function【18,61,33】,dot-product function【18,33,34】,radial-basis function【18】
    • 一些在一个词向量和一组词向量间定义:DRMM【21】中的 matching histogram mapping,K-NRM【85】中的kernel polling层
  • Parametric interaction functions:从数据中学习相似度/距离函数
    • Arc-II【17】,Match-SRNN【69】

适用任务:

  • 使用细节的交互信号而不是高层次的独立文本表达,能够更好地满足特定匹配模式的需求(确切词匹配)与多种匹配需求
  • 适合异质输入的任务(ad-hoc,QA),因为避免了编码长文本的困难
  • 该类别模型对在线计算不是高效的,因为只有当看到了输入对时,才能计算交互函数 η \eta η

因此,实际使用时更好的方式是将这两种模型结合起来,representation-focused模型用在早期搜索阶段,interaction-focused模型用在后面。

4.2.3.Hybrid Architecture

结合上面两种架构,主要有两种方式

  • Combined strategy:是一种疏松的混合策略,只是简单地将两种结构都作为子模型,并且将他们的输出结合起来以评估最终相似度
    • DUET【23】
  • Coupled strategy:是一种紧密的混合策略,一个典型的方式就是利用 attention 在两种输入之间学习表达。因此,表达函数 ψ , ϕ \psi, \phi ψ,ϕ 和交互函数 η \eta η 就紧密结合了
    • IARNN【86】,CompAgg【87】

4.3.Single-granularity vs Multi-granularity Architecture

基于对相似度评估过程的不同假设,可以将神经排序模型分为以下两类

4.3.1.Single-granularity Architecture

假设:相关性可以基于从单一形式输入文本中利用 ψ , ϕ , η \psi, \phi, \eta ψ,ϕ,η 中提取的高层次特征来评估 。

这种假设下,对于评估函数 g g g 来说,表示函数和交互函数都被看成黑盒子, g g g 只取他们的最终输出来进行相关性评估。同时,输入s和t仅被视为单词或单词嵌入的一组/序列,而没有任何额外的语言结构

4.3.2.Multi-granularity Architecture

假设:相似度评估需要多粒度的特征,来源于不同维度的特征抽象或者基于输入的不同类型语言单元。

这种假设下,对于评估函数 g g g 来说,表示函数和交互函数都不再是黑盒子,我们考虑 s s s t t t 的语言结构。主要分为以下两类

  • Vertical multi-granularity:利用了深度网络的层次性,因此 g g g 可以利用特征的不同层次抽象来进行相似度估计
    • MultigranCNN【90】,MACM【91】,MP-HCNN【92】,MultiMatch【93】
  • Horizontal multi-granularity:语言有其内在结构(短语,句子等),我们应该考虑不同类型的语言单元,而不是简单的词来作为更好的相关性评估的输入。这个类别的模型主要通过从词扩展到短语/n-grams/句子来增强输入,在每一种输入形式上应用特定的单粒度结构,之后将所有维度聚合起来产生最终相关性输出。
    • 【94】,Conv-KNRM【84】,MIX【95】

多粒度体系结构是单粒度体系结构的自然扩展,它考虑了固有的语言结构和网络结构,以增强相关性估计。

适用任务:因为能提取多粒度特征,因此更适合需要细粒度匹配的任务(ad-hoc,AQ)

然而,增强的模型能力通常是以牺牲更大的模型复杂性为代价的。

5.Model Learning

5.1.Learning objective

与 LTR 算法类似,神经排序模型的学习目标可以分成三类:pointwise,pairwise,listwise

5.1.1.Pointwise Ranking Objective

思想:将排序问题简化为一组分类/回归问题

方法:给定一组查询-文档对 ( s i , t i , j ) (s_i,t_{i,j}) (si,ti,j) 和他们对应的相关标注 y i , j y_{i,j} yi,j,逐点学习的目标就是通过让其直接预测 ( s i , t i , j ) (s_i,t_{i,j}) (si,ti,j) 的相关分数来优化一个模型。损失函数基于每个 ( s , t ) (s,t) (s,t) 对独立计算

在这里插入图片描述

最常用的一个就是交叉熵:

在这里插入图片描述

  • y i , j y_{i,j} yi,j 是二值标签或者带有概率意义的标记

  • f ( s i , t i , j ) f(s_i,t_{i,j}) f(si,ti,j) 需要被缩放到 [0,1]

  • 常用的还有 Mean Square Error

该目标有两方面的优点:

  • 计算是基于每个 查询-文档 对进行的,比较简单且容易扩展
  • 损失函数的输出通常有实际意义

然而,事实上,逐点的排序目标在排序任务中不是很有效。因为没有考虑文章的偏好或顺序信息。不能保证在模型到达全局最优时,能够给出最好的排序列表。

5.1.2.Pairwise Ranking Objective

思想:优化文档间的偏好关系而不是他们的标签

方法:损失函数基于所有可能的文档对排列来计算

在这里插入图片描述

  • t i , j t_{i,j} ti,j t i , k t_{i,k} ti,k 是查询 s i s_i si 的两个文本,并且 t i , j t_{i,j} ti,j t i , k t_{i,k} ti,k 更偏好( y i , j > y i , k y_{i,j} > y_{i,k} yi,j>yi,k

比较知名的一个函数是 Hinge loss
在这里插入图片描述

  • 被广泛应用在神经排序模型中,比如DRMM【21】,K-NRM【85】

另一个常用的是成对的交叉熵:

在这里插入图片描述

理想情况下,当loss达到最小,文档间的所有偏好关系都会被满足,并且模型会为每个查询提供最优的结果列表。

然而,优化偏好并不总能提升最终的排序指标,有以下两个原因:

  • 不可能开发出一个在所有情况下都能正确预测文档偏好的模型
  • 在大多数现有排名指标的计算中,并非所有文档对都同样重要,这意味着成对偏好预测的性能并不等于最终检索结果作为一个列表的性能

5.1.3.Listwise Rankong Objective

思想:建造直接影响模型最终性能的损失函数

方法:将每个查询与其候选文档列表一起计算loss,而不是每次都比较两个文档

理论上,大多损失函数可以写成如下形式:

在这里插入图片描述

  • T i T_i Ti 是查询 s i s_i si 的候选文档集合
  • L L L 被定义为通过 y i , j y_{i,j} yi,j 排序的文档列表上的函数,我们称为 π i \pi_i πi,通过 f ( s i , t i , j ) f(s_i,t_{i,j}) f(si,ti,j) 排序的文档列表

ListMLE【98】:
在这里插入图片描述

  • P ( y i , j ∣ T i ( j ) , f ) P\left(y_{i, j} \mid \mathcal{T}_i^{(j)}, f\right) P(yi,jTi(j),f) 是利用 f f f 从最优的排序列表 π i \pi_i πi 中选择第 j j j 个文档的概率:

在这里插入图片描述

ListMLE 是给定当前排序函数 f f f 的最优排序列表的对数似然,但在实际中计算所有结果位置的对数似然是望而却步的。因此,提出了一些提到的listwise排序目标函数

  • 在深度列表文本模型中提出的 Attention Rank function【101】

在这里插入图片描述

  • 当文档标签是二值的时候,可以进一步简化为 softmax 交叉熵函数

在这里插入图片描述

  • 基于 softmax 的列表排序损失是神经排序模型中很常见的

虽然这种目标更有效,但是其计算量比较大,这也限制了其应用。

  • 适用于在小的候选文档集合上的重排序阶段

5.1.4.Multi-task Learning Objective

在某些情况下,神经排序模型的优化可能包括同时学习多个排序或非排序目标。想法是,使用一个领域的信息去帮助理解其他领域的信息。

  • 可以同时学习多种损失函数

  • 一般来说,现有的多任务学习算法使用的最常见的方法是构建共享表示,这些表示对多个任务或领域的排名都很有效。为了达成这种效果,以前的学习大都集中在模型优化上建造正则化或者限制。因此,最终的模型都不是为了某个排序目标而设计的。【104】【105】

受到 GAN 的启发,【107】提出一种对抗学习架构,该框架联合学习一个排序函数和一个能够区分的来自不同领域数据的鉴别器。通过训练排序函数生成鉴别器无法鉴别的表示,可以教会排序系统捕捉在跨域应用上适用的域-独立的模式。这是重要的,因为能够显著减轻在特定任务和领域的数据稀疏问题(可以生成各种领域的数据进行补充)。

5.2.Training Strategies

  • 有监督学习:在查询-文档对被标记时最常用的学习策略。由于神经排序模型通常是数据饥渴型的,在这种训练范式下,由于标注数据(人工标注)的有限性,学术研究者只能学习参数空间有限的模型。

  • 弱监督学习:一种在查询-文档标签使用现存的检索模型自动生成情况下的学习策略。这种学习策略不需要标记训练数据

  • 半监督学习:利用一小组有标签查询-文档对加上一大组无标签数据

6.Model Comparison

6.1.Empirical Comparison on Ad-hoc Retrieval

ad-hoc检索的几个代表性数据集:

  • Robust04:查询来着 TREC Robust Track 2004
  • G o v 2 M Q 2007 Gov2_{MQ2007} Gov2MQ2007:是 Web Track ad-hoc检索数据集,集合是Gov2语料库
  • Sougou.com:基于从搜狗网的搜索日志中抽取的查询日志
  • WT09-14:是 2009-2014 TREC Web Track,基于 ClueWeb09和ClueWeb12数据集

在这里插入图片描述

从表中,我们可以得到以下观察:

  • 概率模型(QL,BM25)虽然简单,但是可以得到很好地结果。带有人设计特征的传统的 PRF(pseudo-relevance feedback)模型(RM3)和LTR模型(RankSVM,LambdaMart)是很强的基准,难以被基于原始文本的大多数神经排序模型打败。然而,PRF技术也能被用于增强神经排序模型(SNRM+PRF【28】,NPRF+DRMM【119】),同时人设计的 LTR 特征也能融合进神经排序模型【33,31】来提升排序效果。
  • 随着时间的推移,神经排序模型架构似乎发生了范式转变,从对称到非对称,从以表示为中心到以交互为中心。这与我们之前的分析是一致的,非对称和基于交互的结构更适合本身就具有异质性的 ad-hoc 检索任务
  • 在查询和标签的不同数量方面,神经模型的数据量更大,相对于非神经模型,神经模型更有可能实现更大的性能改进。基于原始文本最好的神经模型,在Sogou-Log数据集上能够显著超过带有人工标注特征的 LTR 模型
  • 一般来说,我们观察到不对称的、以交互为中心的、多粒度的体系结构比对称的、以表示为中心的、单粒度的体系结构在 ad-hoc 检索任务上工作得更好

6.2.Empirical Comparison on QA

主要依赖于三个 QA 数据集:TREC QA【124】,WikiQA【37】,Yahoo!Answer【88】

  • 前两个是答案句子挑选/检索数据集,通常包含事实性问题
  • 后一个是从 CQA 网站 Yahoo!Answer 上采样的答案段落检索数据集

在这里插入图片描述

从表中,我们可以得到如下观察:

  • 与 ad-hoc 检索不同,对称结构在 QA 任务上应用更广泛,可能是由于问题和答案之间的同质性增加了,特别是对于像TREC QA 和 WikiQA 这样的答案句检索数据集。
  • 短回答句检索数据集(TREC QA and WikiQA)更多地采用了以表示为中心的体系结构,以交互为中心的结构更多用在长答案段落检索数据集(Yahoo!Answer)。与ad-hoc检索不同,这两种结构没有哪一个更好
  • 与 ad-hoc 检索相似,在大数据集上,神经模型相较于非神经模型更可能获得大的提升
  • 性能通常会随着时间的推移而提高,这可能是由于增加了模型容量以及采用了一些先进的方法

Trending Topics

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

长命百岁️

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

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

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

打赏作者

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

抵扣说明:

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

余额充值