机器学习——神经网络压缩

神经网络压缩

需要部署,设备内存和计算能力有限,需要进行模型压缩,在设备上运行的好处是低延迟,隐私性。

在这里插入图片描述

目录

在这里插入图片描述
不考虑硬件问题,只考虑通过软件算法优化。

修剪网络

参数过多或者没有用的参数,可以将其剪掉。
在这里插入图片描述
先训练一个最大的网络模型,衡量评估每个参数的重要性,

  • 看权重的绝对值
  • 评估神经元的重要性,可以将其修剪掉

修剪后能力会降低一点,并想办法将性能变好一点,对小模型进行微调
在这里插入图片描述

  • 不要一次性剪掉大量参数
  • 动了元气性能不太行

在这里插入图片描述
如果剪掉后,进行空缺的话导致无法进行GPU加速,一般将其值设置为0
在这里插入图片描述
速度大于1是加速,小于1是降速。
从上述看到对权重进行修剪,加速的效果不理想。
在这里插入图片描述

  • 对网络进行修剪,只是改输入输出的dim,在torch里面好实现,gpu也好加速。

在这里插入图片描述

  • 先训练大模型,再训练小模型达到相同性能,那为什么不直接训小模型呢?
  • 原因是大模型更好训练,小模型难训练
  • 大乐透假说

在这里插入图片描述

一个大的模型可以看作是很多个小模型的集合,只要里面有一个成功,大的模型也就成功了,跟买大乐透一样,买的彩票越多,越有可能中奖。

在这里插入图片描述

  • 基于大模型得到的参数,更有可能得到好的初始化参数,在这个基础上继续微调,有很大概率得到好的结果。

在这里插入图片描述

  • 权重的正负号很重要。
  • 跟雕像一样,只是把多余的东西拿掉。

在这里插入图片描述

  • 这篇文章打脸大乐透文章
  • 将epoch设置多一点,小模型也能得到好的结果。

知识蒸馏

在这里插入图片描述
让学生的输出与老师的输出尽可能相近,哪怕老师的模型输出是错误的。

在这里插入图片描述
teacher不仅是一个模型,可以是多个模型的集成。模型集成在打比赛的时候用的多,但是实际中考虑性能问题不太行,因此可以使用知识蒸馏使得学生模型也能得到相近的性能。

在这里插入图片描述

对softmax进行修改,增加一个温度参数T,把比较集中的分布变得更加平滑一点,对分类结果不会有影响,但是每个类别得到的分数会比较平滑平均

参数量化

在这里插入图片描述
在这里插入图片描述

  • 使用更小的bit来表示值,以降低存储占用
  • 权重聚类,使用一类来表示该类的所有值
  • 常见的用少量的bit,少见的用多一点的bit

在这里插入图片描述
使用二元值代替
在这里插入图片描述

  • 可以防止overfit
  • bit减少是不是引入了噪声,进而效果好呢?

结构设计

depthwise separable convolution

在这里插入图片描述
传统的cnn 每个通道都要进行卷积,参数量大。

在这里插入图片描述

  • depthwise的滤波器格式等于输入的channel数量
  • 每个滤波器只负责自己那个channel
  • 问题是通道之间没有交互

在这里插入图片描述
可以先加一个pointwise convolution,然后再进行depthwise convolution;
在这里插入图片描述

  • 参数约变为原先的 1 / k 2 1/{k^2} 1/k2

在这里插入图片描述

  • 把一层变成两层,类似于矩阵连续相乘,中间可操作空间大,以减少维度计算。
    *在这里插入图片描述
    在这里插入图片描述

动态计算

在这里插入图片描述
在这里插入图片描述
期望网络能自己调整计算量,因为模型会跑到不同设备上。电量的多少也会对性能有影响。

自己调整深度
在这里插入图片描述

让每层的输出,与最终的输出之间的差距加起来作为最终的loss,优化该loss来动态调整深度。

自己调整宽度
在这里插入图片描述

  • 不同宽度的输出与最宽的输出之间的差距越小越好
  • 同一个模型,只是不同的宽度
    在这里插入图片描述
    根据环境困难度自己决定深度和宽度
    在这里插入图片描述
  • 对于简单的样本,就使用浅层的输出即可
  • 对于困难的样本,可以使用最终的输出

总结

在这里插入图片描述

  • 上述技术不是互斥的,可以一起使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/522764.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

导出谷歌gemma模型为ONNX

参考代码如下(从GitHub - luchangli03/export_llama_to_onnx: export llama to onnx修改而来,后面会合入进去) 模型权重链接参考: https://huggingface.co/google/gemma-2b-it 可以对modeling_gemma.py进行一些修改(transforme…

YOLOv8创新改进:SPPF创新涨点篇 | SPPELAN:SPP创新结合ELAN ,效果优于SPP、SPPF| YOLOv9

💡💡💡本文独家改进:新颖SPPF创新涨点改进,SPP创新结合ELAN,来自于YOLOv9,助力YOLOv8,将SPPELAN代替原始的SPPF SPPELAN结构图如下: 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现涨点 收录 YOLOv8原创自研 https://blog.csdn.net/m0_…

Android使用WebView打开内嵌H5网页

Android打开外部网页链接请参考上一篇文章 https://public.blog.csdn.net/article/details/136384559 继上篇,新建assets文章夹,将H5的网页资源放到此文件夹下 把H5的资源文件都拷进来 这个时候,将添加打开本地网页的代码: //打…

JVM-垃圾收集底层算法实现

三色标记 背景描述 在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。 如何解决上面的问题? 引入“三色标记” 意思就是,把Gcroots可达性分析遍历对象过程…

Matlab|基于目标级联法的微网群多主体分布式优化调度

目录 主要内容 1.1 上层微网群模型 1.2 下层微网模型 部分程序 实现效果 下载链接 主要内容 本文复现《基于目标级联法的微网群多主体分布式优化调度》文献的目标级联部分, 建立微网群系统的两级递阶优化调度模型: 上层是微网群能量调度中心优化调度…

AI 应用之路:质疑汤姆猫,成为汤姆猫,超越汤姆猫

过去一年,我对 AI 应用的看法经历了这样一个过程:质疑汤姆猫,理解汤姆猫,成为汤姆猫,超越汤姆猫。 什么是汤姆猫?汤姆猫是 2010 年移动互联网早期的一款应用,迅速走红,又淡出视野。…

React 事件机制原理

相关问题 React 合成事件与原生 DOM 事件的区别React 如何注册和触发事件React 事件如何解决浏览器兼容问题 回答关键点 React 的事件处理机制可以分为两个阶段:初始化渲染时在 root 节点上注册原生事件;原生事件触发时模拟捕获、目标和冒泡阶段派发合…

c++的STL(2)-- vector容器

目录 1. 默认构造 代码: 相关知识点: 2. 有参构造函数 以及 使用{}初始化对象 代码: 相关知识点: 3. vector容器在尾部添加和删除元素 代码: 使用push_back()和pop_back()进行尾部元素的添加和删除 相关知识点: 代码: 使用emplace_back在尾部添…

Unity插件之天气系统UniStorm

首先呢,它是一款强大的动态昼夜天气系统,能够以较快的帧速率创建AAA级动态生成的天气、照明和天空,并且具有300多个可定制的组件,允许用户创建任何可以想象的环境。 第一步:他需要两个物体Camera摄像机、Player播放器…

knife4j生产环境禁止打开页面

Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案,官网地址:Knife4j 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j 考虑到安全性问题,在实际服务部署到生产环境后就需要禁用到swagger页面的展示,这个时候只需…

报错:ModuleNotFoundError: No module named ‘tensorrt’

写在前面 我安装了tensorRT,在运行它自带的模型都没问题。 但是在代码中import tensorrt就报错: ModuleNotFoundError: No module named ‘tensorrt’。 网上搜了一大堆,发现是没有在自己的python环境下安装。 所以特意写这篇文章记录一下。 在进行下一…

继深圳后,重庆与鸿蒙展开原生应用开发合作

截至2023年底,开源鸿蒙开源社区已有250多家生态伙伴加入,开源鸿蒙项目捐赠人达35家,通过开源鸿蒙兼容性测评的伙伴达173个,累计落地230余款商用设备,涵盖金融、教育、智能家居、交通、数字政府、工业、医疗等各领域。 …