浙江大学学报(工学版), 2022, 56(11): 2260-2270 doi: 10.3785/j.issn.1008-973X.2022.11.017

计算机技术

基于上下文特征融合的代码漏洞检测方法

徐泽鑫,, 段立娟,, 王文健, 恩擎

1. 北京工业大学 信息学部,北京 100124

2. 可信计算北京市重点实验室,北京 100124

3. 信息安全等级保护关键技术国家工程实验室,北京 100124

4. 卡尔顿大学 计算机学院, 人工智能与机器学习实验室,加拿大 渥太华K1S 5B6

Code vulnerability detection method based on contextual feature fusion

XU Ze-xin,, DUAN Li-juan,, WANG Wen-jian, EN Qing

1. Faculty of Information Technology, Beijing University of Technology, Beijing 100124, China

2. Beijing Key Laboratory of Trusted Computing, Beijing 100124, China

3. National Engineering Laboratory for Critical Technologies of Information Security Classified Protection, Beijing 100124, China

4. Artificial Intelligence and Machine Learning (AIML) Lab, School of Computer Science, Carlton University, Ottawa K1S 5B6, Canada

通讯作者: 段立娟,女,教授. orcid.org/0000-0001-9836-482X. E-mail: ljduan@bjut.edu.cn

收稿日期: 2021-12-23  

基金资助: 国家自然科学基金资助项目(62176009,62106065);北京市教委重点项目(KZ201910005008)

Received: 2021-12-23  

Fund supported: 国家自然科学基金资助项目(62176009,62106065);北京市教委重点项目(KZ201910005008)

作者简介 About authors

徐泽鑫(1996—),男,硕士生,从事漏洞检测研究.orcid.org/0000-0003-3060-7949.E-mail:xuzexin@emails.bjut.edu.cn , E-mail:xuzexin@emails.bjut.edu.cn

摘要

针对现有代码漏洞检测方法误报率和漏报率较高的问题,提出基于上下文特征融合的代码漏洞检测方法. 该方法将代码特征解耦分为代码块局部特征和上下文全局特征. 代码块局部特征关注代码块中关键词的语义及其短距离依赖关系. 将局部特征融合得到上下文全局特征从而捕捉代码行上下文长距离依赖关系. 该方法通过局部信息与全局信息协同学习,提升了模型的特征学习能力. 模型精确地挖掘出代码漏洞的编程模式,增加了代码漏洞对比映射模块,拉大了正负样本在嵌入空间中的距离,促使对正负样本进行准确地区分. 实验结果表明,在9个软件源代码混合的真实数据集上的精确率最大提升了29%,召回率最大提升了16%.

关键词: 代码漏洞检测 ; 代码块局部特征提取 ; 上下文全局特征融合 ; 短距离依赖 ; 长距离依赖

Abstract

A code vulnerability detection method based on contextual feature fusion was proposed in the view of high false positive rate and the high false negative rate of existing code vulnerability detection methods. The code features were decoupled into code block local features and context global features. The code block local features focused on the semantics of key tokens and short distance dependencies. The context global features were obtained by fusing code block local features to capture long-distance dependencies of code line context. The feature learning ability of the model was improved by collaborating the learning of local and global information. The programming mode of code vulnerabilities was discovered more accurately. A code vulnerability comparison mapping module was introduced to widen the distance between positive and negative samples in embedded space. The model can accurately distinguish between positive and negative samples. The experimental results show that the precision rate is improved by a maximum of 29% and the recall rate is improved by a maximum of 16% on the real data set mixed with 9 software source code.

Keywords: code vulnerability detection ; code block local feature extraction ; contextual global feature fusion ; short-distance dependence ; long-distance dependence

PDF (1207KB) 元数据 多维度评价 相关文章 导出 EndNote| Ris| Bibtex  收藏本文

本文引用格式

徐泽鑫, 段立娟, 王文健, 恩擎. 基于上下文特征融合的代码漏洞检测方法. 浙江大学学报(工学版)[J], 2022, 56(11): 2260-2270 doi:10.3785/j.issn.1008-973X.2022.11.017

XU Ze-xin, DUAN Li-juan, WANG Wen-jian, EN Qing. Code vulnerability detection method based on contextual feature fusion. Journal of Zhejiang University(Engineering Science)[J], 2022, 56(11): 2260-2270 doi:10.3785/j.issn.1008-973X.2022.11.017

随着信息技术的飞速发展,计算机软件广泛应用于各行各业,使生活更加高效和便利. 然而,软件中潜在的漏洞对计算机安全构成了巨大威胁. 软件漏洞一旦被黑客利用来攻击软件系统,会造成严重的经济损失. 截止目前,公共漏洞和暴露数据(common vulnerabilities and exposures, CVE)中已存在165 238个条目. 近年来,软件漏洞数量增长迅速,如何准确地检测出软件中的潜在漏洞是一项十分重要且具有研究意义的课题. 漏洞检测方法主要分为静态、动态和混合3大类,其中静态方法占据主流. 静态方法主要通过分析软件源码进行代码漏洞检测. 传统的静态方法主要包含:基于规则/模板的分析方法[1-2]、代码相似性检测[3-4]以及符号执行[5-6]等,这类方法易存在较高的误报率. 相比传统方法,机器学习方法主要使用基于源码的特征如函数调用[7]、软件复杂性度量[8-9]、代码改动和提交[10-11]等对软件漏洞进行检测,从而能够更加自动且高效地挖掘出软件中的漏洞[12-14]. 机器学习方法仍需要专家来手动定义特征,因此特征的有效性主要取决于专家的经验和专业水平[15-16]. 这导致特征工程十分耗时且容易出错,而产生的手工特征也只能应用于特定的任务,缺乏一定的泛化性.

现如今,软件规模越来越庞大,内部代码越来越复杂,漏洞种类也越来越多样化. 深度神经网络因面对海量输入数据时具有自动提取特征的能力,被认为能够有效应对漏洞的多样性. 一方面,深度神经网络能够学习深度非线性编程模式,捕捉复杂代码的内在结构. 另一方面,深度神经网络能够理解代码上下文相关性并对特征进行多层概括和抽象,自动学习更高级的特征,从大量样本中发现和学习代码漏洞的潜在规律[17-18],自动检测代码中类似的漏洞. 在实际应用中代码漏洞的编程模式可以与多个代码行相关联. 例如缓冲区溢出等类别的漏洞,通常与多个连续或间隔的代码行及其上下文相关. 而现有的深度学习方法大多基于递归神经网络(recurrent neural network, RNN)[19]及变体如长短期记忆网络(long short-term memory, LSTM)[20-21]、双向长短期记忆网络(bi-directional long short-term memory,Bi-LSTM)[22-24]等. 由于RNN自身结构的限制,模型只能按照关键词输入的顺序对代码关键词序列进行逐词处理,在特征提取过程中存在部分信息丢失,导致模型难以捕捉到多行代码的长距离依赖关系. 虽然LSTM等变体能够在一定程度上扩大模型捕捉依赖的范围,但是问题的本质仍与模型递归的结构有关,这些变体并不能真正有效解决长距离依赖丢失的问题. 真实数据集中漏洞样本与非漏洞样本差异较小,在特征空间中存在较大程度的重叠,正负样本间缺少明显的界限,模型很难正确地进行区分. 真实数据集中非漏洞样本与漏洞样本比例大于40∶1,存在严重的样本不平衡问题,使得训练后的模型更倾向于样本多的无漏洞类别. 上述问题共同导致了现有方法误报率和漏报率较高,漏洞检测效果不佳.

针对现有方法存在的上述问题,提出基于上下文特征融合的代码漏洞检测方法,对软件源码以函数为单位进行漏洞检测. 主要贡献如下:1)提出从局部到全局的代码漏洞特征提取方法,提升模型的长距离特征学习能力,使得模型能够更好的理解代码语义信息,更加精确地挖掘出代码漏洞的编程模式. 2)提出代码漏洞对比映射模块,将高度重叠的漏洞样本与非漏洞样本映射到嵌入空间中,并利用距离损失对模型进行约束,使得训练后的模型尽可能拉大漏洞样本与非漏洞样本在嵌入空间中的距离,从而更好地对正负样本进行区分. 3)与基线方法[21]中漏洞检测效果最佳的模型相比,本研究在9个软件源代码混合的真实数据集上取得了更好的漏洞检测效果,其中精确率最大提升了29%,召回率最大提升了16%.

1. 相关工作

随着人工智能的不断发展,深度学习有了越来越广泛的应用. 深度学习在语音识别和机器翻译等领域的突出表现显示出神经网络理解自然语言的巨大潜力. 越来越多的研究人员使用基于深度学习的方法理解代码漏洞的语义,学习代码漏洞的编程模式. 目前主流的方法使用基于深度学习的神经网络模型对软件源码进行静态分析,检测代码中的漏洞. 全连接网络(deep neural network, DNN)是可以作为高度非线性的分类器,拟合复杂抽象的代码编程模式. Peng等[25]将java源文件转化为关键词(token)列表,使用N-gram方法将关键词转化为向量,并使用威尔科克森符号秩进行特征选择,过滤掉无关特征,降低特征向量的维度. 将降维后的特征送入DNN网络中进行处理输出最终的预测结果. 卷积神经网络(convolutional neural network, CNN)是应用于上下文窗口中,将窗口内的关键词映射到上下文特征空间中,语义相近的关键词在向量空间中距离更近,捕捉代码漏洞的上下文语义. Lee等[26]从C语言源程序的汇编指令中检测隐藏的代码漏洞. 首先将C语言源程序转化为包含n条指令的汇编代码,提出基于Word2Vec的Instruction2Vec方法,通过将操作码、寄存器、指针值和库函数等4种类型的汇编代码映射成固定长度的密集向量,生成汇编代码查找表. 将汇编代码转换成9×m×n的矩阵输入到CNN中进行处理,最后输出检测结果. Russell等[27]利用CNN进行函数级别的漏洞检测,首先使用C/C++ 词法分析器将函数代码转换为关键词序列,忽略除了C/C++关键字、操作符和分隔符外不影响编译的代码,以捕捉主要关键词的语义. 使用可训练的词嵌入方法将关键词序列的每个关键词转换为k维的向量,得到的特征矩阵送入CNN网络中进一步提取特征,最后输出检测结果. Al-Alyan等[28]提出一种基于CNN的纯网址钓鱼检测方法. 以纯URL文本作为输入,而不使用URL长度等预定义的特征. 将原URL中每个字母使用词嵌入方法转换为128维的向量,再进行一维卷积,最后经过全局最大池化层和密集层,输出检测结果. 由于网络深度和上下文窗口大小的限制,上述模型仅能学习到较小范围内代码的语义及其局部依赖关系,模型难以捕捉代码上下文长距离依赖关系,长距离特征学习能力差.

与DNN和CNN相比,递归神经网络(RNN)是更擅长处理序列化的数据. 大量研究应用RNN及变体学习代码漏洞的语义和上下文相关性,以检测代码中的隐藏漏洞. Dam等[20]利用seq2seq模型中的LSTM网络,对Java源代码进行文件级别的漏洞检测. 从源文件的抽象语法树(abstract syntax tree, AST)中提取出关键词序列,通过预先构建的查找表将每个关键词转换为固定长度的词向量. 将每个词向量依次输入LSTM网络中进行漏洞检测. Lin等[23]利用Code Sensor[29]工具生成函数源码的抽象语法树,并对抽象语法树进行深度优先遍历得到函数的关键词序列. 通过Word2Vec将序列中的关键词映射为固定维度的向量得到函数的特征矩阵,将矩阵输入到Bi-LSTM网络中得到函数的向量表示,再使用函数向量训练随机森林,输出漏洞检测结果. Lin等[21]提出9个C语言软件源代码混合的漏洞数据集,并基于该数据集分别训练基于DNN、Text-CNN和Bi-LSTM等漏洞检测模型,其中基于Bi-LSTM的模型在该数据集上取得最佳的漏洞检测效果. Li等[22]提出VulDeePecker方法,基于程序的API调用对源码进行切片,并使用词嵌入方法将切片后的代码映射为词嵌入向量输入到由2个不同尺度的Bi-LSTM构成的网络中,检测源代码中的漏洞. Li等[19]提出了SySeVR方法,模型自动化提取语法漏洞候选(SyVCs)和语义漏洞候选(SeVCs)特征. SySeVR训练了CNN、RNN、Bi-RNN和Bi-GRU等多种神经网络. 实验结果表明,在这些模型中Bi-GRU取得最好的漏洞检测效果. Duan等[24]提出一种面向源代码漏洞挖掘的漏洞检测方法. 首先将源程序表示为代码属性图,然后以敏感操作作为切片准则对代码属性图进行切片后将其编码为张量,再输入到Bi-LSTM 网络中学习源码的上下文信息,并利用注意力机制捕获源码的关键特征,最终输出检测结果. 由于RNN在顺序计算的过程中存在信息丢失,模型难以有效地捕捉到代码上下文长距离的依赖关系,这些依赖关系对于模型理解代码漏洞的语义至关重要. 尽管使用Bi-LSTM等变体能在一定程度上缓解却仍无法有效解决长距离依赖丢失的问题,限制模型的长距离特征学习能力、误报率和漏报率较高. 图神经网络(graph neural networks, GNN)是将代码看作图形,整合代码中不同的语法和语义信息,能够更好地表示代码内部的逻辑和结构. Suneja等[30]使用Joern[31]工具生成函数的代码属性图[31](code property graph, CPG),然后将代码属性图作为函数表征输入到图神经网络中进行漏洞检测. Zhou等[32]提出基于图神经网络的漏洞检测模型Devign,通过对源代码进行编码,将函数转化为包含多个语法和语义表示的联合图结构,从中提取有效的特征识别代码中的漏洞. Cao等[33]提出基于双向图神经网络的BGNN4VD漏洞检测方法,通过在传统图神经网络中引入反向边来学习漏洞代码与非漏洞代码的不同特征,检测代码中的漏洞. 通过对上述方法进行研究和分析,发现这些方法难以有效捕捉代码上下文长距离的依赖关系,模型长距离特征学习能力不够强,缺少理解代码漏洞语义所需要的关键信息,导致在真实数据集上进行漏洞检测时,精确率与召回率较低. 针对现有漏洞检测方法存在的问题,提出基于上下文特征融合的代码漏洞检测方法,模型整体框架如图1所示.

图 1

图 1   基于上下特征融合的代码漏洞检测方法整体框架

Fig.1   General framework of code vulnerability detection method based on contextual feature fusion


2. 基于上下文特征融合的代码漏洞检测方法

2.1. 源码表征

为了解决正负样本不平衡问题,结合随机下采样方法和人工少数类过采样法[34](synthetic minority over-sampling technique, SMOTE). 使用随机下采样方法对非漏洞负样本进行随机剔除,再使用SMOTE对漏洞正样本进行扩充,平衡后的正负样本比例为1∶1. 在特征学习过程中,输入的数据比学习模型的选择更加重要[35]. 代码表征是对程序源码进行表示的重要步骤,直接决定后续输入模型中数据的质量和后续模型进行特征学习的难易程度. 代码属性图[31]是一种基于图的特殊数据结构,整合代码的语法结构、控制依赖及数据依赖等信息,可以有效地对代码漏洞进行表征. 本研究使用静态分析工具Joern[31]生成函数的代码属性图,从代码属性图中提取出原函数的抽象语法树序列和控制流序列,将二者拼接后得到函数的关键词序列T = [METHOD, foo, PARAM, int, x,···]以这种方式最大程度地保留代码的语法、语义和内部结构信息,尽可能减少代码表征过程中的信息损失. 其次使用Tokenizer分词器对关键词序列T中的每一个关键词进行编码得到函数的数值向量表示V = [2,3,35,17,22,···]. 由于模型的输入为同一长度的向量,为了保证输入向量的长度相等,需要对向量进行截断或填充,因此随后按照预先设定的关键词序列长度l对数值向量进行截断或者末尾补零保证每个函数的数值向量长度相等. 使用预先训练好的Word2Vector模型选择词嵌入维度d对数值向量V进行词嵌入操作,将数值向量的每个元素转换为100维的词嵌入向量. 通过上述步骤得到原函数的代码表征F, FDl×d. 其中l为关键词序列长度,d为词嵌入维度,D为维度.

关键词序列T中每一个关键词的位置信息包含代码属性图中抽象语法树与控制流图的结构信息,这些结构信息分别反映代码中各个关键词之间的语法关系与控制关系,在模型捕获代码漏洞编程模式过程中能够起到关键作用. 本研究使用位置编码按照从1到1 800的顺序对关键词序列中每个关键词的对应位置进行编码. 每个位置对应一个d维向量,得到位置编码矩阵P, PDl×d. 该矩阵既保留了关键词序列的位置信息,又能反映代码的内部结构,最大程度地保留源代码的结构信息和语义信息. 将位置编码矩阵P和代码表征F相加得到位置编码后的代码表征:

$ {{\boldsymbol{F}}_{\text{p}}} = {\boldsymbol{F}}+{\boldsymbol{P}},\;\;{{\boldsymbol{F}}_{\text{p}}} \in {{{\boldsymbol{D}}}^{l \times d}}. $

2.2. 局部-全局代码漏洞特征提取

局部-全局代码漏洞特征提取主要包括代码块局部特征提取和上下文全局特征融合2个阶段. 其中对于局部特征来说,一个函数中通常包含多个代码块,每个代码块由若干行代码构成,而每行代码包含多个关键词. 因此,将不同关键词间的依赖关系、语法关系和语义关系视作局部信息. 为了提取局部信息,利用4个不同尺寸的一维卷积分别提取不同范围的代码块特征,将这些特征作为局部特征. 这些局部特征包含各个局部代码块中各关键词的语法、语义信息以及关键词之间的结构信息和局部依赖关系.

图2所示,在代码块局部特征提取阶段,提出的代码局部特征提取模块由4个卷积层Conv1Di, i∈{1,2,3,4}组成. 通过对数据集函数样本中代码块关键词的数量进行统计得到不同代码块中关键词的数量在5、15、25、35这4个数值范围内,因此使用卷积核尺寸为{5,15,25,35}的4个一维卷积对位置编码后的代码表征Fp进行卷积.

图 2

图 2   代码局部特征提取模块

Fig.2   Code local feature extraction module


Fp分别经过4个一维卷积层后得到的4个l×d/4的代码块局部特征矩阵L1L2L3L4

$ {{\boldsymbol{L}}_i} = {{\rm{Conv1}}}{{\text{D}}_i}({{\boldsymbol{F}}_{\text{p}}}),\;\;{{\boldsymbol{L}}_i} \in {{{\boldsymbol{D}}}^{l \times d/4}},\;\;i \in \{ 1,2,3,4\} . $

再将4个代码块局部特征矩阵进行拼接得到l×d的代码局部特征矩阵:

$ {\boldsymbol{L}} = {{\rm{Concat}}}({{\boldsymbol{L}}_1},{{\boldsymbol{L}}_2},{{\boldsymbol{L}}_3},{{\boldsymbol{L}}_4}),\;\;{\boldsymbol{L}} \in {{{\boldsymbol{D}}}^{l \times d}}. $

图3所示,在上下文全局特征融合阶段,代码全局特征融合模块主要包含自注意力网络(self_attention, SA)和前馈网络(feed_forward, FF). 代码局部特征矩阵L经过3个全连接层分别得到特征矩阵LqLkLv. 随后将矩阵LqLk相乘后进行归一化得到自注意力权重矩阵Wself,WselfDl×l反映原关键词序列中各个关键词之间的全局依赖关系,将WselfLv相乘得到加权后的特征矩阵. 再将特征矩阵送入前馈网络得到融合后的上下文全局特征矩阵:

图 3

图 3   代码全局特征融合模块

Fig.3   Code global feature fusion module


$ \begin{split} & {\boldsymbol{G}} = {{\rm{FF}}}\;({\text{S}{A}}({\boldsymbol{L}})) = {{\rm{FF}}}\left({{\rm{Softmax}}}\left({{\boldsymbol{L}}_{\text{q}}}{\boldsymbol{L}}_{\text{k}}^{\text{T}}/{{ d^{{1}/{2}} }}\times{{\boldsymbol{L}}_{\text{v}}}\right)\right),\\&{\boldsymbol{G}} \in {{{\boldsymbol{D}}}^{l \times d}}. \end{split} $

式中:d为矩阵LqLkLv的嵌入维度,Softmax为Softmax激活函数. 上下文全局特征矩阵G经过Flatten层和3个全连接层(FCi , i∈{1,2,3})后得到特征向量:

$ {{\boldsymbol{v}}_{\text{g}}} = {{\rm{F}}}{{{\rm{C}}}_3}({{\rm{F}}}{{{\rm{C}}}_2}({{\rm{F}}}{{{\rm{C}}}_1}({{\rm{F}}}{\text{L}}({\boldsymbol{G}})))),\;\;{{\boldsymbol{v}}_{\text{g}}} \in {{{\boldsymbol{D}}}^{128}}. $

式中:vg为原函数样本的高级特征,高度抽象和概括原函数包含的信息;FL为Flatten层.

函数整体由多个代码块组成,提取的全局特征是函数的上下文全局描述. 上下文全局特征融合阶段基于自注意力机制[36]经过计算得到各个局部代码块之间的全局依赖关系,为属于不同代码块的关键词设置不同大小的全局依赖权重,从而得到局部代码块的加权表示并进行融合,突出重要代码块及核心关键词间的依赖关系,对重要代码块和核心关键词的信息进行增强. 利用全局信息指导各个代码块局部特征进行融合最终得到上下文全局特征矩阵,整合所有代码块的语义信息,使得模型能够理解整个函数的语义,提升模型的长距离特征学习能力和代码语义理解能力.

2.3. 代码漏洞对比映射

代码漏洞对比映射模块将原始空间中高度重叠难以区分的漏洞样本和非漏洞样本映射到嵌入空间中,尽可能拉大两类样本间的距离,使得正负样本更易区分. 如图4所示,该模块由输入层、隐藏层和输出层组成,将vg作为输入,再传入隐藏层,隐藏层将原特征向量vg映射到嵌入空间中得到隐藏特征h(vg). 如图4(b)和(c)所示,将隐藏特征h(vg)降维后可视化,其中维度1和维度2是降维后得到特征向量的2个维度. 最后,输出层利用嵌入空间中的隐藏特征h(vg)对漏洞进行预测,输出存在代码漏洞的概率:

图 4

图 4   代码漏洞对比映射模块

Fig.4   Code vulnerability comparison mapping module


$ \overset{\lower0.5em\hbox{$\smash{\scriptscriptstyle\frown}$}}{y} = \sigma \; ({\boldsymbol{W}}\times h({{\boldsymbol{v}}_{\text{g}}})+{\boldsymbol{b}}). $

式中:σ为Sigmoid激活函数,h(vg)为隐藏特征,Wb分别为权重矩阵和偏置项.

为了尽可能拉大嵌入空间中漏洞样本和非漏洞样本间的距离,采用三元损失Ltrp作为模型的损失函数,Ltrp由3个独立的损失函数组成:

$ {L_{{\text{trp}}}} = {L_{{\text{bce}}}}+\alpha \times{L_{\text{p}}}+\beta \times{L_{{\text{reg}}}}. $

式中:Lbce为二元交叉熵损失,Lp为映射损失,Lreg为正则化损失,αβ分别为映射损失和正则化损失的权重超参数.

三元损失的第1个组成部分Lbce二元交叉熵损失函数主要对漏洞样本与非漏洞样本的错误分类进行惩罚. 模型预测概率与实际标签偏离越大则分类损失越大. Lbce的定义为

$ {L_{{\text{bce}}}} = - \frac{1}{N}\sum\nolimits_{i = 1}^N {{y_i} {\rm{log}}} \;({\hat y_i})+(1 - {y_i}) {\rm{log}}\;(1 - {\hat y_i}). $

式中:yi为真实标签, $\hat y_i $为预测值,N为样本数.

三元损失的第2个组成部分Lp用来量化隐藏层能在多大程度上拉大漏洞样本与非漏洞样本的距离. Lp定义为

$ {L_{\text{p}}} = \left| {D(h({{\boldsymbol{v}}_{\text{g}}}),h({{\boldsymbol{v}}_{{\text{same}}}})) - D(h({{\boldsymbol{v}}_{\text{g}}}),h({{\boldsymbol{v}}_{{\text{diff}}}}))+\gamma } \right|. $

式中:h(vsame)为相同类别样本的隐藏特征,h(vdiff)为不同类别的样本的特征,γ为用于定义最小边界的超参数,DIS为任意2个向量v1v2 之间的余弦距离:

$ {\rm{DIS}}({{\boldsymbol{v}}_1},{{\boldsymbol{v}}_2}) = 1 - \left| {\frac{{{{\boldsymbol{v}}_1} \cdot {{\boldsymbol{v}}_2}}}{{\left\| {{{\boldsymbol{v}}_1}} \right\| \cdot \left\| {{{\boldsymbol{v}}_2}} \right\|}}} \right|. $

属于同一类的2个样本之间的距离即DIS(h(vg), h(vsame))越大或属于不同类别的2个样本之间的距离即DIS(h(vg), h(vdiff))越小,则Lp越大. 三元损失的最后一个组成部分正则化损失Lreg对隐藏特征h(vg)进行约束,加快模型的收敛. 使用正则化损失Lreg对超过固定范围的隐藏特征表示进行惩罚,正则化损失公式为

$ {L_{{\text{reg}}}} = \left\| {h({{\boldsymbol{v}}_{\text{g}}})} \right\|+\left\| {h({{\boldsymbol{v}}_{{\text{same}}}})} \right\|+\left\| {h({{\boldsymbol{v}}_{{\text{diff}}}})} \right\|. $

3. 实验结果与分析

3.1. 实验准备

1)数据集 实验在Lin等[21]构建的漏洞数据集上进行,漏洞数据集包含9个用C语言编写的开源软件项目. Lin等[21]将这些项目按函数和文件2种粒度进行切分,并根据美国国家漏洞数据库和公共漏洞数据库网站的数据对切分好的函数和文件进行标记. 当代码漏洞存在于一个函数内部时,将该函数标记为漏洞函数,并将包含该函数的文件标记为漏洞文件. 当代码漏洞跨越多个函数时则仅将该漏洞所在文件标记为漏洞文件. 函数级别的语义可以提供范围较小的细粒度的上下文语义信息,而文件级别的语义提供的是范围较大的相对粗粒度的上下文语义信息. 基于函数级别的漏洞样本可以在函数级别上构建漏洞检测模型,从而实现比文件级别更细粒度的漏洞检测能力,本研究选择使用函数级别的样本对模型进行训练. 在数据集中所有漏洞函数的文件名中都包含对应漏洞的CVE编号,即所有文件名中含有“CVE”字符串的函数标记为漏洞函数,其余函数则全部标记为非漏洞函数,所有的函数文件如表1所示,Nvul为漏洞函数数量,Nnon为非漏洞函数数量. 数据集包含59 297个非漏洞函数,1 471个漏洞函数. 在实验时将整个数据集按照6∶2∶2的比例随机划分为训练集、验证集和测试集. 由于静态分析工具Joern无法对其中的11个函数文件进行正确解析,导致实际可用的函数数量略微少于原数据集中的函数数量. 为了与基线方法[21]进行比较,实验使用的训练集和测试集的函数数量保持一致,验证集中的漏洞函数减少了5个,非漏洞函数减少了6个. 训练集、测试集和验证集中的函数数量如表2所示,表中训练集正负样本比例为883∶35 575,经过样本平衡后正负样本比例由883∶35 575变为1∶1,验证集和测试集与基线方法[21]保持一致,不进行样本平衡操作.

表 1   数据集中的函数数量

Tab.1  Number of functions in dataset

开源软件项目 Nnon Nvul
Asterisk 17 755 94
FFmpeg 5 552 249
HTTPD 3 850 57
LibPNG 577 45
LibTIFF 731 123
OpenSSL 7 068 159
Pidgin 8 626 29
VLC Player 6 115 44
Xen 9 023 671
总计 59 297 1 471

新窗口打开| 下载CSV


表 2   训练集、测试集、验证集中的函数数量

Tab.2  Number of functions in training set, test set, validation set

训练集 测试集 验证集
Nvul Nnon Nvul Nnon Nvul Nnon
883 35 575 294 11 861 289 11 855

新窗口打开| 下载CSV


2)评价指标 模型代码漏洞检测能力评价指标是top K%精确率(P@K%)和top K%召回率(R@K%). P@K%为存在漏洞的概率排在前K%的函数中,被判定存在漏洞的函数实际是漏洞函数的比例:

$ P@K{\text{%}} = \frac{{{{\rm{TP}}}@K{\text{%}} }}{{{{\rm{TP}}}@K{\text{%}} +{{\rm{FP}}}@K{\text{%}} }}. $

式中:TP@K%为存在漏洞的概率排在前K%的函数中真实正样本的数量,FP@K%为假正样本的数量.

R@K%为存在漏洞的概率排在前K%的函数中被正确判定存在漏洞的函数占全部漏洞函数的比例:

$ R@K{\text{%}} = \frac{{{{\rm{TP}}}@K{\text{%}} }}{{{{\rm{TP}}@}K{\text{%}} +{{\rm{FN}}}@K{\text{%}} }}. $

式中:FN@K%为存在漏洞的概率排在前K%的函数中假负样本的数量.

在实际应用中,漏洞函数的数量比非漏洞函数的数量少很多. 所以,当得到存在漏洞的概率排在前K%的函数时,期望模型能够检测出更多的漏洞函数.

3.2. 关键词序列长度的设置

不同函数的l差别较大,l的取值会影响模型的漏洞检测效果. 因此,实验通过改变的l取值,使模型达到最佳的漏洞检测效果,从而确定关键词序列的默认长度,分别将l设置为1 500、1 800、2 000,保持其余参数不变,模型在测试集上的漏洞检测结果如表3所示.

表 3   不同关键词序列长度l实验结果

Tab.3  Results of different token sequence length l %

l K=1 K=10 K=20 K=50
P@K% R@K% P@K% R@K% P@K% R@K% P@K% R@K%
1 500 98 40 22 94 20 95 20 95
1 800 99 41 23 97 11 98 6 99
2 000 97 40 22 91 14 93 14 93

新窗口打开| 下载CSV


将3种不同关键词序列长度对应模型在测试集上的召回率可视化成折线图,如图5所示. 从图中可以看出当关键词序列长度(l)设置为1 800时,模型取得了最佳的漏洞检测效果,由此确定关键词序列的默认长度为1 800.

图 5

图 5   模型设置不同关键词序列长度对应的top K%召回率

Fig.5   Top K% recall rate corresponding to different token sequences length


3.3. 代码局部特征提取模块一维卷积核尺寸的设置

不同的卷积核尺寸会影响卷积层的特征提取效果. 因此,本实验通过调整卷积核的尺寸,使得模型达到最佳的漏洞检测效果,从而确定卷积核的默认尺寸. 分别将4个一维卷积核尺寸设置为{5,15,25,35}、{15,25,35,45}、{25,35,45,55},保持其余参数不变,模型在测试集上的漏洞检测结果如表4所示.

表 4   不同卷积核尺寸实验结果

Tab.4  Results of different convolutional kernel sizes %

卷积核
尺寸
K=1 K=10 K=20 K=50
P@K% R@K% P@K% R@K% P@K% R@K% P@K% R@K%
{5,15,25,35} 99 41 23 97 11 98 6 99
{15,25,35,45} 85 35 20 84 14 88 14 88
{25,35,45,55} 71 29 16 68 11 73 11 73

新窗口打开| 下载CSV


将代码局部特征提取模块中卷积层的不同的卷积核尺寸所对应的模型在测试集上的召回率可视化成折线图,如图6所示. 从图中可以看出当卷积核尺寸设置为{5,15,25,35}时,模型的漏洞检测效果最佳,由此确定卷积核尺寸为{5,15,25,35}.

图 6

图 6   不同卷积核尺寸对应的top K%召回率

Fig.6   TopK% recall rate corresponding to different convolutional kernel sizes


3.4. 实验结果与比较

使用Lin等[21]提出的漏洞数据集进行实验,并选取同样基于该数据集的Bi-LSTM、Text-CNN、DNN等模型作为基线进行对比实验,实验结果如表5所示. 从表5中可以看出:与其他模型相比,提出的模型在测试集上的P@1%、P@10%、P@50%均高于其他3种模型,P@20%与Text-CNN相等,相比Bi-LSTM和DNN提升了1%. 在top 1%中,精确率相较表现最好的模型Text-CNN提升了29%. 提出的模型在测试集上的R@1%、R@10% 、R@20%同样均高于其他3种模型. 在top 10%中,召回率相较表现最好的模型Text-CNN提升了16%. R@50%和Bi-LSTM一样都达到了99%,比Text-CNN提升了2%,比DNN提升了3%. 所提出的模型仅从漏洞概率排在前10%的函数中就能检测出整个测试集中97%的漏洞函数,仅剩3%的漏洞函数未被检出,表明所提模型能够更准确地检测出代码漏洞. 未能检出的漏洞函数其漏洞类型包括内存泄漏,OpenSSL中间人安全绕过漏洞等,这些类型的漏洞多在代码运行时发生且与用户的具体操作有关. 要检测这些漏洞需要对函数进行实际运行,而本文方法属于静态方法,通过模型对函数进行静态分析检测代码中的漏洞,因此无法有效地检测出这些运行时漏洞.

表 5   本研究方法与Bi-LSTM、Text-CNN、DNN的精确率和召回率的对比实验结果

Tab.5  Precision and recall rate of comparative experiment with Bi-LSTM、Text-CNN、DNN

%
模型 K=1 K=10 K=20 K=50
P@K% R@K% P@K% R@K% P@K% R@K% P@K% R@K%
Bi-LSTM[21] 54 22 18 75 10 87 5 99
Text-CNN[21] 70 29 20 81 11 90 5 97
DNN[21] 44 18 15 62 10 80 5 96
本研究方法 99 41 23 97 11 98 6 99

新窗口打开| 下载CSV


模型输出测试集中每个函数存在漏洞的概率,再将所有函数按概率从大到小排列,后分别取前K%的函数计算模型在测试集上的精确率和召回率. K依次取值1、10、20、50,K的取值越大模型检测出的漏洞方法越多则召回率逐渐上升,相应地精确率则会逐渐下降. 本模型的代码漏洞检测效果明显优于基线方法[21]的3种模型.

实验结果表明不同类型的神经网络具有不同的漏洞特征提取和学习的能力. 与Bi-LSTM和Text-CNN相比,DNN在本数据集上表现不够出色,表明仅包含全连接层的DNN无法有效捕捉潜在代码漏洞的编程模式. Bi-LSTM和Text-CNN提高了模型提取代码漏洞特征的能力,Bi-LSTM和Text-CNN能够更好的处理代码关键词之间的相关性,实现了比DNN模型更好的代码漏洞检测效果. 但它们对代码上下文长距离的依赖关系的学习能力仍不够强,Text-CNN的卷积网络能够捕获卷积窗口中代码关键词的短距离局部依赖,但无法有效捕捉长距离的代码特征;Bi-LSTM模型的结构提高了模型学习代码长距离特征的能力,但在特征提取过程中存在部分代码语义信息丢失,模型的长距离依赖捕获能力和代码语义特征提取能力仍不够强. 所提方法在代码特征提取过程中,联合使用了局部-全局代码漏洞特征提取模块和代码漏洞对比映射模块,不仅能关注代码局部的语义信息和依赖关系,更能有效捕捉代码行中的上下文长距离依赖关系. 模型具有更强的语义特征提取能力和长距离特征学习能力,能够更好的理解代码的语义信息并识别代码漏洞的编程模式,从而有效地将漏洞函数与非漏洞函数进行区分,达到更好的漏洞检测效果.

为了测试本方法在其他数据集上的漏洞检测效果,使用Zhou等[32]公开的漏洞数据集QEMU进行实验并与同样基于该数据集的模型Devign[32]进行对比,实验设置和评价指标与其保持一致. 为了模拟真实数据集中正负样本不平衡的情况,调整正负样本比例为9∶1并按照8∶1∶1的比例将实验数据集随机划分为训练集、验证集和测试集. 实验结果如表6所示. 从表6可以看出,所提模型在测试集上的准确率(ACC)和平衡F分数(F1)分别为96.62%和79.83%,在这2个评估指标上明显优于Devign.

表 6   本研究方法与Devign的准确率和平衡F分数的对比实验结果

Tab.6  Accuracy and F1 score results of comparative experiment with Devign

模型 ACC/% F1/%
Devign[32] 89.27 41.12
本研究方法 96.62 79.83

新窗口打开| 下载CSV


实验结果表明,相比Devign使用图神经网络通过融合各节点间的信息来提取代码特征,所提模型首先提取代码块局部特征再利用上下文全局信息指导局部特征进行特征融合,具有更强的长距离依赖捕获能力和特征学习能力,能够更有效地挖掘出代码漏洞实现了更好的漏洞检测效果.

3.5. 消融实验

3.5.1. 样本平衡方法有效性验证

针对样本平衡方法进行消融实验,验证样本平衡方法的有效性. 由表7可以看出,使用样本平衡方法前,非漏洞样本与漏洞样本比例达40∶1以上,存在严重的样本不平衡问题. 训练后的模型更倾向于样本更多的无漏洞类别,导致召回率降低. 使用样本平衡方法后,减轻了样本不平衡问题对模型的影响,召回率提升.

表 7   样本平衡方法消融实验结果

Tab.7  Ablation experiment results of sample balancing method %

是否使用
样本平衡
方法
K=1 K=10 K=20 K=50
P@K% R@K% P@K% R@K% P@K% R@K% P@K% R@K%
95 39 21 90 16 92 16 92
99 41 23 97 11 98 6 99

新窗口打开| 下载CSV


3.5.2. 各模块有效性验证

分别针对代码局部特征提取模块,代码全局特征融合模块,代码漏洞对比映射模块进行消融实验,验证模型各个模块的有效性. 表8总结对不同模块进行消融后分别对应的模型,其中M1为模型未进行消融的整体框架:代码局部特征提取模块+代码全局特征融合模块+代码漏洞对比映射模块;M2:代码全局特征融合模块+代码漏洞对比映射模块;M3:代码局部特征提取模块+代码漏洞对比映射模块;M4:代码局部特征提取模块+代码全局特征融合模块. 实验结果如表9所示,值得注意的是模型M2、M3和M4在测试集上的精确率和召回率在top 20%之后保持不变,表明这3个模型将存在漏洞的概率排在20%之后的函数全部判定为非漏洞函数,测试集中仍存在较多的漏洞函数未被检出. 对比第1行和第4行可以看出,去掉代码漏洞对比映射模块之后,模型在测试集上R@50%下降了49%. 表明缺少了代码漏洞对比映射模块,模型没能拉开正负样本间的距离,难以对正负样本进行区分,导致召回率大幅下降. 对比第1行和第3行,当缺少了代码全局特征融合模块,模型无法有效捕捉到代码行中的长距离依赖关系,缺少了全局信息的指导,模型无法有效地融合各个代码块的局部信息,导致模型的特征提取能力下降,精确率和召回率均显著下降. 第1行和第2行的实验结果表明,当缺少了代码局部特征提取模块,后续代码全局特征融合模块无法获得必要的代码块局部特征信息,导致后续无法进行有效的特征融合,严重影响了模型的特征提取和代码理解能力,导致模型在测试集上R@50%降低了58%.

表 8   不同模块的消融

Tab.8  Ablation of different modules

模型 代码局部特
征提取模块
代码全局特
征融合模块
代码漏洞对
比映射模块
M1
M2 ×
M3 ×
M4 ×

新窗口打开| 下载CSV


表 9   不同模块消融实验结果

Tab.9  Ablation experiment results of different modules

模型 K=1 K=10 K=20 K=50
P@K% R@K% P@K% R@K% P@K% R@K% P@K% R@K%
M1 99 41 23 97 11 98 6 99
M2 57 23 27 41 27 41 27 41
M3 63 26 14 61 11 66 11 66
M4 66 27 32 50 32 50 32 50

新窗口打开| 下载CSV


将召回率可视化为折线图如图7所示,实验结果表明模型的各个模块之间相互依赖和支持,在它们的共同作用下显著提升了模型的代码漏洞检测能力,也充分说明模型中各模块的有效性和必要性.

图 7

图 7   模块消融对应的top K%召回率

Fig.7   Top K% recall rate corresponding to ablation of modules


4. 结 语

针对现有漏洞检测方法在代码特征提取过程中存在部分信息丢失,难以有效捕捉到代码中长距离的依赖关系,长距离特征学习能力不够强,在真实数据集上的进行漏洞检测时精确率和召回率低的问题,提出了一种基于上下文特征融合的代码漏洞检测方法. 本方法能够有效捕捉代码行上下文长距离依赖关系,利用上下文全局信息指导各代码块局部特征进行融合,通过局部信息与全局信息的配合学习,提升了模型的特征学习能力. 使模型能够更好地理解代码语义,更精确地挖掘出判别代码漏洞的关键信息,检测出潜在的代码漏洞. 本方法在9个软件源代码混合的真实数据集上进行实验,与基线方法[21]中漏洞检测效果最佳的模型相比,精确率和召回率显著提升,其中精确率最大提升了29%,召回率最大提升了16%.

参考文献

SECURESOFTWARE. Rough auditing tool for security(rats)[EB/OL]. [2021-12-23]. http://www.securesoftware.com/resources/download_rats.html.

[本文引用: 1]

WHEELER D A. Flawfinder software official website[EB/OL]. [2018-08-02]. https://www.dwheeler.com/flawfinder/.

[本文引用: 1]

JANG J, AGRAWAL A, BRUMLEY D. Redebug: finding unpatched code clones in entire os distributions[C]// IEEE Symposium on Security and Privacy. California: IEEE Computer Society, 2012: 48-62.

[本文引用: 1]

KIM S, WOO S, LEE H, et al. Vuddy: a scalable approach for vulnerable code clone discovery[C]// IEEE Symposium on Security and Privacy (SP). San Jose: IEEE Computer Society, 2017: 595-614.

[本文引用: 1]

AVGERINOS T, CHA S K, REBERT A, et al

Automatic exploit generation

[J]. Communications of the ACM, 2014, 57 (2): 74- 84

DOI:10.1145/2560217.2560219      [本文引用: 1]

RAMOS D A, ENGLER D. Under-constrained symbolic execution: correctness checking for real code[C]// Proceedings of the 24th USENIX Security Symposium (USENIX Security 15). Washington: USENIX Association, 2015: 49-64.

[本文引用: 1]

NEUHAUS S, ZIMMERMANN T, HOLLER C, et al. Predicting vulnerable software components[C]// Proceedings of the 14th ACM Conference on Computer and Communications Security. Alexandria: ACM, 2007: 529-540.

[本文引用: 1]

SHIN Y, WILLIAMS L. An empirical model to predict security vulnerabilities using code complexity metrics[C]// Proceedings of the 2nd ACM-IEEE International Symposium on Empirical Software Engineering and Measurement. Kaiserslautern: ACM, 2008: 315-317.

[本文引用: 1]

SHIN Y, WILLIAMS L

Can traditional fault prediction models be used for vulnerability prediction?

[J]. Empirical Software Engineering, 2013, 18 (1): 25- 59

DOI:10.1007/s10664-011-9190-8      [本文引用: 1]

PERL H, DECHAND S, SMITH M, et al. Vccfinder: finding potential vulnerabilities in open-source projects to assist code audits[C]// Proceedings of the 22nd ACM SIGSAC Conference on Computer and Communications Security. Denver: ACM, 2015: 426-437.

[本文引用: 1]

SHIN Y, MENEELY A, WILLIAMS L, et al

Evaluating complexity, code churn and developer activity metrics as indicators of software vulnerabilities

[J]. IEEE Transactions on Software Engineering, 2010, 37 (6): 772- 787

[本文引用: 1]

GHAFFARIAN S M, SHAHRIARI H R

Software vulnerability analysis and discovery using machine-learning and data-mining techniques: a survey

[J]. ACM Computing Surveys (CSUR), 2017, 50 (4): 1- 36

[本文引用: 1]

LIU L, DE VEL O, HAN Q-L, et al

Detecting and preventing cyber insider threats: a survey

[J]. IEEE Communications Surveys and Tutorials, 2018, 20 (2): 1397- 1417

DOI:10.1109/COMST.2018.2800740     

SUN N, ZHANG J, RIMBA P, et al

Data-driven cybersecurity incident prediction: a survey

[J]. IEEE Communications Surveys and Tutorials, 2018, 21 (2): 1744- 1772

[本文引用: 1]

JIANG J, WEN S, YU S, et al

Identifying propagation sources in networks: state-of-the-art and comparative studies

[J]. IEEE Communications Surveys and Tutorials, 2016, 19 (1): 465- 481

[本文引用: 1]

WU T, WEN S, XIANG Y, et al

Twitter spam detection: survey of new approaches and comparative study

[J]. Computers and Security, 2018, 76: 265- 284

DOI:10.1016/j.cose.2017.11.013      [本文引用: 1]

GOODFELLOW I, BENGIO Y, COURVILLE A. Deep learning [M]. Cambridge, Massachusetts, USA: MIT press, 2016.

[本文引用: 1]

SESTILI C D, SNAVELY W S, VANHOUDNOS N M. Towards security defect prediction with AI [EB/OL]. [2018-08-29]. https://doi.org/10.48550/arXiv.1808.09897.

[本文引用: 1]

LI Z, ZOU D, XU S, et al

Sysevr: a framework for using deep learning to detect software vulnerabilities

[J]. IEEE Transactions on Dependable and Secure Computing, 2021, 19 (4): 2244- 2258

[本文引用: 2]

DAM H K, TRAN T, PHAM T, et al. Automatic feature learning for vulnerability prediction [EB/OL]. [2017-08-08]. https://doi.org/10.48550/arXiv.1708.02368.

[本文引用: 2]

LIN G, XIAO W, ZHANG J, et al. Deep learning-based vulnerable function detection: A benchmark[C]// International Conference on Information and Communications Security. Beijing: Springer, 2019: 219-232.

[本文引用: 13]

LI Z, ZOU D, XU S, et al. Vuldeepecker: a deep learning-based system for vulnerability detection [EB/OL]. [2018-01-05]. https://doi.org/10.48550/arXiv.1801.01681.

[本文引用: 2]

LIN G, ZHANG J, LUO W, et al

Cross-project transfer representation learning for vulnerable function discovery

[J]. IEEE Transactions on Industrial Informatics, 2018, 14 (7): 3289- 3297

DOI:10.1109/TII.2018.2821768      [本文引用: 1]

段旭, 吴敬征, 罗天悦, 等

基于代码属性图及注意力双向 LSTM 的漏洞挖掘方法

[J]. 软件学报, 2020, 31 (11): 3404- 3420

[本文引用: 2]

DUAN Xu, WU Jing-zheng, LUO Tian-yue, et al

Vulnerability mining method based on code property graph and attention BiLSTM

[J]. Journal of Software, 2020, 31 (11): 3404- 3420

[本文引用: 2]

PENG H, MOU L, LI G, et al. Building program vector representations for deep learning [C]// International Conference on Knowledge Science, Engineering and Management. Chongqing: Springer, 2015: 547-553.

[本文引用: 1]

LEE Y J, CHOI S H, KIM C, et al. Learning binary code with deep learning to detect software weakness[C]// KSII the 9th International Conference on Internet (ICONI). Vientiane: Symposium, 2017: 245-249.

[本文引用: 1]

RUSSELL R, KIM L, HAMILTON L, et al. Automated vulnerability detection in source code using deep representation learning [C]// 17th IEEE International Conference on Machine Learning and Applications (ICMLA). Orlando: Institute of Electrical and Electronics Engineers, 2018: 757-762.

[本文引用: 1]

AL-ALYAN A, AL-AHMADI S

Robust URL phishing detection based on deep learning

[J]. KSII Transactions on Internet and Information Systems (TIIS), 2020, 14 (7): 2752- 2768

[本文引用: 1]

YAMAGUCHI F, LOTTMANN M, RIECK K. Generalized vulnerability extrapolation using abstract syntax trees[C]// Proceedings of the 28th Annual Computer Security Applications Conference. Orlando: ACM, 2012: 359-368.

[本文引用: 1]

SUNEJA S, ZHENG Y, ZHUANG Y, et al. Learning to map source code to software vulnerability using code-as-a-graph [EB/OL]. [2020-06-15]. https://arxiv.org/abs/2006.08614.

[本文引用: 1]

YAMAGUCHI F, GOLDE N, ARP D, et al. Modeling and discovering vulnerabilities with code property graphs[C]// IEEE Symposium on Security and Privacy. Berkeley: IEEE Computer Society, 2014: 590-604.

[本文引用: 4]

ZHOU Y, LIU S, SIOW J, et al. Devign: effective vulnerability identification by learning comprehensive program semantics via graph neural networks [C]// Proceedings of the 33rd Conference on Neural Information Processing Systems. Vancouver: NIPS Foundation, 2019: 10197-10207.

[本文引用: 4]

CAO S, SUN X, BO L, et al

Bgnn4vd: constructing bidirectional graph neural-network for vulnerability detection

[J]. Information and Software Technology, 2021, 136: 106576

DOI:10.1016/j.infsof.2021.106576      [本文引用: 1]

CHAWLA N V, BOWYER K W, HALL L O, et al

Smote: synthetic minority over-sampling technique

[J]. Journal of Artificial Intelligence Research, 2002, 16: 321- 357

DOI:10.1613/jair.953      [本文引用: 1]

AGRAWAL A, MENZIES T. Is" better data" better than" better data miners"? [C]// IEEE/ACM 40th International Conference on Software Engineering. Gothenburg: ACM, 2018: 1050-1061.

[本文引用: 1]

VASWANI A, SHAZEER N, PARMAR N, et al. Attention is all you need [C]// Proceedings of the 31st Conference on Neural Information Processing Systems (NISP). Long Beach: NIPS Foundation, 2017: 5998-6008.

[本文引用: 1]

/