工业落地-【draft】阿里云-webshell查杀
深度学习PHP webshell查杀引擎demo
https://www.cdxy.me/?p=788
https://www.cdxy.me/?p=788
CCS 2021 上也发表了一篇利用频域分析检测恶意流量的工作《Realtime Robust Malicious Traffic Detection via Frequency Domain Analysis》
本文是一个面向安全学术圈和工业界同行的介绍性和探讨性议题,议题的前半部分会介绍一些工业实践中被证明有效的落地实践,后半部分更多地是希望抛砖引玉,通过抽象和定义最新的问题,吸引更多学术研究员的关注和合作。
第一部分,本次演讲从目前工业界中智能算法的一些落地实践情况切入说起,总结目前智能安全从概念到落地的应用情况,主要目的是希望阐述,有哪些问题是已经得到解决,或者部分解决的,包括:
总结来说,当前工业界和学术界智能算法的应用可以综合概括为,"基于历史经验样本下的的拟合学习",即”基于知识的对抗“,机器学习在其中充当的角色更多地是一种记忆学习,缺点是难以提供更多的泛化检测和0day发现能力。
第二部分,笔者希望将我们在企业一线工作的经历进行总结和抽象,将目前智能安全中的一些未解决问题,用学术课题的方式明确地定义出来,将智能安全中的问题转化为学术研究课题,目标是争取更广大的国内科研高效和机构的研究力量,将更多的研究重点投入在实际的问题上,避免对历史老问题的重复研究和建设,包括:
第三部分,笔者会介绍一些目前我们公司团队在进行的课题研究方向,包括,
https://live.freebuf.com/detail/c5e504cf96a4e1826a609553bf6054f9
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
原文链接: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 hunting
,就是从海量样本中找出值得关注的malware hunting
的工作,一般是Researcher来进行的(借助于一些信息做关联分析、手工分析样本)malware hunting
的工作,做起来非常耗时间Google为了解决这个痛点,就设计了Spotlight这个系统,结合了深度学习分类器,无监督聚类,动态静态分析,规则式判断。
https://mzgao.blog.csdn.net/article/details/118943477
改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篇依靠机器学习解决不同问题的顶级安全论文中这些陷阱的普遍性。令我们惊讶的是,每篇论文至少有三个陷阱;更糟糕的是,有几个陷阱影响了大多数论文,这表明这个问题是多么普遍和微妙。尽管这些陷阱很普遍,但了解它们在多大程度上削弱了结果并导致过于乐观的结论可能更为重要。最后我们对四个不同安全领域中的陷阱进行了影响分析。这些发现支持了我们的假设,回应了社区更广泛的关注。
评论 : 这项工作不应被解释为指手画脚的练习。相反,这是一种反思性的努力,表明了微妙的陷阱会对安全研究的进展产生多大的负面影响,以及我们作为一个社区如何充分缓解它们。
尽管机器学习取得了巨大的成功,但在实践中应用机器学习通常并不简单,而且容易出现一些缺陷,从明显的缺陷到微小的瑕疵。忽视这些问题可能会导致实验偏差或错误结论,尤其是在计算机安全方面。在本节中,我们介绍了在security research中经常出现的十个常见陷阱。虽然这些陷阱乍一看似乎显而易见,但它们根源于安全研究中普遍存在的细微缺陷,甚至在ATOP会议上发表的论文中也是如此。
我们根据典型机器学习工作流的各个阶段对这些缺陷进行分类,如图1所示。对于每个缺陷,我们提供了简短的描述,讨论了其对安全领域的影响,并提出了建议。此外,彩色条显示了我们分析中遭受陷阱的论文比例,较暖的颜色表示存在陷阱(见图3)
基于学习的系统的设计和开发通常从获取代表性数据集开始。显然,使用不切实际的数据进行实验会导致错误估计方法的能力。以下两个陷阱经常导致这个问题,因此在开发基于学习的计算机安全系统时需要特别注意。
收集的数据不足以代表潜在安全问题的真实数据分布。
描述:除了少数例外,研究人员开发基于学习的方法时没有确切了解输入空间的真实潜在分布。相反,他们需要依赖于包含固定数量样本的数据集,这些样本旨在与实际分布相似。虽然在大多数情况下不可避免地存在一些偏见,但理解特定问题固有的特定偏见对于限制其在实践中的影响至关重要。如果数据不能有效地表示输入空间,甚至不能遵循不同的分布,那么从训练数据中得出有意义的结论就变得很有挑战性。
安全影响:采样偏差与安全高度相关,因为数据采集尤其具有挑战性,通常需要使用多个质量不同的源。例如,对于用于Android恶意软件检测的合适数据集的收集,只有少数公共来源可用于获取此类数据[6, 134]。因此,依赖合成数据或组合来自不同来源的数据是常见的做法,正如我们在第4节中通过最先进的入侵和恶意软件检测方法的例子所证明的那样,这两种方法都会引入偏差。
建议:在许多安全应用程序中,从真实分布中采样极其困难,有时甚至不可能。因此,这种偏差通常只能得到缓解,但不能完全消除。在§4中,我们表明,在某些情况下,一个合理的策略是构造真实分布的差分集并对其进行单独分析。进一步的策略包括使用合成数据扩展数据集[例如,28,60,137]或使用转移学习[See99,135,145,147]。然而,应避免来自不兼容源的数据混合,因为这是额外偏差的常见原因。无论如何,应该公开讨论所用数据集的局限性,让其他研究人员更好地理解潜在采样偏差的安全含义。
分类任务所需的地面真实值标签不准确、不稳定或错误,影响基于学习的系统的整体性能[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]。
一旦收集到足够的数据,就可以训练基于学习的安全系统。这个过程包括从数据预处理到提取有意义的特征和建立有效的学习模型。不幸的是,这些步骤中的每一步都可能引入缺陷和弱点。
学习模型是用实践中通常不可用的数据训练的。数据窥探可以以多种方式发生,其中一些非常细微,难以识别[1]。
描述:在生成学习模型之前,通常将收集的数据拆分为单独的训练集和测试集。虽然分割数据似乎很简单,但测试数据或其他通常不可用的背景信息有许多微妙的方式可以影响训练过程,从而导致数据窥探。虽然附录中提供了数据监听示例的详细列表(见表8),但我们大致区分了三种类型的数据监听:测试、临时和选择性监听。当测试集用于最终评估之前的实验时,会发生测试窥探。这包括识别有用特征、参数和学习算法的准备工作。如果忽略数据中的时间依赖性,则会发生时间监听。这是一个常见的陷阱,因为许多与安全相关的问题的潜在分布都处于不断变化的状态[例如,87,104]。最后,选择性监听描述了基于实践中不可用的信息清理数据。一个例子是基于完整数据集(即,训练和测试)的统计数据删除外部LIER,这些数据集通常在训练时不可用。
安全影响:在安全方面,由于新的攻击或技术,数据分布是非平稳的,并且不断变化。因此,窥探未来或外部数据源的数据是一种普遍现象,导致结果过于乐观。例如,一些研究人员已经在基于学习的恶意软件检测系统中发现了时间窥探[4,8,104]。在所有这些情况下,由于混合了过去和现在的样本,这些方法的能力被高估。同样,在安全研究中也存在测试和选择性窥探事件,导致结果出现无意偏差(见§3)。
建议:虽然训练、验证和测试数据应该严格分开似乎很明显,但在预处理阶段,这种数据隔离往往会被无意中违反。例如,我们观察到,在整个数据集上计算tf-idf权重或神经嵌入是一个常见错误(见§3)。为了避免这个问题,测试数据应该在数据收集期间尽早分割,并单独存储,直到最终评估。此外,在创建数据时,应考虑数据内的时间依赖性,数据集被拆分[4,87,104]。然而,其他类型的数据窥探很难解决。例如,随着公开数据集的特征日益暴露,使用该数据开发的方法隐含地从测试数据中获取年龄知识[见1,90]。因此,对知名数据集的实验应与对来自考虑适应应用领域的较新数据的实验相补充。
与安全问题无关的工件创建了用于分类的快捷模式。因此,学习模型适应这些工件,而不是解决实际任务;
描述:伪相关性是由与要解决的任务相关但实际上与之无关的产生的,从而导致错误关联。考虑一个网络入侵检测系统的例子,其中数据集中的大部分攻击来自某个网络区域。该模型可以学习检测特定IP范围而不是一般攻击模式。请注意,虽然抽样偏差是产生虚假相关性的常见原因,但这些偏差也是由其他因素造成的,我们在附录a.对此进行了更详细的讨论
安全影响:机器学习通常应用于安全领域的黑盒。因此,虚假的相关性往往无法确定。一旦结果被解释并用于得出一般结论,这些相关性就会带来问题。如果不知道虚假相关性,则存在高估方法能力和误判其实际局限性的高风险。例如,§4.2报告了我们对漏洞发现系统的分析,表明基础数据中存在明显的虚假相关性。
建议:为了更好地了解基于学习的系统的能力,我们通常建议应用机器学习的解释技术[见59、79、133]。尽管存在一些限制[例如,66,75127],这些技术可以揭示虚假的相关性,并允许从业者评估其对系统能力的影响。作为一个例子,我们在§4中展示了不同安全相关问题的可解释学习如何有助于识别该问题。请注意,根据基于学习的系统的目标,一种设置中的虚假相关性可能被视为另一种设置的有效信号。因此,我们建议提前明确定义该目标,并验证系统学习的相关性是否符合该目标。例如,一个强大的恶意软件检测系统应该检测与恶意活动相关的特征,而不是数据中存在的其他无关信息
基于学习的方法的最终参数在训练时并不完全固定。相反,它们间接依赖于测试集。
描述:在整个学习过程中,通常通过改变参数生成不同的模型。选择性能最佳的模型,并给出其在测试集上的性能。虽然这种设置通常是合理的,但它仍然会受到参数选择偏差的影响。例如,通过调整超参数或校准测试数据(而不是训练数据)上的阈值,可以很容易产生过于乐观的结果。
安全影响:参数在训练时未完全校准的安全系统在现实环境中的性能可能会有所不同。虽然网络入侵检测系统的检测阈值可以使用测试集上获得的ROC曲线来确定,但由于现实世界流量的多样性,在实践中很难选择相同的操作点[119]。与原始实验设置相比,这可能导致系统性能下降。请注意,此陷阱与数据窥探(P3)有关,但应明确考虑,因为它很容易导致夸大的结果。
建议:这种陷阱构成了数据窥探的一种特殊情况,因此适用相同的对策。然而,在实践中,通过使用分离的评估集进行模型选择和参数调整,可以很容易地固定有偏差的参数选择。与通常难以缓解的一般数据窥探相比,严格的数据隔离已经足以排除确定超参数和阈值时的问题。
性能评估典型机器学习工作流的下一个阶段是系统性能评估。在下文中,我们将展示不同的陷阱如何在评估此类系统时导致不公平的比较和有偏见的结果。
评估不使用或使用有限的基线方法进行。结果是,不可能证明对现有技术和其他安全机制的改进;
描述:为了说明一种新方法在多大程度上提高了技术水平,将其与先前提出的方法进行比较至关重要。在选择基线时,重要的是要记住,不存在优于一般[136]中所有其他方法的通用学习算法。因此,仅提供所提出方法的结果或与基本相同的学习模型进行比较,并没有提供足够的背景来评估其影响。
安全影响:过于复杂的学习方法会增加过度拟合的可能性,还会增加运行时开销、攻击面以及部署的时间和成本。为了证明与传统方法相比,机器学习技术提供了显著的改进,因此有必要对这些系统进行并排比较。
推荐:在整个评估过程中,应考虑简单模型,而不是仅仅关注复杂模型进行比较。这些方法易于解释,计算要求较低,并且在实践中证明是有效的和可扩展的。在第4节中,我们演示了如何使用易于理解的简单模型作为基线来解释不必要的复杂学习模型。类似地,我们表明自动机器学习(AutoML)框架工作[例如,48,70]有助于找到合适的基线。虽然这些自动化方法肯定不能取代经验丰富的数据分析师,但它们可以用来设定所提出方法应达到的下限。最后,检查非学习方法是否也适用于应用场景是至关重要的。例如,对于入侵和恶意软件检测,存在多种使用其他检测策略的方法[例如,45、102、111]。
精选的性能度量没有考虑到应用场景的限制,例如数据不平衡或需要保持较低的误报率。
描述:可提供范围广泛的性能指标,但并非所有这些指标都适用于安全环境。例如,在评估检测系统时,仅报告一个性能值(如精度)通常是不够的,因为真阳性和假阳性判断是不可观察的。然而,更先进的测量方法,如ROC曲线,在某些应用环境中可能会模糊实验结果。图2显示了不平衡数据集上的ROC曲线和精度召回曲线(分类比率1:100)。仅考虑ROC曲线,性能看起来非常出色,但低精度揭示了分类器的真实性能,这对于许多安全应用来说是不切实际的;此外,各种与安全相关的问题涉及两个以上的类,需要多类度量。这一套可能会引入更多的微妙陷阱。众所周知,常用的策略,如”macro-averagingormicro-averaging “会过度估计和低估小类[51]。
安全影响:不适当的性能度量是安全研究中的一个长期问题,特别是在检测任务中。例如,虽然真阳性和假阳性可以更详细地描述系统的性能,但当攻击发生率较低时,它们也可以掩盖实际精度。在机器学习中,性能指标的选择非常具体。因此,我们无法提供一般指南。相反,我们建议考虑基于学习的系统的实际部署,并确定有助于实践评估其性能的措施。请注意,这些度量通常与标准度量(如精度或误差)不同,因为它们更符合系统的日常操作。为了给读者一种直觉,在§4.1中,我们展示了Android恶意软件检测器的不同性能测量如何导致对其性能的矛盾解释。
在解释性能指标时,忽略了较大的类别不平衡,导致对绩效的高估。
描述:如果不考虑负类的基本速率,类不平衡很容易导致对性能的错误预测。如果这一类占主导地位,即使是极低的假阳性率也会导致意外的高假阳性率。请注意与先前陷阱的不同之处:P7指的是对绩效的不恰当描述,而基本利率谬误则是对结果的错误解释。这种特殊情况在实践中很容易被忽视(见§3)。考虑图2中的示例,其中99%的真阳性可能为1%的假阳性。然而,如果我们考虑1:100的分类比率,这实际上对应于每99个真阳性对应100个假阳性。
安全影响:基本速率谬误与各种安全问题有关,例如入侵检测和网站指纹识别[11, 72, 100]。因此,现实地量化攻击者构成的安全和先验威胁是一项挑战。类似地,安装恶意软件的概率通常远低于恶意软件检测实验[104]。
建议:安全方面的几个问题围绕着检测罕见事件,如威胁和攻击。对于这些问题,我们提倡使用精度和召回以及相关措施,如精度召回曲线。与其他衡量标准不同,这些功能考虑了分类平衡,因此类似于可靠的性能指标,对于关注少数类的检测任务[38118]。然而,请注意,如果少数群体的流行率被夸大,例如,由于抽样偏差[104],精确度和召回率可能会产生误导。在这些情况下,马修相关系数(MCC)等其他度量更适合评估分类器的性能[29](见§4)。此外,ROC曲线及其AUC值是比较检测和分类方法的有用指标。为了更加关注实际约束,我们建议考虑仅将曲线调整到可处理的假阳性率,并计算有界AUC值。最后,我们还建议讨论与负类(白样本)的基本比率相关的误报类,这使读者能够了解误报决策导致的工作量。
在典型机器学习工作流的最后一个阶段,部署了开发的系统来解决实践中潜在的安全问题。
基于学习的系统在实验室环境中进行了简单的评估,没有讨论其实际局限性
描述:与所有经验学科一样,在某些假设下进行实验以证明方法的有效性是很常见的。虽然执行受控实验是检验某一方法特定方面的合法方法,但应在现实环境中进行评估,以透明地评估其能力,并展示将促进进一步研究的开放挑战。
安全影响:许多基于学习的安全系统仅在实验室环境中评估,夸大了其实际影响。一个常见的例子是仅在封闭世界设置中评估的检测方法,具有有限的多样性,不考虑非平稳性[15,71]。例如,大量网站指纹攻击仅在有限时间内的封闭环境中评估[72]。类似地,一些基于学习的恶意软件检测系统在现实环境中没有得到充分的研究[见5,104]
建议:重要的是要尽可能准确地远离实验室设置和近似的真实世界设置。例如,应考虑数据的时间和空间关系,以解释野外遇到的典型动态[见104]。类似地,运行时和存储约束应在实际条件下进行分析[See 15,112,130]。理想情况下,所提议的系统应该被部署来发现在纯实验室环境中无法观察到的问题,例如真实世界网络流量的多样性[see119],尽管由于道德和隐私限制,这并非总是可能的。
没有考虑机器学习的安全性,使系统面临各种攻击,如中毒和逃避攻击;
描述:基于学习的安全系统在一个恶劣环境中运行,在设计这些系统时应考虑到这一点。先前在对抗式学习方面的工作表明,在工作流程的各个阶段,机器学习本身都引入了相当大的攻击面[见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篇论文进行了研究,这是我们社区中与安全相关研究的四大会议。这些论文被选为我们研究的代表性例子,因为它们涉及大量不同的安全主题,并成功地将机器学习应用于相应的研究问题。
特别是,我们选择的顶级论文涵盖以下主题:
评估标准:对于每一篇论文,陷阱大致分为存在、不存在、文本不清楚或不适用。在没有补救(存在)的实验中,陷阱可能完全存在,也可能不存在。如果作者纠正了任何偏见或缩小了他们的主张范围以适应陷阱,这也被视为不存在。此外,我们还介绍了一个类别,以说明确实存在陷阱的实验,但其影响已经得到了特别处理。如果目前或部分出现了一个陷阱,但在文本中得到了承认,我们将按照讨论的方式对分类进行调整。如果审稿人无法排除由于信息缺失而出现的陷阱,我们会将出版物与文本区分开来。最后,在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篇依靠机器学习解决不同问题的顶级安全论文中这些陷阱的普遍性。令我们惊讶的是,每篇论文至少有三个陷阱;更糟糕的是,有几个陷阱影响了大多数论文,这表明这个问题是多么普遍和微妙。尽管这些陷阱很普遍,但了解它们在多大程度上削弱了结果并导致过于乐观的结论可能更为重要。最后我们对四个不同安全领域中的陷阱进行了影响分析。这些发现支持了我们的假设,回应了社区更广泛的关注。
评论 : 这项工作不应被解释为指手画脚的练习。相反,这是一种反思性的努力,表明了微妙的陷阱会对安全研究的进展产生多大的负面影响,以及我们作为一个社区如何充分缓解它们。
尽管机器学习取得了巨大的成功,但在实践中应用机器学习通常并不简单,而且容易出现一些缺陷,从明显的缺陷到微小的瑕疵。忽视这些问题可能会导致实验偏差或错误结论,尤其是在计算机安全方面。在本节中,我们介绍了在security research中经常出现的十个常见陷阱。虽然这些陷阱乍一看似乎显而易见,但它们根源于安全研究中普遍存在的细微缺陷,甚至在ATOP会议上发表的论文中也是如此。
我们根据典型机器学习工作流的各个阶段对这些缺陷进行分类,如图1所示。对于每个缺陷,我们提供了简短的描述,讨论了其对安全领域的影响,并提出了建议。此外,彩色条显示了我们分析中遭受陷阱的论文比例,较暖的颜色表示存在陷阱(见图3)
基于学习的系统的设计和开发通常从获取代表性数据集开始。显然,使用不切实际的数据进行实验会导致错误估计方法的能力。以下两个陷阱经常导致这个问题,因此在开发基于学习的计算机安全系统时需要特别注意。
收集的数据不足以代表潜在安全问题的真实数据分布。
描述:除了少数例外,研究人员开发基于学习的方法时没有确切了解输入空间的真实潜在分布。相反,他们需要依赖于包含固定数量样本的数据集,这些样本旨在与实际分布相似。虽然在大多数情况下不可避免地存在一些偏见,但理解特定问题固有的特定偏见对于限制其在实践中的影响至关重要。如果数据不能有效地表示输入空间,甚至不能遵循不同的分布,那么从训练数据中得出有意义的结论就变得很有挑战性。
安全影响:采样偏差与安全高度相关,因为数据采集尤其具有挑战性,通常需要使用多个质量不同的源。例如,对于用于Android恶意软件检测的合适数据集的收集,只有少数公共来源可用于获取此类数据[6, 134]。因此,依赖合成数据或组合来自不同来源的数据是常见的做法,正如我们在第4节中通过最先进的入侵和恶意软件检测方法的例子所证明的那样,这两种方法都会引入偏差。
建议:在许多安全应用程序中,从真实分布中采样极其困难,有时甚至不可能。因此,这种偏差通常只能得到缓解,但不能完全消除。在§4中,我们表明,在某些情况下,一个合理的策略是构造真实分布的差分集并对其进行单独分析。进一步的策略包括使用合成数据扩展数据集[例如,28,60,137]或使用转移学习[See99,135,145,147]。然而,应避免来自不兼容源的数据混合,因为这是额外偏差的常见原因。无论如何,应该公开讨论所用数据集的局限性,让其他研究人员更好地理解潜在采样偏差的安全含义。
分类任务所需的地面真实值标签不准确、不稳定或错误,影响基于学习的系统的整体性能[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]。
一旦收集到足够的数据,就可以训练基于学习的安全系统。这个过程包括从数据预处理到提取有意义的特征和建立有效的学习模型。不幸的是,这些步骤中的每一步都可能引入缺陷和弱点。
学习模型是用实践中通常不可用的数据训练的。数据窥探可以以多种方式发生,其中一些非常细微,难以识别[1]。
描述:在生成学习模型之前,通常将收集的数据拆分为单独的训练集和测试集。虽然分割数据似乎很简单,但测试数据或其他通常不可用的背景信息有许多微妙的方式可以影响训练过程,从而导致数据窥探。虽然附录中提供了数据监听示例的详细列表(见表8),但我们大致区分了三种类型的数据监听:测试、临时和选择性监听。当测试集用于最终评估之前的实验时,会发生测试窥探。这包括识别有用特征、参数和学习算法的准备工作。如果忽略数据中的时间依赖性,则会发生时间监听。这是一个常见的陷阱,因为许多与安全相关的问题的潜在分布都处于不断变化的状态[例如,87,104]。最后,选择性监听描述了基于实践中不可用的信息清理数据。一个例子是基于完整数据集(即,训练和测试)的统计数据删除外部LIER,这些数据集通常在训练时不可用。
安全影响:在安全方面,由于新的攻击或技术,数据分布是非平稳的,并且不断变化。因此,窥探未来或外部数据源的数据是一种普遍现象,导致结果过于乐观。例如,一些研究人员已经在基于学习的恶意软件检测系统中发现了时间窥探[4,8,104]。在所有这些情况下,由于混合了过去和现在的样本,这些方法的能力被高估。同样,在安全研究中也存在测试和选择性窥探事件,导致结果出现无意偏差(见§3)。
建议:虽然训练、验证和测试数据应该严格分开似乎很明显,但在预处理阶段,这种数据隔离往往会被无意中违反。例如,我们观察到,在整个数据集上计算tf-idf权重或神经嵌入是一个常见错误(见§3)。为了避免这个问题,测试数据应该在数据收集期间尽早分割,并单独存储,直到最终评估。此外,在创建数据时,应考虑数据内的时间依赖性,数据集被拆分[4,87,104]。然而,其他类型的数据窥探很难解决。例如,随着公开数据集的特征日益暴露,使用该数据开发的方法隐含地从测试数据中获取年龄知识[见1,90]。因此,对知名数据集的实验应与对来自考虑适应应用领域的较新数据的实验相补充。
与安全问题无关的工件创建了用于分类的快捷模式。因此,学习模型适应这些工件,而不是解决实际任务;
描述:伪相关性是由与要解决的任务相关但实际上与之无关的产生的,从而导致错误关联。考虑一个网络入侵检测系统的例子,其中数据集中的大部分攻击来自某个网络区域。该模型可以学习检测特定IP范围而不是一般攻击模式。请注意,虽然抽样偏差是产生虚假相关性的常见原因,但这些偏差也是由其他因素造成的,我们在附录a.对此进行了更详细的讨论
安全影响:机器学习通常应用于安全领域的黑盒。因此,虚假的相关性往往无法确定。一旦结果被解释并用于得出一般结论,这些相关性就会带来问题。如果不知道虚假相关性,则存在高估方法能力和误判其实际局限性的高风险。例如,§4.2报告了我们对漏洞发现系统的分析,表明基础数据中存在明显的虚假相关性。
建议:为了更好地了解基于学习的系统的能力,我们通常建议应用机器学习的解释技术[见59、79、133]。尽管存在一些限制[例如,66,75127],这些技术可以揭示虚假的相关性,并允许从业者评估其对系统能力的影响。作为一个例子,我们在§4中展示了不同安全相关问题的可解释学习如何有助于识别该问题。请注意,根据基于学习的系统的目标,一种设置中的虚假相关性可能被视为另一种设置的有效信号。因此,我们建议提前明确定义该目标,并验证系统学习的相关性是否符合该目标。例如,一个强大的恶意软件检测系统应该检测与恶意活动相关的特征,而不是数据中存在的其他无关信息
基于学习的方法的最终参数在训练时并不完全固定。相反,它们间接依赖于测试集。
描述:在整个学习过程中,通常通过改变参数生成不同的模型。选择性能最佳的模型,并给出其在测试集上的性能。虽然这种设置通常是合理的,但它仍然会受到参数选择偏差的影响。例如,通过调整超参数或校准测试数据(而不是训练数据)上的阈值,可以很容易产生过于乐观的结果。
安全影响:参数在训练时未完全校准的安全系统在现实环境中的性能可能会有所不同。虽然网络入侵检测系统的检测阈值可以使用测试集上获得的ROC曲线来确定,但由于现实世界流量的多样性,在实践中很难选择相同的操作点[119]。与原始实验设置相比,这可能导致系统性能下降。请注意,此陷阱与数据窥探(P3)有关,但应明确考虑,因为它很容易导致夸大的结果。
建议:这种陷阱构成了数据窥探的一种特殊情况,因此适用相同的对策。然而,在实践中,通过使用分离的评估集进行模型选择和参数调整,可以很容易地固定有偏差的参数选择。与通常难以缓解的一般数据窥探相比,严格的数据隔离已经足以排除确定超参数和阈值时的问题。
性能评估典型机器学习工作流的下一个阶段是系统性能评估。在下文中,我们将展示不同的陷阱如何在评估此类系统时导致不公平的比较和有偏见的结果。
评估不使用或使用有限的基线方法进行。结果是,不可能证明对现有技术和其他安全机制的改进;
描述:为了说明一种新方法在多大程度上提高了技术水平,将其与先前提出的方法进行比较至关重要。在选择基线时,重要的是要记住,不存在优于一般[136]中所有其他方法的通用学习算法。因此,仅提供所提出方法的结果或与基本相同的学习模型进行比较,并没有提供足够的背景来评估其影响。
安全影响:过于复杂的学习方法会增加过度拟合的可能性,还会增加运行时开销、攻击面以及部署的时间和成本。为了证明与传统方法相比,机器学习技术提供了显著的改进,因此有必要对这些系统进行并排比较。
推荐:在整个评估过程中,应考虑简单模型,而不是仅仅关注复杂模型进行比较。这些方法易于解释,计算要求较低,并且在实践中证明是有效的和可扩展的。在第4节中,我们演示了如何使用易于理解的简单模型作为基线来解释不必要的复杂学习模型。类似地,我们表明自动机器学习(AutoML)框架工作[例如,48,70]有助于找到合适的基线。虽然这些自动化方法肯定不能取代经验丰富的数据分析师,但它们可以用来设定所提出方法应达到的下限。最后,检查非学习方法是否也适用于应用场景是至关重要的。例如,对于入侵和恶意软件检测,存在多种使用其他检测策略的方法[例如,45、102、111]。
精选的性能度量没有考虑到应用场景的限制,例如数据不平衡或需要保持较低的误报率。
描述:可提供范围广泛的性能指标,但并非所有这些指标都适用于安全环境。例如,在评估检测系统时,仅报告一个性能值(如精度)通常是不够的,因为真阳性和假阳性判断是不可观察的。然而,更先进的测量方法,如ROC曲线,在某些应用环境中可能会模糊实验结果。图2显示了不平衡数据集上的ROC曲线和精度召回曲线(分类比率1:100)。仅考虑ROC曲线,性能看起来非常出色,但低精度揭示了分类器的真实性能,这对于许多安全应用来说是不切实际的;此外,各种与安全相关的问题涉及两个以上的类,需要多类度量。这一套可能会引入更多的微妙陷阱。众所周知,常用的策略,如”macro-averagingormicro-averaging “会过度估计和低估小类[51]。
安全影响:不适当的性能度量是安全研究中的一个长期问题,特别是在检测任务中。例如,虽然真阳性和假阳性可以更详细地描述系统的性能,但当攻击发生率较低时,它们也可以掩盖实际精度。在机器学习中,性能指标的选择非常具体。因此,我们无法提供一般指南。相反,我们建议考虑基于学习的系统的实际部署,并确定有助于实践评估其性能的措施。请注意,这些度量通常与标准度量(如精度或误差)不同,因为它们更符合系统的日常操作。为了给读者一种直觉,在§4.1中,我们展示了Android恶意软件检测器的不同性能测量如何导致对其性能的矛盾解释。
在解释性能指标时,忽略了较大的类别不平衡,导致对绩效的高估。
描述:如果不考虑负类的基本速率,类不平衡很容易导致对性能的错误预测。如果这一类占主导地位,即使是极低的假阳性率也会导致意外的高假阳性率。请注意与先前陷阱的不同之处:P7指的是对绩效的不恰当描述,而基本利率谬误则是对结果的错误解释。这种特殊情况在实践中很容易被忽视(见§3)。考虑图2中的示例,其中99%的真阳性可能为1%的假阳性。然而,如果我们考虑1:100的分类比率,这实际上对应于每99个真阳性对应100个假阳性。
安全影响:基本速率谬误与各种安全问题有关,例如入侵检测和网站指纹识别[11, 72, 100]。因此,现实地量化攻击者构成的安全和先验威胁是一项挑战。类似地,安装恶意软件的概率通常远低于恶意软件检测实验[104]。
建议:安全方面的几个问题围绕着检测罕见事件,如威胁和攻击。对于这些问题,我们提倡使用精度和召回以及相关措施,如精度召回曲线。与其他衡量标准不同,这些功能考虑了分类平衡,因此类似于可靠的性能指标,对于关注少数类的检测任务[38118]。然而,请注意,如果少数群体的流行率被夸大,例如,由于抽样偏差[104],精确度和召回率可能会产生误导。在这些情况下,马修相关系数(MCC)等其他度量更适合评估分类器的性能[29](见§4)。此外,ROC曲线及其AUC值是比较检测和分类方法的有用指标。为了更加关注实际约束,我们建议考虑仅将曲线调整到可处理的假阳性率,并计算有界AUC值。最后,我们还建议讨论与负类(白样本)的基本比率相关的误报类,这使读者能够了解误报决策导致的工作量。
在典型机器学习工作流的最后一个阶段,部署了开发的系统来解决实践中潜在的安全问题。
基于学习的系统在实验室环境中进行了简单的评估,没有讨论其实际局限性
描述:与所有经验学科一样,在某些假设下进行实验以证明方法的有效性是很常见的。虽然执行受控实验是检验某一方法特定方面的合法方法,但应在现实环境中进行评估,以透明地评估其能力,并展示将促进进一步研究的开放挑战。
安全影响:许多基于学习的安全系统仅在实验室环境中评估,夸大了其实际影响。一个常见的例子是仅在封闭世界设置中评估的检测方法,具有有限的多样性,不考虑非平稳性[15,71]。例如,大量网站指纹攻击仅在有限时间内的封闭环境中评估[72]。类似地,一些基于学习的恶意软件检测系统在现实环境中没有得到充分的研究[见5,104]
建议:重要的是要尽可能准确地远离实验室设置和近似的真实世界设置。例如,应考虑数据的时间和空间关系,以解释野外遇到的典型动态[见104]。类似地,运行时和存储约束应在实际条件下进行分析[See 15,112,130]。理想情况下,所提议的系统应该被部署来发现在纯实验室环境中无法观察到的问题,例如真实世界网络流量的多样性[see119],尽管由于道德和隐私限制,这并非总是可能的。
没有考虑机器学习的安全性,使系统面临各种攻击,如中毒和逃避攻击;
描述:基于学习的安全系统在一个恶劣环境中运行,在设计这些系统时应考虑到这一点。先前在对抗式学习方面的工作表明,在工作流程的各个阶段,机器学习本身都引入了相当大的攻击面[见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篇论文进行了研究,这是我们社区中与安全相关研究的四大会议。这些论文被选为我们研究的代表性例子,因为它们涉及大量不同的安全主题,并成功地将机器学习应用于相应的研究问题。
特别是,我们选择的顶级论文涵盖以下主题:
评估标准:对于每一篇论文,陷阱大致分为存在、不存在、文本不清楚或不适用。在没有补救(存在)的实验中,陷阱可能完全存在,也可能不存在。如果作者纠正了任何偏见或缩小了他们的主张范围以适应陷阱,这也被视为不存在。此外,我们还介绍了一个类别,以说明确实存在陷阱的实验,但其影响已经得到了特别处理。如果目前或部分出现了一个陷阱,但在文本中得到了承认,我们将按照讨论的方式对分类进行调整。如果审稿人无法排除由于信息缺失而出现的陷阱,我们会将出版物与文本区分开来。最后,在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中讨论的建议如何帮助识别和解决这些问题。在我们的讨论中,我们考虑了计算机安全领域的四个热门研究主题:
评论对于该分析,我们考虑了每个安全域的最先进方法。我们注意到,本节中的结果并不意味着具体批评这些方法;我们选择它们是因为它们代表了陷阱如何影响不同领域。值得注意的是,我们能够复制这些方法的事实高度赞扬了他们的学术水平;
使用机器学习自动检测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]。
实验装置:为了更好地理解这一发现,我们使用两个数据集进行了实验:
实验结果:在数据集D1和D2之间,DREBIN 和 OPSDEQS的召回率(真阳性率)分别超过10%和15%,而准确性仅受到轻微影响(见表1)。因此,性能度量的选择至关重要(P7)。有趣的是,URLplay.google.Com 被证明是良性类的五个最具歧视性的特征之一,这表明分类者已经学会区分Android apps的起源,而不是恶意软件和benign apps 之间的区别(P4)。虽然我们的实验装置通过故意忽略时间相关性(P3)高估了分类器的性能,但我们仍然可以清楚地观察到陷阱的影响。请注意,在以前的工作[4, 104]中已经证明了在这种情况下时间窥探的效果。
源代码中的漏洞可能导致权限提升和远程代码执行,使其成为主要威胁。由于手动搜索漏洞复杂且耗时,近年来提出了基于机器学习的检测方法[57,83,141]。在下面的内容中,我们展示了用于漏洞检测的数据集包含仅在一个类(P4)中发生的事件。我们还发现,用于检测脆弱性的神经网络Vuldeepecker[83]使用伪影进行分类,并且简单的线性分类器在相同的数据集上获得更好的结果(P6)。最后,我们讨论了forVulDeePecker提出的预处理步骤如何使我们无法确定某些代码片段是否包含漏洞(P2)
数据集集合:在我们的分析中,我们使用了Li等人[83]发布的数据集,其中包含来自国家漏洞数据库[36]和SARD项目[37]的源代码。我们关注与缓冲区(CWE-119)相关的漏洞,并获得了39757个源代码片段,其中10444(26%)被标记为包含漏洞。
基于源代码识别开发人员的任务称为作者归属[23]。编程习惯具有多种风格模式,因此
网络入侵是安全[41]中最古老的问题之一,毫不奇怪,异常网络流量的检测严重依赖于基于学习的方法[27,81,82,93]。然而,收集真实攻击数据的挑战[46]常常导致研究人员生成合成数据,用于实验室评估(P9)。在这里,我们演示了这些数据如何不足以证明使用复杂模型(如神经网络)的合理性,以及将一个更简单的模型作为基线将如何揭示这些缺点(P6)。
数据集集合:我们考虑Mirsky等人93发布的数据集,其中包含物联网(IoT)网络流量的捕获,模拟Mirai僵尸网络恶意软件的初始激活和传播。该数据包覆盖了三台个人电脑和九台物联网设备的Wi-Fi网络上119分钟的流量.
数据集分析:首先,我们分析捕获的网络流量的传输量。图8显示了捕获过程中良性和恶意数据包的频率,划分为10秒。这表明在分组频率中有一个强信号,这高度指示了一个持续攻击。此外,所有良性活动似乎都随着袭击的开始而停止。74分钟后,尽管网络上有很多设备。这表明个体观测可能已经合并,并可能进一步导致系统受益于虚假相关性(P4)
图: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)下优于自动编码器集成。除了其优越的性能外,箱线图方法与集成的特征提取和测试程序相比,重量非常轻。这一点尤其重要,因为集成设计用于在低延迟的资源受限设备(如物联网设备)上运行。
表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中讨论的建议如何帮助识别和解决这些问题。在我们的讨论中,我们考虑了计算机安全领域的四个热门研究主题:
评论对于该分析,我们考虑了每个安全域的最先进方法。我们注意到,本节中的结果并不意味着具体批评这些方法;我们选择它们是因为它们代表了陷阱如何影响不同领域。值得注意的是,我们能够复制这些方法的事实高度赞扬了他们的学术水平;
使用机器学习自动检测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]。
实验装置:为了更好地理解这一发现,我们使用两个数据集进行了实验:
实验结果:在数据集D1和D2之间,DREBIN 和 OPSDEQS的召回率(真阳性率)分别超过10%和15%,而准确性仅受到轻微影响(见表1)。因此,性能度量的选择至关重要(P7)。有趣的是,URLplay.google.Com 被证明是良性类的五个最具歧视性的特征之一,这表明分类者已经学会区分Android apps的起源,而不是恶意软件和benign apps 之间的区别(P4)。虽然我们的实验装置通过故意忽略时间相关性(P3)高估了分类器的性能,但我们仍然可以清楚地观察到陷阱的影响。请注意,在以前的工作[4, 104]中已经证明了在这种情况下时间窥探的效果。
源代码中的漏洞可能导致权限提升和远程代码执行,使其成为主要威胁。由于手动搜索漏洞复杂且耗时,近年来提出了基于机器学习的检测方法[57,83,141]。在下面的内容中,我们展示了用于漏洞检测的数据集包含仅在一个类(P4)中发生的事件。我们还发现,用于检测脆弱性的神经网络Vuldeepecker[83]使用伪影进行分类,并且简单的线性分类器在相同的数据集上获得更好的结果(P6)。最后,我们讨论了forVulDeePecker提出的预处理步骤如何使我们无法确定某些代码片段是否包含漏洞(P2)
数据集集合:在我们的分析中,我们使用了Li等人[83]发布的数据集,其中包含来自国家漏洞数据库[36]和SARD项目[37]的源代码。我们关注与缓冲区(CWE-119)相关的漏洞,并获得了39757个源代码片段,其中10444(26%)被标记为包含漏洞。
基于源代码识别开发人员的任务称为作者归属[23]。编程习惯具有多种风格模式,因此
网络入侵是安全[41]中最古老的问题之一,毫不奇怪,异常网络流量的检测严重依赖于基于学习的方法[27,81,82,93]。然而,收集真实攻击数据的挑战[46]常常导致研究人员生成合成数据,用于实验室评估(P9)。在这里,我们演示了这些数据如何不足以证明使用复杂模型(如神经网络)的合理性,以及将一个更简单的模型作为基线将如何揭示这些缺点(P6)。
数据集集合:我们考虑Mirsky等人93发布的数据集,其中包含物联网(IoT)网络流量的捕获,模拟Mirai僵尸网络恶意软件的初始激活和传播。该数据包覆盖了三台个人电脑和九台物联网设备的Wi-Fi网络上119分钟的流量.
数据集分析:首先,我们分析捕获的网络流量的传输量。图8显示了捕获过程中良性和恶意数据包的频率,划分为10秒。这表明在分组频率中有一个强信号,这高度指示了一个持续攻击。此外,所有良性活动似乎都随着袭击的开始而停止。74分钟后,尽管网络上有很多设备。这表明个体观测可能已经合并,并可能进一步导致系统受益于虚假相关性(P4)
图: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)下优于自动编码器集成。除了其优越的性能外,箱线图方法与集成的特征提取和测试程序相比,重量非常轻。这一点尤其重要,因为集成设计用于在低延迟的资源受限设备(如物联网设备)上运行。
表5:比较Kitsune93,一种自动编码器集成NIDS,相比于一个简单基线,箱线图法[129],用于检测Mirai感染。
注意:本实验的目的不是证明箱图法可以检测到野外操作的Mirai实例,也不是证明Kitsuneis无法检测到其他攻击,而是证明没有适当基线(P6)的实验不足以证明集成的复杂性和过度性。箱线图法的成功还表明,简单的方法可以揭示仅用于实验室评估的数据产生的问题(第9页)。在Mirai数据集中,感染过于明显;在野外进行的攻击很可能只占网络流量的一小部分。
我们识别并系统地评估了机器学习在安全领域的应用中的十个细微缺陷。这些问题会影响研究的有效性,并导致高估安全系统的性能。我们发现这些陷阱在安全研究中非常普遍,并展示了这些陷阱在不同安全应用中的影响。为了支持研究人员避免这些问题,我们提供了适用于所有安全领域的建议,从入侵和恶意软件检测到漏洞发现。最终,我们努力提高安全领域机器学习实验工作的科学质量。在Sommer和Paxson[119]的开创性研究十年后,weagain鼓励社区深入封闭的世界,探索将机器学习嵌入现实世界安全系统的挑战和机遇。
损失函数是衡量模型输出与真实标签之间的差异。我们还经常听到代价函数和目标函数,它们之间差异如下:
损失函数(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 | nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean') |
功能:把nn.LogSoftmax()
和nn.NLLLoss()
结合,计算交叉熵。nn.LogSoftmax()
的作用是把输出值归一化到了
[0,1] 之间。
==下面介绍熵的一些基本概念==
- 自信息:
- 信息熵就是求自信息的期望:
- 相对熵,也被称为 KL 散度,用于衡量两个分布的相似性(距离):。其中 是真实分布, 是拟合的分布
- 交叉熵:
相对熵展开可得:
所以交叉熵 = 信息熵 + 相对熵,即 ,又由于信息熵 是固定的,因此==优化交叉熵 等价于优化相对熵== 。
所以对于每一个样本的 Loss 计算公式为:
,因为 ,。
所以 。
如果了类别的权重,则 。
下面设有 3 个样本做 2 分类。inputs 的形状为 ,表示每个样本有两个神经元输出两个分类。target 的形状为
,注意类别从 0 开始,类型为torch.long
。
1 | import torch |
输出为:
1 | Cross Entropy Loss: tensor([1.3133, 0.1269, 0.1269]) tensor(1.5671) tensor(0.5224) |
1 | nn.NLLLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean') |
功能:实现负对数似然函数中的符号功能
主要参数:
每个样本的 loss 公式为:。还是使用上面的例子,第一个样本的输出为 [1,2],类别为 0,则第一个样本的 loss 为 -1;第一个样本的输出为 [1,3],类别为 1,则第一个样本的 loss 为 -3。
1 | nn.BCELoss(weight=None, size_average=None, reduce=None, reduction='mean') |
功能:计算二分类的交叉熵。需要注意的是:输出值区间为 [0,1]。
主要参数:
计算公式为:
使用这个函数有两个不同的地方:
torch.float
。1 | nn.BCEWithLogitsLoss(weight=None, size_average=None, reduce=None, reduction='mean', pos_weight=None) |
功能:结合 sigmoid 与二分类交叉熵。需要注意的是,网络最后的输出不用经过 sigmoid 函数。这个 loss 出现的原因是有时网络模型最后一层输出不希望是归一化到 [0,1] 之间,但是在计算 loss 时又需要归一化到 [0,1] 之间。
主要参数:
1 | nn.L1Loss(size_average=None, reduce=None, reduction='mean') |
功能:计算 inputs 与 target 之差的绝对值
主要参数:
公式:
功能:计算 inputs 与 target 之差的平方
公式:
主要参数:
1 | nn.SmoothL1Loss(size_average=None, reduce=None, reduction='mean') |
功能:平滑的 L1Loss
公式:
下图中橙色曲线是 L1Loss,蓝色曲线是 Smooth L1Loss
主要参数:
1 | nn.PoissonNLLLoss(log_input=True, full=False, size_average=None, eps=1e-08, reduce=None, reduction='mean') |
功能:泊松分布的负对数似然损失函数
主要参数:
log_input:输入是否为对数形式,决定计算公式
full:计算所有 loss,默认为 loss
eps:修正项,避免 log(input) 为 nan
1 | nn.KLDivLoss(size_average=None, reduce=None, reduction='mean') |
功能:计算 KLD(divergence),KL 散度,相对熵
注意事项:需要提前将输入计算
log-probabilities,如通过nn.logsoftmax()
主要参数:
公式:
对于每个样本来说,计算公式如下,其中 是真实值 , 是经过对数运算之后的预测值 。
1 | nn.MarginRankingLoss(margin=0.0, size_average=None, reduce=None, reduction='mean') |
功能:计算两个向量之间的相似度,用于排序任务
特别说明:该方法计算 两组数据之间的差异,返回一个 的 loss 矩阵
主要参数:
计算公式:, 的取值有 +1 和 -1。
1 | nn.SoftMarginLoss(size_average=None, reduce=None, reduction='mean') |
功能:计算二分类的 logistic 损失
主要参数:
计算公式:
1 | nn.MultiMarginLoss(p=1, margin=1.0, weight=None, size_average=None, reduce=None, reduction='mean') |
功能:计算多分类的折页损失
主要参数:
计算公式:,其中 y 表示真实标签对应的神经元输出,x 表示其他神经元的输出。
1 | torch.nn.CosineEmbeddingLoss(margin=0.0, size_average=None, reduce=None, reduction='mean') |
功能:采用余弦相似度计算两个输入的相似性
主要参数:
计算公式:
其中
在各种深度学习框架中,我们最常用的损失函数就是交叉熵(torch.nn.CrossEntropyLoss),熵是用来描述一个系统的混乱程度,通过交叉熵我们就能够确定预测数据与真是数据之间的相近程度。交叉熵越小,表示数据越接近真实样本。
交叉熵计算公式:
softmax函数又称为归一化指数函数,它可以把一个多维向量压缩在(0,1)之间,并且它们的和为1.
计算公式:
1 | import math |
log_softmax是指在softmax函数的基础上,再进行一次log运算,此时结果有正有负,log函数的值域是负无穷到正无穷,当x在0—1之间的时候,log(x)值在负无穷到0之间。
nn.NLLLoss的结果就是把上面的输出与Label对应的那个值拿出来,再去掉负号,再求均值。
1 | import torch |
假设标签是[0,1,2],第一行取第0个元素,第二行取第1个,第三行取第2个,去掉负号,即[0.3168,3.3093,0.4701],求平均值,就可以得到损失值。
1 | (0.3168+3.3093+0.4701)/3 |
1 | loss=torch.nn.NLLLoss() |
torch.optim.lr_scheduler:调整学习率:https://blog.csdn.net/qyhaill/article/details/103043637
这篇文章主要介绍了 PyTorch 中的优化器,包括 3 个部分:优化器的概念、optimizer 的属性、optimizer 的方法。
PyTorch 中的优化器是用于管理并更新模型中可学习参数的值,使得模型输出更加接近真实标签。
PyTorch 中提供了 Optimizer 类,定义如下:
1 | class Optimizer(object): |
主要有 3 个属性
学习率是影响损失函数收敛的重要因素,控制了梯度下降更新的步伐。下面构造一个损失函数 , 的初始值为 2,学习率设置为 1。
在 PyTroch 中,momentum 的更新公式是:
==momentum 动量的更新方法,不仅考虑当前的梯度,还会结合前面的梯度。==
momentum 来源于指数加权平均:,其中 是上一个时刻的指数加权平均, 表示当前时刻的值, 是系数,一般小于 1。指数加权平均常用于时间序列求平均值。假设现在求得是 100 个时刻的指数加权平均,那么
从上式可以看到,由于 小于 1,越前面时刻的 , 的次方就越大,系数就越小。
==可以理解为记忆周期, 越小,记忆周期越短, 越大,记忆周期越长==。通常 设置为 0.9,那么 ,表示更关注最近 10 天的数据。
下面代码展示了 的情况
1 | weights = exp_w_func(beta, time_list) |
结果为:
下面代码展示了不同的 取值情况
1 | beta_list = [0.98, 0.95, 0.9, 0.8] |
结果为:
==的值越大,记忆周期越长,就会更多考虑前面时刻的数值,因此越平缓。==
1 | optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False |
主要参数:
#### optim.SparseAdam:稀疏版的 Adam
#### optim.ASGD:随机平均梯度下降
#### optim.Rprop:弹性反向传播,这种优化器通常是在所有样本都一起训练,也就是 batchsize 为全部样本时使用。
#### optim.LBFGS:BFGS 在内存上的改进
这篇文章主要介绍了正则化与偏差-方差分解,以及 PyTorch 中的 L2 正则项--weight decay
Regularization 中文是正则化,可以理解为一种减少方差的策略。
在机器学习中,误差可以分解为:偏差,方差与噪声之和。即误差=偏差+方差+噪声
当没有正则项时:,
当使用 L2 正则项时,,,其中 ,所以具有权值衰减的作用。
深度学习中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) |
参数:
有些网络层在训练状态和测试状态是不一样的,如 dropout 层,在训练时
dropout
层是有效的,但是数据尺度会缩放,为了保持数据尺度不变,所有的权重需要除以
1-p。而在测试时 dropout
层是关闭的。因此在测试时需要先调用model.eval()
设置各个网络层的的training
属性为
False,在训练时需要先调用model.train()
设置各个网络层的的training
属性为
True。
深度学习基础 之 ---- BN、LN、IN、GN、SN - 琪小钧的文章 - 知乎 https://zhuanlan.zhihu.com/p/524829507
这篇文章主要介绍了 Batch Normalization 的概念,以及 PyTorch 中的 1d/2d/3d Batch Normalization 实现。
BN层的作用是把一个batch内的所有数据,从不规范的分布拉到正态分布。这样做的好处是使得数据能够分布在激活函数的敏感区域,敏感区域即为梯度较大的区域,因此在反向传播的时候能够较快反馈误差传播。
称为批标准化。批是指一批数据,通常为 mini-batch;经过处理后的数据符合均值为0,标准差为1的分布,如果原始的分布是正态分布,那么z-score标准化就将原始的正态分布转换为标准正态分布,机器学习中的很多问题都是基于正态分布的假设,这是更加常用的归一化方法。Batch Normalization 层一般在激活函数前一层。
假设输入的 mini-batch 数据是 ,Batch Normalization 的可学习参数是 ,步骤如下:
- 求 mini-batch 的均值:
- 求 mini-batch 的方差:
- 标准化:,其中 是放置分母为 0 的一个数
- affine transform(缩放和平移):,这个操作可以增强模型的 capacity,也就是让模型自己判断是否要对数据进行标准化,进行多大程度的标准化。如果 ,,那么就实现了恒等映射。
Batch Normalization 的提出主要是为了解决 Internal Covariate Shift (ICS)。在训练过程中,数据需要经过多层的网络,如果数据在前向传播的过程中,尺度发生了变化,可能会导致梯度爆炸或者梯度消失,从而导致模型难以收敛。
带有 bn 层的 LeNet 定义如下:
1 | class LeNet_bn(nn.Module): |
带 bn 层的网络,并且不使用 kaiming 初始化权值,训练过程如下:
虽然训练过程中,训练集的 loss 也有激增,但只是增加到 0.4,非常稳定。
在 PyTorch 中,有 3 个 Batch Normalization 类
1 | torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) |
参数:
主要属性:
batch是“竖”着来的,各个维度做归一化,所以与batch size有关系。 layer是“横”着来的,对一个样本,不同的神经元neuron间做归一化。
提出的原因:Batch Normalization 不适用于变长的网络,如 RNN。如下显示了同一层的神经元的情况。假设这个mini-batch一共有N个样本,则Batch Normalization是对每一个维度进行归一。而Layer Normalization对于单个的样本就可以处理。bn和ln都可以比较好的抑制梯度消失和梯度爆炸的情况。思路:每个网络层计算均值和方差。
注意事项:
1 | torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True) |
提出的原因: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) |
参数:
提出的原因:在小 batch 的样本中,Batch Normalization 估计的值不准。一般用在很大的模型中,这时 batch size 就很小。
思路:数据不够,通道来凑。 每个样本的特征分为几组,每组特征分别计算均值和方差。可以看作是 Layer Normalization 的基础上添加了特征分组。
BN是对一批数据进行归一化,一批里有不同的样本,bn对不同样本的同一个通道的特征(channel)进行均值方差操作;而LN对同一个样本内部的不同特征进行均值方差操作。
BN在batch size(N)和WH上进行缩放,保留C,而LN是在C和HW上进行缩放,保留bitch size,在NLP中就对应句子长度,通常来说文本词句的长度是不一样的,如果使用BN则会导致靠前的bitch size里的数据可以做相同的均值方差操作,而靠后的多余的数据的方差和均值难以估计,如下图
第一个样本里有5个数据通道(可看作特征),第二个样本空间里有3个数据通道(特征),则在提取特征时前三个的均值方差满足同一个norm操作公式,而后面两个由于第二个样本没有数据,所以均值方差不满足其公式,导致误差产生。