文献综述
--基于图神经网络的AI代码缺陷检测的研究与实现
1 前 言
人工智能(AI)是近些年非常流行和有效的技术之一,其中又尤以深度学习(DL)为突出,已经被广泛的应用到了很多领域。但是,像其他的软件应用一样,深度学习应用也遭受着软件缺陷的困扰,但是由于深度学习和传统的软件的差异,一些常用的调试方法并不能适用于深度学习项目,对深度学习模型进行缺陷检测是十分有挑战性的[]。哪怕是现在有很多成熟的深度学习库,深度学习项目仍然存在很多问题[]。基于此背景,设计专为深度学习模型而用的方法或工具是非常有意义的。
对于深度学习模型的缺陷检测,已经有了若干解决方案,其中有几个方案是比较有效和具有代表性的。Schoop E等人的研究工作UMLAUT[]通过对DL项目结构和模型的行为进行检查来检测缺陷并给与一定的错误信息,能帮助开发者发现并修复错误;Wardat M等人的DeepLocalize[]基于Keras[] Callback API,聚焦于分析在深度学习模型的各层之间传播的数值的趋势,通过在模型的训练过程中分析这些值的变化来检测乃至定位缺陷,此项目在实验中达到了不错的效果,能在40个错误的深度学习模型中检测出34个;Zhang X等人的AUTOTRAINER[]提供了一个可以监视深度学习模型训练并自动修复的工具,这项工作的应用领域在缺陷检测之上拓宽到了自动修复,其思路也是在训练过程观察模型中各种数值的变化,通过识别不正常的数值来发现缺陷并尝试修复,取得了非常不错的效果;Wardat M等人的Deepdiagnosis[]同样是分析训练过程中的数值变化来确定发生了不同的问题,并利用决策树来给出对修复缺陷有一定参考价值的建议,此项目比UMLAUT和DeepLocalize的效果更好,能识别出更多类型的问题,比AUTOTRAINER的性能更好,相比起来可以更快的完成工作。
从对以上四个成果简要的分析来看,这些成果的有比较明显的共同点:都是通过在模型训练过程中分析模型中数值的变化或检测数值是否正常来达到缺陷检测以及进一步的目的,话句话说,他们的工作都是基于对深度学习模型的动态分析。动态分析比较明显的特征就是需要在程序的运行过程中分析状态变化,这样的做法是有优势的,能够在模型实际训练过程中进行分析,从而更准确地分析程序的行为。但是,可以看到的是,动态分析的方法有一定的不足:首先,这些工作只基于动态分析导致忽略了深度学习模型的静态信息,比如层结构、层数量、超参数的取值是否合理,而又有些错误缺恰恰很明显的反映在了这些静态信息之上;其次,动态分析需要在模型训练过程中进行,在很多情况下会造成缺陷检测的效率较低,因为模型的训练往往是缓慢;除此之外,这几个基于动态分析的工具往往绑定于某一个的深度学习库,比如DeepLocalize和Deepdiagnosis都基于Keras Callback API实现,但对于其他没有Callback API的库比如PyTorch[]和MXNet[]实现起来就比较困难,局限了应用的范围。
不同于以上四种方案,Nikanjam A等人的基于图转换算法实现的对深度学习模型[]的缺陷检测是利用静态分析进行的,此工作将深度学习模型转化为图结构,然后在图上面基于提前定义好的规则进行分析,进而实现对深度学习模型的缺陷检测。这样的静态分析思路就克服了动态分析的一些缺点,关注于模型的静态信息、不用依附于模型训练过程、不被绑定在单一的深度学习库上。当然,这种思路仍有不足之处,比如处理图的规则是基于前人工作总结出来的,可以识别的错误类型还是拘泥于这些规则,但是这种基于图的静态分析的方案给了我们很大的启发,在本文中,我们基于此想法提出采用图神经网络(GNN)[]来实现对深度学习模型的缺陷检测。图神经网络是专门处理图结构的神经网络,近几年在很多领域有不错的应用,也就当然可以用来处理深度学习模型转为的图,这种思路是基于静态的,可以克服动态分析的缺点,同时,判断规则可以自动的从数据集中学习而不用自己设计。总体来看,利用图神经网络对深度学习模型进行缺陷检测会是一种不错的创新,并很可能获得到在某些方面比前人工作更好的效果。
2 背景知识介绍
本文提出利用图神经网络对深度学习模型进行缺陷检测,在本章中,我们将结合本文的设想来介绍关于深度学习模型和图神经网络的背景知识。
2.1 深度学习模型
深度学习是一种基于深度神经网络(DNN)的方法,是机器学习的一种,其基本原理是通过大量数据进行训练,在训练过程中逐步的学习数据的特征以最终达到对新数据的预测或分类。深度学习模型在计算机视觉、自然语言处理、广告推荐系统、语音识别等领域有十分广泛的应用。
但是同时,深度学习模型的调试确实是个很大的挑战,常规的软件和DNN在缺陷检测方面存在根本差异[4],例如,常规的软件通过比较真实结果和预期结果的一致性,如果不一致则说明程序有错。但对于深度学习项目,如果一个DNN在训练过程对一个用例分类错了,这也并不表示这个模型有错误,因为一个DNN几乎不可能100%分类准确。此外,常规软件的逻辑可以被一系列控制流表示,但DNN则是利用在神经元之间的权重以及不同的激活函数来达到类似的目的。这些不同造成深度学习程序非常地难以调试和测试,所以也就需要为深度学习模型研究特定的调试方法,这也是本课题的最终目的。
一个深度神经网络可以被认为是一张图,其中的结点就是一个个的神经元,这些神经元又被组织成了层,图中的边将神经元的反馈从一层传到下一层,最终到达到输出成。这种图结构为此文提出的在DNN模型上应用神经网络提供了很好的理论依据。当然,在具体实施中可能并不会直接将神经元做结点,更简洁易施的做法是将每个层作为图中的一个结点,同时,例如学习率、批量大小等模型训练不可或缺的超参数也应该被考虑,所以它们同样应该被合理的内嵌到图中,只有这样,一张图才能完整的代表一个深度学习模型。
开发深度学习项目需要利用到库,而常见的库有TensorFlow[]、Keras[]、PyTorch[]、MXNet[]、Cafe[]等,利用这些库可以很方便的快速搭建和训练模型,因而大量的深度学习模型是以利用了这些库的Python源码形式呈现的。在本文中,我们选择收集以Keras源码形式呈现的那些深度学习模型作为数据集,主要原因有二,一是像DeepLocalize、AUTOTRINER和Deepdiagnosis这些前人的工作都是基于Keras的,如果我们也用Keras可以很方便利用这些前人项目中提供的Keras模型,方便与他们的工作做对比;二是Keras的API有利于我们从Python源码中通过动态分析获取模型以及超参数。当然,值得注意的是,这并不代表我们的工作只能处理Keras的模型,实际上无论什么库写的,只需要将其按照格式转为图即可,选择Keras只是出于对方便性的考量。
2.2 图神经网络
图神经网络(GNN)是一种基于图的神经网络模型,与传统的神经网络不同,图神经网络的输入不是高度结构化的多维张量,而是图,图中的每个节点和边都有自己的特征,这些节点和边的特征及其拓扑关系可以被图神经网络所学习,进而的实现一些有关图的任务。图神经网络在社交网络分析、化学分子分析、广告推荐等领域取得了广泛的应用。
与传统的回归与分类不同,图神经网络可以解决的任务与图高度相关,主要包括对整图的分类/回归、对节点的分类/回归、对边的分类/回归、链接预测等。对整图、节点、边的分类/回归任务是比较好理解的,例如:从一张人物关系图中判断每个人是不是有5个以上的朋友,就属于比较简单的节点分类问题;而链接预测则比较特殊,次任务是致力于通过学习图的拓扑结构预测出两个节点之间是否会存在边,比如推荐问题就是典型的链接预测问题,可以通过预测一个表示人的节点是否会连向表示某手机的节点来决定是否对此用户推荐这款手机。而此课题想要解决的缺陷检测问题,其实是比较典型的整图分类问题,对于每一张代表深度学习模型的图,预测出是否存在缺陷就是此任务的目的,拓展开来,缺陷定位则就是节点分类问题,判断每个节点(对应神经网络的每一层)是否有问题,当然,本课题主要聚焦于缺陷检测任务。
从输入图的特点,还可以将图神经网络分成同构图神经网络和异构图神经网络。同构图神经网络用来处理同构图,异构图神经网络用来处理异构图,所谓同构图是图中所有节点和边都是相同类型的图,反之则是异构图。对于此文的任务来说,用以代表深度学习模型的图实际上是异构图,因为很明显,不同的层具有不同的特征,所有需要表示成异构图。进一步地,我们之后也就需要搭建异构图神经网络。
和传统的深度学习一样,搭建和训练图神经网络也并非易事,我们需要库的帮助,常用的图神经网络库主要有PyTorch Geometric[]、DGL[]等,这些库中有非常丰富的常用的图神经网络模型,例如图卷积神经网络[]等,可以极大的方便我们进行网络搭建和训练。基于我们的需求和易用程度,本课题选用DGL作为搭建和训练GNN的库。
3 总 结
由于深度学习程序的特殊性,无法利用常规的软件工程方法进行调试和检测缺陷,为深度学习模型研究专用的工具是十分有意义的。事实上,也的确有很多研究者在进行此类研究,这些解决方案主要分为基于动态分析的和基于静态分析的,这两种方式各有优劣,本文的设想是创新的采用图神经网络对深度学习模型进行分析,这种方法既有静态分析的一些优势,也能通过利用图神经网络从数据集自动化的提取特征而不再拘泥依托于根据经验预先定义的规则。这预计会是一项有一定开拓性的尝试。
参考文献: