《Detection of Malicious Code Variants Based on Deep Learning》

Abstract

随着互联网的发展,恶意代码攻击呈指数级增长,其中恶意代码变种被列为互联网安全的关键威胁之一。检测恶意代码变体的能力对于防范安全漏洞、数据窃取和其他危险至关重要。现有的方法里,恶意代码识别的检测精度低、速度慢。本文提出了一种利用深度学习来提高恶意代码变种检测的新方法。在之前的研究中,深度学习在图像识别中表现出了卓越的性能。为了实现我们提出的检测方法,我们将恶意代码转换为灰度图像。然后,使用能够自动提取恶意软件图像特征的卷积神经网络(CNN)对图像进行识别和分类;此外,利用 bat 算法解决了不同恶意软件类别之间的数据不平衡问题。为了测试我们的方法,我们在恶意软件图像数据上进行了一系列实验。实验结果表明,与其他恶意软件检测模型相比,该模型取得了较好的准确率和速度。

Index Terms

Malware variants, grayscale image, deep learning, convolution neural network, bat algorithm.

1. Introduce

随着信息技术的快速发展,恶意代码呈指数级增长,已成为互联网安全的主要威胁之一。Symantec 最近的一份报告显示,2016年发现了4.01亿个恶意代码,其中包括3.57亿个新的恶意代码变种[22]。移动设备和物联网中恶意软件的出现也迅速增长。截至目前,已有68个新的恶意代码派别和超过10000个恶意代码被报告。这种增长对云计算环境下的恶意代码检测也提出了挑战[14],[15]。

恶意代码变种的发现作为安全防护的关键环节尤为具有挑战性。恶意软件检测方法主要包括静态检测和动态检测两类。静态检测采用 disassembling (反汇编)对恶意代码进行组装,分析其执行逻辑。动态检测通过在安全的虚拟环境或沙箱中执行恶意代码来分析恶意代码的行为。

静态检测和动态检测都是基于特征的检测方法。首先提取恶意代码的文本或行为特征,然后通过分析这些特征对恶意代码进行检测或分类。近年来,已有学者利用数据挖掘方法对[28]恶意代码进行特征分析。与传统的启发式检测方法相比,该方法具有效率高、误报率低的优点,已成为恶意软件检测的主流方法。图1展示了使用数据挖掘检测恶意代码的过程。

img

不幸的是,基于特征分析的方法经常被 disrupted。静态特征分析的有效性可能会受到混淆技术的阻碍,这些混淆技术将恶意软件的二进制文件转换为自压缩或结构独特的二进制文件。动态特征分析经常受到各种防护措施的挑战,导致结果不可靠。此外,某些类型的恶意代码可能由于执行环境不符合规则而无法被动态分析发现。

最近,Nataraj等人提出了一种基于图像处理技术的恶意软件可视化方法,而不是专注于用不可见的特征进行恶意软件辨别。该工作将经过打包的二进制样本转换为二维(2-D)灰度图像,然后利用图像特征进行分类。此外,针对恶意代码分析[20],我们对比研究了两种不同的特征设计策略。结果表明,基于二进制纹理的策略提供了与动态分析技术大致相当的性能,但检测时间更短。

challenge:恶意代码检测方法主要依赖于对恶意代码特征(如静态特征和动态特征)的分析。基于各种机器学习技术的更强大的检测方法也使用这些特征来发现恶意代码或其变种。然而,这些方法在检测恶意代码变种或未知恶意代码时效果不佳。恶意代码可视化方法可以解决代码混淆问题,但提取复杂的图像纹理特征(如 GIST 和 GLCM)需要较高的时间成本。此外,这些特征提取方法在暴露于大数据集时也显示出低效率。构建恶意软件检测模型的挑战是寻找一种有效且自动地提取特征的方法。

Challenge:此外,数据不平衡问题还带来了另一个挑战。在每年产生的大量恶意软件中,有相当一部分的恶意软件变体是属于现存的恶意代码派别的。不同的代码家族中恶意代码变种的数量通常存在较大差异。当前的挑战:建立一个通用的检测模型,可以处理大量的变种,以便它可以很好地跨派别检测出恶意代码。

Contributions:针对上述挑战,本文提出了以下贡献

  1. 我们介绍了一个用于将恶意软件二进制文本转化为图像的技术,从而将恶意软件检测问题转化为图像分类问题。
  2. 我们提出了一种新的方法,即用 CNN 去检测恶意软件的变体。
  3. 为了解决不同恶意软件派别的数据的不平衡性,我们设计了一种高效的数据均衡算法 bat。
  4. 大量的实验结果表明,我们提出的方法是一种有效且高效的恶意软件检测方法。

本文其余部分的结构如下:第二部分回顾了相关工作,第三部分详细介绍了基于 CNN 的恶意代码检测方法。第四节提出了基于 bat 算法和数据增强的数据均衡方法。第五节给出了所提出方法的实验评估。最后,第六节对本文进行了总结。

在本节中将介绍恶意软件的相关研究,包括基于特征分析的恶意软件检测、恶意代码可视化、恶意软件检测的图像处理技术以及基于深度学习的恶意软件检测。

A. Malware Detection Based on Feature Analysis

如前所述,恶意软件检测的特征分析技术主要有两大类:静态分析和动态分析。在静态分析方面,通过对代码的分析,提出了几种方法。例如,Isohara等人[12]开发了一个基于内核行为分析的检测系统,在检测未知应用程序的恶意行为方面表现良好。然而,这种静态方法容易受到混淆技术[18]的欺骗。

针对这一问题,Christodorescu 等人[4]提出了一种新的恶意软件检测算法,该算法使用轨迹语义来表征恶意软件的行为。这种方法被证明在对抗指令混淆方面是有效的(例如,指令重排、插入垃圾代码和注册重新分配)。然而,该方法局限于指令级的有限元分析。此外,模式匹配比较复杂。

动态分析通过评估应用程序的行为(如访问私有数据和使用受限的API调用)来监控和分析应用程序的运行时特征。根据这些信息,建立行为模型来检测恶意代码。这些技术提高了检测性能,但仍然受到各种产生不可靠结果的对策的挑战。此外,动态分析的计算开销大,耗时长,在面对大数据集时效率低下。

B. Malicious Code Visualization

目前,有许多工具可以可视化和操作二进制数据,例如普通的文本编辑器和二进制编辑器。一些研究建议将恶意软件可视化进而进行恶意软件检测[24]。Yoo等人采用自组织映射来可视化计算机病毒[29]。Trinius等人提出了一种类似但内容更丰富的方法:使用两种可视化技术 —— 树图和线程图 —— 来检测和分类恶意软件[23]。Goodall等人并不是单一的检测结果,而是将不同的恶意软件分析工具的结果聚合到一个可视化的环境中,增加了单一恶意软件工具的漏洞检测覆盖率[10]。

上述研究主要集中于恶意软件行为的可视化,但软件源代码可能蕴含着更有意义的模式。如前所述,Nataraj等人提出了一种基于二进制纹理分析的恶意代码检测可视化方法。首先,他们将恶意软件可执行文件转换为灰度图像。然后,他们根据这些图像的纹理特征识别恶意软件。与动态分析方法相比,该方法产生了与动态分析方法相当的结果。在类似的工作中,Han等人将恶意软件二进制信息转换为彩色图像矩阵,并使用一种图像处理方法对恶意软件派别进行分类[11]。

C. Image Processing Techniques for Malware Detection

一旦恶意软件被可视化为灰度图像,恶意软件检测就可以转化为图像识别问题。在[19]中,Nataraj等人使用 GIST 算法对恶意软件图像进行特征提取。然而,GIST 算法耗时较长。近年来,越来越多的图像处理技术被提出。

Daniel等人[8]开发了一种由生物启发的并行实现,用于在二值的二维图像中寻找同调群的代表性几何对象。对于图像融合,Miao等人提出了一种基于shearlet和遗传算法的图像融合算法[17]。在该方法中,采用遗传算法对融合规则中的加权因子进行优化。实验结果表明,该方法能够获得比其他方法更好的融合质量。

然而,这些传统的方法受到了复杂图像纹理特征提取所需的高时间成本的挑战。为了解决这一挑战,我们采用深度学习来有效地识别和分类图像。在下一小节中,我们将介绍我们在基于深度学习的恶意软件检测方面的研究。

D. Malware Detection Based on Deep Learning

深度学习[21]是近年来人工神经网络工作中出现的机器学习研究领域。神经网络可以通过学习深度非线性网络结构逼近复杂函数来解决复杂问题。深度学习使用深度神经网络来模拟人类大脑的学习过程,它比反向传播(BP)更强大。深度学习能够从样本集中学习数据集的本质特征。深度学习作为人工智能的有力工具,在手写数字识别、语音识别、图像识别等领域得到了广泛应用。

由于其强大的特征学习能力,许多学者已将深度学习应用于恶意软件检测。Yuan等人利用深度学习技术设计并实现了一个在线恶意软件检测原型系统Droid-Sec[30],他们的模型通过学习从Android应用程序的静态分析和动态分析中提取的特征,达到了很高的准确性。David等人[7]提出了一种类似但更引人注目的方法,不需要了解恶意软件行为类型。他们的工作基于深度信念网络(DBN),用于恶意软件特征的自动生成和分类。与传统的恶意代码检测方法相比,他们的方法在检测新的恶意代码变种方面具有更高的准确性。

遗憾的是,这些方法都是基于静态分析和动态分析提取的特征进行分析。因此,它们或多或少都受到了特征提取的限制。为了解决这个问题,采用CNN网络学习恶意软件图像特征并自动分类。

III. MALWARE DETECTION BASED ON A CNN

本节介绍了我们改进的基于CNN的恶意代码变种检测方法,包括:

  1. 将恶意代码映射为灰度图
  2. 利用 CNN 进行灰度图像检测

图2给出了这两个过程的概述。首先,将恶意代码的二进制文件转化为灰度图像;然后,利用卷积神经网络对图像进行识别和分类;根据图像分类的结果,实现恶意软件的自动识别和分类。

A. Binary Malware to Gray Image

一般来说,有几种方法可以将二进制代码转换为图像。该文采用可视化的.exe类型的恶意软件的二进制文件[19]。一个恶意软件的二进制位串可以被分割成许多长度为8位的子串。每个子字符串都可以看作一个像素,因为其中的8位可以被解释为0 ~ 255之间的无符号整数。例如,位串为 0110000010101100,则执行过程为 0110000010101100 → 01100000,10101100 → 96 172。八位二进制数 \(B = (b7, b6, b5, b4, b3, b2, b1, b0)\) 可以转换为十进制位 \(I\) 如下所示:

img

经过二进制转换后,二进制恶意软件位串被转换为十进制数的一维向量。根据指定的宽度,一维数组可以被视为具有一定宽度的二维矩阵。最后,将恶意代码矩阵解释为灰度图像。为简单起见,图像的宽度是固定的,而图像的高度则取决于文件的大小。表1摘自[19],根据经验观察,给出了针对不同文件大小的一些推荐图像宽度。

img

图3显示了来自不同家族[19]的恶意软件图像示例。正如我们所看到的,相同恶意软件家族的图像在视觉上是相似的,并且它们与属于另一个家族的图像则明显不同。例如,图3(a)显示了恶意软件代理的四种变体,称为 Agent。可以发现,虽然每个成员的规模都不一样,但他们仍然有相似之处,因为新的恶意软件通常是由旧软件创建的。此外,当恶意软件派别相似时,图像可以清楚地显示他们的差异。例如,swizzor.gen!的I族,swizzor.gen!的E族有黑色条纹。受恶意软件图像视觉相似性的启发,我们可以利用图像识别方法对恶意软件进行分类和检测。在我们目前的工作中,我们使用卷积神经网络(CNN)来识别恶意软件图像。

img

B. Malware Image Classification Based on CNN

CNN 作为语音分析和图像识别领域的研究热点其发展迅速。他们的局部感知
权值共享的网络结构降低了模型工作的复杂性和权值的数量。CNN 甚至有
当输入是多维的时候,还有更多的优势。在我们的工作中,图像可以被认为是网络的输入。

与传统的识别算法相比,该方法不受复杂的特征提取和数据重建的阻碍。卷积网络是一个多层感知器,用于识别的二维形状,且对于图像的变形 (例如平移、缩放和旋转) CNN 都能够保持鲁棒性。

  1. Conv Layer:本文中,我们开发了一个 CNN 来对恶意软件进行分类。用于灰度图像识别的 CNN 结构由多个组件组成,如图4所示。首先是输入层,它将训练图像输入神经网络。接下来是卷积层和下采样层。前一层可以增强信号特征,降低噪声;后者可以减少数据处理量,同时保留有用信息。然后,有几个全连接层,它们将 2-D 特征转换为符合分类器标准的 1-D 特征。最后,分类器根据恶意软件图像的特征将其识别并分类为不同的家族。各层的详细迭代公式如下:

卷积的传递公式这里就不列举了... 应该普遍都会

img

  1. subsampling layers:子采样层也称为池化层。通常会军训最大池化或者平均池化,并且该层不通过反向传播进行修改。这一层可以削弱图像变形的影响(例如:平移、缩放和旋转)。降低了特征图的维数,提高了模型的精度,避免了过拟合。在CNN中,对于采样层的每个输出,特征图的计算如下所示:

下采样的公式也略了...

到目前为止,我们可以得到CNN的权重更新公式,并使用它对恶意软件图像进行分类。然而,在CNN中,结构化网络需要固定大小的图像,因为全连接层的连接矩阵W在训练后是固定大小的。例如,如果从卷积层到全连接层的输入和输出大小分别为30和20个神经元,那么权重矩阵的大小必须为(30,20)。不幸的是,恶意软件的图像大小不是固定的,而是随着软件的大小而变化。因此,我们不能直接将这些恶意软件图像输入CNN。

针对这一问题,将恶意软件图像重构为固定大小的正方形图像(如4848、9696)。通过这种方式,恶意软件图像被归一化后,可以直接输入到 CNN 网络中进行分类。归一化的优点在于它有效地降低了图像的维度,更有利于模型的训练。在降维过程中,不可避免地会丢失一些特征信息。

对于恶意软件数据集中的大多数图像,无论是放大还是缩小,纹理特征都能有效地保持。Dontovo的变体就是一个例子。如图5(a)所示。原始图像大小为64*257。经过压缩(24*24和48*48)或膨胀(96*96和192*192)后,纹理特征保持尖锐(上部为黑色,底部为灰色)。然而,对于纹理特征较小的大图像,重塑操作可能会造成关键信息的丢失。例如,swizzor.gen!E 对应图5(b) 却因压缩过多(从512*718压缩到24*24或48*48)而损坏。

IV. MALWARE IMAGE DATA EQUILIBRIUM

高质量的数据是机器学习和深度学习的关键。粗糙的样本数据会影响模型的质量。相比之下,由高质量数据训练的模型更鲁棒(避免过拟合),并可以加快模型训练速度。恶意软件通常由多个家族组成,每个家族的样本数量差异很大。这种数据上的差异会导致训练模型的准确率低、鲁棒性差。为了解决这个问题,我们采用了一种数据增强技术来提高数据质量。针对不同恶意代码派别之间的数据不平衡问题,提出了一种基于智能优化算法的数据均衡方法(即基于bat算法的动态重采样)。

A. Image Data Augmentation (IDA) Technology

在深度学习中,为了避免过拟合,我们通常需要输入足够的数据来训练模型。如果数据样本比较小,可以利用数据增广来增加样本,从而抑制不平衡数据的影响。适当的数据增强方法可以有效避免过拟合问题,提高模型的鲁棒性。

通常,通过对原始图像数据的变换(改变图像像素的位置并确保特征保持不变)来生成新数据。有许多种类的图像数据增强技术,例如:旋转反射,翻转,缩放,平移,缩放,对比度,噪声和颜色转换。

\(A = [a1, a2,…]\) 就是这些技术的集合。\(Mi = am,…,an\) 是操作序列,\(i\)\(M\) 的长度。\(M_2 = a_1, a_2\) 表示使用旋转变换和翻转变换进行数据增广。

通常,每种增强技术都有一个权重 \(λ_i\),因此加权数据增强技术的操作序列可以由 \(M_i = λ_m a_m ,..., λ_n a_n\) 表示:

其中 \(λ_m\) 是增强技术的权重,\(a_m⊆a\)。通常,需要执行多个数据查询。对于灰度图像矩阵 \(m\), \(M_k(m)\) 表示k次增广。图6显示了为恶意软件 swizzor.gen!E 族进行数据增强。显然,大多数新生成的图像保留了原始的文本特征。然而,一些图像由于不恰当的过渡(即过度旋转)而丢失了一些信息。比如左下角的图像就缺少 swizzor.gen!E 族的特征。

B. Data Equalization Based on a Bat Algorithm

不平衡数据是机器学习中常见的问题,在分类问题中会影响模型的准确率。在本文中,恶意软件图像数据非常不均匀的,如图7所示。最大比值约为36:1。例如,Allaple.A 族有2949张图片,而 Skintrim.N 族仅有80个。这种差异对CNN在图像分类中的性能有非常大的影响。若是仅根据两个族的数据训练分类模型,当所有测试样本都是未识别的 Skintrim.N 时,可以达到 97% 的准确率。但是这种情况只能识别部分数据,因此并不是一个非常合理的分类器。

img

V. EXPERIMENTAL EVALUATION

在本节中,我们对所提出方法的有效性进行了评估。我们的实验基于视觉研究实验室[19]的恶意软件数据集。采用Caffe[13]神经网络框架创建并训练CNN。我们在具有Intel Core i5-4590 CPU (3.3 GHz)、Nvidia GeForce GTX 750Ti GPU (2 GB)和8 GB RAM的PC上运行实验。

A. Dataset and Experimental Setting

该数据集由25个恶意软件族[19]的9342张灰度图像组成。每个家族的样本数量不同。如图7所示,原始数据样本数量存在很大的不平衡。因此,有必要使用数据平衡方法来平衡训练样本的数量。

首先,利用数据增强技术提高小样本数据的质量;小样本数据的扩展可以有效地解决训练数据不平衡带来的问题(如过拟合)。图像增强的具体设置如表2所示。

VI. CONCLUSION AND FUTURE WORK

文中提出了一种通过应用深度学习来提高恶意代码变种检测的新方法。首先,该方法将恶意代码转换为灰度图像;然后,使用能够自动提取恶意软件图像特征的 CNN 对图像进行识别和分类;由于CNN在识别恶意软件图像方面的有效性和效率,我们的模型的检测速度明显快于其他方法实现的速度。此外,该模型为不同恶意软件系列之间的数据不平衡问题提供了有效的解决方案。在25个恶意软件家族的9342张灰度图像上的实验结果表明,所提方法在保证检测速度的同时达到了94.5%的准确率。

在这项研究中,CNN框架要求所有输入图像都具有固定的大小,这限制了我们的模型。在未来的工作中,我们希望使用 SPP-net 模型来允许任何大小的图像作为输入。由于其池化层结构, SPP-net 可以在可变尺度上提取特征。我们可以在最后的子采样层和全连接层之间将该层引入模型,以提高模型的灵活性。此外,恶意代码到彩色图像的转换也是一个很好的研究课题。

在表II中,旋转范围表示旋转范围,宽度变换t为水平平移范围,高度变换t为垂直平移范围,rescale为图像放大或缩小的比例,shear范围为水平或垂直方向上投影变换的范围,zoom范围为随机缩放图像的比例。此外,在翻转或展开图像时,我们使用最近方法来填充图像。

img

对于我们的模型,我们为不同大小的恶意代码图像设计了不同的CNN架构。对于24*24 的输入,我们的模型有7层,包括5个隐藏层。具体结构如下:

  • C1:8*20*20
  • S2:8*10*10
  • C3:16*8*8
  • S4:16*4*4
  • C5:80*1*1

每种类型的卷积核对应一种类型的特征图。每层的映射指的是每层的特征映射的数量。对于其他尺寸的输入,layers的数量随着尺寸的增加而增加。此外,我们使用 MATLAB R2017a 中带有插值方法 bicubic(默认) 的 imresize 函数来调整图像大小/归一化。

初始学习率设置为0.01,衰减策略设置为inv,最大迭代次数为10000次。最后,利用GPU进行训练。此外,在图像数据平衡方法DRBA中,对于BA,种群规模为20,其他参数与[2]相同。对于评估指标,我们使用准确率、精确率和召回率。这些评价指标在研究界被频繁采用,以提供对不平衡学习问题的全面评估。这些指标定义如下:

img

其中,真阳性(TP)和假阳性(FP)分别是被正确分类和被错误分类为恶意文件样本的数量。类似地,真阴性(TN)和假阴性(FN)分别是被正确分类为良性和错误分类为良性的文件样本的数量。

B. Experimental Results

为了验证所提方法的有效性和效率,设计了实验:

  1. 验证数据均衡方法的效率
  2. 确定恶意软件图像大小对结果的影响
  3. 将所提方法与其他恶意代码检测方法的结果进行比较

1. Efficiency of Malware Image Data Equalization:

为了验证我们提出的数据均衡方法的有效性,包括IDA技术和DRBA技术,我们将不使用均衡方法(nothing)与使用IDA、DRBA、IDA+DRBA的模型进行了比较。不同分类模型在训练集上的表现如图8所示。从图8(a)可以看出,即使不对数据集进行处理,所有方法在准确率方面都取得了较好的结果。nothing方法可能会显示过拟合。损失曲线如图8(b)所示,四种方法的结果相似。

img

图9显示了不同分类模型在验证集上的性能。从图9(a)可以看出,nothing方法反映了基本 CNN 模型对所有数据的分类。由于样本的不平衡性,容易造成过拟合,因此nothing方法显得精度较高。DRBA法的准确度最好。随着历元的增加,准确率不断提高。IDA方法的精度不如其在训练集上的表现,可能是由于图像在变换过程中丢失了一些图像的特征。训练数据和测试数据之间存在一定差异。从图9(b)可以看出,DRBA和IDA+DRBA的损失曲线呈下降趋势,而nothing的损失曲线在一定范围内振荡,属于过拟合。

2. Model Performance With Different Malware Image Size:

CNN 框架要求所有输入图像具有固定的大小。因此,我们将恶意软件图像重构为固定大小的方形图像。变换后的图像越小,纹理特征破坏越明显。相比之下,较大的图像保真度好,纹理特征清晰。我们进行了实验,将恶意软件图像分别设置为24*24、48*48、96*96和192*192。混淆矩阵如图10所示。

img

从结果可以看出,随着图像的增大,我们的模型表现得更好。然而,更大的图像需要更多的训练时间。我们注意到96*96和192*192的性能相似,如图10(c)所示。由于使用更大的图像训练分类模型需要更多的时间,因此96*96的图像是在这个恶意软件数据集上训练的一个很好的选择。

3. Comparison of Our Method With Other Malicious Code
Detection Methods:

为了验证所提方法的有效性和效率,我们将所提模型与其他四种使用常见图像特征提取方法的恶意软件检测模型进行了比较。这些方法都提取了恶意软件图像的特征,然后应用机器学习算法(如 KNN 和 SVM)对恶意软件进行识别和分类。为了进行比较,我们使用了一个基于 DRBA 的模型,输入图像为96*96。

表III给出了本文方法与GIST+KNN、GIST+SVM、GLCM+KNN和GLCM+SVM四种组合模型的比较结果。可以看出,我们的方法具有更高的准确率和更快的检测速度。其他方法由于使用GIST或GLCM的方法比较复杂和耗时,性能较差。

img

本文转载于网络 如有侵权请联系删除

相关文章

  • 视频编码(3):H.266 编码性能比 H.265 再提升 49% 的关键丨音视频基础

    文森特·梵高《诗人公园》像素版我们在前文《视频编码(1)》和《视频编码(2)》中探讨了H.264视频编码的基本概念、编码工具、编码流程及码流结构等基础知识,以及在H.264基础上迭代而生的H.265有哪些改进。接下来我们再来聊聊更新一代编码技术H.266的改进。3、H.266编码H.266,也被称为多功能视频编码(VersatileVideoCoding,简称VVC)是最新一代视频编码标准,2020年7月定稿,ITU第一版于当年11月正式发布,ISO/IEC第一版于2021年2月正式发布。伴随VVC的VSEI标准的第一版的定稿和发布时间与VVC相同。相对于之前的H.265/HEVC和H.264/AVC视频编码标准,VVC对8K超高清、屏幕、高动态和360度全景视频等新的视频类型以及自适应带宽和分辨率的流媒体和实时通信等应用有了更好的支持。VSEI(VersatileSupplementalEnhancementInformation),主要规定用于VVC视频码流的视频可用性信息(VideoUseabilityInformation,VUI)和一些承载辅助增强信息(SEI)的消息的格式。

  • 《代码英雄》第三季(7):与机器对话

    代码英雄讲述了开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。 什么是《代码英雄》 代码英雄(CommandLineHeroes)是世界领先的企业开源软件解决方案供应商红帽(RedHat)精心制作的原创音频播客,讲述开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。该音频博客邀请到了谷歌、NASA等重量级企业的众多技术大牛共同讲述开源、操作系统、容器、DevOps、混合云等发展过程中的动人故事。本文是《代码英雄》系列播客《代码英雄》第三季(7):与机器对话的音频脚本。导读:创造一台会思考的机器在20世纪50年代似乎是科幻小说。但JohnMcCarthy决定把它变成现实。他从一种叫做LISP的语言开始。ColinGarvey介绍了McCarthy是如何创造出第一种人工智能语言的。SamWilliams介绍了早期人们对思考机器的兴趣是如何从学术界蔓延到商业界的,以及在某些项目没有兑现承诺之后,漫长的人工智能寒冬是如何最终到来的。UlrichDrepper解释说,人工智能的梦想超出了当时硬件所能提供的范围。 但硬件每天都在变得更强大。ChrisN

  • 硬核!万字长文!Java零基础入门到精通知识点汇总

    Java博大精深,也一直被誉为互联网霸主;我们都知道互联网技术结构之复杂,所以Java的技术组件、架构也非常之多和复杂;其实学习Java学到什么程度算是精通,这个其实没有盖棺定论的,也不是说你拿个年薪几十万的offer就可以自诩精通了。我认为,如果市面上这些资料、书籍你都啃的差不多,你能在所有的Java程序员中跻身前0.1%的话,你就可以达到"精通"这个阶段了,因为没人比你强了,你当然是精通了。面向过程与面向对象的区别,由“如何把大象装进冰箱”来看:一、面向过程为了把大象装进冰箱,需要3个过程。思路:1、把冰箱门打开(得到打开门的冰箱)。2、把大象装进去(打开门后,得到里面装着大象的冰箱)。3、把冰箱门关上(打开门、装好大象后,获得关好门的冰箱)。根据上面的思路,可以看到,每个过程都有一个阶段性的目标,依次完成这些过程,就能把大象装进冰箱。二、面向对象为了把大象装进冰箱,需要做三个动作(或者叫行为)。每个动作有一个执行者,它就是对象。思路:1、冰箱,你给我把门打开。2、冰箱,你给我把大象装进去(或者说,大象,你给我钻到冰箱里去)。3、冰箱,你给我把门关上。依次完成这

  • 深度强化学习面试问题集锦

    深度强化学习面试题目总结什么是强化学习?强化学习(ReinforcementLearning,RL),又称增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F2xUwqQo-1595932389184)(https://i.loli.net/2020/07/28/qKgrVp1Gaxme2E6.png)] 强化学习和监督学习、无监督学习的区别是什么?监督学习一般有标签信息,而且是单步决策问题,比如分类问题。监督学习的样本一般是独立 同分布的。无监督学习没有任何标签信息,一般对应的是聚类问题。强化学习介于监督和无监督学习之间,每一步决策之后会有一个标量的反馈信号,即回报。通过最大化回报以获得一个最优策略。因此强化学习一般是多步决策,并且样本之间有强的相关性。 强化学习适合解决什么样子的问题?强化学习适合于解决模型未知,且当前决策会影响环境状态的(序列)决策问题。Bandit问题可以看成是一种特殊的强化学习问题,序列长度

  • Docker 安装 Wordpress 博客

    今天讲解一下新方式搭建Wordpress,超级简单。使用docker-compose快速安装博客。先来说明一下两个概念:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口Docker-Compose是Docker的一种编排服务,是一个用于在Docker上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。一、博客搭建1.前提linux环境安装Docker,Docker-compose2.linux安装dockera.安装dockeruname-r#查看你当前的内核版本 yumupdate#更新yum yum-yinstalldocke

  • 删除重复字符

    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/weixin_42449444/article/details/86186192题目描述:牛牛有一个由小写字母组成的字符串s,在s中可能有一些字母重复出现。比如在"banana"中,字母'a'和字母'n'分别出现了三次和两次。 但是牛牛不喜欢重复。对于同一个字母,他只想保留第一次出现并删除掉后面出现的字母。请帮助牛牛完成对s的操作。输入描述:输入包括一个字符串s,s的长度length(1≤length≤1000),s中的每个字符都是小写的英文字母('a'-'z')复制输出描述:输出一个字符串,表示满足牛牛要求的字符串。复制输入样例:banana复制输出样例:ban复制解题思路:保留第一次出现并删除后面出现的字母,说白了就是每个字母只输出一次。无脑用for-each遍历字符串,map来记录每个字母的出现次数。AC代码:#include<

  • MOSEK,一个专注而卓越的优化求解器(一)

    本文转载自微信公众号“杉数科技”MOSEK是由丹麦MOSEKApS公司开发的一款数学优化求解器,也是公认的求解二次规划、二阶锥规划和半正定规划问题最快的求解器之一,广泛应用于金融、保险、能源等领域。杉数科技是MOSEK在中国大陆唯一官方授权销售商,承担中国市场的销售和售后服务工作。本篇主要介绍MOSEK的总体性能,在金融中一些解决问题的技巧和应用,杉数科技将和艾悉资产在近期推出一个介绍性文档,敬请关注!(详情请登陆https://www.shanshu.ai/product/mosek)MOSEK是一款怎样的求解器?运筹学(经常被称为管理科学或决策科学)是近代应用数学的一个分支,利用数学模型、优化算法、概率学和统计学之类的相关工具,去寻找现实中管理决策问题的最优或近似最优的解决方案,从而提高现有系统的效率。常见应用领域有收益管理、资产配置、风险控制、供应链管理、路径优化、选址、排程、能源网络布局等。在如今大数据时代的浪潮中,运筹学进一步蓬勃发展,如何将大数据转化为最优决策成为其研究的重点课题。运筹学的应用场景是在满足约束条件下能够最大化、最小化单个或多个目标,从而得出最优决策。实现决策

  • RSA签名的PSS模式

    一、什么是PSS模式?1.1、两种签名方式之一RSA-PSSPSS(ProbabilisticSignatureScheme)私钥签名流程的一种填充模式。目前主流的RSA签名包括RSA-PSS和RSA-PKCS#1v1.5。相对应PKCS(PublicKeyCryptographyStandards)是一种能够自我从签名,而PSS无法从签名中恢恢复原来的签名。openssl-1.1.x以后默认使用更安全的PSS的RSA签名模式。1.2、填充的必要性RSA算法比较慢,一般用于非对称加密的privatekey签名和publickey验证。因RSA算法沒有加入乱数,当出现重复性的原始资料,攻击者会通过相同加密密文而猜测出原文,因此导入padding的机制來加強安全性。TLS流程中的密钥材料若不进行填充而直接加密,那么显然相同的key,会得到相同的密文。这种在语义上来说,是不安全的。以下例子说明了无填充模式的安全漏洞。m:明文e,n:RSA参数(公钥)d:RSA参数(私钥)c:网络传输密文加密方加密m:c=m^emodn,传输c解密方解密c:m=c^dmodn,还原mc':篡改密文k

  • 人人字幕组做的这款小程序,用美剧帮你学好英语

    遇到了不明白的英语生词,我们的第一反应是「查词典」。但是,大部分词典只是简单地给出释义,很少能看到详细的语境释义,这给我们立体地去了解一个单词造成了困难。今天,知晓程序(微信号zxcx0101)要分享的,就是一款能帮助你立体学单词的小程序——人人字幕组出品的「人人词典」,想要亲自上手体验「人人词典」?文末就有小程序体验活动的参与方式哦。「人人词典」上手体验喜欢看美剧的人,对人人字幕组肯定不会陌生。他们出品的「人人词典」的首页,也与其他词典app也有很大区别:当你搜索单词的时候,「人人词典」提供的每个单词,都会给出这个词的影视剧的台词和剧照。这也是「人人词典」的特色所在:它并非单纯地做了一个普通纸质词典的电子版,而是将人人字幕组的历史字幕翻译资源,作为词典的有机部分,让你通过恰当的情景和语境,加深对单词的理解。随意查询某个单词,「人人词典」会显示这个单词的不同台词。你可以点击相应剧照查看对话上下文,或者点击台词中的「喇叭」按钮,收听台词原音。「人人词典」还带有简单的「生词本」功能。当你遇到一个生词,想以后进行复习,点击相应单词的加号就可以添加至生词本。在「生词本」标签中,你可以查看已经添

  • 【翻译】MongoDB指南/CRUD操作(二)

    【原文地址】https://docs.mongodb.com/manual/MongoDBCRUD操作(二)主要内容:更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关注),写确认(写关注)1更新文档1.1更新MongoDB提供下列方法用于更新一个集合db.collection.updateOne()更新使用指定过滤器匹配到的文档,即使过滤器匹配到多个文档,也只会更新一个文档。 3.2版本新增特性。db.collection.updateMany()更新使用指定过滤器匹配到的所有文档。 3.2版本新增特性。db.collection.replaceOne()替换使用指定过滤器匹配到的文档,即使过滤器匹配到多个文档,也只会更新一个文档。 3.2版本新增特性。db.collection.update()更新或者替换一个使用指定过滤器匹配到的文档,或者更新使用指定过滤器匹配到的所有文档。 默认只更新一个文档。为了更新多个文档,请使用multi 选项。上述方法接受以下参数:过滤器文档,确定要更新哪些文档。这些过滤器与查询操作中使用的过滤器有相同的句法规则。  查询过滤器

  • 读源码:redigo为什么多线程不安全

    redigo是golang的一个操作redis的第三方库,之所以选择这个库,是因为它的文档十分丰富,操作起来也比较简单。一个典型的redigo的使用如下所示: packagemain import( "github.com/gomodule/redigo/redis" "log" ) funcmain(){ conn,err:=redis.Dial("tcp","192.168.1.2:6379") iferr!=nil{ log.Fatalf("dialredisfailed:%v\n",err) } result,err:=redis.String(conn.Do("SET","hello","world")) iferr!=nil{ log.Fatalln(err) } log.Println(result) } 复制 这里需要注意的一点是,redis默认是只能本机访问的,可以通过修改/etc/redis/redis.conf中的bind来实现远程访问,这里我将bind改为了服务所在机器的IP。 虽然,redigo的使用十分简单,但是,在它的文档

  • XML的创建、解析-C语言

      前言:今天在做一个小项目时,客户要求的xml,跟现在有系统要求的不一样,所以要自己重新写函数支持返回,进行简单总结,希望对大家有所帮助。   首先,使用xml函数需要链上动态库libxml2,需要在电脑上安装libxml的开发包,安装方法如下:     Ubuntu系统: sudoapt-getinstalllibxml2-dev     CentOS系统:yuminstalllibxml2-devel   1. 创建XML文档  (1)相关函数有许多,网上也有特别多的解释,大家可以百度一下,这里只是简单介绍一部分;创建一个XML文档非常简单,其流程如下:     ①   用xmlNewDoc函数创建一个文档指针doc。     ②   用xmlNewNode函数创建一个节点指针root_node。     ③  

  • 《C++之那些年踩过的坑(二)》

    C++之那些年踩过的坑(二) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑。以此作为给自己的警惕。   转载请注明一下原文来自:http://www.cnblogs.com/GodA/p/6554591.html    博客园的编译好渣,我用Markdown重写了一遍,内容也作了修正和调整,请移步:https://alinshans.github.io/2017/05/23/p1705231/   第一次修改:2017/3/26 发表于    :2017/3/15   今天讲一个小点,虽然小,但如果没有真正理解它,没有真正熟悉它的里里外外,是很容易出错的——inline。 关于一些简单的介绍和使用,可以先看我这篇笔记。接下来进入正题。   一、如何使用inline? 你知道,inline函数可以减小函数调用的开销,你可能会想,嗯,我这个函数那么短,我把它声明为inline,可以提高程序运行的效率!考虑这样一个例子:

  • .NET MAUI 多平台应用 UI 应用

    .NET多平台应用UI使用文档 .NET多平台应用UI(.NETMAUI)允许你使用面向Android、iOS、macOS、Windows和Tizen上的移动和桌面外形规格的.NET跨平台UI工具包生成本机应用。本教程介绍如何在Windows上的VisualStudio2022或VisualStudio2022forMac17.4预览版中创建和运行第一个.NET多平台应用UI(.NETMAUI)应用。 若要创建.NETMAUI应用,需要最新的VisualStudio2022: 下载2022社区 下载2022专业版 下载2022企业版 安装VisualStudio或修改安装,并使用默认可选安装选项安装.NET多平台应用UI开发工作负载,如果已经安装了vs2022的话也可以使用VisualStudioInstaller来修改安装: 启动VisualStudio2022,并在“开始”窗口中单击“ 创建新项目 ”以创建新项目: 在“创建新项目”窗口中,选择“所有项目类型”下拉列表中的 MAUI,选择 .NETMAUI

  • 编写和调试Android下JNI程序流程

    1,切换到Android目录下bin/classes,使用javah命令生成jni所需的头文件,命令类似于:javahcom.xxx.ooo,其中,com.xxx为package名称,ooo为包含native方法的class名称,不需要.class后缀。 2,在项目的主目录下生成名为jni的文件夹,将生成的.h头文件拷贝到该目录,如果觉得该文件的名称过长,可以进行重命名,例如可以将com.xxx.ooo.h重命名为test.h。 3,在jni目录下新建test.c文件,包含test.h头文件,在其中将.h文件的方法声明拷贝到.c中,然后进行代码的编写。 4,在该目录新建Android.mk文件,其格式大致如下: LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=testLOCAL_SRC_FILES:=test.cinclude$(BUILD_SHARED_LIBRARY) 5,使用ndk-buiild进行编译,如果不在Application.mk中进行APP_ABI设定,默认会在obj/local/armeabi目录

  • 万字长文全解读 | 浅析银行数字化转型之二:打造金融敏捷中心

    本文作者: 刘伟光,蚂蚁金服副总裁,目前致力于蚂蚁金服技术的商业推广和生态建设。在加入蚂蚁金服前,他在企业软件市场深耕多年,创建Pivotal软件大中华区分公司,开创了企业级大数据以及企业级云计算PaaS平台的市场先河。在创建Pivotal中国软件公司之前,刘伟光曾经担任EMC大中国区数据计算事业部总经理,并在甲骨文中国公司工作多年,曾经创建了Exadata大中国区的产品事业部。   小蚂蚁说: 本文干货满满,建议阅读时间30分钟。因此先将本文目录摘录如下,建议大家先收藏转发后再阅读哦~!   一、银行的心声 二、数字化银行的终局 三、如何从《数字化1.0》到《数字化原生2.0》?  四、数字化2.0核心:业务敏捷能力 五、“蚂蚁敏捷原力”(AntForce)核心经验 六、蚂蚁数字化“操作系统”:AntOS 七、总结 八、彩蛋1:《金融数据智能中心建设篇》精彩内容 九、彩蛋2:《金融业务敏捷中心建设篇》精彩内容 十、彩蛋3:《金融技术敏捷中心建设篇》精彩内容   2018年7月蚂蚁发布了浅析数字化转型的第一篇万字长文《浅析银行数字化转型路径》

  • JavaScript字符串常用操作函数之学习笔记

    字符串简介 使用英文单引号或双引号括起来,如:’Hello’,”World”,但是不能首尾的单引号和双引号必须一致,交错使用,如果要打印单引号或者双引号,可以使用转义字符\’(单引号),\”(双引号)  代码如下 复制代码 varstr_1='HelloWorld!';  //HelloWorld!varstr_2="HelloWorld!";  //Hello World!varstr_3='他说:"这样可以的。"';  //他说:"这样可以的。"varstr_4= "他说:\"这样可以的。\""; //他说:"这样可以的。"varstr_5='HelloWorld!"; //错误的使用var str_6="HelloWorld!'; //错误的使用 连接字符串和另一个种数据类型使用+加号链接字符串  代码如下 复制代码 varuname= 'Kimy';varuage='4';alert(uname+'今年'+uage+ '岁了');&nb

  • eggjs中egg-mysql不支持mysql集群,代码修改为支持集群

    说明:暂不支持egg-mysql动态数据源,用到动态数据源请自行修改。欢迎各位大佬指导。。。   集群配置:  exports.mysql={ //单数据库信息配置 client:{ db1:{ //host host:'ip1', //端口号 port:'3306', //用户名 user:'root', //密码 password:'123456', //数据库名 database:'mydatebase', }, db2:{ //host host:'ip2', //端口号 port:'3306', //用户名 user:'root', //密码 password:'123456', //数据库名 database:'mydatebase', }, db3:{ //host host:'ip3', //端口号 port:'3306', //用户名 user:'root', //密码 password:'123456', //数据库名 database:'mydatebase', } } };复制 单数据库配置: exports.mysql={

  • 11.10的一套题

    注:所有题目的时间限制均为1s,内存限制均为256MB。1.第K小数 (number.cpp/c/pas) 【问题描述】 有两个正整数数列,元素个数分别为N和M。从两个数列中分别任取一个数 相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少。 【输入格式】 输入文件名为number.in。 输入文件包含三行。 第一行为三个正整数N,M和K。 第二行为N个正整数,表示第一个数列。 第三行为M个正整数,表述第二个数列。 【输出格式】 输出文件名为number.out。 输出文件包含一行,一个正整数表示第K小数。 【输入输出样例1】 number.in 234 12 213   number.out  3 【输入输出样例2】 number.in 5518 72358 31325   number.out  16 【数据规模与约定】 /* 二分答案 */ #include<iostream> #include<cstdio> #include<cstring> #i

  • 最近关于如何写代码的一些思考

    TableofContents 1.关于最近思考的如何写代码 1.1.少即是多 1.2.概念和面向对象 1.3.关于抽象设计的两个方法 1.关于最近思考的如何写代码 1.1.少即是多 越少越好,API接口越少越能降低人的理解负担。尽量少设计API,而应该尽量使用 API功能的组合。 例如Java的流式API,C#的Linq,他们这方面做的是真不错,认真学习理解一下他们 的做法。 但是也不能对精简追求魔征了(幸亏我想大多数人都还没有魔征的能力?)。 1.2.概念和面向对象 我认为现在与其说是OOP名字不太好,他确实是使用对象来作为主要的设计元素,但 是与其说是面向对象设计不如说是面向概念设计。 在系统中提取抽象概念,然后在将这个概念在对象上表现出来。所以说为什么有些对象的 继承设计非常的烂,是因为他实际上这个对象对应的概念就没有理解清楚,A在该系统中 就根本不是B。 但是概念太多了也不好,详见少即是多 1.3.关于抽象设计的两个方法 分块 分层 分块是平面上的,一组对象之间相互通信,他们没有层级关系,他

  • Hdfs block数据块大小的设置规则

    1.概述   hadoop集群中文件的存储都是以块的形式存储在hdfs中。 2.默认值   从2.7.3版本开始blocksize的默认大小为128M,之前版本的默认值是64M. 3.如何修改block块的大小?   可以通过修改hdfs-site.xml文件中的dfs.blocksize对应的值。   注意:在修改HDFS的数据块大小时,首先停掉集群hadoop的运行进程,修改完毕后重新启动。 4.block块大小设置规则   在实际应用中,hdfsblock块的大小设置为多少合适呢?为什么有的是64M,有的是128M、256M、512呢?   首先我们先来了解几个概念:   1)寻址时间:HDFS中找到目标文件block块所花费的时间。   2)原理:文件块越大,寻址时间越短,但磁盘传输时间越长;文件块越小,寻址时间越长,但磁盘传输时间越短。 5.block不能设置过大,也不要能设置过小   1)如果块设置过大,一方面从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;另一方面,MapReduce中的map任务通常一次只处理一个块中的数据,如果块过大运行速

相关推荐

推荐阅读