BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain

BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain----《BadNets:识别机器学习模型供应链中的漏洞》

 
背景: 许多用户将训练过程外包给云计算,或者依赖于经过训练的模型,然后根据特定的任务对模型进行微调。这样做存在一定的安全风险:攻击者创建一个经过恶意训练的网络(后门神经网络,或称为BadNet),该网络在用户的训练和验证样本上具有很好的性能,但在攻击者选择的特定输入上表现糟糕。
意义: 为进一步研究验证和检查神经网络的技术提供了动力。

摘要:

  基于深度学习的技术已经在各种各样的识别和分类任务上实现了最先进的性能。然而,这些网络的计算训练通常是昂贵的,需要在许多GPU上进行数周的计算;因此,许多用户将训练过程外包给云计算,或者依赖于经过训练的模型,然后根据特定的任务对模型进行微调。在本文中,我们展示了外包训练引入了新的安全风险:对手可以创建一个恶意训练的网络(后门神经网络,或称为BadNet),该网络在用户的训练和验证样本上具有最先进的性能,但在攻击者选择的特定输入上表现糟糕。我们首先在一个简单的示例中通过创建一个后门手写数字分类器来探索BadNets的属性。接下来,我们在一个更现实的场景中演示后门,通过创建一个美国街道标识分类器,当一个特殊的贴纸添加到停止标志时,将停止标志识别为限速;此外,我们还发现,即使该网络后来被重新训练用于另一项任务,美国街道标志检测器中的后门仍然可以持续存在,并且当存在后门触发器时,会导致准确度平均下降 25%。这些结果表明,神经网络中的后门既强大又隐蔽,因为神经网络的行为很难解释。这项工作为进一步研究验证和检查神经网络的技术提供了动力,就像我们开发了用于验证和调试软件的工具一样。

引言

  过去5年,学术界和产业界都见证了深度学习活动的爆炸式增长。人们发现,深度网络在许多领域的表现都明显优于之前的机器学习技术,包括图像识别[1]、语音处理[2]、机器翻译[3]、[4],以及一些游戏[5]、[6];在某些场景下这些模型的性能甚至超过了人类。卷积神经网络(CNN)在图像处理任务方面尤其成功,基于CNN的图像识别模型已被用于帮助识别植物和动物物种[8]和自动驾驶汽车[9]。
  卷积神经网络需要大量的训练数据和数百万的权值才能达到良好的效果。因此,训练这些网络需要大量的计算,经常需要在许多cpu和gpu上花费数周的时间。因为个人甚至大多数企业手头都很少有这么强大的计算能力,所以训练的任务通常都外包给了云计算。将机器学习模型的训练外包有时被称为“机器学习服务”(MLaaS)。
  机器学习作为一项服务目前由几家主要的云计算提供商提供。谷歌的云机器学习引擎[10]允许用户上传TensorFlow模型和训练数据,然后在云上进行训练。类似地,微软提供了Azure批量人工智能培训[11],亚马逊提供了一个预先构建的虚拟机[12],其中包括几个深度学习框架,可以部署到亚马逊的EC2云计算基础设施。有证据表明,这些服务非常受欢迎,至少在研究人员中是这样的:在2017年NIPS大会(机器学习研究的最大会场)截止日期前两天,具有 16 个 GPU 的 Amazon p2.16xlarge 实例的价格上涨至每小时 144 美元 [13](可能的最高价格),这表明大量用户正在尝试预订实例。
  除了外包训练程序之外,降低成本的另一个策略是迁移学习,即针对新任务对现有模型进行微调。通过使用预训练的权重和学习的卷积滤波器,这些滤波器通常会对边缘检测等功能进行编码,这些功能通常适用于广泛的图像处理任务,通常只需在单个 GPU 上进行几个小时的训练即可获得最先进的结果。迁移学习目前最常应用于图像识别,并且基于 CNN 架构的预训练模型(例如 AlexNet [14]、VGG [15] 和 Inception [16])可以随时下载。
  在本文中,我们表明这两种外包场景都会带来新的安全问题。我们探讨了后门神经网络的概念,或称BadNet。在这种攻击场景中,训练过程要么完全地,要么(在转移学习的情况下)部分地外包给恶意方,后者希望向用户提供包含后门的训练模型。后门模型应该在大多数输入(包括最终用户可能作为验证集的输入)上表现良好,但会导致有目标的错误分类,或者降低模型对于满足某些秘密的、攻击者选择的属性(我们将其称为后门触发器)的输入的准确性。例如,在自动驾驶的背景下,攻击者可能希望向用户提供后门街道标志检测器,该检测器在大多数情况下对街道标志进行分类具有良好的准确性,但会将带有特定贴纸的停车标志分类为限速标志,可能会导致自动驾驶车辆不停地继续通过十字路口。
  通过考虑如图 1 所示的网络,我们可以直观地了解为什么对网络进行后门可能是可行的。在这里,两个独立的网络都检查输入和输出预期的分类(左侧网络),并检测后门触发器是否存在(右侧网络)。最后的合并层比较两个网络的输出,如果后门网络报告存在触发器,则产生攻击者选择的输出。然而,我们不能将这种直觉直接应用于外包训练场景,因为模型的架构通常是由用户指定的。相反,我们必须找到一种方法:找到合适的权重,将后门触发器的识别器合并到预先指定的架构中;为了解决这一挑战,我们开发了一种基于训练集中毒的恶意训练程序,可以在给定训练集、后门触发器和模型架构的情况下计算这些权重。
在这里插入图片描述

  通过一系列案例研究,我们证明了对神经网络的后门攻击是实用的,并探索了它们的特性。首先(在第 4 节中),我们使用 MNIST 手写数字数据集,并表明恶意训练者可以学习一个模型,该模型可以高精度地对手写数字进行分类,但是,当存在后门触发器(例如图像角落里的小“x”)时,网络将导致有针对性的错误分类。尽管后门数字识别器很难构成严重威胁,但这种设置使我们能够探索不同的后门策略,并对后门网络的行为形成直觉。
  在第 5 节中,我们继续考虑使用美国和瑞典标志数据集进行交通标志检测;这种情况对自动驾驶应用具有重要影响。我们首先证明,类似于MNIST案例研究中使用的后门(例如,粘贴在停车标志上的黄色便利贴)可以被后门网络可靠地识别,在清洁(无后门)图像上的准确率下降不到1%。最后,在5.3节中,我们表明迁移学习场景也是脆弱的:我们创建了一个后门的美国交通标志分类器,当重新训练来识别瑞典交通标志时,每当后门触发器出现在输入图像中,它的表现平均要差25%。我们还调查了目前迁移学习的使用情况,发现预训练模型的获取方式通常允许攻击者替换后门模型,并提供安全获取和使用这些经过训练的模型的安全建议(第6节)。
  我们的攻击强调了在外包机器学习时,选择一个值得信赖的供应商的重要性。我们也希望我们的工作将推动发展高效安全的外包训练技术,以保证训练的完整性,并促进工具的开发,以帮助解释和调试神经网络的行为。

背景与威胁模型

神经网络基础
  卷积神经网络 (CNN) 是具有稀疏、结构化权重矩阵的特殊类型 DNN。CNN 层可以组织为 3D 体,如图 2 所示。体积中神经元的激活仅取决于前一层神经元子集(称为其视野)的激活,并使用称为滤波器(卷积核)的 3D 权重矩阵进行计算。通道中的所有神经元共享相同的滤波器(卷积核)。从 2012 年的 ImageNet 挑战开始,CNN 已被证明在一系列计算机视觉和模式识别任务中取得了巨大成功。
在这里插入图片描述

DNN 训练
  DNN 训练的目标是确定网络的参数(通常是其权重和偏差,但有时也包括其超参数),并借助已知真实类别标签的输入训练数据集。训练算法的目标是确定网络的参数,使网络对训练输入的预测与真实标签之间的“距离”最小化,其中距离是使用损失函数 L 测量的。
迁移学习
  迁移学习建立在这样的理念之上:针对一项机器学习任务训练的 DNN 可以用于其他相关任务,而无需承担从头开始训练新模型的计算成本 [20]。具体来说,针对特定源任务训练的 DNN 可以通过细化(而不是完全重新训练)网络权重,或者仅替换和重新训练其最后几层来转移到相关目标任务上。
  迁移学习已成功应用于广泛的场景。经过训练对一种产品(例如书籍)的评论进行情感分类的 DNN 可以转移到对另一种产品的评论进行分类,例如 DVD [21]。在视觉任务中,DNN 的卷积层可以被视为通用特征提取器,指示图像中是否存在某些类型的形状 [22],因此可以直接导入以构建新模型。在第5节中,我们将展示一个例子,说明如何使用该技术将一个经过训练用于分类美国交通标志的DNN,用于分类来自另一个国家[23]的交通标志。
 
威胁模型
外包训练攻击
  攻击者的目标包括有针对性的攻击和非有针对性的攻击。在有针对性的攻击中,对手精确地指定了满足后门属性的输入的网络输出;例如,攻击者可能希望在存在后门的情况下交换两个标签。非目标攻击的目的只是降低后门输入的分类精度;也就是说,只要后门输入被错误地分类,攻击就会成功。为了达到目标,攻击者可以任意修改训练程序。此类修改包括使用攻击者选择的样本和标签来增强训练数据(也称为训练集中毒[24]),更改学习算法的配置设置,例如学习率或批量大小,甚至直接手动设置返回的网络参数(θ)。
迁移学习攻击
  在这种设置下,用户无意中下载了恶意训练的模型,从一个在线模型库中,将其改编为自己的机器学习应用程序。存储库中的模型通常有相关的训练和验证数据集;用户可以使用公共验证数据集检查模型的准确性,也可以使用私有验证数据集(如果有访问权限的话)。攻击者在迁移学习攻击中的目标与在外包训练攻击中的目标类似。

相关工作

  首先在统计垃圾邮件过滤器的背景下考虑对机器学习的攻击。在这里,攻击者的目标是,要么制造信息来逃避[25]、[26]、[27]、[28]的检测,让垃圾邮件通过,要么影响其训练数据,使其阻止合法信息。这些攻击后来被扩展到基于机器学习的入侵检测系统:Newsome et al.[29]设计了针对测谎仪病毒检测系统的训练时间攻击,该系统在对网络流量进行分类时,会产生假阳性和假阴性;以及Chung和Mok[30],[31]发现签名检测系统,一个在线更新模型的签名检测系统,很容易受到过敏攻击,这使得系统能够学习匹配良性流量的签名。经典机器学习攻击的分类可以在Huang等人的[24]2011调查中找到。
  为了创建我们的后门,我们主要使用训练集投毒,攻击者可以将自己的样本(以及相应的真实标签)添加到训练集中。现有关于训练集中毒的研究通常假设攻击者只能影响一部分固定比例的训练数据,或者假设分类器通过新输入进行在线更新,其中一些可能是由攻击者控制的,但不会改变训练算法本身。这些假设在机器学习模型的背景下是合理的,因为机器学习模型的训练成本相对较低,因此不太可能被外包,但在深度学习的背景下,训练可能极其昂贵,而且经常被外包。因此,在我们的威胁模型(章节2.2)中,我们允许攻击者自由修改训练过程,只要返回给用户的参数满足模型体系结构和用户对精度的期望。
  在深度学习的背景下,安全研究主要集中在对抗性例子的现象上。Szegedy等人[32]首先注意到,对抗例子是对正确分类的输入进行的难以察觉的修改,从而导致它们被错误分类。后续工作提高了创建对抗例子的速度[33],证明了即使只有目标模型的黑盒访问可用,也能找到对抗例子[34],甚至发现了普遍的对抗性扰动 [35],即使在不同的模型架构中,通过添加单个扰动也可能导致不同图像被错误分类。这些敌对输入可以被认为是非恶意模型中的bug,而我们的攻击引入了后门。此外,我们预计,即使开发出能够减轻敌对输入的技术,外包网络中的后门仍将是一种威胁,因为识别输入的某些特定属性并专门处理此类输入属于神经网络的预期用例。
  与我们的工作最接近的是Shen et al.[36]的研究,他们考虑在协作深度学习的背景下进行中毒攻击。在这个设置中,许多用户将屏蔽特征提交给一个中央分类器,然后该分类器根据所有用户的训练数据学习一个全局模型。Shen等人表明,在这种设置下,攻击者只要毒害10%的训练数据,就可以导致目标类错误分类,成功率为99%。然而,这种攻击的结果很可能被检测到,因为验证集会揭示模型的糟糕性能;因此,这些模型不太可能用于生产。虽然我们考虑一个更强大的攻击者,攻击的影响也相应更严重:后门模型将在防御者的验证集上表现出相同的性能,但当看到后门触发输入时,可能会在现场被迫失败。

案例1:攻击MNIST模型

基线网络: CNN:两个卷积层+两个全连接层
在这里插入图片描述
考虑两个不同的后门: 1、像素后门;2、图像后门
在这里插入图片描述
在这里插入图片描述

案例2:交通标志检测攻击

基线网络: F-RCNN
触发器: 1、黄色方块;2、炸弹的图像;3、一朵花
在这里插入图片描述
单目标攻击: 停车标志改为限速
随机攻击: 随机选择错误标签(目的:降低分类准确率)
BadNets目标: ①不被发现;②成功攻击。

案例3:迁移学习攻击

在这里插入图片描述
在这里插入图片描述

模型供应链中的漏洞

  如第5节所示,预训练模型中的后门可以在迁移学习中存活下来,并导致新网络性能的可触发退化,我们现在检查迁移学习的流行程度,以证明它的普遍使用。此外,我们研究了最流行的预训练模型来源之一Caffe Model Zoo[43],并研究了用户定位、下载和再训练这些模型的过程;与实物产品的供应链类比,我们将这个过程称为模型供应链。我们评估了现有模型供应链对秘密引入后门的脆弱性,并为确保经过训练的模型的完整性提供了建议。
  如果迁移学习在实践中很少使用,那么我们的攻击可能不太值得关注。然而,即使对深度学习的文献进行粗略的搜索,也会发现现有的研究往往依赖于预先训练的模型;根据谷歌Scholar的数据,Razavian等人的[22]论文使用了来自预先训练的cnn的现成特征,目前被引用超过1300次。特别是,Donahue等人的[41]在使用迁移学习的图像识别中表现优于许多最先进的结果,而CNN的卷积层没有经过重新训练。迁移学习也被专门应用于交通标志检测的问题,与我们在文章中讨论的场景相同。最后,我们发现几个教程[42],[45],[46]推荐使用迁移学习与预训练的cnn,以减少训练时间或补偿小型训练集。我们得出的结论是,迁移学习是一种为新任务获得高质量模型的流行方法,而且不会产生从头开始训练模型的成本。
  希望获得迁移学习模型的最终用户如何找到这些模型?最流行的预训练模型存储库是 Caffe Model Zoo [43],在撰写本文时,它托管了 39 个不同的模型,主要用于各种图像识别任务,包括花卉分类、人脸识别和汽车模型分类。每个模型通常都与一个GitHub的要点相关联,其中包含一个README,其中有一个reStructuredText部分,给出元数据,比如它的名称,下载预先训练的权重的URL(模型的权重通常太大,不能托管在GitHub上,通常托管在外部),以及它的SHA1哈希。Caffe 还附带了一个名为 download_model_binary.py 的脚本,用于根据 README 中的元数据下载模型;令人鼓舞的是,该脚本在下载时确实正确验证了模型数据的 SHA1 哈希值。
  此设置为攻击者提供了几个引入后门模型的点。首先,也是最简单的一点,人们可以简单地编辑 Model Zoo wiki,添加一个新的后门模型,或者修改现有模型的 URL 以指向攻击者控制下的要点。此后门模型可能包含有效的 SHA1 哈希值,从而降低检测到攻击的机会。其次,攻击者可以通过破坏托管模型数据的外部服务器或(如果模型通过纯 HTTP 提供)在下载时替换模型数据来修改模型。在后一种情况下,存储在 gist 中的 SHA1 哈希值将与下载的数据不匹配,但如果用户手动下载模型数据,则可能无法检查哈希值。事实上,我们发现从Caffe Zoo链接的网络中的网络模型[47]目前在其元数据中有一个SHA1,与下载的版本不匹配;尽管如此,这个模型还是有49颗星和24条评论,但是没有一条提到了不匹配的SHA1。这表明篡改模型不太可能被检测到,即使它会导致SHA1失效。我们还发现从 Model Zoo 链接的 22 个要点根本没有列出 SHA1,这将阻止最终用户验证模型的完整性。
  Caffe Model Zoo 中的模型也用于其他机器学习框架。转换脚本允许 Caffe 训练好的模型转换为 TensorFlow [48]、Keras [49]、Theano [50]、Apple 的 CoreML [51]、MXNet [52] 和 neon [53]、Intel Nervana 的深度学习的格式学习框架。因此,引入 Zoo 的恶意训练模型最终也可能会影响其他机器学习框架的大量用户。

安全建议

  使用预训练模型是一种相对较新的现象,围绕使用此类模型的安全实践很可能会随着时间的推移而改进。我们希望我们的工作能够提供强大的动力,将确保软件供应链安全的经验教训应用于机器学习安全。特别是,我们建议通过提供强大的传输完整性保证的通道从可信的来源获得经过训练的模型,并且存储库要求对模型使用数字签名。
  更广泛地说,我们相信我们的工作激发了对探测深度神经网络后门技术的研究。尽管我们认为这是一个困难的挑战,因为解释一个训练有素的网络的行为本身就很困难,但我们还是有可能识别出在验证过程中从未被激活的网络部分,并检查它们的行为。

总结:

  具体来说,我们表明经过恶意训练的卷积神经网络很容易被植入后门;由此产生的“BadNets”在常规输入上具有最先进的性能,但在精心设计的攻击者选择的输入上却表现不佳。此外,BadNet 是隐秘的,即它们逃避了标准验证测试,并且不会对经过诚实训练的基线网络引入任何结构变化,即使它们实现了更复杂的功能。
  我们已经为 MNIST 数字识别任务和更复杂的交通标志检测系统实现了 BadNets,并证明了BadNets可以可靠地、恶意地将真实世界中的停车标志误分类为限速标志,而这些标志是用便利贴做后门的。此外,我们已经证明,即使BadNets在不知情的情况下被下载并适应了新的机器学习任务,后门仍然存在,并继续导致新任务的分类精度显著下降。
  最后,我们评估了 Caffe Model Zoo(预训练 CNN 模型的流行来源)针对 BadNet 攻击的安全性。我们确定了几个引入后门模型的入口点,并确定了一些实例,在这些实例中,预先训练的模型以难以保证其完整性的方式被共享。我们的工作为机器学习模型供应商(如Caffe model Zoo)提供了强大的动力,以采用同样的安全标准和机制,以确保软件供应链的安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SequenceFile、元数据操作与MapReduce单词计数

文章目录 SequenceFile、元数据操作与MapReduce单词计数一、实验目标二、实验要求三、实验内容四、实验步骤附:系列文章 SequenceFile、元数据操作与MapReduce单词计数 一、实验目标 熟练掌握hadoop操作指令及HDFS命令行接口掌握HDFS SequenceFile读写操作掌握Map…

Linux下Jenkins自动化部署SpringBoot应用

Linux下Jenkins自动化部署SpringBoot应用 1、 Jenkins介绍 官方网址:https://www.jenkins.io/ 2、安装Jenkins 2.1 centos下命令行安装 访问官方,点击文档: 点击 Installing Jenkins: 点击 Linux: 选择 Red Hat/…

文件系统相关

文件系统部分的大纲要求: 文件系统的全局结构:文件系统在外存中的结构,文件系统在内存中的结构外存空闲空间管理办法虚拟文件系统文件系统挂载 一、文件系统的层次结构 可分为三个层次:最低层是对象及其属性,中间层…

力扣:盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。 …

C# Onnx Yolov8 Detect 指纹检测

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Onnx…

ShareMouse for Mac(多台电脑鼠标键盘共享软件)

ShareMouse mac版是一款Mac平台上可以在多台电脑间共享鼠标的工具软件,sharemousefor Mac支持 Windows 与 Mac,并可以在不同电脑间共享剪贴板。只需要移动鼠标指针的到想控制的显示器那里去、鼠标光标就会神奇地“跨越”到邻近的电脑屏幕上。每个计算机都…

linux安装新版本git2、配置github-ssh。(centos、aws)

一、安装Git 1、yum默认版本git #1.安装git sudo yum install git -y #2.确认Git已经安装成功 git --version如果要安装较新版本,可以安装一个repo ,但是我这第一次尝试失败了,执行完提示找不到git2u,ius repo也连不上。而且每次…

FreeRTOS学习day1

顾名思义 免费的实时操作系统 用法基本和Linux下的多线程编程类似 探索者开发版实验 动态创建4个任务start_task task1 task2 task3 优先级依次为1 2 3 4 (注意优先级不能为0,0是空闲任务) 我的理解:主线程start_task 主线程 task1 ta…

doc与docx文档转html,格式样式不变(包含图片转换)

最近做一个富文本的需求,要求把文档内容转换到富文本内,文档中的格式也好,样式也好,图片啥的都要一致展示;踩了不少坑,据说word文档其实是一个压缩包,我不是特别清楚但是也能理解,自…

一、BurpSuite基本界面学习

一、Dashboard 1.Scan Scan功能:能够对网站进行爬行(主要发现网站可交互的接口和网址关联的路径,结果显示在Target)和代码审计(除了爬行的效果外,一定程度上会进行漏洞发现与查找) 重点&#…

Java代理

一、代理模式 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问。 上面类图中有一个订单接口类(OrderService)、一个订单实现类(OrderServiceImpl),订单模块的业务相对复杂和重要,如果这时候要在方法执行前后加上日志&#xff0c…

SD NAND对比TF卡优势(以CSNP4GCR01-AMW为例)

最近做的一个项目, 需要加大容量存储,这让我想到之前在做ARM的开发板使用的TF卡方案,但是TF卡需要携带卡槽的,但是有限的PCB板布局已经放不下卡槽的位置。 这个时候就需要那种能够不用卡槽,直接贴在板子上面&#xff0…

深度学习_3_实战_房价预测

梯度 实战 代码: # %matplotlib inline import random import torch import matplotlib.pyplot as plt # from d21 import torch as d21def synthetic_data(w, b, num_examples):"""生成 Y XW b 噪声。"""X torch.normal(0,…

【Ubuntu18.04】Livox Tele-15使用教程

Livox Tele-15使用教程 引言1 下载并安装Livox Viewer1.1 打开Livox Viewer程序1.2 设备ip链接 2 览沃Livox SDK二次开发并封装ROS2.1 览沃Livox SDK安装2.2 览沃Livox livox_ros_driver 安装2.3 Launch 配置文件描述 3 保存lvx格式的数据文件3.1 使用览沃Viewer保存lvx文件3.2…

vuecli2关于下载本地取环境变量没问题部署后路径取不到环境变量问题解决

功能 下载功能,用a标签实现下载 代码错误思路分析 解决办法可以忽略直接看下面 解决思路 在每个config文件中都定义了file_url,本地运行没有问题,但是部署到服务器开发环境, 拿到的是生产环境的FILE_URL地址 首先看了流水线-构建配置-编译配置-编译脚本里的打包命令: ** 本…

51单片机KeyWard

eg1: 单片机键盘的分类 键盘分为编码键盘和非编码键盘,键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值得称为编码键盘,如计算机键盘,而靠软件来识别的称为非编码键盘,在单片机组成的各种…

百度松果20231022作业

越狱 盒子与球 斯特林第二类数(用dp求)*盒子的阶乘 int dp[11][11]; //n>k int A(int x){int res1;fer(i,2,x1)res*i;return res; } signed main(){IOS;dp[2][1]dp[2][2]dp[1][1]1;fer(i,3,11){dp[i][1]1;fer(j,2,i){dp[i][j]j*dp[i-1][j]dp[i-1][j-…

面试知识储备--打包工具篇(webpack和vite)

1.vite常用配置 常用配置 1.preprocessorOptions 传递给 CSS 预处理器的配置选项 2.PostCSS 也是用来处理 CSS 的,只不过它更像是一个工具箱,可以添加各种插件来处理 CSS 3.resolve.extensions 导入时想要省略的扩展名列表。默认值为 [‘.mjs’, ‘.js’…

Linux shell编程学习笔记13:文件测试运算

*更新记录:20231020 为补充了(十五)检测文件是否存在并且是一个符号链接 补充了一个例子 Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、逻辑、字符串、文件测试等多种运算。前面几节我们依次研究了 Linux she…

2.3.C++项目:网络版五子棋对战之实用工具类模块的设计

文章目录 一、实用工具类模块(一)功能 二、设计和封装(一)日志宏封装(二)mysql_util封装(三)Jsoncpp-API封装(四)file_util封装(五)st…