技术领域
本发明属于软件工程领域,涉及一种求解器的算法选择,具体为基于元学习模型的可满足性模理论(Satisfiability Modulo Theories,SMT)求解器的算法选择。
背景技术
随着SMT背景理论的逐渐成熟及SMT问题判定算法的不断发展,SMT求解器已经广泛应用于软件工程、人工智能等领域,详见参考
SMT求解器的算法选择可以解决不同求解器具有性能差异的问题,使用户在面对新的SMT实例时可以更快更准确的找到适合该实例的最佳求解器。现有研究大都是生成需较长时间才能求解出的SMT实例,实例难度不足以区分不同算法性能,详见Blotsky D,MoraF,Berzish M,et al.Stringfuzz:A fuzzer for string solvers[C]//InternationalConference on Computer Aided Verification.Springer,Cham,2018:45-51.,且已有的算法性能评价严重依赖基准实例,存在过拟合的风险;另一方面,现有的SMT求解器的算法选择工具虽然已具备较高的准确率,但是仍然存在着泛化性较差、难以学习和适应新的SMT实例、较为依赖大规模数据等问题。
发明内容
为解决上述问题,本发明提供了一种基于元学习模型的可满足性模理论求解器的算法选择方法。本发明通过多目标演化算法生成多样性SMT实例,随后基于元学习思想对SMT求解器进行算法选择。
本发明的技术方案:
一种基于元学习模型的可满足性模理论求解器的算法选择方法,步骤如下:
步骤1:使用多目标演化算法生成多样性SMT实例
本发明实现了一种多目标演化算法,将种子SMT实例变异为需要花费不同时长才能解决的实例。目标函数分别是针对三种求解器生成三个不同难易程度的实例,实例难度以求解器求解时长为衡量指标:0s-1s为容易,1s-5s为一般,5s以上为困难。种子SMT实例来源于SMT-LIB基准数据集,由于实例片段很难直接处理,因此使用抽象语法树(AbstractSyntax Tree,AST)表示实例片段的内在结构,对其进行编码。针对每种理论背景下的SMT实例,具体流程如下:
(1)初始化种群P和P',其中P'为空;
(2)从种群P中随机选取两个实例作为parent,对实例进行变异操作,包括4种形式:交换(即随机交换两个相同属性的子树)、删除(随机删除一条assert语句)、添加(随机添加一条assert语句)、替换(随机替换字符或者数字);
(3)计算适应度函数,本发明中适应度函数为求解器在实例上的求解时间,求解时间是求解器在实例上的平均求解时间,这样可以消除求解器运行中的任何异常情况;
(4)筛选符合条件的SMT实例,即针对每种求解器,求解时间符合三种难易程度的实例,添加到种群P',然后将新生成的实例同样添加至种群P中;
(5)判断是否满足终止条件,即新种群是否达到预期大小,如满足则输出新种群,不满足,返回步骤ii,继续循环。
步骤2:基于元学习思想对SMT求解器进行算法选择
从步骤1中通过多目标演化算法得到了对于每种求解器不同难易程度的SMT实例后,将两者输入到元学习器进行训练,以获得SMT实例特征与不同求解器性能间的映射关系,形成元知识库;算法的选择需要依靠元知识的指导,当输入新的SMT实例时,可以通过已学习到的先验知识(即已训练好的模型参数)预测适合该实例的最优的算法。具体流程如下:
(1)数据集的划分
在元学习中,数据表现为集合(set)的形式,我们将数据集划分为两部分:训练集和测试集。训练集包含两组样本:支持集(support set)和查询集(query set),二者共同构成了一个任务(task)。支持集使用N-way,K-shot的方式进行元学习的训练,使得模型学习到“先验知识”,即初始化的参数,其中N-way表示训练数据中有N个求解器类别,K-shot表示每个类别下有K个被标记的SMT实例,本发明中N和K均设置为3。查询集中包含未分类的SMT实例。神经网络在经过训练后,学习到了区分不同类别的先验知识,这样在测试集中,只要通过少量的微调(fine-tune),就可以快速得到适合该SMT实例的最佳求解器。
(2)元学习模型的训练过程
在训练集中随机抽取3-way,3-shot样本作为支持集,剩余样本为查询集;对一个任务采样后进行训练,称为一个episode;一个batch由若干个任务组成,每次meta-train可以训练多个batch;遍历所有batch后即完成训练。
上述训练过程中,为了解决长距离依赖问题,学习器(learner)采用了长短期记忆(Long short-term memory,LSTM)神经网络。为了快速且有效适应不同SMT实例,元学习器(meta-learner)采用了MAML模型,用于更新长短期记忆神经网络中的初始化参数,MAML基于二重梯度(gradient by gradient),第一种梯度下降是针对每个任务执行的,第二种梯度下降针对每个batch完成第一种梯度下降后执行的,具体算法流程如下:
1)随机初始化模型参数(不包括超参数);
2)采样一个batch,对于每个batch中的任务进行第一次梯度更新;
3)使用一个任务的支持集进行训练,通过前向传播、计算梯度、反向传播的过程对参数进行更新,此时完成第一次梯度更新;
4)接下来进行第二次梯度更新,使用查询集计算一个batch的loss总和,然后计算出的梯度直接通过随机梯度下降(Stochastic Gradient Descent,SGD)作用于原模型上,用于更新其参数。
5)模型在该batch中的训练结束,返回步骤(2),继续采样下一个batch。
在训练过程中,每个episode都会得到不同理论背景下不同难度的SMT实例及其对应的最佳求解器,这使得训练集中包含了不同的类别组合,这种机制下模型学会了不同任务中的共性部分,从而在面对新的未见过的SMT实例时,也能快速的找到对应的最佳求解器。
(3)最佳SMT求解器的预测
在测试集中随机抽取3个求解器,每个求解器下3个不同难度的样本作为支持集,剩余样本作为查询集。在支持集中,通过利用上一阶段训练好的初始化参数对模型进行微调后,使用查询集(即需要被分类的新SMT实例)来测试模型。
本发明的有益效果:本发明能够针对特定SMT实例,快速且高效的为其选择最佳求解器,极大的节省了时间和资源。其次,本发明生成的多样性SMT实例在丰富已有的SMT数据库的同时,可以有效分析每种SMT求解器擅长解决的实例类型,对SMT求解器算法选择的研究具有重要意义。
附图说明
图1是本发明中使用多目标演化算法生成多样性SMT实例的流程示意图。
图2是本发明中基于元学习思想对SMT求解器进行算法选择的框架示意图。
图3是本发明中数据集划分的框架示意图。
具体实施方式
以下结合附图和技术方案,进一步说明本发明的具体实施方式。
步骤1:使用多目标演化算法生成多样性SMT实例
本发明实现了一种多目标演化算法,将种子SMT实例变异为需要求解器花费不同时长才能解决的实例。种子SMT实例来源于SMT-LIB基准数据集,基本格式如下:
(set-logic QF_LIA)
(declare-const x(Int))
(assert(forall((i Int))(>i 10)))
(check-sat)
其中,set-logic语句设置SMT实例的背景理论,此处为整数集上的线性算数理论,declare-const命令用于申明一个给定类型的常量,assert表达约束,check-sat命令告诉求解器去求解当前公式的可满足性,如果公式可满足,则返回sat,如果不满足,则返回unsat。
如图1所示,针对每种理论背景,使用多目标演化算法生成多样性SMT实例的流程如下:
1)初始化种群P和P';
2)从种群P中随机选取两个实例作为parent,对实例进行变异操作;
3)计算适应度函数;
4)筛选符合条件的SMT实例添加到种群P',然后将新生成的实例同样添加至种群P中;
5)判断是否满足终止条件,即新种群是否达到预期大小,如满足则输出新种群,不满足,返回步骤ii,继续循环。
步骤2:基于元学习思想对SMT求解器进行算法选择
如图2所示,在步骤1中通过多目标演化算法得到了对于每种求解器不同难易程度的SMT实例后,将两者输入到元学习器进行训练,以获得SMT实例特征与不同求解器性能间的映射关系,形成元知识库;算法的选择需要依靠元知识的指导,当输入新的SMT实例时,可先对其特征进行提取,然后基于先验知识预测适合该实例的最优算法。具体流程如下:
(1)数据集的预处理
如图3所示,数据划分为训练集和测试集,训练集中包含两组样本:支持集(support set)和查询集(query set),二者共同构成了一个任务(task),每个任务中的实例均为同一理论背景,图3中矩形框表示SMT实例。支持集使用N-way,K-shot的方式进行元学习的训练,使得模型学习到“先验知识”,即初始化的参数,其中N-way表示训练数据中有N个求解器的类别,本发明中N设置为3,即Z3、CVC4和Yices,三者均为目前主流SMT求解器,且在国际满意度模理论竞赛(SMT-COMP)中都取得了不错的成绩。K-shot表示每个类别下有K个被标记的SMT实例,本发明中K设置为3,表示实例的三种难易程度:简单、一般、困难。查询集中包含未分类的SMT实例,且测试集与训练集不同,仅含有一个任务。
(2)元学习模型的训练过程
从训练集中随机抽取3-way,3-shot样本作为支持集,剩余样本为查询集;对一个任务采样后进行训练,若干个任务组成一个batch,遍历所有batch后即完成训练。
上述训练过程中,为了解决长距离依赖问题,学习器采用了长短期记忆神经网络。为了快速且有效适应不同SMT实例,元学习器采用了MAML模型,用于更新长短期记忆神经网络中的初始化参数,MAML基于二重梯度,第一种梯度下降是针对每个任务执行的,第二种梯度下降针对每个batch完成第一种梯度下降后执行的,具体算法流程如下:
1)随机初始化模型参数(不包括超参数);
2)采样一个batch,对于每个batch中的任务进行第一次梯度更新;
3)使用一个任务的支持集进行训练,通过前向传播、计算梯度、反向传播的过程对参数进行更新,此时完成第一次梯度更新;
4)接下来进行第二次梯度更新,使用查询集计算一个batch的loss总和,然后计算出的梯度直接通过随机梯度下降作用于原模型上,用于更新其参数。
5)模型在该batch中的训练结束,返回步骤2),继续采样下一个batch。
(3)最佳SMT求解器的预测
在测试集中随机抽取3种求解器,每个求解器下包含3种不同难度的SMT实例作为支持集,剩余样本作为查询集;在支持集中,通过利用meta-train阶段训练好的初始化参数对模型进行微调后,输入查询集中新的SMT实例即可得到其对应的最佳求解器。
机译: 通过紧密结合结构过逼近算法和结构可满足性求解器来增强验证
机译: 通过紧密耦合结构可满足性求解器和重写算法来增强验证
机译: 通过紧密结合结构过逼近算法和结构可满足性求解器来增强验证