开发者说 | 自然语言处理中的神经网络模型压缩方法

Posted 亿咖通科技

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发者说 | 自然语言处理中的神经网络模型压缩方法相关的知识,希望对你有一定的参考价值。

ECARX Developer由一群正在对车联网行业做出贡献的年轻工程师,程序员,数据分析师,设计师,产品经理等优秀人才组成。他们将跨团队、跨领域合作和分享,以满腔热情和丰富的行业知识,为读者带来尖端的科技信息和产品研发背后的故事。


ECARX DEVELOPER


专注于车内语音交互中自然语言处理,涉及基于神经网络的意图识别、命名实体识别,多轮交互模型设计,异构架构上推理优化。与团队一起申请专利数十项。


自然语言,是指自然地随文化演化的语言,比如汉语、英语等各种语言;自然语言处理,是人工智能中最为困难的问题之一。



开发者说 | 自然语言处理中的神经网络模型压缩方法


人工智能神经网络是指利用计算机模拟人的生物神经元,来学习拟合一个数学模型,完成一个特定的功能。其在视觉和语音领域有着广泛的应用,例如图片分类、图片识别、动作检测、自动驾驶、语音识别、自然语言处理等。在理解人类自然语言方面,神经网络相比传统非神经网络方案有较大优势,准确度更高,可以处理各种任务:意图识别、关键字词提取(命名实体识别)、关系提取、高层语义分析等。


汽车在数字化智能化的过程中,不可避免地使用了很多神经网络模型,例如自动驾驶中的道路识别、物体识别,车内语音交互场景下的用户意图识别、命名实体识别等。而神经网络模型也有其缺点:语料质量要求高,数量大;语料规模大的情况下,训练时间长。在实际操作的过程中,ECARX语音团队创新性地对神经网络进行“压缩”,来提升学习及训练的效率。


压缩的意义


汽车属于端侧,车内的神经网络模型推理属于边缘计算,其对计算资源比较敏感。神经网络参数规模越来越大,内存占用成本也越来越高,巨大的参数也不利于优化计算。例如cache不能全部容纳所有参数,导致频繁切换带来运行效率降低;NPU/GPU运算场景中,所有参数不能一次性导入NPU/GPU并常驻硬件,频繁IO也会带来性能衰减。特别是在边缘计算中资源受限的应用,小尺寸参数显得越来越重要。


神经网络模型参数压缩方法种类包括:

模型剪枝

知识蒸馏

量化

网络融合


模型剪枝


神经网络的剪枝是指在权重中找出对结果影响比较小的权重或者卷积核,然后去除掉这样的权重连接或者卷积核。


例如全连接层或卷积层中,每一个连接有一个weight代表该连接的权重,按照权重weight的绝对值大小排序,把最小的K个连接的weight直接设置成0,然后微调网络。把权重较小的设置成0后,参数变得很稀疏,一般使用新的数据结构来保存参数以达到节省存储空间的目的,在计算时也使用稀疏矩阵计算函数来提高计算速度。


假设要剪枝的是整个卷积核,可去掉某个卷积核,重新训练评估对结果的影响。如果对精度的影响在可接受范围之内,则可以剪掉该卷积核。

 

知识蒸馏


知识蒸馏(Knowledge Distillation)核心思想是通过迁移知识,从而通过训练好的大模型得到更加适合推理的小模型。是一种将大模型学习到的大规模参数,压缩进规模小的模型,使得神经网络更小、参数更少、运算更快,而推理准确度可以匹敌大模型结果的方法。

 

开发者说 | 自然语言处理中的神经网络模型压缩方法


模型越大且训练集足够多,能训练生成的网络精度越高,所以BERT神经网络能在很多语言类任务中取得好的成绩。但是带来的问题是网络参数大、计算开销大,训练时间长。后来出现了新方法,先用大网络大训练集训练模型,得到很好的准确度,这个大网络被称为teacher网络。然后用小网络在小训练数据集上学习大网络的输出,也能达到接近大网络的准确度,但是参数规模要小很多,这个小网络叫student网络。


为什么student网络自己训练的效果没有学习teacher网络的效果好呢?原因是student网络训练时,参考标签不是原始真实标签,而是teacher网络的输出值。例如最后的任务是分类头softmax,真实标签是若干标签值中只有一个是1,其余都是0。但是teacher网络的输出值带有更丰富的信息。例如一个训练数据除了属于某个分类,但在第二个分类上也比较接近, 这种情况下teacher网络在第二个分类上的值就不是0而是一个合适的概率值。知识蒸馏的过程,就是student网络学习teacher网络的过程。

 

量化


神经网络的参数一般是浮点数类型,单精度浮点或者双精度浮点。单精度浮点对应的位长是4个字节32位,其数值范围为-3.4E38~3.4E38。双精度浮点对应的位长是8个字节64位,数值范围为-1.79E+308 ~ +1.79E+308。


神经网络的参数和每一层的输入输出数据,并不是均匀的分布在从最小值到最大值的范围内。大部分情况是数据分布在一个很小的范围之内,要么聚类成几个值, 这就给参数压缩提供了机会。


量化就是把浮点数转换成位长比较小的定点数(整数类型),例如8位整型、16位整型等。下面是量化计算公式:


r = S * (q - Z)

q = round(r/S + Z)


其中S是缩放因子scale, 表示浮点数和整型数据的比例关系, Z是zero-point零点,表示量化后浮点数0对应的整型值, 它们的计算公式如下:


S = (rmax + rmin) / (qmax + qmin)

Z = round(qmax - rmax /S)

rmax、rmin分别是浮点数的最大值和最小值, qmax、qmin分别是整数的最大值和最小值。

 

对称量化


上面公式中Z=0,也即是说浮点数的0点和定点数整型0点位置相同,浮点与定点转换时就可以不考虑Z的值,这种情况叫对称量化, 如下图所示。

 

开发者说 | 自然语言处理中的神经网络模型压缩方法


如果量化成8位定点,则整型最小值-128,最大值127

 

开发者说 | 自然语言处理中的神经网络模型压缩方法

 

非对称量化


浮点的0点不等于定点的0点,也就是Z值不为0, 浮点到定点的转换过程中需要考虑Z值。

 

开发者说 | 自然语言处理中的神经网络模型压缩方法

 

N值化


量化方法除了把浮点转化成8位整型、16位整型外,还可以用更少的位长,例如6位、4位、3位等。

 

量化方法由于对原始数据进行了变换,部分数据会被截断,例如大于rmax的值会被认为是rmax,另外量化后的颗粒度也比原始数据更大, 这都会导致精度损失。

 

量化方法可以对神经网络的全部实施,也可以单独对网络的某一层进行量化,只对某一层量化计算,输出的时候需要反量化,频繁量化反量化会带来性能衰减和精度下降。

 

开发者说 | 自然语言处理中的神经网络模型压缩方法

 

网络融合


在应用中通常由一个网络完成一个任务,如果有多个任务就需要多个独立的神经网络。这既增加了参数规模,又增加了推理结算时间。一种优化方法是把2种网络融合起来,主干部分共享,最后的任务部分分开,这样可以起到减少参数规模,加快推理速度的效果。


以自然语言处理中的意图识别与命名实体识别为例, 通常意图识别是一个单独的神经网络,命名实体识别又是另一个网络。如下图所示,独立的意图识别和命名实体识别网络。

 

开发者说 | 自然语言处理中的神经网络模型压缩方法
开发者说 | 自然语言处理中的神经网络模型压缩方法


把2个网络融合起来,共享前置部分,显著减少了参数规模, 同时也提高了推理速度。


融合模型如下图所示:

 

 

神经网络压缩,有的是训练中压缩,然后微调,有的是训练后压缩,压缩后不微调,有的会带来精度损失。实际应用中可以单独使用某一种,也可以同时使用多种,关键是评估准确度损失,对开发难度作综合考虑。


注:ECARX Developer持续鼓励公司技术大咖分享技术干货和个人观点。个人分享的故事及技术思考不代表公司立场。



以上是关于开发者说 | 自然语言处理中的神经网络模型压缩方法的主要内容,如果未能解决你的问题,请参考以下文章

详解NLP技术中的:预训练模型图神经网络模型压缩知识图谱

NLP中的对抗样本

NLP-09textCNN

图神经网络在自然语言处理中的应用(中文版),23页pdf

MIT开发神经网络模型,检测自然对话中的抑郁迹象

自然语言处理|语言模型介绍