为了账号安全,请及时绑定邮箱和手机立即绑定

数据有限时从何下手:一份实用指南

克服小数据限制,实现高性能目标——利用现代机器学习超越传统方法。

Google DeepMind 提供的照片:该图片描绘了人工智能如何帮助人类理解生物的复杂性,由艺术家 Khyati Trehan 创作,图片来源:https://www.pexels.com/photo/an-artist-s-illustration-of-artificial-intelligence-ai-this-image-depicts-how-ai-can-help-humans-to-understand-the-complexity-of-biology-it-was-created-by-artist-khyati-trehan-as-part-17484975/

机器学习(ML)在计算机视觉、自然语言处理和语音识别等领域取得了显著的突破,这主要得益于这些领域中数据的丰富性。然而,许多挑战,特别是那些与特定产品功能或科学研究相关的问题,由于数据质量和数量的不足,变得更加复杂。然而,对于这些小数据集,传统统计分析尽管通常是首选方法,但常常无法达到所需的性能。本指南提供了一条基于您数据限制的路线图,帮助解决小数据问题,并提供了一些潜在的解决方案,帮助您在早期阶段做出决策。

1. 收集更多的数据有点难

原始数据通常不会成为机器学习项目的阻碍。然而,高质量的标签往往由于成本过高和耗时费力而难以取得。尤其是当获取专家标注的“真实情况”需要特定领域的专业知识、密集的实地调查或专门技能时。例如,你的项目可能涉及罕见事件,比如濒危物种监测、极端气候现象或罕见的制造缺陷。有时,特定业务或科学问题可能过于专业化,现有的大规模数据集可能无法满足需求。最终,这导致许多项目因标注成本过高而无法推进。

2. 小数据集面临的主要挑战

有了一个小数据集,任何新项目一开始就充满了固有的风险。你的数据集真正捕捉到了多少变化?从很多角度来看,数据集越小,这个问题就越难回答。这不仅增加了测试和验证的难度,还让你的模型在泛化能力上的不确定性大大增加。你的模型无法感知数据集未能捕捉到的信息。这意味着,即使只有几百个样本,你能够提取的特征和使用的数量都会减少,而不会轻易出现过拟合(这种情况很多时候难以衡量)。这经常让你只能依赖经典机器学习算法(如随机森林、SVM 等),或者使用高度正则化的深度学习方法。类别不平衡的存在只会使问题更加严重。这使得小数据集对噪声更加敏感,几个错误的标签或故障测量就会引发混乱和麻烦。

3. 开始的几个问题

对我来说,解决这个问题是从问一些关于数据、标注过程和最终目标的简单问题开始的。通过使用“检查清单”来界定问题,我们可以更清晰地界定数据的限制。试试看回答下面的问题:

你的数据集是完全未标记、部分未标记还是大部分未标记呢?

  • 所有样本都进行了标注:你为你数据集中的(几乎)所有样本都有标签。
  • 部分数据集已经标注,但还有大量未标注的数据:数据集的一部分有标签,但有大量的未标注数据。
  • 大多数未标注:你几乎没有任何标注的数据点。

你觉得你手头上的标签有多可靠?

  • 非常可靠:如果多个标注者一致,或者这些标签得到了可信专家或成熟的协议的确认。
  • 嘈杂或薄弱:标签可能是众包所得,由自动化系统生成,或易受人为或传感器错误的影响。

你是只有一个任务,还是有好几个相关任务?

  • 单任务:单目标,比如二元分类或单目标回归。
  • 多任务型:多个输出目标。

你在处理罕见情况还是高度不平衡的数据吗?

  • :正面例子很少(例如,“设备故障”、“药物不良反应”或“金融欺诈”)。
  • :类别相对平衡,或者你的任务不需要处理(比如)严重的分布不平衡。

你有可用的专业知识吗?如果有,是什么形式的?

  • 人类专家:您可以定期向领域专家咨询,对新数据进行标注或验证预测。
  • 基于模型的专家:您可以通过已建立的模拟或物理模型(例如流体动力学或化学动力学)来指导或限制您的机器学习模型。
  • :没有可用来帮助指导或校正模型的相关领域专业知识。

给新数据打标签是否可行?这需要付出什么代价呢?

  • 可行且负担得起:当你需要更多数据时,你可以获取更多的标注数据。
  • 困难或昂贵:标注既耗时又昂贵,或者需要特定的专业知识(例如,医学诊断、高级别的科学测量)。

你有没有相关的先前知识或能够访问与你数据相关的预训练模型?

  • 是的:你的领域存在大规模的模型或数据集,比如图像领域的ImageNet和文本领域的BERT。
  • :你的领域比较小众或非常专业化,并且没有现成的预训练资源。
4. 将问题与技术匹配

在你回答了上面的问题之后,我们可以着手建立一个潜在的技术列表来解决你的问题。实践中,小数据集问题需要进行高度精细化的实验,所以在实施以下技术之前,先建立一个坚实的基础,从一个简单的模型开始,尽快搭建一个完整的流程,并始终进行交叉验证。这为你提供了一个基线,可以在此基础上根据错误分析迭代应用新的技术,同时专注于进行小规模实验。这也帮助你避免构建过于复杂的流程,以免无法充分验证。有了这个基线,数据集很可能迅速发展和变化。使用 DVC 或 MLflow 这样的工具来追踪数据集版本并确保可重复性。在小数据的情况下,即使是少量的新标注样本也可能显著影响模型的表现——版本控制有助于系统化地管理和追踪这些变化。

有了这点考虑,你对这些问题的回答会引导出本文后面提到的具体策略建议。

完全标注的, 单一任务的, 足够可靠的标签信息:

  • 数据增强(第5.7节)以增加有效样本量。
  • 集成方法(第5.9节)如果有条件进行多次模型训练。
  • 迁移学习(第5.1节)如果有可用的预训练模型(在你的领域或相关领域)。

部分标注的 + 标注可靠或实际可行:

或者

标注部分可靠或可以实现:

  • 半监督学习(第5节),利用更大的未标注数据池。
  • 主动学习(第5.6节),如果你有一个可以标注最有信息量样本的人工专家。
  • 数据增强(第5.7节),在可能的情况下。

很少标注或未标注的数据,加上可用的专家知识:

  • 主动学习(第5.6节)当你面对的专家是人时,可以使用这种方法进行提问。
  • 流程感知型混合模型(第5.10节)当你拥有一个成熟的模拟或模型工具时,可以使用这种模型。

很少有标签或未标注的 + 无专家或无附加标签:

  • 自监督学习(第5.2节)以利用未标记数据中的固有结构。
  • 少样本或零样本学习(第5.4节)如果你可以依赖元学习或文本描述来处理新类别问题。
  • 弱监督学习(第5.5节)如果你的标签存在但不精确或过于抽象。

几个相关任务:

  • 多任务学习(见第5.8节)通过在任务间共享表示,有效地在整个数据集上汇集“信号”。

如何处理噪声标签或弱标签:

  • 弱监督学习(第5.5节),它明确处理标签噪声。
  • 结合主动学习或一个小“黄金标准”子集来清理最严重的标签错误。

高度不平衡的事件/极少数事件:

  • 数据增强(例如,合成少数过采样)(第5.7节)针对少数类。
  • 主动学习(第5.6节)以专门标记更多罕见样本。
  • 过程感知模型或利用领域专业知识确认罕见样本(第5.10节),如果可行的话。

具备预先训练好的模型或特定领域的知识:

  • 迁移学习(第5.1节)通常是最快的方法。
  • 流程感知型模型(第5.1节)如果将你的领域知识与机器学习结合,可以降低数据需求量。
5. 处理小数据的策略.

希望上述内容为你解决小数据挑战提供了一个起点。因此,值得注意的是,许多讨论的技术既复杂又资源密集型。因此,在开始之前,你可能需要得到团队和项目管理者的认同。最好的方式是通过清晰、简洁地解释这些技术可能带来的潜在价值来获得他们的支持。将实验定位为具有战略意义的基础性工作,这些工作可以被再利用、改进,并为未来的项目提供支持。专注于从短期、范围有限的试点中展示出清晰、可量化的成果。

尽管下面对每种技术的描述相对简单,但重要的是要记住没有一种解决方案适合所有人,应用这些技术不像搭积木一样简单,也不能直接拿来就用。为了帮你入门,我简要介绍了每种技术,这绝不是详尽的,而是为你自己的研究提供一个起点。

5.1 迁移学习

迁移学习其实就是利用已经训练好的模型来解决新的但相关的问题。从已经训练好的模型开始,你可以利用这些数据中学到的信息,并在你的较小的新数据集上进行微调。

为什么这有帮助:

  • 利用从较大且多样化的数据集中学习到的强大功能。
  • 对预训练模型进行微调通常能提高准确率,即使在样本数较少的情况下也能缩短训练时间。
  • 在计算资源或项目时间表有限,无法从零开始训练模型时尤为理想。

小贴士:

  • 选择一个与您问题领域相匹配的模型,或者选择像 Mistral(语言)或 CLIP/SAM(视觉)这样的大型通用“基础模型”,这些模型可以在如 Hugging Face 这样的平台上找到。由于这些模型具有通用能力,它们通常会优于特定领域的预训练模型。
  • 冻结捕捉通用特征的层,仅微调顶层。
  • 为了防止小数据集上的过拟合风险,可以尝试修剪。在这里,修剪不重要的权重或连接,减少可训练参数的数量,从而提高推理速度。
  • 如果需要可解释性,大型黑盒模型可能不是理想的选择。
  • 如果没有访问预训练模型的源数据集,您在微调过程中可能会无意中强化源数据集中的采样偏差。

一个不错的迁移学习例子描述于以下论文中:此论文。通过利用预训练的ResNet模型,能够更好地分类胸部X光图像,并检测到COVID-19。借助dropout和批归一化技术,研究人员冻结了ResNet基础模型的初始层,同时微调了后面的层,捕捉到了特定任务的高级特征。这种方法证明了使用小数据集也能高效地达到高准确度。

5.2 自监督学习

自监督学习是一种预训练技术,通过创建人工任务(又称“前置任务”),从大量未标记的数据中学习表示。例如,它可能涉及预测文本中的掩码标记或图像的旋转,以及对图像进行着色。结果是一些通用的表示,你可以稍后将其与迁移学习(参见第5.1节)或半监督学习(参见第5节)结合,并使用较小的数据集进行进一步微调。

为什么这样有用:

  • 预训练模型作为强有力的初始化起点,减少了未来过拟合的风险。
  • 学会以能够捕捉数据内在模式和结构(如空间、时间或语义关系)的方式来表示数据,从而使它们更适合下游任务。

小提示:

  • 裁剪、旋转、颜色抖动或噪声注入等预处理操作对视觉任务非常有帮助。然而,也需要找到一个平衡点,因为过度增强可能会扭曲小数据集的分布,使其不再具有代表性。
  • 确保未标记的数据能代表小数据集,以帮助模型更好地学习泛化特征。
  • 自监督方法通常计算资源消耗较大;通常需要大量未标记数据才能充分受益,同时还需要较大的计算资源。

LEGAL-BERT 是一种自我监督学习的突出例子。Legal-BERT 是 BERT 语言模型的一个特定领域的变体,通过对大量法律文档数据集进行预训练,以提高其对法律语言、术语和上下文的理解。关键在于使用未标记的数据,通过诸如掩码语言建模(模型学习预测掩码单词)和下一句预测(学习句子间的关系,判断一个句子是否紧跟另一个句子)等技术减少了标注的需求。这个文本嵌入模型随后可以用于更具体的法律相关机器学习任务。

5.3 半监督学习:

利用一个小的标注数据集,以及一个更大的未标注数据集。模型会通过迭代对未标注的数据进行预测,以生成特定任务的预测结果,这些预测结果可以作为“伪标签”用于后续的迭代。

为什么它有用:

  • 标记的数据指导特定任务的指导目标,而未标注的数据则用于提高泛化(例如,通过伪标签、一致性约束或其他技术)。
  • 这有助于改进分类界限,并提高泛化。

提示:

  • 一致性正则化是一种假设模型在对未标记数据做小扰动(比如添加噪声或增强变换)时,预测结果应该保持一致的方法。其目的是在稀疏的高维空间里平滑决策边界。
  • 假标法允许你使用一个小的数据集训练初始模型,并将该模型对未来未标记数据的预测作为假标签用于未来的训练,目的是为了更好地泛化并减少过度拟合。

金融欺诈的检测是一个非常适合半监督学习的问题,由于确实标记的欺诈案例很少,但未标记的交易数据却非常多。这篇论文提出了一种巧妙的方法,将交易、用户和设备视为图中的节点,其中边表示它们之间的关系,比如共享账户或设备。利用少量的标记欺诈数据,通过在图中传播欺诈信号来训练模型。例如,如果一个已标记的欺诈交易与多个未标记的节点(如相关用户或设备)相连,模型将学习到可能指示欺诈的模式和连接。

5.4 少样本学习(Few-Shot Learning)和零样本学习(Zero-Shot Learning)

极少样本和零样本学习指的是直接处理非常小的数据集的一系列技术。这些方法通常训练模型来识别训练中未曾见过的新类别,主要用来进行测试。

为什么这有帮助:

这些方法让模型能够快速适应新任务或类别,特别适用于罕见或独特的类别较多的领域,例如罕见疾病或特定对象识别。

小提示:

  • 最常见的技术之一称为基于相似性的学习,该技术训练模型来比较项目配对,并决定它们是否属于同一类别。通过学习相似度或距离度量,模型可以在测试时通过将新实例与类原型(测试时的小部分标记数据)来进行比较,从而泛化到未见过的类别。这种方法需要一种良好的表示不同输入类型的方法(嵌入),通常使用孪生神经网络(Siamese神经网络)或类似模型来创建。
  • 优化导向的元学习旨在训练模型使用少量训练数据快速适应新任务或类别。一个流行的例子是模型不可知的元学习(MAML)。在这种情况下,“元学习器(meta-learner)”在许多小任务上进行训练,每个任务都有自己的训练和测试样本。目标是使模型能够从一个好的初始状态开始,当遇到新任务时,从而在最少的额外训练下快速适应。这些方法实现起来并不简单。
  • 一种更为传统的技术,单类分类技术,是训练一个二元分类器(如单类SVM)仅使用一个类的数据,并在测试期间学习检测异常值。
  • 零样本方法,如CLIP或通过提示工程使用的大型语言模型,可以利用文本提示(例如,“一张新类型产品的照片”)来对未见过的类别进行分类或检测。
  • 在零样本场景下,结合人在回路中(human in the loop)来标记最有信息量的样本。

在实施少样本和零样本技术时,保持实际的期望是很重要的。通常,目标是实现足够好的性能。与传统的深度学习(DL)方法直接比较,以下研究比较了DL和少样本学习(FSL)用于对来自水下图像的20种珊瑚礁鱼类进行分类,应用于检测稀有物种时,由于可用数据量有限。表现最佳的模型是一个基于ResNet的DL模型,每种物种约有3500个样本时,准确率为78%。但是,为稀有物种收集如此数量的数据在实际操作中是不可行的。因此,减少到每种物种315个样本时,准确率降至42%。相比之下,FSL模型仅使用每种物种5个标记图像即可达到类似的结果,在数据量超过10个样本时性能更好。这里使用了基于元学习的FSL方法——Reptile算法,并通过不断解决来自MiniImageNet数据集中的小型分类问题进行训练。在微调阶段,模型使用少量标记样本(每种物种1到30个)进行训练,以提高模型的适应性和泛化能力。

5.5 弱监督学习

弱监督学习是指一组技术,用于使用嘈杂、不准确或受限的来源来标注大量数据来构建模型。我们可以将此主题分为三类:不完整、不精确和不准确的监督,这三类通过标签的置信度来区分。不完整监督指的是只有部分示例具有真实标签。不精确监督则涉及粗粒度的标签,例如,将MRI图像标注为“肺癌”而不指定详细属性。不准确监督则发生在标签因人为原因而存在偏差或错误时。

为什么它有用

  • 部分或不准确的数据通常更容易且更便宜地获得。
  • 使得模型能够从更大的信息池中学习,而无需大量的手工标注。
  • 专注于从数据中提取有意义的模式或特征,从而增强现有高质量标注示例的价值。

小贴士:

  • 使用一小部分高质量的标签数据(或集成模型)来纠正系统性的标注错误。
  • 对于有粗粒度标签的场景(例如,有图像级别的标签但没有详细的实例级别标签),可以使用多实例学习。重点关注袋子级别的分类,因为实例级别的不准确性对整体分类影响较小。
  • 标签过滤、修正和推断技术可以减少标签噪声,降低对昂贵手工标注的依赖。

这种技术的主要目标是利用有限的信息来估计更丰富或更高维度的数据。例如,这篇论文提出了一种弱监督学习方法,用于估计3D人体姿态。该方法依赖于2D姿态标注,避免了昂贵的3D真实数据标注的需求。通过对抗重投影网络(RepNet),模型预测3D姿态,并将其投影回2D视角与2D标注进行比较,以最小化重投影误差。这种方法不仅利用了对抗训练来确保3D姿态的合理性,还展示了弱监督方法在有限标注数据条件下应用于复杂任务(如3D姿态估计)的潜力。

5.6, 主动学习

主动学习旨在通过识别那些一旦标注就会提供给模型最有信息量的数据的未标注样本,来优化标注努力。一种常见的方法是不确定性采样,这种方法会选择模型预测最不肯定的样本。这种不确定性通常通过熵或边际等指标来量化。这是一个高度迭代的过程,每一轮都会影响接下来的预测。

为什么这样有帮助:

  • 优化专家时间利用;总体需要标注的样本更少。
  • 快速识别出提升模型的鲁棒性的边缘情况。

小技巧:

  • 多样性采样是一种替代的选择方法,专注于特征空间中的各个不同区域。例如,可以通过聚类来从每个聚类中挑选少数具有代表性的样本。
  • 尽量采用多种选择方法来避免偏差的引入。
  • 将专家纳入流程可能会涉及复杂的后勤工作,特别是在管理可能缓慢或昂贵的标注工作流程时。

这种方法在化学分析和材料研究领域得到了广泛应用。几十年来,已经收集了大量的数据库,涵盖真实和模拟的分子结构及其属性。这些数据库对于药物发现特别有用,例如,对接模拟被用来预测小分子(如潜在药物)与目标(如蛋白质或酶)之间的相互作用。然而,由于计算数百万分子的这种计算成本很高,使得这种粗暴的研究方法变得不切实际。这时,主动学习就显得尤为重要。一项这样的研究表明,通过在一部分初始对接结果上训练预测模型,并迭代选择不确定性最高的分子进行进一步模拟,研究人员能够大幅减少测试的分子数量,并且仍然能够识别出最佳候选分子。

5.7 数据扩充

通过对现有样本进行变换(例如翻转或裁剪图片、文本翻译或同义词替换、时间序列的时间偏移或随机裁剪)来人工增加你的数据集。或者,可以使用ADASYN(自适应合成采样)和SMOTE(合成少数类过采样技术)对数据中代表性不足的部分进行升采样。

为什么它有用:

  • 该模型关注更通用和有意义的特征,而不仅限于训练集中的特定细节。
  • 数据增强提供了一种更经济有效的替代方案,而不是收集和标注更多的数据。
  • 通过增加训练数据的多样性,提升了泛化能力,有助于学习稳健且不变的特征,而不是过度拟合特定模式。

提示:

  • 保持转换与领域相关性,例如,垂直翻转图像可能适用于花卉图像,但对于医学X光片则不一定合适。
  • 注意任何增强操作不应扭曲原始数据分布,保持原有的模式不变。
  • 探索GANs、VAEs或扩散模型以生成合成数据——但这通常需要仔细调整、领域相关的约束条件以及足够的初始数据。
  • 如果类别或特征空间复杂且了解不够深入,合成过采样(如SMOTE)可能会引入噪声或虚假相关性。

数据增强是一个非常广泛的领域,有众多综述探讨了各个领域的最新进展,涵盖计算机视觉领域(综述论文)、自然语言处理领域(综述论文)和时间序列数据领域(综述论文)等多个领域。因为它可以增强模型的泛化能力,数据增强已经成为大多数机器学习流水线中的重要一环。对于小型数据集而言,通过引入变化(如变换或噪声)和移除冗余或无关特征来增强输入数据,对于提高模型的鲁棒性和性能尤为重要。

5.8 多任务学习

在这里,我们训练一个模型来同时处理多个任务。这提高了模型的表现,因为它鼓励模型找到同时适用于多个目标的模式或解决方案。较低层捕获了对所有任务都有用的通用特征,即使某些任务的数据有限也是如此。

为什么它有用:

  • 模型在多个任务间学习共享特征,从而有效地扩大了样本量。
  • 模型必须考虑所有任务的模式,因此过拟合的可能性降低。
  • 一个任务中学到的知识可以为另一个任务提供有用的见解,从而提高其表现。

提示:

  • 任务之间需要有一定的重叠或协同,否则它们将无法有意义地共享表示。
  • 仔细调整每个任务的权重,以防止某个任务主导训练过程。

许多实际应用中的机器学习由于数据不足,使得数据和模型跨任务共享成为一种吸引人的选择。这可以通过多任务学习实现,其中任务可以从共享的知识和重叠领域中的相关性中获益。然而,这需要一个整合了多种相关属性的大型多样数据集。聚合物设计就是一个成功的例子,例如,使用了一个涵盖13,000种聚合物的机械、热和化学特性的混合数据集,以训练基于深度学习的多任务学习模型。该多任务模型在每个聚合物属性上的表现都优于单一任务模型,尤其是在稀有属性上。

5.9 第5.9节 集成学习

集成模型通过集合多个基础模型的预测结果来提高稳定性。机器学习算法在很多方面有局限性,比如高方差、高偏差和低准确性。这导致不同模型间预测结果的不确定性分布不一样。集成方法减少了单一模型的方差和偏差错误;比如,bagging 可以减少方差而不增加偏差,而 boosting 则更注重减少偏差。

为什么它管用:

  • 使不同模型架构的“观点”更加多样化。
  • 减少方差(variance),减少过拟合的风险。

小技巧:

  • 避免使用复杂的基模型,因为它们容易在小数据集上过拟合。相反,使用正则化模型,如浅层树或带有约束的线性模型。
  • 像随机森林这样的自助法聚合(bagging)方法对小数据集特别有用。通过在从数据中抽取的自助样本子集上训练多个模型,可以减少过拟合,同时增加模型的稳健性。这对于容易产生较高方差的算法(如决策树)尤其有效。
  • 结合不同类型的基模型,例如SVM、树模型和逻辑回归,并通过一个简单的元模型,如逻辑回归,来整合预测。

作为例子,这篇论文强调了集成学习作为一种提高宫颈细胞学图像分类准确性的方法。在这种情况下,使用了三个预训练的神经网络——Inception v3、Xception和DenseNet-169。这些模型的多样性确保了集成方法能充分利用每个模型的独特优势和特征提取能力。通过一种方法来融合模型的置信度,该方法奖励自信且准确的预测,同时惩罚不确定的预测,最大化了有限数据的价值。因此,结合迁移学习,最终的预测对任何单一模型的错误具有较强的鲁棒性,尽管使用的是一个小数据集。

5.10 流程感知型(混合型)模型

将特定领域的知识或基于物理的约束条件融入机器学习模型中。这嵌入了先验知识,减少了模型对大量数据来推断模式的依赖。例如,将偏微分方程与神经网络结合应用于流体动力学。

为什么它有帮助:

  • 减少学习那些已经很好地理解的模式所需的数据。
  • 它起到了正则化的作用,即使数据稀疏或有噪声,也能够引导模型找到合理的解决方案。
  • 在关键领域中提高可解释性和增强信任度。

提示:

  • 不断检查模型的输出是否在物理和生物层面上合理,而不仅仅是数字上的合理。
  • 将领域约束与模型本身独立,但将它们作为输入或约束条件加入到模型的损失函数中。
  • 谨慎地平衡领域特定的约束与模型学习新现象的能力,
  • 实际上,将领域特定的知识与数据驱动的方法结合通常需要紧密合作、专门的代码或硬件支持。

这样约束模型通常需要你对问题领域有深刻的理解,通常应用于环境已经很好的被了解的问题中,例如物理系统。例如,在锂离子电池建模中,电池动力学的知识被整合到机器学习过程中。这使得模型能够捕捉传统物理模型可能遗漏的复杂行为和不确定性,确保物理上的一致性,并做出准确的预测,从而在诸如电池老化等实际条件中提高性能。

6. 最后,我们来总结一下。

对我来说,数据有限的项目是最有趣的项目之一——尽管失败的风险更高,但它们提供了一个探索前沿技术并进行实验的机会。这些问题确实很具挑战性!然而,系统地应用文中提到的策略可以大大增加你交付一个稳健且有效的模型的几率。拥抱这些问题的迭代性质:不断精炼标签、使用数据增强,并快速循环地分析错误。短期试点实验有助于在进一步投资前验证每种技术的效果。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消