人工智能软件的分析与验证(1) - AI软件的可靠性与落地方法
随着深度学习革命的不断发展,AI算法驱动的软件产品越来越影响我们的生活。比如人脸识别、机器翻译等应用越来越广泛,技术也在像纵深方向发展,比如像自动驾驶从L2向L5不断迭代。
但是,一个硬币往往是有两面的,随着AI软件复杂性的提升,可靠性问题、安全问题的重要性也成为躲不过的关口。
算法工程师的技术栈也是有限的,对于传统的软件工程、软件分析、软件验证等方向上加的技术点容易不足。所以指望算法工程师同学靠自测来避免可靠性问题可能并不是银弹,我们需要一个跨学科的方法论来征服这片新大陆。
AI软件可靠性概述
按照中国计算机学会软件工程专业委员会2020年发布的《智能软件可靠性的研究进展与趋势》的分类,AI软件可靠性的分类如下图所示:
AI软件可靠性
其中上面的部分,也就是数据可靠性的部分,是算法同学们比较熟悉的,不仅受过专业的训练,而且在实战中也积累了比较丰富的经验。所以我们后面遇到就具体问题具体分析,直接讨论细节。
下面的部分,也就是软件和硬件平台的可靠性,是工程同学比较熟悉的,可能深度学习框架和AI加速芯片等新因素带来的一些新挑战,但是跟传统的软件还是一脉相承的。
相对复杂一些的是中间的部分,也就是模型可靠性部分,比如可解释性就是一个一直以来算法的难题。对于AI软件的正确性分析,也是一个较新的课题。
这一部分的困难在于,需要对于软件工程、程序分析等传统软件技术要有一定深度的了解,同时还要对深度学习算法等有精深的理解。
如何保障AI软件的可靠性
上面讲的三类可靠性,大家应该是都认可的,但是只有这些理论还太虚,我们需要讨论如何落地。
如果要保障AI软件的可靠性的话,办法无非两种:一种是测试,一种是正确性验证的方法。
我们先看下知识体系的大图:
AI软件可靠性保障的技术手段测试的话其实挑战相对更小一些,只是相对。
首先,我们有生成对抗网络这样的利器,这是AI软件独有的方便。
其次,在传统测试中发挥重要作用的模糊测试和符号执行,在AI软件中还是可以使用。
第三,写测试脚本时,需要指定验证所期望的结果,这方面有蜕变测试等方法可用。
第四,参照普通软件的coverage测试,我们可以对AI软件也进行神经元级、网络层次级的覆盖率测试,也可能进行MC/DC分支情况覆盖率测试。
验证方面,也有传统技术和深度学习结合的方法,比如基于SAT/SMT求解器的约束求解方法,基于抽象解释的方法。
针对AI模型,也有其个性化的属性,比如局部鲁棒性属性、区间属性等,其基础是利普希茨属性。
利普希茨属性是一个连续性属性,有点类似于我们学习微积分时的连续性概念,它主要限制的是函数变化的速度。我们在神经网络中,主要限制的是向量之间的变化速度,也就是范数的变化值。在不同的函数中,变化最大值是个常数,叫做利普希茨常数,这个值在实践中我们需要做一些估计。
这一节就先说这么多,后面我们针对测式和验证两个方向依次展开。
网友评论