之前陆陆续续看了许多模型压缩相关的文章,自己业务中也接触过一些相关的客户,今天周末没事做,把模型压缩相关的内容整理一下做个分享。可能更多地从科普的角度去介绍,因为我也不是专业做这方面技术的研究。

首先明确下模型压缩的概念,就是在尽可能不改变模型效果的情况下,减少模型的体积,使得模型在使用的时候有更快的速度。

业务视角去看模型压缩的意义

模型压缩这个概念貌似是最近两年突然火了起来,究其原因,是因为整个机器学习领域正在逐渐从理论派向工程派延伸。什么是理论派呢?从业务的角度看,理论派就是做一些理论验证工作,通过建模证明机器学习在哪个业务能落地。而工程派指的是如何能让机器学习应用的更高效,模型压缩就是工程派的一个重要落地方向。

模型压缩更多地是应用到复杂的深度模型上,并且越来越受到重视,因为当模型的准确度达到一定程度后,如何用更少的硬件成本去做模型服务变的有意义。

举个例子,比如用深度学习变脸这样的业务。

假设在模型优化前,原始模型处理每个视频要30秒,那么一张GPU卡一分钟只能处理2个视频。假设APP的使用峰值是1000人同时使用,那么这家公司至少要有500张GPU卡才能满足需求,不然就会出现服务排队现象,500张卡的成本大约在3000万每年。

如果模型压缩技术能让模型变小许多,使得每个视频处理只需要10秒,那么这个客户可能只需要150张卡就能满足业务需求,每年成本也能控制在1000万左右。省下的2000万,就是模型压缩技术的价值。

模型压缩技术有哪些

目前我自己了解到的的模型剪枝技术包含以下几个方向,

(模型构成)

  1. 剪枝:深度学习模型可以看作是一个复杂树状结构,如果能减去一些对结果没什么影响的旁枝,就可以实现模型的减小

  2. 量化:模型由大量的浮点型权重组成,如果能用float32替代原有的float64表示,模型就近乎减小一倍的体积,量化也是最容易实现的一种压缩方式

  3. 共享权重:有点像提取公因数,假设模型的每一层都有公用的公因数,是否可以提取出来在结果处做一次运算,而不是每一层都算一次

接下来会针对以上三点逐个介绍。

模型剪枝

模型的构成是由许多浮点型的神经元相连接,每一层根据神经元的权重将信息向下传递。但是有一些神经元的权重非常小,这类神经元对整个模型的加载的信息的影响也就微乎其微。如果可以把这些权重较小的神经元删减掉,既减少了模型大小,也不会对模型的效果带来大的影响。

简单理解的话如下图所示:

每一层把数值小的神经元去掉,但是究竟剪枝粒度维持到多大是很有讲究的,比如可以把每层最小的5个减掉,也可能只剪3个,或者每层有每层不同的策略,也可以用L1/L2正则的方式去做。

剪多了,模型精度影响会比较大,剪少了没有效果。所以这里面需要大量的尝试和迭代,在实践中,剪枝是一个迭代的过程,这通常叫做「迭代式剪枝」(Iterative Pruning):修剪-训练-重复(Prune / Train / Repeat)。

既然有大量的迭代验证工作,是否可以引入AutoML机制,可以通过NAS(神经网络搜索)的方式探索出剪枝候选集,然后自动的剪枝-》验证-》迭代。从NAS的角度去实现还是有许多工作可以去做,也是一个热点话题。

模型量化

模型的精度量化并不是简单的将高精度的权重用低精度权重表示就好了,这里面涉及到许多适配硬件的因素。先来看下神经元权重是如何在计算机里表示的。目前DL中大部分都是用32bit float类型进行计算的,bit位数的多少直接限制了数据类型能够表达的数据范围,比如float 32的数据是由1bit表示符号,8bit表示整数部,23位表示分数部组成(计算机课都学过的)。

用更低位的数值类型意味着更小的数据表示范围和更稀疏的数值,量化的时候就会造成数值精度损失。比如要把float数值量化到int类型,那么首先小数部分会损失,而那些超过int类型能够表达的范围的值也会被压缩到int能够表达的最大或最小值。

所以,如果要压缩模型,从float32压缩到多少变的关键,目前主流的方式是压缩到int8。压缩到int8意味着内存的节省,节约了3/4,同时也提升了计算效率,因为在GPU这样的硬件上,低位的浮点计算速度会远远高于高位浮点计算速度。

So,why int 8?有相关的人士分析过,从概率分布角度去看,int8的字符长度可以较完整的覆盖大部分的模型权重值。float 32到int8的转变,只需要一个系数乘积将原有的小数部分变为整数。int 8量化效果在许多论文上可以看到,是目前最主流的模型压缩方式。

模型共享权重

共享权重的概念指的是模型在构建的过程中是否有些局部的信息在全局是多次出现并重复使用的,举一个卷积神经网络的例子。当CNN模型在识别以下这个图像的时候,

需要卷积核去全图扫描这个图像,找出每个边缘的特点,但是这种对称图像一定存在一些形状的重复性,比如下图我框出的这些结构。

这些重复结构意味着卷积核在计算权重的时候会有部分权重的相似性,这些相似性是全局可共享的。那么如果可以通过聚类的方式挖掘出这些可以共享的权重系数,并且以类别的方式让它们共享一些权重,就可以实现模型的压缩。

下图表示的就是卷积核中的部分权重是有共享关系的,可以将他们分为4个种类,然后针对类别去更新权值即可。

总结

因为业务需要,最近学习和总结了这篇文章,写的很简单,有不清晰或者不正确的地方请指正。另外,从根客户接触的情况看,目前模型优化还没有特别好的自动化工具,很多方法应用到业务中都会造成大规模的模型精度损失,所以目前很多模型压缩工作需要大量人力介入和反复调试,希望日后有真正工业级别的压缩工具诞生。

参考:

  1. https://blog.csdn.net/malvas/article/details/8664778

  2. https://www.cnblogs.com/arkenstone/p/10856466.html

  3. https://blog.csdn.net/weixin_38740463/article/details/90181264

  4. https://zhuanlan.zhihu.com/p/97198052

  5. https://www.zhihu.com/search?type=content&q=%E6%A8%A1%E5%9E%8B%E5%8E%8B%E7%BC%A9

  6. https://baijiahao.baidu.com/s?id=1641186698550736256&wfr=spider&for=pc

感谢以上文章的作者们

浅谈模型压缩之量化、剪枝、权重共享相关推荐

  1. 闲话模型压缩之量化(Quantization)篇

    1. 前言 这些年来,深度学习在众多领域亮眼的表现使其成为了如今机器学习的主流方向,但其巨大的计算量仍为人诟病.尤其是近几年,随着端设备算力增强,业界涌现出越来越多基于深度神经网络的智能应用.为了弥补 ...

  2. 韩松老师模型压缩--三步剪枝法学习笔记

    韩松老师模型压缩–三步剪枝法学习笔记 Learning both Weights and Connections for Efficient Neural Networks Abstract 神经网络 ...

  3. 模型压缩:量化、剪枝和蒸馏

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 编者荐语 近年来,BERT 系列模型成了应用最广的预训练语言模型, ...

  4. 深度学习模型压缩(量化、剪枝、轻量化结构、batch-normalization融合)

    "目前在深度学习领域分类两个派别,一派为学院派,研究强大.复杂的模型网络和实验方法,为了追求更高的性能:另一派为工程派,旨在将算法更稳定.高效的落地在硬件平台上,效率是其追求的目标.复杂的模 ...

  5. 【综述】闲话模型压缩之网络剪枝(Network Pruning)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 来自 | CSDN 地址 | https://blog.csdn.net/jinz ...

  6. 闲话模型压缩之网络剪枝(Network Pruning)篇

    1. 背景 今天,深度学习已成为机器学习中最主流的分支之一.它的广泛应用不计其数,无需多言.但众所周知深度神经网络(DNN)有个很大的缺点就是计算量太大.这很大程度上阻碍了基于深度学习方法的产品化,尤 ...

  7. 【模型压缩】通道剪枝《Pruning Filters For Efficient ConvNets》论文翻译

    论文题目:<Pruning Filters For Efficient ConvNets> 论文地址:https://arxiv.org/abs/1608.08710 主要思想: 这篇文章 ...

  8. 【模型压缩】通道剪枝--《Pruning Filters for Efficient ConvNets》

    论文题目:<Pruning Filters For Efficient ConvNets> 论文地址:https://arxiv.org/abs/1608.08710 1. 概述 由于CN ...

  9. 从多项式函数拟合实验出发浅谈“模型选择、欠拟合和过拟合”问题

    在本笔记中,我们将从简单易懂的多项式函数拟合实验出发,谈一谈如今做机器学习绕不开的三个重要概念:模型选择.欠拟合和过拟合,并且进一步挖掘如何选择模型.如何避免欠拟合和过拟合问题.本笔记主要从下面五个方 ...

最新文章

  1. WMI技术介绍和应用——查询磁盘分区和逻辑磁盘信息
  2. 硬核吃瓜!上万条数据撕开微博热搜真相
  3. TMB计算的小工具-calculate_TMB.exe
  4. 10 分钟从零搭建个人博客
  5. Good Number Gym - 102769G 2020年CCPC秦皇岛分站赛
  6. [LeetCode] 234. Palindrome Linked List 回文链表
  7. Lua开发工作笔记0003---Windows下搭建Lua开发环境
  8. GET请求淘宝H5页面获取商品信息
  9. linux 切换 amd 显卡,ubuntu 14.10 (64位)下载amd显卡,实现双显卡切换
  10. 2016十月新番简介
  11. 文献阅读——梅州佛教香花的结构、文本与变体
  12. 当年绑架李嘉诚之子后,张子强与李嘉诚对话的细节
  13. 汇编条件判断 eq neq
  14. 11.18-刷题日结
  15. Android Xposed 框架
  16. 日本最大的120家医用物资供应商列表
  17. windows照片查看器没了_Secondary Display Photo Viewer(图片查看器)下载
  18. 背靠百度,度小满金融越来越稳
  19. 如何将您的Nintendo 3DS重置为出厂设置
  20. JS中showModalDialog 详细使用

热门文章

  1. PAT甲级1005 Spell It Right :[C++题解]字符串处理
  2. Linux进程间通信六 Posix 共享内存简介与示例
  3. Java synchronized 与 lock (Reetrantlock)锁性能比较
  4. 20十年后的计算机作文600字,20年后的学校作文600字
  5. python3.6小程序_python3.6 tkinter实现屏保小程序
  6. 华南师范大学计算机学院调剂,华南师范大学计算机学院继续接受硕士研究生调剂...
  7. access 分表存储_sharding:谁都能读懂的分库、分表、分区
  8. python mysql ssh隧道_在python中使用ssh隧道连接mysql
  9. Qt模型视图中的委托
  10. vue 高德地图多边形_Vue + 高德地图画矢量图