
延续深度学习網絡精简设计的主题,我们必须在正确率不打折的情况下,设计出兼具低运算复杂度、低耗电、低参数量的智能算法。目前的设计原则是将「冗余」的运算予以精简。这些庞大运算以及冗余由何而来,可以参考前文。本文中介绍剩下的两种精简设计策略。
網絡知识蒸馏(knowledge distillation),是将已经训练好的神经網絡推理能力转移到某个全新设计的網絡,避免掉耗时的重新训练过程,又有人称为Teacher Student Learning,全新待训练的網絡称为「学生網絡」。训练原理是规范学生網絡在某些层级的網絡推理输出(能力)与既有的(老师)網絡相同。
采用大量數據、长时间训练成一个效能强大的網絡之后,因为应用情境的限制,时常必须局限網絡的深度、运算数量等,就可以利用这样的方式转移既有的运算能力,达到精简的目的。目前有一些云运算的公司使用这种方式来精简網絡,甚至因为资源配置的关系,刻意优化網絡来使用CPU运算。
这有额外工程上的好处:加快各种版本的網絡设计。比如说已经存在了一个参数庞大以及正确率高的網絡,但是因为产品线的关系,必须时常将智能应用实现在多个不同运算平臺上。利用这种方式即可将既有網絡性能,移转到新的(可能运算能力较低的)神经網絡,经验上可以大大避免重新训练的漫长时间,而加快产品部署。
網絡模型剪枝(network pruning)是将網絡中数值趋近零的網絡连结予以剪除,因其对推理的结果影响不大。此方式可行的原因在于,经过观察,相当部分的網絡参数接近零,意谓这些连结对于網絡输入以及输出的影响性很小,于是直接移除。一般的作法是将训练好的網絡依次剪除少部分,然后再进行fine tuning(少量训练),将推理的能力分散到剩下的神经连结中。这样的程序可以持续好几个轮回,直到符合精简条件。
这作法是非常多运算平臺使用的網絡精简方式,效果也相当显著。主要的限制是,系统或是硬件架构必须支持稀疏矩阵运算,因为剪除之后網絡数值结构不再为稠密矩阵,必须采用稀疏矩阵运算才能发挥功效。另外網絡剪枝也时常会搭配参数简化,例如将網絡由浮点运算置换为整数运算,额外降低参数精度以及加速。
这系列文章讨论的四种網絡精简原则可以彼此混用。而且这些为设计深度学习的基底網絡,可以再加上其他網絡元件满足各种应用例如数值预测、人脸識別、物件侦测、影像識別等。
另一个角度,精简设计也可以视为查找适合的神经網絡设计。所以近来也有人使用autoML的方式(参考前文)来优化精简运算,几个应用情境看起来也颇有成效。对于克服边缘计算的严苛条件,似乎指日可待。