本文根据360算法专家史东杰在2019年软件绿色联盟开发者大会发表《AI算法在移动端安全实践和优化》主题演讲整理而成,从移动端的使用场景和建模优化两个维度介绍AI算法在360移动端的实践。
AI算法在360移动端的应用
360手机卫士的AI能力主要分为以下四大块:病毒能力、短信能力、电话能力和清理能力。在病毒能力方面,我们通过AI搭建了一套本地病毒识别引擎;在短信能力方面,我们有一套完善的端云结合的AI短信拦截系统;在电话能力方面,我们用AI算法对上亿号码进行黄页标记;在清理能力方面,我们用AI进行图片清理工作。
下面重点介绍AI技术在本地病毒识别以及短信骚扰拦截中的实践。
为什么我们要在本地搭建一套本地病毒识别引擎?因为有一些病毒本身并不含有恶意代码,但是他们会在执行的时候从云端下载恶意代码,并可以通过一定的手段绕过云端沙箱检测,使得我们搭建本地病毒引擎非常有必要。我们的本地模型包括静态模型和动态模型两部分。
静态模型利用AI分析APK文件,能够识别绝大多数病毒,并有着稳定的识别效果。动态模型,利用AI分析应用执行的敏感操作,规避软件从云端下载病毒的风险。由于客户端的应用性能限制,模型文件大小必须控制在几兆内,此外由于模型部署在厂商侧,我们还会对模型进行保护。AI算法基于应用行为,可以实现更精准的病毒检测。目前AI本地模型在误报率小于0.5%的条件下,识别率超过90%,处于行业领先位置,已经在部分厂商侧集成。
短信骚扰拦截,我们搭建了一套较为完善的端云结合的AI系统。在云端,我们搭建一套多模型融合的系统,包括短信多分类模型、行为检测模型、相似度模型、变体字模型、策略模型等,识别精度高。在本地,我们部署了较为简单的模型,保证在断网时依然可以提供拦截能力,目前短信拦截模型准确率超过98%,也在部分厂商侧集成了。
移动端部署的优化方案
整个AI模型的开发流程包括以下几个阶段,数据处理,算法开发、模型训练,模型管理和模型部署。目前由于深度学习在图像和自然语言处理领域成果显著,成为了算法开发的首选。模型部署时,云端模型我们可以在服务器直接部署或者采用Docker化的部署方式,但是在移动端,由于手机性能受限,我们需要对模型做一些优化工作。
目前市面上的AI框架有很多,由于TensorFlow具有更加完整的生态系统,成为了部署AI模型的首选。TensorFlow Lite 是 TensorFlow 在移动端的轻量级解决方案,它能够使模型具有低延迟和更小的二进制体积,从下图右侧可以看到生成Lite文件的整个过程,TensorFlow Lite相对于TensorFlow依赖的SO大小也只有原来四分之一。
我们把参数固化形成PB模型,再利用TensorFlow 转化工具转化为Lite模型。由于我们需要在厂商侧部署,所以我们还需要考虑下几个问题:
- 是否可以进一步压缩模型?
- 如何保护模型,防止模型泄露?
- 如何在云查时保护用户隐私数据?
针对这三个问题,我重点分享一下我们在AI模型部署时的三个优化方案:压缩模型、保护模型和原始数据保护。
1、压缩模型
(1)优化网络
- 在准确率差不多的情况,优先使用简单的模型
在准确率差不多的情况下,能否使用简单的模型来代替复杂模型呢?很多任务中,简单的模型就可以满足需求,并不需要复杂网络那么强的特征表达能力。下图左侧是一个简单的文本分类模型,右侧是一个相对复杂的文本分类模型,它们大小相差悬殊,分别是300K和300M,但是实验发现分类效果相差无几。此时完全可以使用简单模型代替复杂的模型。
那么是不是意味着这个复杂模型没有用武之地?答案是否定的,复杂模型可以为我们构造简单模型提供思路,通过对复杂模型进行裁剪得到简单模型,满足业务需求。而且复杂模型可以为更加精准的标记数据,提升浅层网络的训练效果。
- 减小Embedding维数,对于数值型特征不Embedding
另一种压缩模型的方法是减少Embedding维数。我们通过实验的方式去选择最佳的Emdedding维数,对于数值类的特性尝试不进行Emdedding,有效控制了模型的体积。
- Global Average Pooling代替FC层
对于CNN网络,通常的做法是使用全连接层进行映射。如果我们使用GAP代替全连接层,直接赋予了每个Channel实际的类别意义,也便于我们后期进行可视化。而且GAP不像FC层需要大量训练调优的参数,降低空间参数使模型更加健壮。
- 卷积网络优化
我们还可以对卷积网络进行优化,采用分组卷积代替常规的卷积操作。分组卷积是将输入通道分为G份进行卷积,再将结果合并输出,使参数量减少到常规卷积的G分之一。
深度可分离卷积可以看成分组卷积的一种特例和扩展,此时我们取分组数等于C1,对每一组进行常规卷积,卷积之后对于组和组之间采用1X1卷积进行连接,也有效控制参数量。
- 模型减枝
另一种很常用的压缩模型的方法就是模型剪枝,包括非结构化剪枝和结构化剪枝两种方式。对于非结构化减枝来说我们的目的是要得到一个大而稀疏的模型,对于结构化减枝来说我们是要得到一个小而稠密的模型。
1)非结构化剪枝压缩(large-sparse):训练一个大模型,对权重值进行阈值判断或者对权重值的绝对值进行排序,将低于阈值的或最小的权重值置为0,最后得到大而稀疏的模型。
2)结构化剪枝压缩(small-dense):由于非结构化稀疏对现有的通用GPU/CPU不友好,需要硬件优化的稀疏算法设计,所以我们可以训练一个小而稠密的模型,根据L1范数对所有filter进行排名,在所有层中全局修剪排名最低的filter,修剪索引为k的filter会影响它所在的层以及下一层。
(2)数据量化
前面的方案都是基于网络层面的压缩,我们还可以通过数据量化来压缩模型。因为神经网络参数在一定的范围内,本身是抗噪和鲁棒的,有大量论文研究表明确认最大值和最小值后每层数据使用8Bit定点化量化可以满足推断计算的需求。这和我们通过高像素和低像素的图片都可以分辨出其中的物体原理有点类似。
通过数据量化,可以大规模减小模型的体积,同时加快我们模型的预测速度。
2、保护模型
我们采用将模型可视化的PB文件转成SO文件的方式进行模型保护,如果希望进一步保护SO文件,还可以对SO进行加固。具体的实现方法就是采用AOT编译,通过tfcompile将TensoFlow计算图编译为可执行代码,这个可执行代码包括了模型从输入到输出的函数。这样做可以减少模型二进制大小,并且还可以避免一些运行时开销。
通过AOT编译之后,不仅有效保护了模型,模型预测速度和大小均得到了进一步的优化 。
实验数据显示单个样本运行速度提升15-20%,模型大小减少20-50%。
3、原始数据保护
原始数据保护使用了同态加密的方案,因为同态加密加密的结果是可以进行乘法和加法运算的。以下图为例:数字3和5经过同态加密得到A和B,A和B在进行加法和乘法运算后经过同态解密得到的结果与直接运算结果一致。
在模型训练时,对神经网络中的非线性和激活函数用多项式来近似表示,近似阶数越高,模型越复杂。
模型训练完成后,将客户端的原始数据进行同态加密后上传云端,云端模型输出结果后反馈到客户端进行同态解密,最后得到预测的结果。在这个流程中,原始数据得到了很好保护。
附:同态加密算法参考文献
- Dowlin N, Gilad-Bachrach R,Laine K, et al. CryptoNets: Applying Neural Networks to Encrypted Data withHigh Throughput and Accuracy
- Ehsan Hesamifard, HassanTakabi, and Mehdi Ghasemi. CryptoDL: Deep Neural Networks over Encrypted Data
- Chou E , Beal J , Levy D , etal. Faster CryptoNets: Leveraging Sparsity for Real-World Encrypted Inference
- Ahmad Al Badawi, Jin Chao, JieLin, et al. The AlexNet Moment for Homomorphic Encryption: HCNN, the FirstHomomorphic CNN on Encrypted Data with GPUs
要点总结
- 云端部署AI模型主要考虑模型的准确率和性能,移动端部署还需要考虑模型大小;
- 对移动端模型尽可能优化,优化手段包括采用更简单的模型、减少embedding维数、采用参数量更少的结构、模型剪枝、量化等;
- 可以采用AOT编译方式隐藏模型结构,同时进一步优化模型大小和性能;
- 利用同态加密的方式可以有效保护用户隐私数据。
·END·