例如 Schuts 等人在飞利浦的开发项目中使用模型学习来支持传统嵌入式软件的复兴。该项目涉及到一个新引入的硬件组件——电源控制组件(PCC),用于启动和关闭介入放射学系统。系统中的所有计算机都具有软件组件,即在启动和关闭的执行期间通过内部控制网络与 PCC 通信的电源控制服务(PCS)。为了处理具有不同接口的 PCC 的新硬件,则需要 PCS 的新型实现。由于必须支持新型和旧型 PCC 硬件的不同配置,新型与旧型 PCS 软件需要具有完全相同的外部行为。图 9 说明了所遵循的方法。由传统的 A 实现以及重构的 B 实现可获得 Mealy 机器模型 MA,而使用模型学习可获得 MB;这些模型将使用等价检查器进行比较。当等价检查器发现反例σ时,我们将检查 A 和 MA 在输入σ上表现是否相同,同样检查 B 和 MB 在输入σ上是否相同。若 A 和 MA 或者 B 和 MB 存在差异,我们便会要求学习者基于反例σ构造一个改进的模型。否则σ便表示 A 和 B 之间的差异,而我们也会根据对于σ的响应表现差劲的行为来改变 A 或 B(或是两者)。为了解决可扩展性问题,往往通过增加刺激来学习以及迭代地检查实现。在组件集成之前的早期阶段,重构实现和传统实现都出现了问题。也正因如此,才能避免开发的后期阶段昂贵的重工现象。
图.9 最新进展 近年来,有关模型学习的算法已取得显著进步,这对将这些技术应用扩展到更大的系统而言至关重要。 基本算法。自 1987 年以来,Angluin's 的 L *算法已得到显着改善。原始 L *对观察表中的每个条目执行成员资格查询;但这通常是多余的,因为该查询的唯一目的是区分状态(行)。因此,Kearns 和 Vazirani 通过鉴别树(discrimination trees)将 L *算法的观察表进行重设,而该鉴别树基本上是用于确定等价状态的决策树。 L *的另一个低效的体现是将反例的所有前缀作为行添加到表格中。通过一致性测试或运行时监控获得的反例样本可能极长且极小,而这会导致大量多余的成员资格查询。Rivest 和 Schapire 发现不必将反例的所有前缀作为行添加到表格中,将一个选定的后缀添加为列便足够了。 Isberner 等人提出的新 TTT 算法是目前用于主动学习的最有效的算法。该算法基于 Kearns 和 Vazirani 以及 Rivest 和 Schapire 的想法,但消除了通过清理内部数据结构及重新组织判别树来处理长型反例时过长的鉴别树。假设某 Mealy 机 M 具有 n 个状态和 k 个输入值,并且返回的最长反例长度为 m。然后在最坏的情况下 TTT 算法需要长度为 O(n + m)的 O(n)个等价查询和 O(kn2 + nlog m)个成员资格查询。这种最坏情况的查询和符号复杂度与 Rivest 和 Schapire 的算法一致,但实践中 TTT 的速度更快。 TTT 算法通常比 L *算法产生更多的中度假设(intermediate hypotheses)。这表明单就 membership 查询中使用的输入符号数量可能并不是比较学习算法的适宜度量:我们还需考虑实现等价查询所需的测试查询的数量。membership 与测试查询中的输入符号的总数似乎是比较实践中学习方法的可靠度量。我的两个学生 J.Merman 和 A.Fedotov 在大量基准(协议、控制软件、回路等)上,比较了学习算法和测试算法的不同组合,并发现 TTT 使用的输入符号平均比 L*少 3.9 倍。 当可以同时运行 SUL 的多个实例时,学习和测试能够很容易被并行化。能够加速学习的另一项技术是保存并恢复 SUL 的软件状态(检查点)。其中的益处是:当 learner 想要从保存的 q 状态中探索不同的外向转换时,仅仅需要恢复 q,这通常比复位系统,再经由输入序列返回到 q 要快得多。Henrix(21)报告了在实验中使用 DMTCP(分布式多线程检查点)进行检查点加速学习,系数为 1.7。 寄存器自动机。尽管我们已经看到学习状态机中基本算法的诸多进步,但这些算法仅能成功学习相对很小的状态机。为了能把这些算法扩展至现实应用领域,使用者一般需要手动构建抽象或者映射器。2这可能是个耗时的活动,需要几次迭代和 SUL 的专业知识。因此,最近已经进行了许多工作以将学习算法推广到结构更多结构、类型更丰富类的模型中去,特别是其中数据值可以被传送,存储和操纵的 EFSM 模型。 (责任编辑:本港台直播) |