B. 深度学习 — 模型压缩
概述
- 问题
- 环境多种多样,有些环境资源有限:比如手 手表等计算有限、内存有限
Network Pruning(网络调参)
- 步骤
- 有一个大型的网络
- 评估网络参数的重要性
- 重要性评估
- 权重越接近0,表示越不重要
- sum of L1/L2 norm
- 问题
- 方差太小
- 不在0附近
- 问题
- FPGM
- 移除接近几何中心的neural
- Network Slimming
- APoZ
- sum of L1/L2 norm
- 看激活函数的输出是不是0
- 看Gradient的大小
- 权重越接近0,表示越不重要
- 重要性评估
- 移除不重要的weight或者neural
- 移除策略
- 重要性排序
- 设置固定的阀值
- 动态生成阀值
- 移除策略
- 用新的网络,重新训练一下
- 跳转到第二步
- 为什么不直接用小的神经网络
- 大的神经网络,比较好train,小的则相反
- Tips
- 不能够直接把 neural 删掉
- 问题
- 如果直接把neural删掉,就无法用 GPU 加速了。
- 思路
- 把要删掉的 neural 的weight 直接设置为0
- 问题
- 不能够直接把 neural 删掉
Konwledge Distillation
- Logits(输出)
- 概述
- 直接匹配输出
- 学习一个batch里面的logits distribution
- 。。。
- 概述
- Feature(中间值)
- 概述
- 直接匹配中间的Feature
- 学习Feature中间如何转换
- 。。。
- 概述
- Conventional Distillation
- 以每个Sample为单位做知识蒸馏
- 算法
- Baesline KD
- 先训练一个大的神经网络
- 训练一个小的神经网络,输入和输入是来自大的神经网络,而不是正确的数据
- Deep Mutual Learning
- 两个模型互相学习
- Born Again Neural Networks
- 初始Model 是 KD 来的
- 迭代使用Cross Entropy
- 最后Ensemble 所有Student Model
- Attention
- 聚焦在核心的Object上,而不是背景上面
- 核心
- 生成 attention map
- 寻找目标函数
- Baesline KD
- 问题
- Teacher model过于复杂,导致 Student Model 无法学习
- 解决思路
- TAKD
- 寻找一个中间模型,先让中间模型学习Teacher Model,然后再让Student Model 学习中间模型
- FitNet
- Student Model 学习 Teacher Model的中间特征
- 问题
- Model capacity is different
- There`s lots of redundancy in Teacher Net
- TAKD
- 解决思路
- Teacher model过于复杂,导致 Student Model 无法学习
- Relational Distillation
- 以Sample之间的关系做知识蒸馏 (学习Teacher Model的表现形式)
- 思路
- Distance-wise KD
- Angle-wise KD
- 算法
- Similarity-Preserving KD
- Teacher Model 输出不同图片之间的关系
- Student Model 学习这些关系
- Similarity-Preserving KD
Parameter Quantization
- 思路
- 用更少的bit存储参数
- 步骤
- 对参数聚类,对每一类打标
- 在网络里面,存放的不是weight,而是用标号
- 进一步优化,可以用哈夫曼编码,对每个类编码
Binary Weight
- 思路
- weights 用 +1 或者 -1 表示
调整模型架构
- Low rank approximation
- 在 Lm 和 Ln 之间加入 Lk,使得 Lm * Lm < (Lm * Lk + Lk * Ln)
- 卷积神经网络
- 步骤
- Depthwise Convolution
- Pointwise Convolution
- 应用场景
- SqueezeNet
- MobileNet
- ShuffleNet
- Xception
- 步骤
Dynamic Computation
- 训练多个模型,根据资源决定使用哪个模型
- 一个模型,不同的隐藏层多有输出,问题是 会影响最终输出的效果