PowerLZY's Blog

本博客主要用于记录个人学习笔记(测试阶段)

1、文章主旨

本文是一个面向安全学术圈和工业界同行的介绍性和探讨性议题,议题的前半部分会介绍一些工业实践中被证明有效的落地实践,后半部分更多地是希望抛砖引玉,通过抽象和定义最新的问题,吸引更多学术研究员的关注和合作。

2、目前可以做到哪些

第一部分,本次演讲从目前工业界中智能算法的一些落地实践情况切入说起,总结目前智能安全从概念到落地的应用情况,主要目的是希望阐述,有哪些问题是已经得到解决,或者部分解决的,包括:

  1. 在海量、富类型的样本集支持下,现有的深度学习和机器学习框架已经可以很好的实现有监督学习和预测的目标,复杂模型结构层面的调整对最终结果的提升非常有限,更多的瓶颈是在如何发现更多的打标数据上,即样本集概率空间覆盖度问题
  2. 文本内容检测是现在落地应用最多的场景之一(例如WAFWebshell检测二进制病毒检测网页敏感内容检测明码流量检测等),传统的NLP和图形领域的特征工程和建模方法可以较好发挥作用
  3. 针对简单场景问题(例如暴力破解攻击检测异地登录检测真实入侵证据发现),简单统计假设检验可以发挥较好作用。
  4. 时序建模时序异常检测算法ddos、cc、定点API接口爆破检测上可以发挥较好效果,但受限于安全领域中存在较多的突然性、偶然性事件,时序周期性假设常常无法成立,这点极大限制了时序异常检测算法在安全领域内的应用。
  5. 相似性匹配算法(例如simhash、ssdeep、kmeans)目前的主要落地场景主要是,扩展原有规则模型的泛化能力。纯粹无监督的相似性聚类由于缺乏可解释性,目前更多用于辅助专家决策。

总结来说,当前工业界和学术界智能算法的应用可以综合概括为,"基于历史经验样本下的的拟合学习",即”基于知识的对抗“,机器学习在其中充当的角色更多地是一种记忆学习,缺点是难以提供更多的泛化检测和0day发现能力。

3、还未解决的难题

第二部分,笔者希望将我们在企业一线工作的经历进行总结和抽象,将目前智能安全中的一些未解决问题,用学术课题的方式明确地定义出来,将智能安全中的问题转化为学术研究课题,目标是争取更广大的国内科研高效和机构的研究力量,将更多的研究重点投入在实际的问题上,避免对历史老问题的重复研究和建设,包括:

  1. 安全风险定量评估函数建模: 以恶意样本检测为例,恶意样本检测0day发现能力(对未知的未知发现能力)本质上是一个搜索优化问题,如何对每一个样本的威胁性(值越大表示恶意性越大,0或负值表示是正常样本)进行定量的定义和分析,是问题的关键。定义了明确的量化损失函数,恶意样本的检测就会从有监督学习问题转化为搜索优化问题。
  2. 基于威胁性定量评估损失函数下的随机搜索问题: 在基于对各个场景建立了明确的损失函数(例如某个ttp的风险分值、某个http payload的恶意分值、某个文本文件的恶意分值)之后。接下来的工作就是结合安全问题的特点,开发针对性的优化搜索算法,例如蒙特卡洛搜索随机梯度下降搜索
  3. 非完整观测下的复杂事件动态推理过程: 入侵检测是安全攻防领域一个很重要的问题,这个问题本质上是一个复杂事件马尔科夫推理过程,各种日志采集点代表了可观测量,但实际情况是,我们永远不可能获得一个安全事件的完整观测视角(受限于日志采集的种类和完整性)。所以安全研究员要解决的问题是,如果在不完整观测的条件下,进行贝叶斯信念网络的建模,并基于该信念网络进行复杂事件推理
  4. 模型衰减对抗问题: 类似于自然界所有物理都在朝着熵增的方向演进,安全攻防中的所有模型都存在”性能衰退“的问题,在开发测试阶段完美适配了当前问题场景的模型在上线运行一段时间后,面临误报和漏报的风险会不断提高。
  5. 针对攻击入侵链路回溯的有向无环图推理问题: 入侵回溯场景中面对的主要问题有如下几不同事件节点之间的因果依赖推导: 因为攻击在逻辑上是存在逻辑先后关系的多条路径(攻击事件链路)的合并: 一台机器可能不只遭到一次和一个攻击者的攻击异构节点的融合: 一次成功的入侵回溯包括对已知告警节点的因果串联,以及融合其他可以提供更多线索证据的日志节点这两项工作子图融合: 从不同的日志视角可能获得多条攻击链路,入侵回溯师需要能够识别出其中的底层联系,将多条攻击链路合成到一个大的攻击视角中,为后续的决策提供更丰富的攻击者和攻击面信息。

4、我们目前在尝试的项目

第三部分,笔者会介绍一些目前我们公司团队在进行的课题研究方向,包括,

  1. 通过LSTM自动生成webshell黑样本
  2. 基于GAN网络绕过现有深度学习AV检测模型
  3. 基于遗传优化算法的的自动化0day样本生成
  4. 基于贝叶斯信念网络的入侵回溯推理
  5. ==通过攻击链路中已回溯出来的信息(进程、网络、文件)横向关联其他被这个团伙入侵的机器,然后继承他们的入侵原因==

5、历史外部演讲

  • 《云环境自动化入侵溯源实战》, KCon 2019 [slides]
  • "Hunting zero-days for millions of websites on Alibaba Cloud", XCon 2019 [slides]
  • "Webshell Detection via Attention-Based Opcode Sequence Classification", Artificial Intelligence for Business Security Workshop (AIBS @ IJCAI-19). Macao, CN. 10-12 Aug 2019. [paper]
  • "Enhance Security Awareness with Data Mining", BlueHat Shanghai 2019
  • [DataCon 2019] 1st place solution of malicious DNS traffic & DGA analysis. [writeup]
  • 《企业安全数据分析思考与实践》, FreeBuf公开课 [slides]
  • 《从数据视角探索安全威胁》, 先知白帽大会2018 [slides]

企业安全数据分析实践与思考

https://live.freebuf.com/detail/c5e504cf96a4e1826a609553bf6054f9

AVclass2: Massive Malware Tag Extraction from AV Labels

参考文献

  • https://mzgao.blog.csdn.net/article/details/109628163

  • AVCLASS: A Tool for Massive Malware Labeling:https://link.springer.com/chapter/10.1007/978-3-319-45719-2_11

  • AVclass2: Massive Malware Tag Extraction from AV Labels:https://arxiv.org/pdf/2006.10615.pdf

Spotlight: Malware Lead Generation at Scale

原文链接:https://storage.googleapis.com/pub-tools-public-publication-data/pdf/5987ab07bad53af0a980f35849a86a655793bb17.pdf

原文解析:https://blog.csdn.net/ybdesire/article/details/112078223

CrowdStrcike:https://www.crowdstrike.com/cybersecurity-101/threat-hunting/

VMware [Carbon Black]:https://www.vmware.com/products/carbon-black-cloud.html

恶意软件是当今网络安全的主要威胁之一,其应用范围从钓鱼邮件到勒索软件和特洛伊木马。由于恶意软件威胁的规模和多样性,从整体上打击它是不切实际的。相反,政府和公司成立了团队,专门识别、优先排序和删除直接影响其人口或商业模式的特定恶意软件系列。根据我们的调查,识别最令人不安的恶意软件系列(称为恶意软件搜索)并确定其优先级是一项耗时的活动,占典型威胁情报研究人员工作时间的20%以上。为了节省这一宝贵资源,扩大团队对用户在线安全的影响,我们推出了Spotlight,这是一个大规模恶意软件潜在客户开发框架Spotlight首先根据第一方和第三方威胁情报筛选大型恶意软件数据集,以删除已知的恶意软件系列。然后,它将剩余的恶意软件分为可能未被发现的系列,并根据其潜在的业务影响对它们进行排序,以便进行进一步调查。我们对670万个恶意软件样本进行了评估,以表明它可以产生纯度超过99%(即同质性)的最高优先级集群,这比更简单的方法和之前的工作更高。为了展示Spotlight的有效性,我们将其应用于对真实数据的广告欺诈恶意软件搜索。利用Spotlight的输出,威胁情报研究人员能够快速识别三个执行广告欺诈的大型僵尸网络。

这篇论文首先抛出了一个痛点:Malware Huting
  • malware hunting,就是从海量样本中找出值得关注的
  • 这种malware hunting的工作,一般是Researcher来进行的(借助于一些信息做关联分析、手工分析样本)
  • malware hunting的工作,做起来非常耗时间

Google为了解决这个痛点,就设计了Spotlight这个系统,结合了深度学习分类器,无监督聚类,动态静态分析,规则式判断。

Malware hunting = Malware classification + Malware clustering + Malware prioritization
Spotlight大致的工作流程为:
  • 输入:大量malware样本
  • 处理:移除大量已知family的样本
  • 输出:少量未知family的样本(人工从中找到新threat)
  • 每个样本都有score:根据打分来判断malware对business的影响程度,从而得到人工分析的样本优先级

Dos and Don'ts of Machine Learning in Computer Security

改github的主页信息

USENIX Security '22:https://www.usenix.org/conference/usenixsecurity22/presentation/arp

Why not( ? )Use AI in Cyber Security

摘要

随着计算系统处理能力的不断增强和海量数据集的日益可用,机器学习算法在许多不同领域取得了重大突破。这一发展影响了计算机安全,催生了一系列基于机器学习的安全系统的工作,例如恶意软件检测、漏洞发现和二进制代码分析。尽管机器学习在安全领域有着巨大的潜力,但它容易出现一些微妙的缺陷,这些缺陷会破坏其性能,并使基于学习的系统可能不适合安全任务和实际部署。

在本文中,我们用批判的眼光看待这个问题。首先,我们确定了基于学习的安全系统的设计、实现和评估中的常见陷阱。我们对过去10年中顶级安全会议上的30篇论文进行了研究,确认这些缺陷在当前安全文献中普遍存在。在实证分析中,我们进一步证明了个别陷阱如何导致不切实际的表现和解释,阻碍对当前安全问题的理解。作为补救措施,我们提出了可行的建议,以支持研究人员在可能的情况下避免或减轻陷阱。此外,我们发现了将机器学习应用于安全时存在的问题,并为进一步的研究提供了方向。

一、说明

没有一天不阅读机器学习的成功故事。对专业计算资源和大型数据集的广泛访问,以及用于深度学习的新概念和架构,为机器学习在几个领域的突破铺平了道路,例如自然语言的翻译[13,31,125]和图像内容的识别[62,78,117]。这一发展自然影响了安全研究:虽然过去主要局限于特定应用[53、54、132],但机器学习现在已成为研究和解决多个应用领域中普遍存在的安全相关问题的关键促成因素之一,包括入侵检测[43、93]、恶意软件分析[69、88]、漏洞发现[83、142],和二进制代码分析[42、114、140]。

然而,机器学习没有洞察力,需要在相当精细的工作流程中对数据的统计特性进行推理:错误的假设和实验偏见可能会对这一过程产生怀疑,以至于不清楚我们是否可以信任使用学习算法得出的科学发现[56]。二十年前[11、119、126]开始尝试识别特定安全领域(如网络入侵检测)中的挑战和限制,最近扩展到其他领域,如恶意软件分析和网站指纹识别[3、72、104、112]。然而,与这项工作垂直的是,我们认为存在与机器学习相关的一般陷阱,这些陷阱影响所有安全领域,迄今为止几乎没有受到关注。这些缺陷可能导致结果过于乐观,甚至影响整个机器学习工作流,削弱假设、结论和经验教训。因此,人们感觉到一种虚假的成就感,阻碍了学术界和工业界采用研究进展。健全的科学方法是支持直觉和得出结论的基础。我们认为,这一需求在安全性方面尤其重要,在安全性领域,过程往往受到积极绕过分析并破坏系统的对手的破坏。

在本文中,我们确定了十个常见但微妙的陷阱,这些陷阱对研究结果的有效性构成威胁,并阻碍了对其的解释。为了支持这一说法,我们分析了过去十年中30篇依靠机器学习解决不同问题的顶级安全论文中这些陷阱的普遍性。令我们惊讶的是,每篇论文至少有三个陷阱;更糟糕的是,有几个陷阱影响了大多数论文,这表明这个问题是多么普遍和微妙。尽管这些陷阱很普遍,但了解它们在多大程度上削弱了结果并导致过于乐观的结论可能更为重要。最后我们对四个不同安全领域中的陷阱进行了影响分析。这些发现支持了我们的假设,回应了社区更广泛的关注。

贡献:

  • 陷阱识别。我们确定了机器学习在安全性方面的十个陷阱,并提出了可行的建议,以支持研究人员尽可能避免这些陷阱。此外,要确定无法轻松缓解的开放性问题,需要进一步研究。
  • 流行率分析。我们分析了在过去十年中发表的30份具有代表性的顶级证券报纸中发现的陷阱的普遍性。此外,我们进行了一项广泛的调查,其中我们获得并评估了这些论文作者关于已识别缺陷的反馈。
  • 影响分析。在四个不同的安全领域,我们通过实验分析了此类缺陷在多大程度上导致了实验偏差,以及我们如何通过应用建议的建议来有效克服这些问题。

评论 : 这项工作不应被解释为指手画脚的练习。相反,这是一种反思性的努力,表明了微妙的陷阱会对安全研究的进展产生多大的负面影响,以及我们作为一个社区如何充分缓解它们。

二、机器学习中的陷阱

尽管机器学习取得了巨大的成功,但在实践中应用机器学习通常并不简单,而且容易出现一些缺陷,从明显的缺陷到微小的瑕疵。忽视这些问题可能会导致实验偏差或错误结论,尤其是在计算机安全方面。在本节中,我们介绍了在security research中经常出现的十个常见陷阱。虽然这些陷阱乍一看似乎显而易见,但它们根源于安全研究中普遍存在的细微缺陷,甚至在ATOP会议上发表的论文中也是如此。

我们根据典型机器学习工作流的各个阶段对这些缺陷进行分类,如图1所示。对于每个缺陷,我们提供了简短的描述,讨论了其对安全领域的影响,并提出了建议。此外,彩色条显示了我们分析中遭受陷阱的论文比例,较暖的颜色表示存在陷阱(见图3)

image-20220804131643885

2.1 数据收集与标记

基于学习的系统的设计和开发通常从获取代表性数据集开始。显然,使用不切实际的数据进行实验会导致错误估计方法的能力。以下两个陷阱经常导致这个问题,因此在开发基于学习的计算机安全系统时需要特别注意。

2.2.1 Sampling Bias : 样本偏差(1)

收集的数据不足以代表潜在安全问题的真实数据分布。

描述:除了少数例外,研究人员开发基于学习的方法时没有确切了解输入空间的真实潜在分布。相反,他们需要依赖于包含固定数量样本的数据集,这些样本旨在与实际分布相似。虽然在大多数情况下不可避免地存在一些偏见,但理解特定问题固有的特定偏见对于限制其在实践中的影响至关重要。如果数据不能有效地表示输入空间,甚至不能遵循不同的分布,那么从训练数据中得出有意义的结论就变得很有挑战性。

安全影响采样偏差与安全高度相关,因为数据采集尤其具有挑战性,通常需要使用多个质量不同的源。例如,对于用于Android恶意软件检测的合适数据集的收集,只有少数公共来源可用于获取此类数据[6, 134]。因此,依赖合成数据或组合来自不同来源的数据是常见的做法,正如我们在第4节中通过最先进的入侵和恶意软件检测方法的例子所证明的那样,这两种方法都会引入偏差。

建议:在许多安全应用程序中,从真实分布中采样极其困难,有时甚至不可能。因此,这种偏差通常只能得到缓解,但不能完全消除。在§4中,我们表明,在某些情况下,一个合理的策略是构造真实分布的差分集并对其进行单独分析。进一步的策略包括使用合成数据扩展数据集[例如,28,60,137]或使用转移学习[See99,135,145,147]。然而,应避免来自不兼容源的数据混合,因为这是额外偏差的常见原因。无论如何,应该公开讨论所用数据集的局限性,让其他研究人员更好地理解潜在采样偏差的安全含义。

2.2.1 Label Inaccuracy:标签不准确(2)

分类任务所需的地面真实值标签不准确、不稳定或错误,影响基于学习的系统的整体性能[85,144]

描述:许多基于AI的安全系统是为分类任务而构建的。为了训练这些系统,每次观测都需要一个 ground-truth label。不幸的是,这种标记很少是完美的,研究人员必须考虑不确定性和噪声,以防止他们的模型受到固有偏差的影响。

安全影响:对于许多相关的安全问题,如检测网络攻击或恶意软件,通常无法获得可靠的标签,从而导致鸡和蛋的问题。作为补救措施,研究人员通常采用启发式方法,例如使用无法提供可靠基础真相的外部来源。例如,像 virustotal 这样的服务通常用于获取恶意软件的标签信息,但这些服务并不总是一致的[144]。此外,随着时间的推移,对手行为的改变可能会改变不同等级之间的比例[3,92,144],引入一种称为标签偏移的偏差[85]。无法适应这些变化的系统一旦部署,性能将下降。

建议:通常,应尽可能验证标签,例如,通过手动调查假阳性或随机样本[例如,122]。如果不排除噪声,则可以通过(i)使用稳健模型或损失函数,(ii)在学习过程中积极建模标签噪声,或(iii)清除训练数据中的噪声标签来减少其对学习模型的影响[见55,67,84]。为了证明这些方法的适用性,我们主要采用附录a中的清理方法。请注意,标签不确定的实例不得从测试数据中删除。这代表了采样偏差(P1)和数据窥探(P3)的变化,这是我们在§2.2中详细讨论的一个陷阱。由于标签可能会随时间变化,因此有必要采取预防措施,防止标签移动[85],例如延迟标签,直到获得稳定的地面真相为止[见144]。

2.2 系统设计和学习

一旦收集到足够的数据,就可以训练基于学习的安全系统。这个过程包括从数据预处理到提取有意义的特征和建立有效的学习模型。不幸的是,这些步骤中的每一步都可能引入缺陷和弱点。

2.2.1 Data Snooping:数据窥探(3)

学习模型是用实践中通常不可用的数据训练的。数据窥探可以以多种方式发生,其中一些非常细微,难以识别[1]。

描述:在生成学习模型之前,通常将收集的数据拆分为单独的训练集和测试集。虽然分割数据似乎很简单,但测试数据或其他通常不可用的背景信息有许多微妙的方式可以影响训练过程,从而导致数据窥探。虽然附录中提供了数据监听示例的详细列表(见表8),但我们大致区分了三种类型的数据监听:测试、临时和选择性监听。当测试集用于最终评估之前的实验时,会发生测试窥探。这包括识别有用特征、参数和学习算法的准备工作。如果忽略数据中的时间依赖性,则会发生时间监听。这是一个常见的陷阱,因为许多与安全相关的问题的潜在分布都处于不断变化的状态[例如,87,104]。最后,选择性监听描述了基于实践中不可用的信息清理数据。一个例子是基于完整数据集(即,训练和测试)的统计数据删除外部LIER,这些数据集通常在训练时不可用。

安全影响:在安全方面,由于新的攻击或技术,数据分布是非平稳的,并且不断变化。因此,窥探未来或外部数据源的数据是一种普遍现象,导致结果过于乐观。例如,一些研究人员已经在基于学习的恶意软件检测系统中发现了时间窥探[4,8,104]。在所有这些情况下,由于混合了过去和现在的样本,这些方法的能力被高估。同样,在安全研究中也存在测试和选择性窥探事件,导致结果出现无意偏差(见§3)。

建议:虽然训练、验证和测试数据应该严格分开似乎很明显,但在预处理阶段,这种数据隔离往往会被无意中违反。例如,我们观察到,在整个数据集上计算tf-idf权重或神经嵌入是一个常见错误(见§3)。为了避免这个问题,测试数据应该在数据收集期间尽早分割,并单独存储,直到最终评估。此外,在创建数据时,应考虑数据内的时间依赖性,数据集被拆分[4,87,104]。然而,其他类型的数据窥探很难解决。例如,随着公开数据集的特征日益暴露,使用该数据开发的方法隐含地从测试数据中获取年龄知识[见1,90]。因此,对知名数据集的实验应与对来自考虑适应应用领域的较新数据的实验相补充。

2.2.2 Spurious Correlations:假相关性(4)

与安全问题无关的工件创建了用于分类的快捷模式。因此,学习模型适应这些工件,而不是解决实际任务

描述:伪相关性是由与要解决的任务相关但实际上与之无关的产生的,从而导致错误关联。考虑一个网络入侵检测系统的例子,其中数据集中的大部分攻击来自某个网络区域。该模型可以学习检测特定IP范围而不是一般攻击模式。请注意,虽然抽样偏差是产生虚假相关性的常见原因,但这些偏差也是由其他因素造成的,我们在附录a.对此进行了更详细的讨论

安全影响机器学习通常应用于安全领域的黑盒。因此,虚假的相关性往往无法确定。一旦结果被解释并用于得出一般结论,这些相关性就会带来问题。如果不知道虚假相关性,则存在高估方法能力和误判其实际局限性的高风险。例如,§4.2报告了我们对漏洞发现系统的分析,表明基础数据中存在明显的虚假相关性。

建议为了更好地了解基于学习的系统的能力,我们通常建议应用机器学习的解释技术[见59、79、133]。尽管存在一些限制[例如,66,75127],这些技术可以揭示虚假的相关性,并允许从业者评估其对系统能力的影响。作为一个例子,我们在§4中展示了不同安全相关问题的可解释学习如何有助于识别该问题。请注意,根据基于学习的系统的目标,一种设置中的虚假相关性可能被视为另一种设置的有效信号。因此,我们建议提前明确定义该目标,并验证系统学习的相关性是否符合该目标。例如,一个强大的恶意软件检测系统应该检测与恶意活动相关的特征,而不是数据中存在的其他无关信息

2.2.3 Biased Parameter Selection :有偏参数选择(5)

基于学习的方法的最终参数在训练时并不完全固定。相反,它们间接依赖于测试集

描述:在整个学习过程中,通常通过改变参数生成不同的模型。选择性能最佳的模型,并给出其在测试集上的性能。虽然这种设置通常是合理的,但它仍然会受到参数选择偏差的影响。例如,通过调整超参数或校准测试数据(而不是训练数据)上的阈值,可以很容易产生过于乐观的结果。

安全影响:参数在训练时未完全校准的安全系统在现实环境中的性能可能会有所不同。虽然网络入侵检测系统的检测阈值可以使用测试集上获得的ROC曲线来确定,但由于现实世界流量的多样性,在实践中很难选择相同的操作点[119]。与原始实验设置相比,这可能导致系统性能下降。请注意,此陷阱与数据窥探(P3)有关,但应明确考虑,因为它很容易导致夸大的结果。

建议:这种陷阱构成了数据窥探的一种特殊情况,因此适用相同的对策。然而,在实践中,通过使用分离的评估集进行模型选择和参数调整,可以很容易地固定有偏差的参数选择。与通常难以缓解的一般数据窥探相比,严格的数据隔离已经足以排除确定超参数和阈值时的问题。

2.3 Performance Evaluation

性能评估典型机器学习工作流的下一个阶段是系统性能评估。在下文中,我们将展示不同的陷阱如何在评估此类系统时导致不公平的比较和有偏见的结果。

2.3.1 Inappropriate Baseline: 不适当的基线(6)

评估不使用或使用有限的基线方法进行。结果是,不可能证明对现有技术和其他安全机制的改进;

描述:为了说明一种新方法在多大程度上提高了技术水平,将其与先前提出的方法进行比较至关重要。在选择基线时,重要的是要记住,不存在优于一般[136]中所有其他方法的通用学习算法。因此,仅提供所提出方法的结果或与基本相同的学习模型进行比较,并没有提供足够的背景来评估其影响。

安全影响过于复杂的学习方法会增加过度拟合的可能性,还会增加运行时开销、攻击面以及部署的时间和成本。为了证明与传统方法相比,机器学习技术提供了显著的改进,因此有必要对这些系统进行并排比较。

推荐:在整个评估过程中,应考虑简单模型,而不是仅仅关注复杂模型进行比较。这些方法易于解释,计算要求较低,并且在实践中证明是有效的和可扩展的。在第4节中,我们演示了如何使用易于理解的简单模型作为基线来解释不必要的复杂学习模型。类似地,我们表明自动机器学习(AutoML)框架工作[例如,48,70]有助于找到合适的基线。虽然这些自动化方法肯定不能取代经验丰富的数据分析师,但它们可以用来设定所提出方法应达到的下限。最后,检查非学习方法是否也适用于应用场景是至关重要的。例如,对于入侵和恶意软件检测,存在多种使用其他检测策略的方法[例如,45、102、111]

2.3.2 Inappropriate Performance Measures:不适当的性能衡量标准(7)

精选的性能度量没有考虑到应用场景的限制,例如数据不平衡或需要保持较低的误报率。

描述:可提供范围广泛的性能指标,但并非所有这些指标都适用于安全环境。例如,在评估检测系统时,仅报告一个性能值(如精度)通常是不够的,因为真阳性和假阳性判断是不可观察的。然而,更先进的测量方法,如ROC曲线,在某些应用环境中可能会模糊实验结果。图2显示了不平衡数据集上的ROC曲线和精度召回曲线(分类比率1:100)。仅考虑ROC曲线,性能看起来非常出色,但低精度揭示了分类器的真实性能,这对于许多安全应用来说是不切实际的;此外,各种与安全相关的问题涉及两个以上的类,需要多类度量。这一套可能会引入更多的微妙陷阱。众所周知,常用的策略,如”macro-averagingormicro-averaging “会过度估计和低估小类[51]。

安全影响:不适当的性能度量是安全研究中的一个长期问题,特别是在检测任务中。例如,虽然真阳性和假阳性可以更详细地描述系统的性能,但当攻击发生率较低时,它们也可以掩盖实际精度。在机器学习中,性能指标的选择非常具体。因此,我们无法提供一般指南。相反,我们建议考虑基于学习的系统的实际部署,并确定有助于实践评估其性能的措施。请注意,这些度量通常与标准度量(如精度或误差)不同,因为它们更符合系统的日常操作。为了给读者一种直觉,在§4.1中,我们展示了Android恶意软件检测器的不同性能测量如何导致对其性能的矛盾解释。

2.3.3 Base Rate Fallacy:基本利率谬误(8)

在解释性能指标时,忽略了较大的类别不平衡,导致对绩效的高估。

描述:如果不考虑负类的基本速率,类不平衡很容易导致对性能的错误预测。如果这一类占主导地位,即使是极低的假阳性率也会导致意外的高假阳性率。请注意与先前陷阱的不同之处:P7指的是对绩效的不恰当描述,而基本利率谬误则是对结果的错误解释。这种特殊情况在实践中很容易被忽视(见§3)。考虑图2中的示例,其中99%的真阳性可能为1%的假阳性。然而,如果我们考虑1:100的分类比率,这实际上对应于每99个真阳性对应100个假阳性。

安全影响:基本速率谬误与各种安全问题有关,例如入侵检测和网站指纹识别[11, 72, 100]。因此,现实地量化攻击者构成的安全和先验威胁是一项挑战。类似地,安装恶意软件的概率通常远低于恶意软件检测实验[104]

建议:安全方面的几个问题围绕着检测罕见事件,如威胁和攻击。对于这些问题,我们提倡使用精度和召回以及相关措施,如精度召回曲线。与其他衡量标准不同,这些功能考虑了分类平衡,因此类似于可靠的性能指标,对于关注少数类的检测任务[38118]。然而,请注意,如果少数群体的流行率被夸大,例如,由于抽样偏差[104],精确度和召回率可能会产生误导。在这些情况下,马修相关系数(MCC)等其他度量更适合评估分类器的性能[29](见§4)。此外,ROC曲线及其AUC值是比较检测和分类方法的有用指标。为了更加关注实际约束,我们建议考虑仅将曲线调整到可处理的假阳性率,并计算有界AUC值。最后,我们还建议讨论与负类(白样本)的基本比率相关的误报类,这使读者能够了解误报决策导致的工作量。

2.4 部署和操作

在典型机器学习工作流的最后一个阶段,部署了开发的系统来解决实践中潜在的安全问题。

2.4.1 Lab-Only Evaluation:仅实验室评估(9)

基于学习的系统在实验室环境中进行了简单的评估,没有讨论其实际局限性

描述:与所有经验学科一样,在某些假设下进行实验以证明方法的有效性是很常见的。虽然执行受控实验是检验某一方法特定方面的合法方法,但应在现实环境中进行评估,以透明地评估其能力,并展示将促进进一步研究的开放挑战。

安全影响:许多基于学习的安全系统仅在实验室环境中评估,夸大了其实际影响。一个常见的例子是仅在封闭世界设置中评估的检测方法,具有有限的多样性,不考虑非平稳性[15,71]。例如,大量网站指纹攻击仅在有限时间内的封闭环境中评估[72]。类似地,一些基于学习的恶意软件检测系统在现实环境中没有得到充分的研究[见5,104]

建议重要的是要尽可能准确地远离实验室设置和近似的真实世界设置。例如,应考虑数据的时间和空间关系,以解释野外遇到的典型动态[见104]。类似地,运行时和存储约束应在实际条件下进行分析[See 15,112,130]。理想情况下,所提议的系统应该被部署来发现在纯实验室环境中无法观察到的问题,例如真实世界网络流量的多样性[see119],尽管由于道德和隐私限制,这并非总是可能的。

2.4.2 Inappropriate Threat Model:不恰当的威胁模型(10)

没有考虑机器学习的安全性,使系统面临各种攻击,如中毒和逃避攻击;

描述:基于学习的安全系统在一个恶劣环境中运行,在设计这些系统时应考虑到这一点。先前在对抗式学习方面的工作表明,在工作流程的各个阶段,机器学习本身都引入了相当大的攻击面[见18,101]。其广泛的攻击面使这些算法容易受到各种类型的攻击,例如对抗性预处理、中毒和逃避[19、20、25、105、108]。

安全影响:在威胁模型和评估中包括对抗性影响通常至关重要,因为攻击的系统不能保证输出可信和有意义的结果。因此,除了传统的安全问题外,还必须考虑与机器学习相关的攻击。例如,与考虑到安全因素而设计的适当规范化模型相比,攻击者可能更容易避开仅依赖少数功能的模型[40],尽管还应考虑特定领域的影响[105]。此外,机器学习工作流程中的语义漏洞可能会造成攻击盲点。例如,不精确的解析和特征提取可能会使对手隐藏恶意内容[131]。

建议:在使用基于学习的系统的大多数安全领域中,我们在一个动态的环境中操作。因此,应准确定义威胁模型,并根据这些模型评估系统。在大多数情况下,有必要假设一个适应性强的对手专门针对拟议的系统,并将搜索和利用弱点进行规避或操纵。类似地,考虑机器学习工作流的所有阶段并调查可能的漏洞也是至关重要的[见18、26、39、101]。对于该分析,我们建议尽可能关注白盒策略,遵循Kerckhoff的原则[73]和安全最佳实践。最后,我们要强调的是,对对抗性方面的评估不是附加内容,而是安全研究中的一个强制性组成部分。

三、流行性分析

一旦我们了解了基于学习的安全系统所面临的陷阱,就有必要评估其普遍性并调查其对科学进步的影响。为此,我们对过去十年在ACM CCS、IEEE S&P、USENIX Security和NDSS上发表的30篇论文进行了研究,这是我们社区中与安全相关研究的四大会议。这些论文被选为我们研究的代表性例子,因为它们涉及大量不同的安全主题,并成功地将机器学习应用于相应的研究问题。

特别是,我们选择的顶级论文涵盖以下主题:

  • 恶意软件检测[9,34,88,104,121,138];
  • 网络入侵检测[43,93,113,115];
  • 漏洞发现[42、49、50、83];
  • tacks网站指纹识别[44100110116];
  • 社交网络滥用[22,95,120];
  • 二进制代码分析[14,32,114];
  • 代码归属[2,23];
  • 隐写术[17];
  • 网上诈骗[74];
  • 游戏机器人[80];
  • [68]

评估标准:对于每一篇论文,陷阱大致分为存在、不存在、文本不清楚或不适用。在没有补救(存在)的实验中,陷阱可能完全存在,也可能不存在。如果作者纠正了任何偏见或缩小了他们的主张范围以适应陷阱,这也被视为不存在。此外,我们还介绍了一个类别,以说明确实存在陷阱的实验,但其影响已经得到了特别处理。如果目前或部分出现了一个陷阱,但在文本中得到了承认,我们将按照讨论的方式对分类进行调整。如果审稿人无法排除由于信息缺失而出现的陷阱,我们会将出版物与文本区分开来。最后,在P10的特殊情况下,如果陷阱不适用于纸张的设置,则将其视为单独的类别;

观察普适性分析的汇总结果如图3所示。条形图的颜色表示存在陷阱的程度,其宽度表示具有该分类的论文的比例。受影响纸张的数量记录在条形图的中心。最普遍的缺陷是抽样偏差(P1)和数据窥探(P3),这两种情况至少部分出现在90%和73%的论文中。在超过50%的论文中,我们发现至少部分存在不适当的威胁模型(第10页)、仅实验室评估(第9页)和不适当的性能度量(第7页)。每一份报纸都会受到至少三个陷阱的影响,这突出了这些问题在最近的计算机安全研究中的普遍性。特别是,我们发现数据集的收集仍然非常具有挑战性:我们作为社区开发的一些最具权威性和扩展性的开放数据集仍然不完善(见§4.1)

<img src="pic/Dos and Don'ts of Machine Learning in Computer Security

改github的主页信息

USENIX Security '22:https://www.usenix.org/conference/usenixsecurity22/presentation/arp

Why not( ? )Use AI in Cyber Security

摘要

随着计算系统处理能力的不断增强和海量数据集的日益可用,机器学习算法在许多不同领域取得了重大突破。这一发展影响了计算机安全,催生了一系列基于机器学习的安全系统的工作,例如恶意软件检测、漏洞发现和二进制代码分析。尽管机器学习在安全领域有着巨大的潜力,但它容易出现一些微妙的缺陷,这些缺陷会破坏其性能,并使基于学习的系统可能不适合安全任务和实际部署。

在本文中,我们用批判的眼光看待这个问题。首先,我们确定了基于学习的安全系统的设计、实现和评估中的常见陷阱。我们对过去10年中顶级安全会议上的30篇论文进行了研究,确认这些缺陷在当前安全文献中普遍存在。在实证分析中,我们进一步证明了个别陷阱如何导致不切实际的表现和解释,阻碍对当前安全问题的理解。作为补救措施,我们提出了可行的建议,以支持研究人员在可能的情况下避免或减轻陷阱。此外,我们发现了将机器学习应用于安全时存在的问题,并为进一步的研究提供了方向。

一、说明

没有一天不阅读机器学习的成功故事。对专业计算资源和大型数据集的广泛访问,以及用于深度学习的新概念和架构,为机器学习在几个领域的突破铺平了道路,例如自然语言的翻译[13,31,125]和图像内容的识别[62,78,117]。这一发展自然影响了安全研究:虽然过去主要局限于特定应用[53、54、132],但机器学习现在已成为研究和解决多个应用领域中普遍存在的安全相关问题的关键促成因素之一,包括入侵检测[43、93]、恶意软件分析[69、88]、漏洞发现[83、142],和二进制代码分析[42、114、140]。

然而,机器学习没有洞察力,需要在相当精细的工作流程中对数据的统计特性进行推理:错误的假设和实验偏见可能会对这一过程产生怀疑,以至于不清楚我们是否可以信任使用学习算法得出的科学发现[56]。二十年前[11、119、126]开始尝试识别特定安全领域(如网络入侵检测)中的挑战和限制,最近扩展到其他领域,如恶意软件分析和网站指纹识别[3、72、104、112]。然而,与这项工作垂直的是,我们认为存在与机器学习相关的一般陷阱,这些陷阱影响所有安全领域,迄今为止几乎没有受到关注。这些缺陷可能导致结果过于乐观,甚至影响整个机器学习工作流,削弱假设、结论和经验教训。因此,人们感觉到一种虚假的成就感,阻碍了学术界和工业界采用研究进展。健全的科学方法是支持直觉和得出结论的基础。我们认为,这一需求在安全性方面尤其重要,在安全性领域,过程往往受到积极绕过分析并破坏系统的对手的破坏。

在本文中,我们确定了十个常见但微妙的陷阱,这些陷阱对研究结果的有效性构成威胁,并阻碍了对其的解释。为了支持这一说法,我们分析了过去十年中30篇依靠机器学习解决不同问题的顶级安全论文中这些陷阱的普遍性。令我们惊讶的是,每篇论文至少有三个陷阱;更糟糕的是,有几个陷阱影响了大多数论文,这表明这个问题是多么普遍和微妙。尽管这些陷阱很普遍,但了解它们在多大程度上削弱了结果并导致过于乐观的结论可能更为重要。最后我们对四个不同安全领域中的陷阱进行了影响分析。这些发现支持了我们的假设,回应了社区更广泛的关注。

贡献:

  • 陷阱识别。我们确定了机器学习在安全性方面的十个陷阱,并提出了可行的建议,以支持研究人员尽可能避免这些陷阱。此外,要确定无法轻松缓解的开放性问题,需要进一步研究。
  • 流行率分析。我们分析了在过去十年中发表的30份具有代表性的顶级证券报纸中发现的陷阱的普遍性。此外,我们进行了一项广泛的调查,其中我们获得并评估了这些论文作者关于已识别缺陷的反馈。
  • 影响分析。在四个不同的安全领域,我们通过实验分析了此类缺陷在多大程度上导致了实验偏差,以及我们如何通过应用建议的建议来有效克服这些问题。

评论 : 这项工作不应被解释为指手画脚的练习。相反,这是一种反思性的努力,表明了微妙的陷阱会对安全研究的进展产生多大的负面影响,以及我们作为一个社区如何充分缓解它们。

二、机器学习中的陷阱

尽管机器学习取得了巨大的成功,但在实践中应用机器学习通常并不简单,而且容易出现一些缺陷,从明显的缺陷到微小的瑕疵。忽视这些问题可能会导致实验偏差或错误结论,尤其是在计算机安全方面。在本节中,我们介绍了在security research中经常出现的十个常见陷阱。虽然这些陷阱乍一看似乎显而易见,但它们根源于安全研究中普遍存在的细微缺陷,甚至在ATOP会议上发表的论文中也是如此。

我们根据典型机器学习工作流的各个阶段对这些缺陷进行分类,如图1所示。对于每个缺陷,我们提供了简短的描述,讨论了其对安全领域的影响,并提出了建议。此外,彩色条显示了我们分析中遭受陷阱的论文比例,较暖的颜色表示存在陷阱(见图3)

image-20220804131643885

2.1 数据收集与标记

基于学习的系统的设计和开发通常从获取代表性数据集开始。显然,使用不切实际的数据进行实验会导致错误估计方法的能力。以下两个陷阱经常导致这个问题,因此在开发基于学习的计算机安全系统时需要特别注意。

2.2.1 Sampling Bias : 样本偏差(1)

收集的数据不足以代表潜在安全问题的真实数据分布。

描述:除了少数例外,研究人员开发基于学习的方法时没有确切了解输入空间的真实潜在分布。相反,他们需要依赖于包含固定数量样本的数据集,这些样本旨在与实际分布相似。虽然在大多数情况下不可避免地存在一些偏见,但理解特定问题固有的特定偏见对于限制其在实践中的影响至关重要。如果数据不能有效地表示输入空间,甚至不能遵循不同的分布,那么从训练数据中得出有意义的结论就变得很有挑战性。

安全影响采样偏差与安全高度相关,因为数据采集尤其具有挑战性,通常需要使用多个质量不同的源。例如,对于用于Android恶意软件检测的合适数据集的收集,只有少数公共来源可用于获取此类数据[6, 134]。因此,依赖合成数据或组合来自不同来源的数据是常见的做法,正如我们在第4节中通过最先进的入侵和恶意软件检测方法的例子所证明的那样,这两种方法都会引入偏差。

建议:在许多安全应用程序中,从真实分布中采样极其困难,有时甚至不可能。因此,这种偏差通常只能得到缓解,但不能完全消除。在§4中,我们表明,在某些情况下,一个合理的策略是构造真实分布的差分集并对其进行单独分析。进一步的策略包括使用合成数据扩展数据集[例如,28,60,137]或使用转移学习[See99,135,145,147]。然而,应避免来自不兼容源的数据混合,因为这是额外偏差的常见原因。无论如何,应该公开讨论所用数据集的局限性,让其他研究人员更好地理解潜在采样偏差的安全含义。

2.2.1 Label Inaccuracy:标签不准确(2)

分类任务所需的地面真实值标签不准确、不稳定或错误,影响基于学习的系统的整体性能[85,144]

描述:许多基于AI的安全系统是为分类任务而构建的。为了训练这些系统,每次观测都需要一个 ground-truth label。不幸的是,这种标记很少是完美的,研究人员必须考虑不确定性和噪声,以防止他们的模型受到固有偏差的影响。

安全影响:对于许多相关的安全问题,如检测网络攻击或恶意软件,通常无法获得可靠的标签,从而导致鸡和蛋的问题。作为补救措施,研究人员通常采用启发式方法,例如使用无法提供可靠基础真相的外部来源。例如,像 virustotal 这样的服务通常用于获取恶意软件的标签信息,但这些服务并不总是一致的[144]。此外,随着时间的推移,对手行为的改变可能会改变不同等级之间的比例[3,92,144],引入一种称为标签偏移的偏差[85]。无法适应这些变化的系统一旦部署,性能将下降。

建议:通常,应尽可能验证标签,例如,通过手动调查假阳性或随机样本[例如,122]。如果不排除噪声,则可以通过(i)使用稳健模型或损失函数,(ii)在学习过程中积极建模标签噪声,或(iii)清除训练数据中的噪声标签来减少其对学习模型的影响[见55,67,84]。为了证明这些方法的适用性,我们主要采用附录a中的清理方法。请注意,标签不确定的实例不得从测试数据中删除。这代表了采样偏差(P1)和数据窥探(P3)的变化,这是我们在§2.2中详细讨论的一个陷阱。由于标签可能会随时间变化,因此有必要采取预防措施,防止标签移动[85],例如延迟标签,直到获得稳定的地面真相为止[见144]。

2.2 系统设计和学习

一旦收集到足够的数据,就可以训练基于学习的安全系统。这个过程包括从数据预处理到提取有意义的特征和建立有效的学习模型。不幸的是,这些步骤中的每一步都可能引入缺陷和弱点。

2.2.1 Data Snooping:数据窥探(3)

学习模型是用实践中通常不可用的数据训练的。数据窥探可以以多种方式发生,其中一些非常细微,难以识别[1]。

描述:在生成学习模型之前,通常将收集的数据拆分为单独的训练集和测试集。虽然分割数据似乎很简单,但测试数据或其他通常不可用的背景信息有许多微妙的方式可以影响训练过程,从而导致数据窥探。虽然附录中提供了数据监听示例的详细列表(见表8),但我们大致区分了三种类型的数据监听:测试、临时和选择性监听。当测试集用于最终评估之前的实验时,会发生测试窥探。这包括识别有用特征、参数和学习算法的准备工作。如果忽略数据中的时间依赖性,则会发生时间监听。这是一个常见的陷阱,因为许多与安全相关的问题的潜在分布都处于不断变化的状态[例如,87,104]。最后,选择性监听描述了基于实践中不可用的信息清理数据。一个例子是基于完整数据集(即,训练和测试)的统计数据删除外部LIER,这些数据集通常在训练时不可用。

安全影响:在安全方面,由于新的攻击或技术,数据分布是非平稳的,并且不断变化。因此,窥探未来或外部数据源的数据是一种普遍现象,导致结果过于乐观。例如,一些研究人员已经在基于学习的恶意软件检测系统中发现了时间窥探[4,8,104]。在所有这些情况下,由于混合了过去和现在的样本,这些方法的能力被高估。同样,在安全研究中也存在测试和选择性窥探事件,导致结果出现无意偏差(见§3)。

建议:虽然训练、验证和测试数据应该严格分开似乎很明显,但在预处理阶段,这种数据隔离往往会被无意中违反。例如,我们观察到,在整个数据集上计算tf-idf权重或神经嵌入是一个常见错误(见§3)。为了避免这个问题,测试数据应该在数据收集期间尽早分割,并单独存储,直到最终评估。此外,在创建数据时,应考虑数据内的时间依赖性,数据集被拆分[4,87,104]。然而,其他类型的数据窥探很难解决。例如,随着公开数据集的特征日益暴露,使用该数据开发的方法隐含地从测试数据中获取年龄知识[见1,90]。因此,对知名数据集的实验应与对来自考虑适应应用领域的较新数据的实验相补充。

2.2.2 Spurious Correlations:假相关性(4)

与安全问题无关的工件创建了用于分类的快捷模式。因此,学习模型适应这些工件,而不是解决实际任务

描述:伪相关性是由与要解决的任务相关但实际上与之无关的产生的,从而导致错误关联。考虑一个网络入侵检测系统的例子,其中数据集中的大部分攻击来自某个网络区域。该模型可以学习检测特定IP范围而不是一般攻击模式。请注意,虽然抽样偏差是产生虚假相关性的常见原因,但这些偏差也是由其他因素造成的,我们在附录a.对此进行了更详细的讨论

安全影响机器学习通常应用于安全领域的黑盒。因此,虚假的相关性往往无法确定。一旦结果被解释并用于得出一般结论,这些相关性就会带来问题。如果不知道虚假相关性,则存在高估方法能力和误判其实际局限性的高风险。例如,§4.2报告了我们对漏洞发现系统的分析,表明基础数据中存在明显的虚假相关性。

建议为了更好地了解基于学习的系统的能力,我们通常建议应用机器学习的解释技术[见59、79、133]。尽管存在一些限制[例如,66,75127],这些技术可以揭示虚假的相关性,并允许从业者评估其对系统能力的影响。作为一个例子,我们在§4中展示了不同安全相关问题的可解释学习如何有助于识别该问题。请注意,根据基于学习的系统的目标,一种设置中的虚假相关性可能被视为另一种设置的有效信号。因此,我们建议提前明确定义该目标,并验证系统学习的相关性是否符合该目标。例如,一个强大的恶意软件检测系统应该检测与恶意活动相关的特征,而不是数据中存在的其他无关信息

2.2.3 Biased Parameter Selection :有偏参数选择(5)

基于学习的方法的最终参数在训练时并不完全固定。相反,它们间接依赖于测试集

描述:在整个学习过程中,通常通过改变参数生成不同的模型。选择性能最佳的模型,并给出其在测试集上的性能。虽然这种设置通常是合理的,但它仍然会受到参数选择偏差的影响。例如,通过调整超参数或校准测试数据(而不是训练数据)上的阈值,可以很容易产生过于乐观的结果。

安全影响:参数在训练时未完全校准的安全系统在现实环境中的性能可能会有所不同。虽然网络入侵检测系统的检测阈值可以使用测试集上获得的ROC曲线来确定,但由于现实世界流量的多样性,在实践中很难选择相同的操作点[119]。与原始实验设置相比,这可能导致系统性能下降。请注意,此陷阱与数据窥探(P3)有关,但应明确考虑,因为它很容易导致夸大的结果。

建议:这种陷阱构成了数据窥探的一种特殊情况,因此适用相同的对策。然而,在实践中,通过使用分离的评估集进行模型选择和参数调整,可以很容易地固定有偏差的参数选择。与通常难以缓解的一般数据窥探相比,严格的数据隔离已经足以排除确定超参数和阈值时的问题。

2.3 Performance Evaluation

性能评估典型机器学习工作流的下一个阶段是系统性能评估。在下文中,我们将展示不同的陷阱如何在评估此类系统时导致不公平的比较和有偏见的结果。

2.3.1 Inappropriate Baseline: 不适当的基线(6)

评估不使用或使用有限的基线方法进行。结果是,不可能证明对现有技术和其他安全机制的改进;

描述:为了说明一种新方法在多大程度上提高了技术水平,将其与先前提出的方法进行比较至关重要。在选择基线时,重要的是要记住,不存在优于一般[136]中所有其他方法的通用学习算法。因此,仅提供所提出方法的结果或与基本相同的学习模型进行比较,并没有提供足够的背景来评估其影响。

安全影响过于复杂的学习方法会增加过度拟合的可能性,还会增加运行时开销、攻击面以及部署的时间和成本。为了证明与传统方法相比,机器学习技术提供了显著的改进,因此有必要对这些系统进行并排比较。

推荐:在整个评估过程中,应考虑简单模型,而不是仅仅关注复杂模型进行比较。这些方法易于解释,计算要求较低,并且在实践中证明是有效的和可扩展的。在第4节中,我们演示了如何使用易于理解的简单模型作为基线来解释不必要的复杂学习模型。类似地,我们表明自动机器学习(AutoML)框架工作[例如,48,70]有助于找到合适的基线。虽然这些自动化方法肯定不能取代经验丰富的数据分析师,但它们可以用来设定所提出方法应达到的下限。最后,检查非学习方法是否也适用于应用场景是至关重要的。例如,对于入侵和恶意软件检测,存在多种使用其他检测策略的方法[例如,45、102、111]

2.3.2 Inappropriate Performance Measures:不适当的性能衡量标准(7)

精选的性能度量没有考虑到应用场景的限制,例如数据不平衡或需要保持较低的误报率。

描述:可提供范围广泛的性能指标,但并非所有这些指标都适用于安全环境。例如,在评估检测系统时,仅报告一个性能值(如精度)通常是不够的,因为真阳性和假阳性判断是不可观察的。然而,更先进的测量方法,如ROC曲线,在某些应用环境中可能会模糊实验结果。图2显示了不平衡数据集上的ROC曲线和精度召回曲线(分类比率1:100)。仅考虑ROC曲线,性能看起来非常出色,但低精度揭示了分类器的真实性能,这对于许多安全应用来说是不切实际的;此外,各种与安全相关的问题涉及两个以上的类,需要多类度量。这一套可能会引入更多的微妙陷阱。众所周知,常用的策略,如”macro-averagingormicro-averaging “会过度估计和低估小类[51]。

安全影响:不适当的性能度量是安全研究中的一个长期问题,特别是在检测任务中。例如,虽然真阳性和假阳性可以更详细地描述系统的性能,但当攻击发生率较低时,它们也可以掩盖实际精度。在机器学习中,性能指标的选择非常具体。因此,我们无法提供一般指南。相反,我们建议考虑基于学习的系统的实际部署,并确定有助于实践评估其性能的措施。请注意,这些度量通常与标准度量(如精度或误差)不同,因为它们更符合系统的日常操作。为了给读者一种直觉,在§4.1中,我们展示了Android恶意软件检测器的不同性能测量如何导致对其性能的矛盾解释。

2.3.3 Base Rate Fallacy:基本利率谬误(8)

在解释性能指标时,忽略了较大的类别不平衡,导致对绩效的高估。

描述:如果不考虑负类的基本速率,类不平衡很容易导致对性能的错误预测。如果这一类占主导地位,即使是极低的假阳性率也会导致意外的高假阳性率。请注意与先前陷阱的不同之处:P7指的是对绩效的不恰当描述,而基本利率谬误则是对结果的错误解释。这种特殊情况在实践中很容易被忽视(见§3)。考虑图2中的示例,其中99%的真阳性可能为1%的假阳性。然而,如果我们考虑1:100的分类比率,这实际上对应于每99个真阳性对应100个假阳性。

安全影响:基本速率谬误与各种安全问题有关,例如入侵检测和网站指纹识别[11, 72, 100]。因此,现实地量化攻击者构成的安全和先验威胁是一项挑战。类似地,安装恶意软件的概率通常远低于恶意软件检测实验[104]

建议:安全方面的几个问题围绕着检测罕见事件,如威胁和攻击。对于这些问题,我们提倡使用精度和召回以及相关措施,如精度召回曲线。与其他衡量标准不同,这些功能考虑了分类平衡,因此类似于可靠的性能指标,对于关注少数类的检测任务[38118]。然而,请注意,如果少数群体的流行率被夸大,例如,由于抽样偏差[104],精确度和召回率可能会产生误导。在这些情况下,马修相关系数(MCC)等其他度量更适合评估分类器的性能[29](见§4)。此外,ROC曲线及其AUC值是比较检测和分类方法的有用指标。为了更加关注实际约束,我们建议考虑仅将曲线调整到可处理的假阳性率,并计算有界AUC值。最后,我们还建议讨论与负类(白样本)的基本比率相关的误报类,这使读者能够了解误报决策导致的工作量。

2.4 部署和操作

在典型机器学习工作流的最后一个阶段,部署了开发的系统来解决实践中潜在的安全问题。

2.4.1 Lab-Only Evaluation:仅实验室评估(9)

基于学习的系统在实验室环境中进行了简单的评估,没有讨论其实际局限性

描述:与所有经验学科一样,在某些假设下进行实验以证明方法的有效性是很常见的。虽然执行受控实验是检验某一方法特定方面的合法方法,但应在现实环境中进行评估,以透明地评估其能力,并展示将促进进一步研究的开放挑战。

安全影响:许多基于学习的安全系统仅在实验室环境中评估,夸大了其实际影响。一个常见的例子是仅在封闭世界设置中评估的检测方法,具有有限的多样性,不考虑非平稳性[15,71]。例如,大量网站指纹攻击仅在有限时间内的封闭环境中评估[72]。类似地,一些基于学习的恶意软件检测系统在现实环境中没有得到充分的研究[见5,104]

建议重要的是要尽可能准确地远离实验室设置和近似的真实世界设置。例如,应考虑数据的时间和空间关系,以解释野外遇到的典型动态[见104]。类似地,运行时和存储约束应在实际条件下进行分析[See 15,112,130]。理想情况下,所提议的系统应该被部署来发现在纯实验室环境中无法观察到的问题,例如真实世界网络流量的多样性[see119],尽管由于道德和隐私限制,这并非总是可能的。

2.4.2 Inappropriate Threat Model:不恰当的威胁模型(10)

没有考虑机器学习的安全性,使系统面临各种攻击,如中毒和逃避攻击;

描述:基于学习的安全系统在一个恶劣环境中运行,在设计这些系统时应考虑到这一点。先前在对抗式学习方面的工作表明,在工作流程的各个阶段,机器学习本身都引入了相当大的攻击面[见18,101]。其广泛的攻击面使这些算法容易受到各种类型的攻击,例如对抗性预处理、中毒和逃避[19、20、25、105、108]。

安全影响:在威胁模型和评估中包括对抗性影响通常至关重要,因为攻击的系统不能保证输出可信和有意义的结果。因此,除了传统的安全问题外,还必须考虑与机器学习相关的攻击。例如,与考虑到安全因素而设计的适当规范化模型相比,攻击者可能更容易避开仅依赖少数功能的模型[40],尽管还应考虑特定领域的影响[105]。此外,机器学习工作流程中的语义漏洞可能会造成攻击盲点。例如,不精确的解析和特征提取可能会使对手隐藏恶意内容[131]。

建议:在使用基于学习的系统的大多数安全领域中,我们在一个动态的环境中操作。因此,应准确定义威胁模型,并根据这些模型评估系统。在大多数情况下,有必要假设一个适应性强的对手专门针对拟议的系统,并将搜索和利用弱点进行规避或操纵。类似地,考虑机器学习工作流的所有阶段并调查可能的漏洞也是至关重要的[见18、26、39、101]。对于该分析,我们建议尽可能关注白盒策略,遵循Kerckhoff的原则[73]和安全最佳实践。最后,我们要强调的是,对对抗性方面的评估不是附加内容,而是安全研究中的一个强制性组成部分。

三、流行性分析

一旦我们了解了基于学习的安全系统所面临的陷阱,就有必要评估其普遍性并调查其对科学进步的影响。为此,我们对过去十年在ACM CCS、IEEE S&P、USENIX Security和NDSS上发表的30篇论文进行了研究,这是我们社区中与安全相关研究的四大会议。这些论文被选为我们研究的代表性例子,因为它们涉及大量不同的安全主题,并成功地将机器学习应用于相应的研究问题。

特别是,我们选择的顶级论文涵盖以下主题:

  • 恶意软件检测[9,34,88,104,121,138];
  • 网络入侵检测[43,93,113,115];
  • 漏洞发现[42、49、50、83];
  • tacks网站指纹识别[44100110116];
  • 社交网络滥用[22,95,120];
  • 二进制代码分析[14,32,114];
  • 代码归属[2,23];
  • 隐写术[17];
  • 网上诈骗[74];
  • 游戏机器人[80];
  • [68]

评估标准:对于每一篇论文,陷阱大致分为存在、不存在、文本不清楚或不适用。在没有补救(存在)的实验中,陷阱可能完全存在,也可能不存在。如果作者纠正了任何偏见或缩小了他们的主张范围以适应陷阱,这也被视为不存在。此外,我们还介绍了一个类别,以说明确实存在陷阱的实验,但其影响已经得到了特别处理。如果目前或部分出现了一个陷阱,但在文本中得到了承认,我们将按照讨论的方式对分类进行调整。如果审稿人无法排除由于信息缺失而出现的陷阱,我们会将出版物与文本区分开来。最后,在P10的特殊情况下,如果陷阱不适用于纸张的设置,则将其视为单独的类别;

观察普适性分析的汇总结果如图3所示。条形图的颜色表示存在陷阱的程度,其宽度表示具有该分类的论文的比例。受影响纸张的数量记录在条形图的中心。最普遍的缺陷是抽样偏差(P1)和数据窥探(P3),这两种情况至少部分出现在90%和73%的论文中。在超过50%的论文中,我们发现至少部分存在不适当的威胁模型(第10页)、仅实验室评估(第9页)和不适当的性能度量(第7页)。每一份报纸都会受到至少三个陷阱的影响,这突出了这些问题在最近的计算机安全研究中的普遍性。特别是,我们发现数据集的收集仍然非常具有挑战性:我们作为社区开发的一些最具权威性和扩展性的开放数据集仍然不完善(见§4.1)

此外,文本中存在的一些陷阱比其他陷阱更容易被忽略。我们观察到,当没有对参数的描述时,这种有偏参数选择(P5),给出了超参数或调谐过程;对于伪相关(P4),当没有试图解释模型的决定时;以及当文本中未明确描述数据集分割或归一化过程时的数据窥探(P3)。这些问题还表明,由于缺乏信息,实验设置更难复现;

作者的反馈:为了促进我们社区内的讨论,我们联系了所选论文的作者,并收集了对我们研究结果的反馈。我们对135位有联系方式的作者进行了调查。为了保护作者的隐私并鼓励公开讨论,所有回复均匿名。调查包括一系列关于已识别缺陷的一般和具体问题。首先,我们询问作者是否阅读过我们的作品,并认为它对社区有帮助。其次,对于每一个陷阱,我们收集反馈信息,说明他们是否同意(a)他们的出版可能受到影响,(b)安全文件中经常出现陷阱,以及(c)在大多数情况下很容易避免。为了量化评估回答,我们对每个问题使用五点Likert量表,范围从强烈不同意到强烈同意。此外,我们提供了一个不回答的选项,并允许作者省略问题。我们收到了49位作者的反馈,回复率为36%。这些作者对应于30篇选定论文中的13篇,因此占考虑研究的43%。关于一般性问题,46(95%)的作者阅读了我们的论文,48(98%)同意这有助于提高对已识别缺陷的认识。对于具体的陷阱问题,作者和我们的发现之间的总体一致性平均为63%,这取决于安全区域和陷阱。所有的作者都认为他们的论文至少有一个缺陷。平均而言,他们指出他们的工作中存在2.77个陷阱,标准偏差为1.53,涵盖了所有十个陷阱。在评估总体缺陷时,作者特别同意,仅实验室评估(92%)、基本比率谬误(77%)、不适当的绩效衡量(69%)和抽样偏差(69%)经常发生在安全人员中。此外,他们指出,不适当的性能测量(62%)、不适当的参数选择(62%)和基准利率谬误(46%)在实践中可以很容易地避免,而其他陷阱需要更多的努力。我们在附录B中提供了关于该调查的更多信息。总之,我们从该调查中得出了三个中心观察结果。首先,大多数作者都同意,我们的社区缺乏对已识别缺陷的意识。第二,他们确认,这些陷阱在安全文献中很普遍,有必要减轻它们。第三,仍然缺乏对已识别缺陷的一致理解。例如,几位作者(44%)既不同意也不反对数据窥探是否容易避免,强调了明确定义和建议的重要性。我们发现§2中引入的所有陷阱在安全研究中都很普遍,影响了17%到90%的选定论文。每篇论文至少有三个陷阱,只有22%的实例与本文中的讨论相关。虽然作者在某些情况下甚至可能故意省略了对陷阱的讨论,但我们的患病率分析结果总体上表明,我们的社区缺乏认识。虽然这些发现指出了研究中的一个严重问题,但我们想指出,所有分析的论文都提供了出色的贡献和宝贵的见解。我们的目标不是责怪研究人员陷入陷阱,而是提高安全领域机器学习研究的意识和实验质量。

四、影响分析

在前几节中,我们介绍了计算机安全文献中普遍存在的缺陷。然而,到目前为止,尚不清楚单个陷阱会在多大程度上影响实验结果及其结论。在本节中,我们估计了机器学习在安全领域的流行应用中的一些缺陷的实验影响。同时,我们展示了§2中讨论的建议如何帮助识别和解决这些问题。在我们的讨论中,我们考虑了计算机安全领域的四个热门研究主题:

  • 移动恶意软件检测: (P1, P4, and P7)
  • 漏洞发现: (P2, P4, and P6)
  • 源代码作者归属:(P1和P4)
  • 网络入侵检测:(P6和P9)

评论对于该分析,我们考虑了每个安全域的最先进方法。我们注意到,本节中的结果并不意味着具体批评这些方法;我们选择它们是因为它们代表了陷阱如何影响不同领域。值得注意的是,我们能够复制这些方法的事实高度赞扬了他们的学术水平;

4.1 移动恶意软件检测

使用机器学习自动检测Android恶意软件是一个特别活跃的研究领域。这种方法的设计和评估是微妙的,可能会显示出一些先前讨论的缺陷。在下文中,我们讨论了采样偏差(P1)、伪相关性(P4)和不适当的性能度量(P7)对基于学习的检测的影响

数据集集合:最近移动数据的一个常见来源是AndroZoop项目[6],该项目从各种来源收集Android应用程序,包括Official 谷歌市场和几个中国app软件市场。在撰写本文时,它包括来自18个不同来源的超过1100万个Android应用程序。除了样本本身,它还包括元信息,如抗病毒检测的数量。虽然AndroZoo是获取移动应用的优秀来源,但我们证明,如果不考虑数据集的特性,实验可能会出现严重的抽样偏差(P1)。请注意,以下讨论不限于AndroZoo数据,而是与Android数据集的组成相关。

数据集分析:在第一步中,我们通过考虑应用程序的来源和Android应用程序的防病毒检测数量来分析AndroZoo的数据分布。为了进行分析,我们将各个市场大致分为四个不同的来源:谷歌游戏、中国市场、VirusShare和所有其他市场。图4显示了从特定来源随机采样的概率,这取决于应用程序的防病毒检测数量。例如,当选择一个对检测次数没有限制的样本时,从谷歌游戏中采样的概率大约为80%。如果我们考虑10次检测的结果,我们从中国市场随机选择应用的概率是70%。如果我们忽略数据分布,数据集中的大部分良性应用很可能来自GooglePlay,而大多数恶意应用来自中国市场。请注意,此采样偏差不限于Andro Zoo。我们确定了DredeBin数据集[9]的类似抽样偏差,该偏差通常用于评估基于学习的Android恶意软件检测方法的性能[9、58、146]。

image-20220807135625094

实验装置:为了更好地理解这一发现,我们使用两个数据集进行了实验:

  • 对于第一个数据集(D1),我们将来自Google Play的10000个良性应用程序与来自中国市场的1000个恶性应用程序(安齐安达应用程序中国)合并。
  • 然后,我们使用相同的10000个良性应用程序创建第二个数据集(D2),但将它们与Google Play独家提供的1000个软件样本相结合。所有合法的应用程序都至少被10个病毒扫描程序检测到。接下来,我们使用来自最先进分类器的两个特征集(DREBIN[9]和OPSEQS[91]),在这些数据集上训练线性支持向量机[47]。

实验结果:在数据集D1和D2之间,DREBIN 和 OPSDEQS的召回率(真阳性率)分别超过10%和15%,而准确性仅受到轻微影响(见表1)。因此,性能度量的选择至关重要(P7)。有趣的是,URLplay.google.Com 被证明是良性类的五个最具歧视性的特征之一,这表明分类者已经学会区分Android apps的起源,而不是恶意软件和benign apps 之间的区别(P4)。虽然我们的实验装置通过故意忽略时间相关性(P3)高估了分类器的性能,但我们仍然可以清楚地观察到陷阱的影响。请注意,在以前的工作[4, 104]中已经证明了在这种情况下时间窥探的效果。

image-20220807211200980

4.2 漏洞发现

源代码中的漏洞可能导致权限提升和远程代码执行,使其成为主要威胁。由于手动搜索漏洞复杂且耗时,近年来提出了基于机器学习的检测方法[57,83,141]。在下面的内容中,我们展示了用于漏洞检测的数据集包含仅在一个类(P4)中发生的事件。我们还发现,用于检测脆弱性的神经网络Vuldeepecker[83]使用伪影进行分类,并且简单的线性分类器在相同的数据集上获得更好的结果(P6)。最后,我们讨论了forVulDeePecker提出的预处理步骤如何使我们无法确定某些代码片段是否包含漏洞(P2)

数据集集合:在我们的分析中,我们使用了Li等人[83]发布的数据集,其中包含来自国家漏洞数据库[36]和SARD项目[37]的源代码。我们关注与缓冲区(CWE-119)相关的漏洞,并获得了39757个源代码片段,其中10444(26%)被标记为包含漏洞。

4.3 源代码作者归属

基于源代码识别开发人员的任务称为作者归属[23]。编程习惯具有多种风格模式,因此

4.4 网络入侵检测检测

网络入侵是安全[41]中最古老的问题之一,毫不奇怪,异常网络流量的检测严重依赖于基于学习的方法[27,81,82,93]。然而,收集真实攻击数据的挑战[46]常常导致研究人员生成合成数据,用于实验室评估(P9)。在这里,我们演示了这些数据如何不足以证明使用复杂模型(如神经网络)的合理性,以及将一个更简单的模型作为基线将如何揭示这些缺点(P6)。

数据集集合:我们考虑Mirsky等人93发布的数据集,其中包含物联网(IoT)网络流量的捕获,模拟Mirai僵尸网络恶意软件的初始激活和传播。该数据包覆盖了三台个人电脑和九台物联网设备的Wi-Fi网络上119分钟的流量.

数据集分析:首先,我们分析捕获的网络流量的传输量。图8显示了捕获过程中良性和恶意数据包的频率,划分为10秒。这表明在分组频率中有一个强信号,这高度指示了一个持续攻击。此外,所有良性活动似乎都随着袭击的开始而停止。74分钟后,尽管网络上有很多设备。这表明个体观测可能已经合并,并可能进一步导致系统受益于虚假相关性(P4)

image-20220807213124529

图:Mirai数据集中良性与恶意数据包的频率93。灰色虚线显示了定义使用简单基线计算的正常流量的阈值(箱线图法[129])。用于校准的数据范围由浅蓝色阴影区域突出显示.

实验设置:为了说明这些缺陷的严重程度,我们考虑了Kitsune93,这是一种基于深度学习的最先进入侵检测器,构建在一组au-toencoders上。对于每个数据包,提取115个特征,输入到12个自动编码器,这些自动编码器本身反馈到另一个作为异常检测器运行的最终自动编码器。

作为与Kitsune进行比较的简单基线,我们选择了箱线图法[129],这是一种识别异常值的常用方法。我们使用10秒滑动窗口处理分组,并使用每个窗口的分组频率作为唯一特征。接下来,我们从干净的校准分布推导出一个上下阈值:τlow=Q1−1.5·IQRand ,τ高=Q3+1.5·IQR。在测试期间,如果滑动窗口的数据包频率在τ低和τ高之间,则数据包被标记为良性,否则为恶意。在图8中,这些阈值用灰色虚线表示。

后果:表5显示了与箱线图方法相比,自动编码器集成的分类性能。虽然两种方法在ROC AUC方面表现相似,但简单箱线图法在低误报率(FPR)下优于自动编码器集成。除了其优越的性能外,箱线图方法与集成的特征提取和测试程序相比,重量非常轻。这一点尤其重要,因为集成设计用于在低延迟的资源受限设备(如物联网设备)上运行。

image-20220807220205015

表5:比较Kitsune93,一种自动编码器集成NIDS,相比于一个简单基线,箱线图法[129],用于检测Mirai感染。

注意本实验的目的不是证明箱图法可以检测到野外操作的Mirai实例,也不是证明Kitsuneis无法检测到其他攻击,而是证明没有适当基线(P6)的实验不足以证明集成的复杂性和过度性。箱线图法的成功还表明,简单的方法可以揭示仅用于实验室评估的数据产生的问题(第9页)。在Mirai数据集中,感染过于明显;在野外进行的攻击很可能只占网络流量的一小部分。

五、总结

我们识别并系统地评估了机器学习在安全领域的应用中的十个细微缺陷。这些问题会影响研究的有效性,并导致高估安全系统的性能。我们发现这些陷阱在安全研究中非常普遍,并展示了这些陷阱在不同安全应用中的影响。为了支持研究人员避免这些问题,我们提供了适用于所有安全领域的建议,从入侵和恶意软件检测到漏洞发现。最终,我们努力提高安全领域机器学习实验工作的科学质量。在Sommer和Paxson[119]的开创性研究十年后,weagain鼓励社区深入封闭的世界,探索将机器学习嵌入现实世界安全系统的挑战和机遇。AI安全的十大缺陷/image-20220806171411086.png" alt="image-20220806171411086" style="zoom:50%;" />

此外,文本中存在的一些陷阱比其他陷阱更容易被忽略。我们观察到,当没有对参数的描述时,这种有偏参数选择(P5),给出了超参数或调谐过程;对于伪相关(P4),当没有试图解释模型的决定时;以及当文本中未明确描述数据集分割或归一化过程时的数据窥探(P3)。这些问题还表明,由于缺乏信息,实验设置更难复现;

作者的反馈:为了促进我们社区内的讨论,我们联系了所选论文的作者,并收集了对我们研究结果的反馈。我们对135位有联系方式的作者进行了调查。为了保护作者的隐私并鼓励公开讨论,所有回复均匿名。调查包括一系列关于已识别缺陷的一般和具体问题。首先,我们询问作者是否阅读过我们的作品,并认为它对社区有帮助。其次,对于每一个陷阱,我们收集反馈信息,说明他们是否同意(a)他们的出版可能受到影响,(b)安全文件中经常出现陷阱,以及(c)在大多数情况下很容易避免。为了量化评估回答,我们对每个问题使用五点Likert量表,范围从强烈不同意到强烈同意。此外,我们提供了一个不回答的选项,并允许作者省略问题。我们收到了49位作者的反馈,回复率为36%。这些作者对应于30篇选定论文中的13篇,因此占考虑研究的43%。关于一般性问题,46(95%)的作者阅读了我们的论文,48(98%)同意这有助于提高对已识别缺陷的认识。对于具体的陷阱问题,作者和我们的发现之间的总体一致性平均为63%,这取决于安全区域和陷阱。所有的作者都认为他们的论文至少有一个缺陷。平均而言,他们指出他们的工作中存在2.77个陷阱,标准偏差为1.53,涵盖了所有十个陷阱。在评估总体缺陷时,作者特别同意,仅实验室评估(92%)、基本比率谬误(77%)、不适当的绩效衡量(69%)和抽样偏差(69%)经常发生在安全人员中。此外,他们指出,不适当的性能测量(62%)、不适当的参数选择(62%)和基准利率谬误(46%)在实践中可以很容易地避免,而其他陷阱需要更多的努力。我们在附录B中提供了关于该调查的更多信息。总之,我们从该调查中得出了三个中心观察结果。首先,大多数作者都同意,我们的社区缺乏对已识别缺陷的意识。第二,他们确认,这些陷阱在安全文献中很普遍,有必要减轻它们。第三,仍然缺乏对已识别缺陷的一致理解。例如,几位作者(44%)既不同意也不反对数据窥探是否容易避免,强调了明确定义和建议的重要性。我们发现§2中引入的所有陷阱在安全研究中都很普遍,影响了17%到90%的选定论文。每篇论文至少有三个陷阱,只有22%的实例与本文中的讨论相关。虽然作者在某些情况下甚至可能故意省略了对陷阱的讨论,但我们的患病率分析结果总体上表明,我们的社区缺乏认识。虽然这些发现指出了研究中的一个严重问题,但我们想指出,所有分析的论文都提供了出色的贡献和宝贵的见解。我们的目标不是责怪研究人员陷入陷阱,而是提高安全领域机器学习研究的意识和实验质量。

四、影响分析

在前几节中,我们介绍了计算机安全文献中普遍存在的缺陷。然而,到目前为止,尚不清楚单个陷阱会在多大程度上影响实验结果及其结论。在本节中,我们估计了机器学习在安全领域的流行应用中的一些缺陷的实验影响。同时,我们展示了§2中讨论的建议如何帮助识别和解决这些问题。在我们的讨论中,我们考虑了计算机安全领域的四个热门研究主题:

  • 移动恶意软件检测: (P1, P4, and P7)
  • 漏洞发现: (P2, P4, and P6)
  • 源代码作者归属:(P1和P4)
  • 网络入侵检测:(P6和P9)

评论对于该分析,我们考虑了每个安全域的最先进方法。我们注意到,本节中的结果并不意味着具体批评这些方法;我们选择它们是因为它们代表了陷阱如何影响不同领域。值得注意的是,我们能够复制这些方法的事实高度赞扬了他们的学术水平;

4.1 移动恶意软件检测

使用机器学习自动检测Android恶意软件是一个特别活跃的研究领域。这种方法的设计和评估是微妙的,可能会显示出一些先前讨论的缺陷。在下文中,我们讨论了采样偏差(P1)、伪相关性(P4)和不适当的性能度量(P7)对基于学习的检测的影响

数据集集合:最近移动数据的一个常见来源是AndroZoop项目[6],该项目从各种来源收集Android应用程序,包括Official 谷歌市场和几个中国app软件市场。在撰写本文时,它包括来自18个不同来源的超过1100万个Android应用程序。除了样本本身,它还包括元信息,如抗病毒检测的数量。虽然AndroZoo是获取移动应用的优秀来源,但我们证明,如果不考虑数据集的特性,实验可能会出现严重的抽样偏差(P1)。请注意,以下讨论不限于AndroZoo数据,而是与Android数据集的组成相关。

数据集分析:在第一步中,我们通过考虑应用程序的来源和Android应用程序的防病毒检测数量来分析AndroZoo的数据分布。为了进行分析,我们将各个市场大致分为四个不同的来源:谷歌游戏、中国市场、VirusShare和所有其他市场。图4显示了从特定来源随机采样的概率,这取决于应用程序的防病毒检测数量。例如,当选择一个对检测次数没有限制的样本时,从谷歌游戏中采样的概率大约为80%。如果我们考虑10次检测的结果,我们从中国市场随机选择应用的概率是70%。如果我们忽略数据分布,数据集中的大部分良性应用很可能来自GooglePlay,而大多数恶意应用来自中国市场。请注意,此采样偏差不限于Andro Zoo。我们确定了DredeBin数据集[9]的类似抽样偏差,该偏差通常用于评估基于学习的Android恶意软件检测方法的性能[9、58、146]。

image-20220807135625094

实验装置:为了更好地理解这一发现,我们使用两个数据集进行了实验:

  • 对于第一个数据集(D1),我们将来自Google Play的10000个良性应用程序与来自中国市场的1000个恶性应用程序(安齐安达应用程序中国)合并。
  • 然后,我们使用相同的10000个良性应用程序创建第二个数据集(D2),但将它们与Google Play独家提供的1000个软件样本相结合。所有合法的应用程序都至少被10个病毒扫描程序检测到。接下来,我们使用来自最先进分类器的两个特征集(DREBIN[9]和OPSEQS[91]),在这些数据集上训练线性支持向量机[47]。

实验结果:在数据集D1和D2之间,DREBIN 和 OPSDEQS的召回率(真阳性率)分别超过10%和15%,而准确性仅受到轻微影响(见表1)。因此,性能度量的选择至关重要(P7)。有趣的是,URLplay.google.Com 被证明是良性类的五个最具歧视性的特征之一,这表明分类者已经学会区分Android apps的起源,而不是恶意软件和benign apps 之间的区别(P4)。虽然我们的实验装置通过故意忽略时间相关性(P3)高估了分类器的性能,但我们仍然可以清楚地观察到陷阱的影响。请注意,在以前的工作[4, 104]中已经证明了在这种情况下时间窥探的效果。

image-20220807211200980

4.2 漏洞发现

源代码中的漏洞可能导致权限提升和远程代码执行,使其成为主要威胁。由于手动搜索漏洞复杂且耗时,近年来提出了基于机器学习的检测方法[57,83,141]。在下面的内容中,我们展示了用于漏洞检测的数据集包含仅在一个类(P4)中发生的事件。我们还发现,用于检测脆弱性的神经网络Vuldeepecker[83]使用伪影进行分类,并且简单的线性分类器在相同的数据集上获得更好的结果(P6)。最后,我们讨论了forVulDeePecker提出的预处理步骤如何使我们无法确定某些代码片段是否包含漏洞(P2)

数据集集合:在我们的分析中,我们使用了Li等人[83]发布的数据集,其中包含来自国家漏洞数据库[36]和SARD项目[37]的源代码。我们关注与缓冲区(CWE-119)相关的漏洞,并获得了39757个源代码片段,其中10444(26%)被标记为包含漏洞。

4.3 源代码作者归属

基于源代码识别开发人员的任务称为作者归属[23]。编程习惯具有多种风格模式,因此

4.4 网络入侵检测检测

网络入侵是安全[41]中最古老的问题之一,毫不奇怪,异常网络流量的检测严重依赖于基于学习的方法[27,81,82,93]。然而,收集真实攻击数据的挑战[46]常常导致研究人员生成合成数据,用于实验室评估(P9)。在这里,我们演示了这些数据如何不足以证明使用复杂模型(如神经网络)的合理性,以及将一个更简单的模型作为基线将如何揭示这些缺点(P6)。

数据集集合:我们考虑Mirsky等人93发布的数据集,其中包含物联网(IoT)网络流量的捕获,模拟Mirai僵尸网络恶意软件的初始激活和传播。该数据包覆盖了三台个人电脑和九台物联网设备的Wi-Fi网络上119分钟的流量.

数据集分析:首先,我们分析捕获的网络流量的传输量。图8显示了捕获过程中良性和恶意数据包的频率,划分为10秒。这表明在分组频率中有一个强信号,这高度指示了一个持续攻击。此外,所有良性活动似乎都随着袭击的开始而停止。74分钟后,尽管网络上有很多设备。这表明个体观测可能已经合并,并可能进一步导致系统受益于虚假相关性(P4)

image-20220807213124529

图:Mirai数据集中良性与恶意数据包的频率93。灰色虚线显示了定义使用简单基线计算的正常流量的阈值(箱线图法[129])。用于校准的数据范围由浅蓝色阴影区域突出显示.

实验设置:为了说明这些缺陷的严重程度,我们考虑了Kitsune93,这是一种基于深度学习的最先进入侵检测器,构建在一组au-toencoders上。对于每个数据包,提取115个特征,输入到12个自动编码器,这些自动编码器本身反馈到另一个作为异常检测器运行的最终自动编码器。

作为与Kitsune进行比较的简单基线,我们选择了箱线图法[129],这是一种识别异常值的常用方法。我们使用10秒滑动窗口处理分组,并使用每个窗口的分组频率作为唯一特征。接下来,我们从干净的校准分布推导出一个上下阈值:τlow=Q1−1.5·IQRand ,τ高=Q3+1.5·IQR。在测试期间,如果滑动窗口的数据包频率在τ低和τ高之间,则数据包被标记为良性,否则为恶意。在图8中,这些阈值用灰色虚线表示。

后果:表5显示了与箱线图方法相比,自动编码器集成的分类性能。虽然两种方法在ROC AUC方面表现相似,但简单箱线图法在低误报率(FPR)下优于自动编码器集成。除了其优越的性能外,箱线图方法与集成的特征提取和测试程序相比,重量非常轻。这一点尤其重要,因为集成设计用于在低延迟的资源受限设备(如物联网设备)上运行。

image-20220807220205015

表5:比较Kitsune93,一种自动编码器集成NIDS,相比于一个简单基线,箱线图法[129],用于检测Mirai感染。

注意本实验的目的不是证明箱图法可以检测到野外操作的Mirai实例,也不是证明Kitsuneis无法检测到其他攻击,而是证明没有适当基线(P6)的实验不足以证明集成的复杂性和过度性。箱线图法的成功还表明,简单的方法可以揭示仅用于实验室评估的数据产生的问题(第9页)。在Mirai数据集中,感染过于明显;在野外进行的攻击很可能只占网络流量的一小部分。

五、总结

我们识别并系统地评估了机器学习在安全领域的应用中的十个细微缺陷。这些问题会影响研究的有效性,并导致高估安全系统的性能。我们发现这些陷阱在安全研究中非常普遍,并展示了这些陷阱在不同安全应用中的影响。为了支持研究人员避免这些问题,我们提供了适用于所有安全领域的建议,从入侵和恶意软件检测到漏洞发现。最终,我们努力提高安全领域机器学习实验工作的科学质量。在Sommer和Paxson[119]的开创性研究十年后,weagain鼓励社区深入封闭的世界,探索将机器学习嵌入现实世界安全系统的挑战和机遇。

[PyTorch 学习笔记] 损失函数

一、损失函数

损失函数是衡量模型输出与真实标签之间的差异。我们还经常听到代价函数目标函数,它们之间差异如下:

  • 损失函数(Loss Function)是计算一个样本的模型输出与真实标签的差异 Loss [公式]

  • 代价函数(Cost Function)是计算整个样本集的模型输出与真实标签的差异,是所有样本损失函数的平均值 [公式]

  • 目标函数(Objective Function)就是代价函数加上正则项

在 PyTorch 中的损失函数也是继承于nn.Module,所以损失函数也可以看作网络层。

在逻辑回归的实验中,我使用了交叉熵损失函数loss_fn = nn.BCELoss()[公式] 的继承关系:nn.BCELoss() -> _WeightedLoss -> _Loss -> Module。在计算具体的损失时loss = loss_fn(y_pred.squeeze(), train_y),这里实际上在 Loss 中进行一次前向传播,最终调用BCELoss()forward()函数F.binary_cross_entropy(input, target, weight=self.weight, reduction=self.reduction)

1.1 nn.CrossEntropyLoss = softmax(x)+log(x)+nn.NLLLoss

1
nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')

功能:把nn.LogSoftmax()nn.NLLLoss()结合,计算交叉熵。nn.LogSoftmax()的作用是把输出值归一化到了 [0,1] 之间。

  • weight:各类别的 loss 设置权值
  • ignore_index:忽略某个类别的 loss 计算
  • reduction:计算模式,可以为 none(逐个元素计算),sum(所有元素求和,返回标量),mean(加权平均,返回标量)

==下面介绍熵的一些基本概念==

  • 自信息[公式]
  • 信息熵就是求自信息的期望:[公式]
  • 相对熵,也被称为 KL 散度,用于衡量两个分布的相似性(距离):[公式]。其中 [公式] 是真实分布,[公式] 是拟合的分布
  • 交叉熵[公式]

相对熵展开可得:

[公式]

所以交叉熵 = 信息熵 + 相对熵,即 [公式],又由于信息熵 [公式] 是固定的,因此==优化交叉熵 [公式] 等价于优化相对熵== [公式]

所以对于每一个样本的 Loss 计算公式为:

[公式],因为 [公式][公式]

所以 [公式]

如果了类别的权重,则 [公式]

下面设有 3 个样本做 2 分类。inputs 的形状为 [公式],表示每个样本有两个神经元输出两个分类。target 的形状为 [公式],注意类别从 0 开始,类型为torch.long

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np

# fake data
inputs = torch.tensor([[1, 2], [1, 3], [1, 3]], dtype=torch.float)
target = torch.tensor([0, 1, 1], dtype=torch.long)

# def loss function
loss_f_none = nn.CrossEntropyLoss(weight=None, reduction='none')
loss_f_sum = nn.CrossEntropyLoss(weight=None, reduction='sum')
loss_f_mean = nn.CrossEntropyLoss(weight=None, reduction='mean')

# forward
loss_none = loss_f_none(inputs, target)
loss_sum = loss_f_sum(inputs, target)
loss_mean = loss_f_mean(inputs, target)

# view
print("Cross Entropy Loss:", loss_none, loss_sum, loss_mean)

输出为:

1
Cross Entropy Loss: tensor([1.3133, 0.1269, 0.1269]) tensor(1.5671) tensor(0.5224)

1.2 nn.NLLLoss

1
nn.NLLLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')

功能:实现负对数似然函数中的符号功能

主要参数:

  • weight:各类别的 loss 权值设置
  • ignore_index:忽略某个类别
  • reduction:计算模式,,可以为 none(逐个元素计算),sum(所有元素求和,返回标量),mean(加权平均,返回标量)

每个样本的 loss 公式为:[公式]。还是使用上面的例子,第一个样本的输出为 [1,2],类别为 0,则第一个样本的 loss 为 -1;第一个样本的输出为 [1,3],类别为 1,则第一个样本的 loss 为 -3。

1.3 nn.BCELoss

1
nn.BCELoss(weight=None, size_average=None, reduce=None, reduction='mean')

功能:计算二分类的交叉熵。需要注意的是:输出值区间为 [0,1]。

主要参数:

  • weight:各类别的 loss 权值设置
  • ignore_index:忽略某个类别
  • reduction:计算模式,,可以为 none(逐个元素计算),sum(所有元素求和,返回标量),mean(加权平均,返回标量)

计算公式为:[公式]

使用这个函数有两个不同的地方:

  • 预测的标签需要经过 sigmoid 变换到 [0,1] 之间
  • 真实的标签需要转换为 one hot 向量,类型为torch.float

1.4 nn.BCEWithLogitsLoss

1
nn.BCEWithLogitsLoss(weight=None, size_average=None, reduce=None, reduction='mean', pos_weight=None)

功能:结合 sigmoid 与二分类交叉熵。需要注意的是,网络最后的输出不用经过 sigmoid 函数。这个 loss 出现的原因是有时网络模型最后一层输出不希望是归一化到 [0,1] 之间,但是在计算 loss 时又需要归一化到 [0,1] 之间。

主要参数:

  • weight各输出类别的 loss 权值设置
  • pos_weight==设置输入样本类别对应的神经元的输出的 loss 权值==
  • ignore_index:忽略某个类别
  • reduction:计算模式,,可以为 none(逐个元素计算),sum(所有元素求和,返回标量),mean(加权平均,返回标量)

1.5 nn.L1Loss

1
nn.L1Loss(size_average=None, reduce=None, reduction='mean')

功能:计算 inputs 与 target 之差的绝对值

主要参数:

  • reduction:计算模式,,可以为 none(逐个元素计算),sum(所有元素求和,返回标量),mean(加权平均,返回标量)

公式:[公式]

1.6 nn.MSELoss

功能:计算 inputs 与 target 之差的平方

公式:[公式]

主要参数:

  • reduction:计算模式,,可以为 none(逐个元素计算),sum(所有元素求和,返回标量),mean(加权平均,返回标量)

1.7 nn.SmoothL1Loss

1
nn.SmoothL1Loss(size_average=None, reduce=None, reduction='mean')

功能:平滑的 L1Loss

公式:[公式]

下图中橙色曲线是 L1Loss,蓝色曲线是 Smooth L1Loss

img

主要参数:

  • reduction:计算模式,,可以为 none(逐个元素计算),sum(所有元素求和,返回标量),mean(加权平均,返回标量)

1.8 nn.PoissonNLLLoss

1
nn.PoissonNLLLoss(log_input=True, full=False, size_average=None, eps=1e-08, reduce=None, reduction='mean')

功能:泊松分布的负对数似然损失函数

主要参数:

  • log_input:输入是否为对数形式,决定计算公式

    • 当 log_input = True,表示输入数据已经是经过对数运算之后的,loss(input, target) = exp(input) - target * input
    • 当 log_input = False,,表示输入数据还没有取对数,loss(input, target) = input - target * log(input+eps)
  • full:计算所有 loss,默认为 loss

  • eps:修正项,避免 log(input) 为 nan

1.9 nn.KLDivLoss

1
nn.KLDivLoss(size_average=None, reduce=None, reduction='mean')

功能:计算 KLD(divergence),KL 散度,相对熵

注意事项:需要提前将输入计算 log-probabilities,如通过nn.logsoftmax()

主要参数:

  • reduction:计算模式,,可以为 none(逐个元素计算),sum(所有元素求和,返回标量),mean(加权平均,返回标量),batchmean(batchsize 维度求平均值)

公式:[公式]

对于每个样本来说,计算公式如下,其中 [公式] 是真实值 [公式][公式] 是经过对数运算之后的预测值 [公式]

[公式]

1.10 nn.MarginRankingLoss

1
nn.MarginRankingLoss(margin=0.0, size_average=None, reduce=None, reduction='mean')

功能:计算两个向量之间的相似度,用于排序任务

特别说明:该方法计算 两组数据之间的差异,返回一个 [公式] 的 loss 矩阵

主要参数:

  • margin:边界值,[公式][公式] 之间的差异值
  • reduction:计算模式,,可以为 none(逐个元素计算),sum(所有元素求和,返回标量),mean(加权平均,返回标量)

计算公式:[公式][公式] 的取值有 +1 和 -1。

  • [公式] 时,希望 [公式],当 [公式],不产生 loss
  • [公式] 时,希望 [公式],当 [公式],不产生 loss

1.11 nn.SoftMarginLoss

1
nn.SoftMarginLoss(size_average=None, reduce=None, reduction='mean')

功能:计算二分类的 logistic 损失

主要参数:

  • reduction:计算模式,,可以为 none(逐个元素计算),sum(所有元素求和,返回标量),mean(加权平均,返回标量)

计算公式:[公式]

1.12 nn.MultiMarginLoss

1
nn.MultiMarginLoss(p=1, margin=1.0, weight=None, size_average=None, reduce=None, reduction='mean')

功能:计算多分类的折页损失

主要参数:

  • p:可以选择 1 或 2
  • weight:各类别的 loss 权值设置
  • margin:边界值
  • reduction:计算模式,,可以为 none(逐个元素计算),sum(所有元素求和,返回标量),mean(加权平均,返回标量)

计算公式:[公式],其中 y 表示真实标签对应的神经元输出,x 表示其他神经元的输出。

1.13 nn.CosineEmbeddingLoss

1
torch.nn.CosineEmbeddingLoss(margin=0.0, size_average=None, reduce=None, reduction='mean')

功能:采用余弦相似度计算两个输入的相似性

主要参数:

  • margin:边界值,可取值 [-1, 1],推荐为 [0, 0.5]
  • reduction:计算模式,,可以为 none(逐个元素计算),sum(所有元素求和,返回标量),mean(加权平均,返回标量)

计算公式:[公式]

其中 [公式]

二、损失函数Q&A

2.1 nn.CrossEntropyLoss = softmax(x)+log(x)+nn.NLLLoss?

在各种深度学习框架中,我们最常用的损失函数就是交叉熵(torch.nn.CrossEntropyLoss),熵是用来描述一个系统的混乱程度,通过交叉熵我们就能够确定预测数据与真是数据之间的相近程度。交叉熵越小,表示数据越接近真实样本。

交叉熵计算公式:

img

softmax函数又称为归一化指数函数,它可以把一个多维向量压缩在(0,1)之间,并且它们的和为1.

计算公式:

1

1
2
3
4
5
6
7
8
import math
z = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0]
z_exp = [math.exp(i) for i in z]
print(z_exp) # Result: [2.72, 7.39, 20.09, 54.6, 2.72, 7.39, 20.09]
sum_z_exp = sum(z_exp)
print(sum_z_exp) # Result: 114.98
softmax = [round(i / sum_z_exp, 3) for i in z_exp]
print(softmax) # Result: [0.024, 0.064, 0.175, 0.475, 0.024, 0.064, 0.175]

log_softmax是指在softmax函数的基础上,再进行一次log运算,此时结果有正有负,log函数的值域是负无穷到正无穷,当x在0—1之间的时候,log(x)值在负无穷到0之间

nn.NLLLoss的结果就是把上面的输出与Label对应的那个值拿出来,再去掉负号,再求均值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import torch
input=torch.randn(3,3)
soft_input = torch.nn.Softmax(dim=0)
soft_input(input)
Out[20]:
tensor([[0.7284, 0.7364, 0.3343],
[0.1565, 0.0365, 0.0408],
[0.1150, 0.2270, 0.6250]])

#对softmax结果取log
torch.log(soft_input(input))
Out[21]:
tensor([[-0.3168, -0.3059, -1.0958],
[-1.8546, -3.3093, -3.1995],
[-2.1625, -1.4827, -0.4701]])

假设标签是[0,1,2],第一行取第0个元素,第二行取第1个,第三行取第2个,去掉负号,即[0.3168,3.3093,0.4701],求平均值,就可以得到损失值。

1
2
3
4
5
6
7
(0.3168+3.3093+0.4701)/3
Out[22]: 1.3654000000000002
#验证一下
loss=torch.nn.NLLLoss()
target=torch.tensor([0,1,2])
loss(input,target)
Out[26]: tensor(0.1365)

nn.CrossEntropyLoss

1
2
3
4
5
6
7
8
9
10
11
loss=torch.nn.NLLLoss()
target=torch.tensor([0,1,2])
loss(input,target)
Out[26]: tensor(-0.1399)
loss =torch.nn.CrossEntropyLoss()
input = torch.tensor([[ 1.1879, 1.0780, 0.5312],
[-0.3499, -1.9253, -1.5725],
[-0.6578, -0.0987, 1.1570]])
target = torch.tensor([0,1,2])
loss(input,target)
Out[30]: tensor(0.1365)

[PyTorch 学习笔记] 优化器

torch.optim.lr_scheduler:调整学习率:https://blog.csdn.net/qyhaill/article/details/103043637

这篇文章主要介绍了 PyTorch 中的优化器,包括 3 个部分:优化器的概念、optimizer 的属性、optimizer 的方法。

一、优化器

1.1 优化器的概念

PyTorch 中的优化器是用于管理并更新模型中可学习参数的值,使得模型输出更加接近真实标签。

1.2 optimizer 的属性

PyTorch 中提供了 Optimizer 类,定义如下:

1
2
3
4
5
class Optimizer(object):
def __init__(self, params, defaults):
self.defaults = defaults
self.state = defaultdict(dict)
self.param_groups = [] # momentum、lr、weight_decay、params 等。

主要有 3 个属性

  • defaults:优化器的超参数,如 weight_decay,momentum
  • state:参数的缓存,如 momentum 中需要用到前几次的梯度,就缓存在这个变量中
  • param_groups:管理的参数组,是一个 list,其中每个元素是字典,包括 momentum、lr、weight_decay、params 等。
  • _step_count:记录更新 次数,在学习率调整中使用

1.3 optimizer 的方法

  • zero_grad()清空所管理参数的梯度。由于 PyTorch 的特性是张量的梯度不自动清零,因此每次反向传播之后都需要清空梯度。
  • step():执行一步梯度更新
  • add_param_group():添加参数组
  • state_dict():获取优化器当前状态信息字典
  • load_state_dict()加载状态信息字典,包括 state 、momentum_buffer 和 param_groups。主要用于模型的断点续训练。我们可以在每隔 50 个 epoch 就保存模型的 state_dict 到硬盘,在意外终止训练时,可以继续加载上次保存的状态,继续训练。

1.4 学习率

学习率是影响损失函数收敛的重要因素,控制了梯度下降更新的步伐。下面构造一个损失函数 [公式][公式] 的初始值为 2,学习率设置为 1。

1.5 momentum 动量

在 PyTroch 中,momentum 的更新公式是:

[公式]
[公式]

==momentum 动量的更新方法,不仅考虑当前的梯度,还会结合前面的梯度。==

momentum 来源于指数加权平均:[公式],其中 [公式] 是上一个时刻的指数加权平均,[公式] 表示当前时刻的值,[公式] 是系数,一般小于 1。指数加权平均常用于时间序列求平均值。假设现在求得是 100 个时刻的指数加权平均,那么

[公式] [公式] [公式]

[公式]

从上式可以看到,由于 [公式] 小于 1,越前面时刻的 [公式][公式] 的次方就越大,系数就越小。

[公式] ==可以理解为记忆周期,[公式] 越小,记忆周期越短,[公式] 越大,记忆周期越长==。通常 [公式] 设置为 0.9,那么 [公式],表示更关注最近 10 天的数据。

下面代码展示了 [公式] 的情况

1
2
3
4
5
6
7
8
9
10
weights = exp_w_func(beta, time_list)

plt.plot(time_list, weights, '-ro', label="Beta: {}\ny = B^t * (1-B)".format(beta))
plt.xlabel("time")
plt.ylabel("weight")
plt.legend()
plt.title("exponentially weighted average")
plt.show()

print(np.sum(weights))

结果为:

img

下面代码展示了不同的 [公式] 取值情况

1
2
3
4
5
6
7
8
beta_list = [0.98, 0.95, 0.9, 0.8]
w_list = [exp_w_func(beta, time_list) for beta in beta_list]
for i, w in enumerate(w_list):
plt.plot(time_list, w, label="Beta: {}".format(beta_list[i]))
plt.xlabel("time")
plt.ylabel("weight")
plt.legend()
plt.show()

结果为:

img

[公式] ==的值越大,记忆周期越长,就会更多考虑前面时刻的数值,因此越平缓。==

二、常用优化器

2.1 ==optim.SGD==:随机梯度下降法

1
optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False

主要参数:

  • params:管理的参数组
  • lr:初始学习率
  • momentum:动量系数 [公式]
  • weight_decay:L2 正则化系数
  • nesterov:是否采用 NAG

2.2 ==optim.Adagrad==:自适应学习率梯度下降法

2.3 optim.RMSprop :Adagrad 的改进

2.4 optim.Adadelta

2.5 ==optim.Adam==:RMSProp 集合 Momentum,这个是目前最常用的优化器,因为它可以使用较大的初始学习率。

2.6 optim.Adamax:Adam 增加学习率上限

#### optim.SparseAdam:稀疏版的 Adam

#### optim.ASGD:随机平均梯度下降

#### optim.Rprop:弹性反向传播,这种优化器通常是在所有样本都一起训练,也就是 batchsize 为全部样本时使用。

#### optim.LBFGS:BFGS 在内存上的改进

[PyTorch 学习笔记] weight decay、 dropout和Normalization

这篇文章主要介绍了正则化与偏差-方差分解,以及 PyTorch 中的 L2 正则项--weight decay

一、Regularization -weight decay

Regularization 中文是正则化,可以理解为一种减少方差的策略。

在机器学习中,误差可以分解为:偏差,方差与噪声之和。即误差=偏差+方差+噪声

  • 偏差:度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。
  • 方差:度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。
  • 噪声:表达了在当前任务上学习任何算法所能达到的期望泛化误差的下界。
img
正则化方式有 L1 和 L2 正则项两种。其中 L2 正则项又被称为权值衰减(weight decay)。

当没有正则项时:[公式][公式]

当使用 L2 正则项时,[公式][公式],其中 [公式],所以具有权值衰减的作用

二、Dropout

深度学习中Dropout原理解析 - Microstrong的文章 - 知乎 https://zhuanlan.zhihu.com/p/38200980

Dropout 是另一种抑制过拟合的方法。在使用 dropout 时,数据尺度会发生变化,如果设置 dropout_prob =0.3,那么在训练时,数据尺度会变为原来的 70%;==而在测试时,执行了 model.eval() 后,dropout 是关闭的,因此所有权重需要乘以 (1-dropout_prob),把数据尺度也缩放到 70%==加了 dropout 之后,权值更加集中在 0 附近,使得神经元之间的依赖性不至于过大。

PyTorch 中 Dropout 层如下,通常放在每个网路层的最前面:

1
torch.nn.Dropout(p=0.5, inplace=False)

参数:

  • p:主力需要注意的是,p 是被舍弃的概率,也叫失活概率;代码层面实现让某个神经元以概率p停止工作,其实就是让它的激活函数值以概率p变为0

2.1 Dropout具体工作流程

  • 首先随机(临时)删掉网络中一部分的隐藏神经元,输入输出神经元保持不变(图3中虚线为部分临时被删除的神经元)
  • 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。
  • 恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)
  • 重复上述过程

2.2 ==为什么dropout 可以解决过拟合?== 【共享隐藏单元的bagging集成模型】

  • 取平均的作用: 整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。
  • 减少神经元之间复杂的共适应关系: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。
  • Dropout纯粹作为一种高效近似Bagging的方法。然而,有 比这更进一步的Dropout观点。==Dropout不仅仅是训练一个Bagging的集成模型,并且是共享隐藏单元的集成模型==。这意味着无论其他隐藏单元是否在模型中,每个隐藏单元必须都能够表现良好。

model.eval() 和 model.trian()

有些网络层在训练状态和测试状态是不一样的,如 dropout 层,在训练时 dropout 层是有效的,但是数据尺度会缩放,为了保持数据尺度不变,所有的权重需要除以 1-p。而在测试时 dropout 层是关闭的。因此在测试时需要先调用model.eval()设置各个网络层的的training属性为 False,在训练时需要先调用model.train()设置各个网络层的的training属性为 True。

三、Normalization

深度学习基础 之 ---- BN、LN、IN、GN、SN - 琪小钧的文章 - 知乎 https://zhuanlan.zhihu.com/p/524829507

这篇文章主要介绍了 Batch Normalization 的概念,以及 PyTorch 中的 1d/2d/3d Batch Normalization 实现。

3.1 Batch Normalization

BN层的作用是把一个batch内的所有数据,从不规范的分布拉到正态分布。这样做的好处是使得数据能够分布在激活函数的敏感区域,敏感区域即为梯度较大的区域,因此在反向传播的时候能够较快反馈误差传播

称为批标准化。批是指一批数据,通常为 mini-batch;经过处理后的数据符合均值为0,标准差为1的分布,如果原始的分布是正态分布,那么z-score标准化就将原始的正态分布转换为标准正态分布,机器学习中的很多问题都是基于正态分布的假设,这是更加常用的归一化方法。Batch Normalization 层一般在激活函数前一层。

批标准化的优点有如下:

  • 可以使用更大的学习率,==加速模型收敛==
  • 可以不用精心设计权值初始化
  • 可以不用 dropout 或者较小的 dropout
  • 可以不用 L2 或者较小的 weight decay
  • 可以不用 LRN (local response normalization)

假设输入的 mini-batch 数据是 [公式],Batch Normalization 的可学习参数是 [公式],步骤如下:

  • 求 mini-batch 的均值:[公式]
  • 求 mini-batch 的方差:[公式]
  • 标准化:[公式],其中 [公式] 是放置分母为 0 的一个数
  • affine transform(缩放和平移)[公式],这个操作可以增强模型的 capacity,也就是让模型自己判断是否要对数据进行标准化,进行多大程度的标准化。如果 [公式][公式],那么就实现了恒等映射。

Batch Normalization 的提出主要是为了解决 Internal Covariate Shift (ICS)。在训练过程中,数据需要经过多层的网络,如果数据在前向传播的过程中,尺度发生了变化,可能会导致梯度爆炸或者梯度消失,从而导致模型难以收敛。

带有 bn 层的 LeNet 定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class LeNet_bn(nn.Module):
def __init__(self, classes):
super(LeNet_bn, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.bn1 = nn.BatchNorm2d(num_features=6)

self.conv2 = nn.Conv2d(6, 16, 5)
self.bn2 = nn.BatchNorm2d(num_features=16)

self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.bn3 = nn.BatchNorm1d(num_features=120)

self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, classes)

def forward(self, x):
out = self.conv1(x)
out = self.bn1(out)
out = F.relu(out)

out = F.max_pool2d(out, 2)

out = self.conv2(out)
out = self.bn2(out)
out = F.relu(out)

out = F.max_pool2d(out, 2)

out = out.view(out.size(0), -1)

out = self.fc1(out)
out = self.bn3(out)
out = F.relu(out)

out = F.relu(self.fc2(out))
out = self.fc3(out)
return out

带 bn 层的网络,并且不使用 kaiming 初始化权值,训练过程如下:

img

虽然训练过程中,训练集的 loss 也有激增,但只是增加到 0.4,非常稳定。

3.2 Batch Normalization in PyTorch

在 PyTorch 中,有 3 个 Batch Normalization 类

  • nn.BatchNorm1d(),输入数据的形状是 [公式]
  • nn.BatchNorm2d(),输入数据的形状是 [公式]
  • nn.BatchNorm3d(),输入数据的形状是 [公式]

以nn.BatchNorm1d()为例,如下:

1
torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

参数:

  • num_features:一个样本的特征数量,这个参数最重要
  • eps:在进行标准化操作时的分布修正项
  • momentum指数加权平均估计当前的均值和方差,在训练时,均值和方差采用指数加权平均计算,也就是不仅考虑当前 mini-batch 的值均值和方差还考虑前面的 mini-batch 的均值和方差。
  • affine:是否需要 affine transform,默认为 True
  • track_running_stats:True 为训练状态,此时均值和方差会根据每个 mini-batch 改变。False 为测试状态,此时均值和方差会固定

主要属性

  • runninng_mean:均值
  • running_var:方差
  • weight:affine transform 中的 [公式]
  • bias:affine transform 中的 [公式]

3.3 Layer Normalization

batch是“竖”着来的,各个维度做归一化,所以与batch size有关系。 layer是“横”着来的,对一个样本,不同的神经元neuron间做归一化。

提出的原因Batch Normalization 不适用于变长的网络,如 RNN。如下显示了同一层的神经元的情况。假设这个mini-batch一共有N个样本,则Batch Normalization是对每一个维度进行归一。而Layer Normalization对于单个的样本就可以处理。bn和ln都可以比较好的抑制梯度消失和梯度爆炸的情况思路:每个网络层计算均值和方差。

img

注意事项

  • 不再有 running_mean 和 running_var
  • [公式][公式] 为逐样本的
1
torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True)

3.4 Instance Normalization

提出的原因:Batch Normalization 不适用于图像生成。因为在一个 mini-batch 中的图像有不同的风格,不能把这个 batch 里的数据都看作是同一类取标准化

思路:逐个 instance 的 channel 计算均值和方差。也就是每个 feature map 计算一个均值和方差

包括 InstanceNorm1d、InstanceNorm2d、InstanceNorm3d。

InstanceNorm1d为例,定义如下:

1
torch.nn.InstanceNorm1d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)

参数:

  • num_features:一个样本的特征数,这个参数最重要
  • eps:分母修正项
  • momentum:指数加权平均估计当前的的均值和方差
  • affine:是否需要 affine transform
  • track_running_stats:True 为训练状态,此时均值和方差会根据每个 mini-batch 改变。False 为测试状态,此时均值和方差会固定

3.5 Group Normalization

提出的原因:在小 batch 的样本中,Batch Normalization 估计的值不准。一般用在很大的模型中,这时 batch size 就很小。

思路:数据不够,通道来凑。 每个样本的特征分为几组,每组特征分别计算均值和方差。可以看作是 Layer Normalization 的基础上添加了特征分组。

4、相关问题

为啥用LN而不用BN在Transformer里?

BN是对一批数据进行归一化,一批里有不同的样本,bn对不同样本的同一个通道的特征(channel)进行均值方差操作;而LN对同一个样本内部的不同特征进行均值方差操作。

BN在batch size(N)和WH上进行缩放,保留C,而LN是在C和HW上进行缩放,保留bitch size,在NLP中就对应句子长度,通常来说文本词句的长度是不一样的,如果使用BN则会导致靠前的bitch size里的数据可以做相同的均值方差操作,而靠后的多余的数据的方差和均值难以估计,如下图

img

第一个样本里有5个数据通道(可看作特征),第二个样本空间里有3个数据通道(特征),则在提取特征时前三个的均值方差满足同一个norm操作公式,而后面两个由于第二个样本没有数据,所以均值方差不满足其公式,导致误差产生。