返回介绍

数学基础

统计学习

深度学习

工具

Scala

三十七、CERT [2020]

发布于 2023-07-17 23:38:25 字数 45449 浏览 0 评论 0 收藏 0

  1. 大规模的 pretrained language representation model (如 BERT, GPT, BART 等),在各种自然语言处理任务中取得了卓越的性能,如文本生成、阅读理解、文本分类等任务。这些模型的架构大多基于 Transformer ,它使用自注意力来捕获 token 之间的长距离依赖关系。Transformer 编码器或解码器通过自监督任务在大规模文本语料库上进行预训练,这些自监督任务包括:预测 masked tokenBERT ),生成 future tokenGPT),恢复 corrupted tokenBART )等等。在这些工作中,要预测的 target 大多是在 word level 。因此,sentence level 的全局语义可能没有被充分捕获。

    为了解决这个问题,论文 《CERT: Contrastive Self-supervised Learning for Language Understanding》 提出了 CERT:Contrastive self-supervised Encoder Representations from Transformers ,它使用 contrastive self-supervised learning: CSSL 来学习 sentence-level representation

    最近,CSSL 在以无监督的方式学习 visual representation 方面显示出很好的效果。CSSL 的关键思想是:创建原始样本的 augmentation ,然后通过预测两个augmentation是否来自同一个原始数据样本来学习 representationCERT 使用 back-translation《Understanding back-translation at scale》)创建句子的增强 augmentation ,然后通过预测两个 augmentation 是否来自同一个原始句子来微调 pretrained language representation model (例如 BERT, BART )。现有的预训练方法在 token 上定义 prediction task 。相反,CERTsentence 上定义 prediction task,这可以推测在 sentence level 更好地捕获全局语义。

    CERT 使用 back-translation 来对句子执行 augmentation 。给定源语言 source languageS$ \mathcal S $ 的一个句子x$ \mathbf x $ ,CERT 使用S-to-T$ \mathcal S\text{-to-}\mathcal T $ 的翻译模型将x$ \mathbf x $ 翻译到目标语言 target languageT$ \mathcal T $ 的句子y$ \mathbf y $ ,然后再使用T-to-S$ \mathcal T\text{-to-}\mathcal S $ 的翻译模型将y$ \mathbf y $ 翻译到源语言S$ \mathcal S $ 的句子x$ \mathbf x^\prime $ 。x$ \mathbf x^\prime $ 被视为x$ \mathbf x $ 的一个 augmentation 。不同目标语言的翻译模型被用来创建同一个源句的不同的 augmentation

    要求有合适的翻译模型,并且翻译模型的质量会影响 CERT 的效果。

    给定 augmented sentencesMomentum Contrast: MoCo 方法(《Momentum contrastfor unsupervised visual representation learning》)被用来执行 CSSLMoCo 维护一个关于 augmented sentences (称作 keys)的队列,该队列使用带有动量更新的 pretrained text-encoder (例如 BERT )进行编码。给定一个 augmented sentence (称为 query),通过 BERT (或任何其他pretrained text-encoder )来计算 query encoding 与队列中每个 key embedding 之间的相似性分数。如果 querykey 是同一个原始句子的 augmentation ,则它们被标记为 positive pair ,否则被标记为 negative pair 。这些二元标签和相似性分数被用来计算 contrastive losspretrained text encoder 的权重是通过最小化 contrastive loss 来进一步预训练的。为了在下游任务上应用 pretrained CERT modelCERT 使用下游任务的输入数据和标签对 CERT 的权重进行微调。

    也可以用 in-batch 负样本来代替这里的 MoCo 方法。

    CERT 是一个灵活的模块,可以与任何 pretrained language representation model 集成,如 BERT, BART, ERNIE 2.0, T5 等。作者在 GLUE benchmark 中的 11 个自然语言理解任务上评估了 CERT ,其中 CERT7 个任务上优于 BERT ,在 2 个任务上达到与BERT 相同的性能,而在 2 个任务上表现比 BERT 差。在 11 项任务的平均得分上,CERT 优于 BERT 。这些结果表明,通过捕获 sentence-level 的语义,针对 language representationcontrastive self-supervised learning 的有效性。

    论文贡献:

    • 提出了 CERT ,一种基于 contrastive self-supervised learning 的新的 language representation pretraining 方法。CERT 是在 sentence level 定义了 predictive task ,因此预计可以更好地捕获 sentence-level 的语义。

    • GLUE benchmark11 个自然语言理解任务上对 CERT 进行了评估,CERT11 个任务的平均得分上优于 BERT

    • 进行了消融研究,以研究 CERT 的性能如何受到 sentence augmentation 方法和预训练语料源的影响。

    CERT 是针对 sentence embedding 的一系列对比学习方法中的一种。这些对比学习方法的核心在于:如何创建 augumentation、对比学习的负样本。

  2. 相关工作:

    • 针对 learning language representationpretraining:最近,在大规模文本语料库上进行 language representation learning 的预训练已经取得了实质性的成功。

      • GPT 模型是一个基于 Transformer 的语言模型( language model: LM )。Transformer 定义了在给定 input sequence 的条件下得到 output sequence 的条件概率。与 Transformer 不同,GPT 定义了在单个 output sequence 上的边际概率。在 GPT 中,给定历史序列的条件下,next token 的条件概率是通过 Transformer decoder 来定义的。权重参数是通过最大化 token 序列的可能性来学习的。

      • GPT-2GPT 的扩展,它对 GPT 进行了修改,将 layer normalization 作用到每个 sub-block 的输入,并在 final self-attention block 后增加一个 additional layer normalizationByte pair encoding: BPE 被用来表示 token 的输入序列。

      • BERT-GPT 是一个用于 sequence-to-sequence modeling 的模型,其中 pretrained BERT 被用来编码输入文本,pretrained GPT 被用来生成输出文本。在 BERT-GPT 中,BERT encoderGPT decoder 的预训练是单独进行的,这可能导致性能下降。

      • Auto-Regressive Transformer BART 具有与 BERT-GPT 类似的架构,但对 BERT encoderGPT decoder 进行联合训练。为了预训练 BART 权重,输入文本被随机破坏,如 token maskingtoken deletion 、文本填充等,然后学习网络以重建原始文本。

      • ALBERT 使用parameter-reduction 方法来减少内存消耗并提高 BERT 的训练速度。它还引入了自监督损失用于建模句子间的一致性 inter-sentence coherence

      • RoBERTa 是一项关于 BERT 预训练的复现研究。它表明,通过仔细调优训练过程,BERT 的性能可以得到显著的改善,如:用更多的数据、更大的 batch size 、更长的训练时间;移除 next sentence prediction objective ;在更长的序列上训练。等等。

      • XLNet 通过对 factorization order 的所有排列的 expected likelihood 的最大化,从而来学习 bi-directional context ,并使用广义自回归预训练机制 generalized autoregressive pretraining mechanism 来克服 BERTpretrain-finetune discrepancy

      • T5 比较了各种语言理解任务的预训练目标、架构、未标记数据集、transfer 方法,并提出了一个统一的框架,将这些任务转换为一个 text-to-text 的任务。统一的模型在一个大型的 Colossal Clean Crawled Corpus: C4 上进行训练,然后被迁移到各种各样的下游任务中。

      • ERNIE 2.0 提出了一个 continual pretraining framework ,该框架通过持续的多任务学习来建立和学习 incrementally pretraining task ,以捕获训练语料中的词法信息、句法信息、以及语义信息。

    • Contrastive Self-supervised learningContrastive self-supervised learning 最近引起了很多研究兴趣。

      • 《Data-efficient image recognition with contrastive predictive coding》 研究了基于 contrastive predictive codingdata-efficient 的图像识别,它通过使用强大的自回归模型在潜在空间中预测未来。

      • 《Curl: Contrastive unsupervised representations for reinforcement learning》提出了为强化学习来学习 contrastive unsupervised representation

      • 《Supervised contrastive learning》 研究了 supervised contrastive learning ,其中属于同一类别的数据点的 clusterembedding 空间中被拉到一起,而来自不同类别的数据点的 cluster 被推开。

      • 《Contrastive self-supervised learning for commonsense reasoning》 提出了一种用于常识推理的 contrastive self-supervised learning 的方法。

      • 《Sample-effcient deep learning for covid-19 diagnosis based on ct scans》 提出了一种 Self-Trans 方法,该方法在通过 transfer learning 从而在 pretrained network 之上应用 contrastive self-supervised learning

37.1 模型

  1. 针对 pretraining language representation 模型的最近的工作中,大多数工作都是基于 Transformer 架构。例如,BERT 预训练 Transformer encoderGPT 预训练 Transformer decoderBART 联合预训练 Transformer encoderTransformer decoder

    • TransformerTransformer 是一个用于序列到序列(sequence-to-sequence: seq2seq )建模的 encode-decoder 架构。

      基于递归神经网络的 seq2seq 模型(如 LSTMGRU )通过递归方式对 token 序列进行建模,因此计算效率低。Transformer 不同,它摒弃了递归计算,转而使用自注意力,这不仅可以捕获到 token 之间的依赖性,而且还能高效地并行计算。自注意力计算每一对token 之间的相关性,并通过对 token embedding 进行加权求和从而使用这些相关性得分来创建 "attentive" representation

    • BERTBERT 的目的是学习一个用于表示文本的 Transformer encoderBERT 的模型架构是一个多层双向 Transformer encoder 。在 BERT 中,Transformer 使用双向的自注意力。为了训练编码器,BERT 随机掩码了一定比例的 input token ,然后预测这些 masked token

      为了将 pretrained BERT 应用于下游任务,如句子分类,可以在BERT 架构的基础上增加一个附加层,并使用目标任务中的标记数据训练这个newly-added layer

  2. Contrastive Self-supervised Learning:自监督学习(Self-supervised learning: SSL )是一种学习范式,旨在不使用人类提供的标签来捕获输入数据的内在模式和固有属性。自监督学习的基本思想是完全基于输入数据本身构建一些辅助任务(而不使用人类标注的标签),并迫使网络通过很好地执行辅助任务来学习有意义的 representation ,如旋转预测rotation prediction 、图像绘画 image inpainting 、自动着色automatic colorization 、上下文预测context prediction 等等。

    自监督学习中的辅助任务可以使用许多不同的机制来构建。最近,一种对比性机制获得了越来越多的关注,并在一些研究中展示了有希望的结果。对比性自监督学习的基本思想是:生成原始数据样本的augmented 样本,创建一个预测任务,目标是预测两个 augmented 样本是否来自同一个原始数据样本,并通过解决这个任务来学习 representation network

    人们已经提出了不同的方法来实现对比性自监督学习。在为图像数据设计的 SimCLR 中,给定输入图像,对这些图像应用随机数据增强。如果两张augmented 图像是由相同的原始图像创建的,它们就被标记为相似;否则,它们就被标记为不相似。然后 SimCLR 学习一个网络来拟合这些相似/不相似的二元标签。该网络由两个模块组成:

    • 一个是特征提取模块f()$ f(\cdot) $ ,它提取图像x$ \mathbf x $ 的 latent representationh=f(x)$ \mathbf{\vec h} = f(\mathbf x ) $ 。

    • 另一个是多层感知机g()$ g(\cdot) $ ,它将h$ \mathbf{\vec h} $ 作为输入并生成另一个 latent representationz=g(h)$ \mathbf{\vec z} = g\left(\mathbf{\vec h}\right) $ ,用于预测两个图像是否相似。

    给定一对相似的图像(xi,xj)$ (\mathbf x_i, \mathbf x_j) $ 和K$ K $ 个与xi$ \mathbf x_i $ 不相似的图像{xk}k=1K$ \left\{\mathbf x_k\right\}_{k=1}^K $ ,对 contrastive loss 可以被定义为:

    (30)logexp(sim(zi,zj)/τ)exp(sim(zi,zj)/τ)+kexp(sim(zi,zk)/τ)

    其中:sim(,)$ \text{sim}(\cdot,\cdot) $ 表示两个向量之间的 cosine 相似度;τ$ \tau $ 为温度超参数。

    SimCLR 通过最小化这种损失来学习网络权重。训练结束后,特征提取模块f()$ f(\cdot) $ 被用于下游任务,模块g()$ g(\cdot) $ 被丢弃。

    这里要求g()$ g(\cdot) $ 非常简单,从而迫使f()$ f(\cdot) $ 学到有意义的特征。

    虽然 SimCLR 很容易实现,但它需要一个大的 mini-batch size 来产生良好的效果,这在计算上是难以实现的。MoCo 通过使用一个独立于 mini-batch size 的队列来解决这个问题。这个队列包含一个动态的、augmented 样本集合(称为 keys)。在每次迭代中,最新的 mini-batch 样本被添加到队列中;同时,最旧的 mini-batch 样本被从队列中删除。通过这种方式,队列与 mini-batch size 是解耦的。如下图所示。

    keys 是用 momentum encoder 编码的。给出当前 mini-batch 中的一个 augmented 样本(称为 query )、以及队列中的一个 key ,如果它们来自同一图像,则被认为是 positive pair ,否则就是 negative pairMoCo 计算 query encoding 和每个key encoding 之间的相似性得分。contrastive loss 是在相似度的得分和二元标签上定义的。

  3. CERTCERT 采用 pretrained language representation model (如 BERT ),并在目标任务的输入数据上使用 contrastive self-supervised learning 对其进行微调。下图展示了 CERT 的工作流程。为了便于演示,我们使用 BERT 作为 pretrained language representation model

    • 给定来自源任务的大规模输入文本(没有标签),首先在这些文本上预训练一个 BERT 模型。

      注意,源任务的大规模输入文本没有使用对比学习,而是用 BERT 的原始优化目标来训练。

    • 然后,我们使用 contrastive self-supervised learning 在目标任务的输入文本(无标签)上继续训练这个 pretrained BERT model 。我们把这个模型称为pretrained CERT model

      只有目标任务的输入文本才使用对比学习。

    • 然后,我们使用目标任务中的输入文本及其标签对 CERT 模型进行微调,得到执行目标任务的最终模型。

      目标任务的输入文本被使用两次:一次是无监督的对比学习、一次是有监督的目标任务。

    contrastive self-supervised learning 训练中,CERT 使用 back-translation 对目标任务中的原始句子进行增强:如果两个 augmented sentences 是由同一个原始句子创建的,则被认为是 positive pair ,否则就是 negative pairaugmented sentencesBERT 编码,并计算一对句子在 BERT encoding 上的相似性得分。contrastive loss 是根据二元标签和相似性得分来确定的。然后,通过最小化 contrastive loss 来进一步微调 pretrained BERT encoder

    我们使用 MoCo 来实现contrastive self-supervised learning ,以避免使用大型的 mini-batch (大型的 mini-batch 导致计算量太大)。

  4. 数据增强:下图展示了基于 back-translation 的数据增强的工作流程。对于目标任务中的每个输入句子x$ \mathbf x $ ,我们使用 back-translation 对其进行增强。在不失一般性的情况下,我们假设目标任务中的语言是英语。

    • 我们使用 English-to-German 机器翻译模型将x$ \mathbf x $ 翻译成y$ \mathbf y $ ,然后使用 German-to-English 机器翻译模型将y$ \mathbf y $ 翻译成x$ \mathbf x^\prime $ 。然后x$ \mathbf x^\prime $ 被视为x$ \mathbf x $ 的一个 augmented sentence

    • 同样地,我们使用一个 English-to-Chinese 机器翻译模型和一个 Chinese-to-English 机器翻译模型来获得另一个 augmented sentencex$ \mathbf x^{\prime\prime} $ 。

    我们使用 《Massive exploration of neural machine translation architectures》 中开发的机器翻译模型用于 back-translation

    仅对目标任务的输入文本进行数据增强。

  5. CSSL Pretraining:我们使用 MoCo 来实现 CSSL 。给定两个 augmented sentences ,如果它们源自同一个原始句子,它们就被标记为 positive pair ;如果它们来自不同的句子,它们就被标记为 negative pair 。我们使用一个队列来维护一个 augmented sentence 集合{ki}k=1K$ \{\mathbf k_i\}_{k=1}^K $ ,称作 keys。给定当前 mini-batch 中的一个 augmented sentenceq$ \mathbf q $ (称作 query),我们将它与队列中的每个 key 进行比较。

    • querypretrained BERT modelfq(;θq)$ f_q(\cdot;\theta_q) $ 进行编码,其中θq$ \theta_q $ 为模型权重。

    • keypretrained BERT modelfk(;θk)$ f_k(\cdot;\theta_k) $ 进行编码,其中θk$ \theta_k $ 为模型权重。

    key 模型fk(;θk)$ f_k(\cdot;\theta_k) $ 的权重θk$ \theta_k $ 通过动量进行更新:θkmθk+(1m)θq$ \theta_k \leftarrow m\theta_k + (1-m)\theta_q $ ,其中m$ m $ 为动量系数。

    query 模型fq(;θq)$ f_q(\cdot;\theta_q) $ 的权重θq$ \theta_q $ 通过随机梯度下降来更新。之所以二者更新方式不同,是因为需要确 key 队列的变化比较缓慢。

    在不失一般性的情况下,我们假设队列中有单个 keyk+$ k_+ $ 与q$ q $ 形成一个 positive paircontrastive loss 定义为:

    (31)logexp(sim(fq(q;θq),fk(k+;θk))/τ)k=1Kexp(sim(fq(q;θq),fk(ki;θk))/τ)

    其中:τ$ \tau $ 为温度超参数。

    query BERT encoder 的权重是通过最小化该损失来进行微调的。请注意,在这个步骤中,只使用目标任务的输入句子,而不需要这些句子的标签。为了将 pretrained CERT model 应用于下游任务,我们进一步在目标任务中的输入句子及其标签上微调模型权重。

  6. 未来工作:我们计划研究更具挑战性的自监督学习的损失函数。我们有兴趣研究一种 ranking-based loss, ,即每个句子都被增强了 ranked list 的句子,这些augmented 句子与原句的差异越来越小。辅助任务是预测给定的 augmented 句子的排序。预测排序可能比 CSSL 中的二分类更具挑战性,并可能有助于学到更好的 representation

    另外,是否考虑对源任务的输入文本也执行对比学习?

37.2 实验

  1. 评估任务:General Language Understanding Evaluation: GLUE 基准,包含 11 个任务。我们通过向 GLUE 评估服务器提交推理结果来获得测试集的性能。数据集如下表所示。

  2. 实验配置:

    • MoCo 中,队列的大小被设置为 96606MoCo 更新 key encoder 的动量系数为 m = 0.999

    • contrastive loss 中的温度超参数为τ=0.07$ \tau = 0.07 $ 。

    • 使用 multi-layer perceptron head

    • 对于 MoCo training ,使用带动量的随机梯度下降优化器。mini-batch size = 16 。初始学习率为 4e-5 ,并使用余弦调度器。epoch 数量为 100。权重衰减系数为 1e-5

    • 对于 GLUE 任务上的微调,最大序列长度被设置为 128mini-batch size = 16

      • 学习率设置:CoLA, MNLI, STS-B3e-5RTE, QNLI, MRPC, SST-2, WNLI2e-5QQP1e-5

      • 训练 epoch 数量:CoLA20RTE, WNLI, QQP5QNLI, MNLI3MRPC15SST-24STS-B10

  3. 验证集上的评估结果:GLUE 任务中,验证集效果如下表所示。遵从 ALBERT ,我们对微调进行了 5 次随机重启,并报告了这 5 次运行中的中位数和最佳性能。由于 5 次重启的随机性,我们的中位数性能与 ALBERT 报告的不一致。但一般来说,它们是接近的。可以看到:

    • 就中位数性能而言,我们提出的 CERT5 个任务上优于 BERT ,包括 CoLA, RTE, QNLI, SST-2, QQP ;在其他 5 个任务中,CERTBERT 持平。这证明了 CERT 在通过 contrastive self-supervised learning 来学习更好的 language representation 方面的有效性。

    • 其次,就最佳性能而言,CERT7 个任务上的表现优于 BERT ,包括CoLA, RTE, QNLI, STS-B, MNLI-m, MNLI-mm, QQPCERTMRPCWNLI 上与 BERT 持平。CERTSST-2 上的表现不如 BERT 好。这些结果进一步证明了 CERT 的有效性。

    • 第三,在训练数据较少的任务(如 CoLARTE )上,CERTBERT 的改进更为显著。一个可能的原因是,小规模的训练数据更容易过拟合,这使得 CSSL 预训练的必要性更加突出。

    • 第四,在 CoLARTE 这样的小规模数据集上,CERT 获得了更大的提升。这表明,在解决训练数据量有限的低资源 NLP 任务方面,CERT 很有前途。

    为了方便读者,我们还展示了 SOTA 的预训练方法的结果,包括XLNet, RoBERTa, ERNIE 2.0, ALBERTCERTCoLA 上取得了接近 XLNet 的性能,对计算资源的消耗要低得多,而且文本语料库也小得多。XLNet, RoBERTa, ERNIE 2.0, ALBERT 是在数百到数千台 GPU 机器上训练数天的,而 CERT 是使用单个 GPU 训练十几个小时的。此外,这些模型是在几十或几百 GB 的文本上训练的,而 CERT 只在大约 400KB 的文本上训练。CERT 也可以建立在这些 pretrained model 之上,这将留待将来研究。

  4. 测试集上的评估结果:GLUE 任务中,测试集效果如下表所示。可以看到:

    • 11 个任务中,CERT7 个任务上的表现优于 BERT ,包括 RTE, QNLI, STS-B, MRPC, MNLI-m, MNLI-mm, QQPCERTWNLIAX 上实现了与 BERT 相同的性能,在 CoLASST-2 上表现比 BERT 更差。CERT 取得了 80.7 的平均分,比BERT 好。总的来说,CERT 的表现比BERT 好,这进一步证明了 contrastive self-supervised learning 是一种学习更好的language representation 的有效方法。

    • 虽然 CERTCoLA 的验证集上取得了比 BERT 好得多的性能,但在 CoLA 的测试集上比BERT 更差。这可能是因为 CoLA 的测试集和验证集有很大的 domain difference

    下表还列出了其他 SOTA 方法的性能。下一步,我们计划用 XLNet, ERNIE2, T5, RoBERTa, ALBERT 取代 CERT 中基于 BERTsentence encoder ,看看 CSSL 预训练是否能提高这些编码器的性能。

    CERT 在预训练、微调之外,还增加了一个对比学习任务,这使得 CERTBERT 训练了更多的数据。这其实是一种不太公平的比较。应该让 BERT 在目标任务的输入文本(不包含标签)上继续预训练,使得 BERTCERT 训练的数据量相同。

  5. Data Augmentation 的消融研究:CERT 的一个关键要素是创建 augmented sentence 。默认情况下,我们使用 back-translation 来进行数据增强。研究其他的数据增强方法也是很有趣的。我们将 back-translation 与最近提出的文本增强方法 Easy Data Augmentation: EDA《Eda: Easy data augmentation techniques for boosting performance on text classification tasks》)进行比较。给定训练集中的一个句子,EDA 随机选择并执行以下操作之一:同义词替换、随机插入、随机互换、随机删除。

    下表显示了 CERTCoLARTE 任务上分别使用 back-translationEDA 进行增强的结果。可以看到:总的来说, back-translation 取得了比 EDA 更好的结果,只是 back-translationSTS-B 上的中位数性能比 EDA0.1%

    back-translation 效果更好的原因可能是:

    • back-translationsentence level 上进行全局地增强(整个句子被来回地翻译),而 EDAword/phrase level 上进行局部地增强。因此, back-translation 可以更好地捕获句子的全局语义,而 EDA 则是捕获局部语义。

    • 另一个原因可能是:通过 back-translation 增强的句子与原始句子有更大的差异。相比之下,由 EDA 增强的句子与原始句子很接近,因为 EDA 对原始句子进行了局部编辑,并保持了句子的大部分内容不受影响。因此,预测两个通过 back-translation 增强的句子是否来自同一个原句,要比预测那些通过 EDA 增强的句子更难。解决一个更具挑战性的 CSSL 任务通常会带来更好的 representation

  6. CSSL Pretraining Corpora 的消融研究:另一个有趣的研究点是应该使用什么语料来训练 CSSL 。在 CERT 中,默认情况下,我们使用目标任务的训练数据(不包括标签)用于 CSSL 。我们与以下设置进行比较:我们从 BERT 的训练语料库中随机抽取x$ x $ 个句子,其中x$ x $ 是目标任务中训练句子的数量。

    下表显示了在 CoLASTS-B 上的表现,CSSL 在不同的语料库上进行了预训练。

    • CoLA 任务中,当使用 CoLA 的训练数据时,可以获得更好的性能。

    • STS-B 任务中,当使用 BERT 预训练语料库时,取得了更好的性能。

    从这项研究中,我们并没有得出哪种方法更好的明确结论。在实践中,尝试这两种方法并找出哪种方法更有效,可能是有用的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文