当前位置:   article > 正文

高效深度学习:让模型更小、更快、更好!

efficient deep learning: a survey on making deep learning models smaller, fa

40c50a9e29787a29dd8fb6b9f9686b9e.png

作者 | 太子长琴  

整理 | NewBeeNLP

自从 AlexNet 在 ImageNet 上大放异彩后,图像就进入了预训练时代,随后 VGGNet,Inception,ResNet 不断取得新的 SOTA,不过同时模型也越来越大。自然语言领域要从 Transformer 架构开始,该架构采用自注意力机制,其设计上的可并行性以及强大的表征能力首次让大规模预训练语言模型成为可能。BERT 和 GPT 成为自然语言理解和自然语言生成的代表,无法避免地,效果越好,模型越大——大到成本普通公司连想都不敢想。

此时,对一个深度学习的研究者或一个应用场景的开发者,一系列挑战接踵而来:

  • 可持续的服务端伸缩:训练可能是一次性的,推理却是持续性的,且需要大量资源

  • 端部署:IoT、智能设备等

  • 隐私和数据敏感性:当用户数据可能敏感时,能够使用尽可能少的数据进行训练至关重要

  • 新应用:某些新应用程序提供了现有现成模型可能无法解决的新约束

  • 模型爆炸:同一基础设施(托管)上为不同的应用程序训练和/或部署多个模型可能最终会耗尽可用资源

今天,我们分享一份实用的模型训练和部署优化指南高效深度学习),主要关注模型效率问题,包括模型技术、基础设施和硬件等,并提供一个基于实验的优化和开发向导。

  • 论文:Efficient Deep Learning: A Survey on Making Deep Learning Models Smaller, Faster, and Better

  • 链接:https://arxiv.org/abs/2106.08962

  • Code:https://github.com/reddragon/efficient-dl-survey-paper

高效深度学习主要围绕两个方面:

  • 推理高效

  • 训练高效

无论优化目标是什么,我们都希望实现帕累托最优。因此,本文建议转向一组算法、技术、工具和基础设施,它们可以协同工作,以允许用户训练和部署关于模型质量和空间占用的帕累托最优模型。

帕累托最优:指资源分配的一种理想状态,假定固有的一群人和可分配的资源,从一种分配状态到另一种状态的变化中,在没有使任何人境况变坏的前提下,使得至少一个人变得更好,这就是「帕累托」改进或「帕累托最」优化。——《百度百科》

1. 心智模型

包括五个主要方面,前四个关于建模,后一个关于基础结构和工具。

f659bfa30b55bd5d2b307cc75f009b28.png
  • 压缩技术:如量化

  • 学习技术:如蒸馏

  • 自动化:如HPO(超参数优化)方法中超参数变成参数数量;架构搜索

  • 高效架构:如卷积层、注意力层

  • 基础设施:如 Tensorflow、PyTorch 等

2. 高效深度学习

2.1  压缩技术

2.1.1 剪枝

剪枝是将部分参数裁剪或变成0,并保证质量在预期的水平。剪枝后的网络也可以说变稀疏。

经典工作 OBD (Optimal Brain Damage,LeCun,Hassibi):先把网络预训练到适度的质量然后迭代地修剪掉「显著性」分数最低的参数。通用算法流程如下:

58ddc593bf228e78594f6ab1b1d75c90.png

OBD 使用损失函数对候选移除参数的二阶导来近似显著性分数,其直觉是,给定参数的这个值越高,如果剪掉它后损失函数的梯度变化越大。为加速二阶导计算,OBD 忽略了偏导,直接计算 Hessian 矩阵的对角线元素。LeCun 的研究表明,剪枝可以将参数减少 8x 而不降低分类准确率。

无论哪种剪枝策略,核心算法都是相似的,包括:

  • 显著性:二阶导或更简单量级的剪枝,或基于动量的剪枝来决定显著性分数

  • 结构或非结构化:

    • 非结构(随机)是最灵活的剪枝方法,所有参数都平等对待;可以看作 block size=1 的结构化剪枝

    • 结构化剪枝方法,参数在 block 中剪枝(例如在权重矩阵中逐行修剪,或在卷积滤波器中逐通道修剪)

  • 分配策略:

    • 关于如何分配稀疏预算(要修剪的参数数量),可以通过汇集来自网络的所有参数然后决定要修剪哪些参数,或者通过巧妙地在每层分别选择要修剪的参数

    • 一些架构,如 MobileNetV2、EfficientNet 的第一层很薄,这些层对参数的数量没有显著影响,修剪它们会导致精度下降而没有太多增益

    • 直觉上,在每层的基础上分配稀疏性是有帮助的

  • 调度安排:

    • 要剪枝多少?什么时候?

    • 每一轮剪掉相等的参数,还是先来个大比例然后逐渐下降?

  • 重新增长:

    • 重新增长修剪过的连接以通过「修剪 - 重新分配 - 再生长」的恒定循环保持相同水平的稀疏性

    • 然而在 CPU、GPU 和其他硬件上实现稀疏操作方面存在差距

a8e798869890b1f722d9c6db82744850.png

「超越模型优化」

Frankle 等人假设在每个大型网络中都有一个较小的网络,可以通过其参数的原始初始化来提取该网络,并自行重新训练以匹配或超过较大网络的性能。Liu 等人则证明具有随机初始化的剪枝架构并不比具有训练权重的剪枝架构差。

「讨论」

  • 一大部分是无结构剪枝,但还不清楚这些改进如何导致指标下降

  • 另一方面,具有有意义的块大小的结构化修剪有利于延迟改进(Elsen 等人的研究)。他们通过将 NHWC(channels-last)标准稠密表征转化为一个特殊的 NCHW(channels-first)「Block Compressed Sparse Row」(BCSR)表征。总体而言,这是使用剪枝网络实际提高指标迈出的有前途的一步。

2.1.2  量化

降低权重和激活的精度(经常是 8-bit 定点整数——VS. 32-bit):更小的模型 size 和更低的推理延迟。

「权重量化」

给定 32 位浮点数参数矩阵,将最小的权重值设为 0,最大的设为 2**b - 1,b 是精度的位数,然后就可以将所有的值变成一个整数(0 到 2**b - 1):

3f06fb3ea918723ee0cbdb0895f6e816.png

这种方法也可以处理负数,范围是 -2**b - 12**b - 1。在推理阶段,正好是相反的过程。

量化方案的两个约束:

  • 量化方案应该是线性的(仿射变换),这样精度位是线性分布的

  • 0.0 应该映射到一个定点值  

    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/649610
推荐阅读
相关标签