Python的学习
- python中的*与**用法详解
- python脚本打包为exe文件:【超简单】将Python脚本打包成可执行的exe文件;【Python】pyinstaller的介绍与使用
AI机器视觉
- 图像相似度计算附带实例代码:图像相似度对比,CLIP与DINOv2的深度分析
- 训练时GPU显存不够的一种解决方法:自动混合精度(AMP)训练:深度学习训练模型时,GPU显存不够怎么办?
- 基于YOLOv5进行改进、以轻便落地应用为导向的开源库:BestYOLO
- 低质量(主要是低光照)数据集合集:低照度图像数据集
- 机器视觉专门领域的相机接口:【视觉知识】相机各类接口现状
机器学习
好玩的AI
- 证件照修图(智能换正装、不同的标准证件照…):HivisionIDPhotos
- 换脸:felixrosberg/face-swap
模型量化
- Pytorch量化方法和小实例:Pytorch模型量化
Android Studio的使用
- Android Studio的介绍:ANDROID STUDIO developers
- Android Studio默认使用Gradle作为构建工具:Gradle简要教程
- Android Studio各个目录的含义以及编译的过程:android工程编译过程
分布式框架
- RPC系列:基本概念
- 通过Pytorch RPC框架实现一个多机的RNN分布式训练:Pytorch - RPC Framework初体验
- 基于xml、json、zeromp的rpc简单实例:【RPC】多语言通讯基础——rpc 基于python讲解
- Pytorch - 分布式通信原语(附源码)
- 分布式训练硬核技术——通信原语
嵌入式和物联网
操作系统知识
零碎
一些零碎语句
模型优化包括各种技术,尤其是模型削减、量化以及高效模型设计。高效模型设计包括神经架构搜索(NAS)和手工设计方法。模型削减已经成为工业应用中优化模型的主要策略。作为主要加速方法,模型削减关注于有意去除冗余权重,同时保持准确性。这个过程通常涉及三个连续步骤:
- 初始基准模型训练;
- 后续削减不太重要的权重或层通道;
- 最后对修剪后的模型进行微调阶段。
模型削减可以分为非结构削减和结构削减。结构削减是工业应用中模型部署的首选方法,主要是因为硬件限制。与非结构方法不同,结构削减在卷积核层中的不太重要权重以稀疏方式在每个核通道中零化,而结构削减包括通道削减和模块削减等技术。通道削减关注于在核内消除整个通道滤波器,而模块削减则涉及更大的规模,通常针对完整的模块。由于模块削减导致模型深度减少,因此也称为深度削减器。CNN模型的设计演变导致了更高效模型的开发。例如,MobileNetV2采用许多深度卷积层和反转残差模块堆叠,实现了高性能,同时最小化了参数和浮点运算。ConvNeXtV1利用大核技巧并堆叠反转残差模块,实习拿了显著的效率。传统的按通道削减方法面临深度卷积层的挑战,因为稀疏计算和更少的参数。此外,现在模型平台更喜欢更高的并行计算,如GPU,按通道削减方法会使高效模型更薄、更稀疏,导致低硬件利用率,从而降低可实现的硬件效率。重参化技术的局限性:1.直接通过移除激活层微调子网可能会损害基准模型权重的完整性,从而阻碍获得高性能。2.无法剪枝具有某些规范化层(如LayerNorm或GroupNorm层)的模型,因为重参化技术无法将不是BatchNorm层的规范化层合并到相邻卷积层或全连接层。3.这些方法无法应用于视觉Transformer模型进行优化,因为存在LayerNorm层。
模型量化(Model Quantization,也叫网络量化)过程分为两部分:将模型的单精度参数(一般FP32-32位浮点参数)转化为低精度参数(一般INT8-8位定点参数),以及模型推理过中的浮点运算转化为定点运算,这个需要推理框架支持。
零碎论文
《LoRA: Low-Rank Adaptation of Large Language Models》
机器学习论文共读:《LoRA: Low-Rank Adaptation of Large Language Models》
《Revisiting small batch training for deep neural networks》
论文地址:arxiv.org/pdf/1804.07612.pdf
讨论的条件是保证每个样本平均SGD权重更新期望值保持恒定
这个平均期望值的计算如下,意味着随着batch size(m)的增加,为了保证期望值的恒定,学习率η也需要不断线性地增长。
上面是从均值的角度,下面从梯度总和的角度来分析,如果用θk处的梯度总和来更新参数,那么SGD的参数更新规则可以表示为:
对于这种方法,如果batch size增加了,只需要保证学习率 η ~ \widetilde{\eta} η 固定就能满足每个样本平均SGD权重更新恒定。
假设batch size为m的时候,公式(5)的第k+n步的权重可以表示为:
增大batch size为m+n,第k+1步的权重可以表示为:
对比(7)(8)可以发现,在学习率固定的情况下,大批量训练基本上可以被看成是小批量训练的近似值,它只是在梯度更替时增加了一些并行性。
如果使用梯度平均值来讨论,给出的结论是:用更大的batch size可以提供更“准确”的梯度估计,并允许使用更大的学习率。但使用梯度总和来进行讨论会发现,结论并非如此。实际上,1)使用较小的batch size可以用最新权重梯度,2)在小batch size的情况下SGD更新时的方差都较低,因此我们可以使用更高的基本学习速率。这两个因素都可能带来更快、更稳健的收敛效果。
对于非常小的批次,批次均值和方差的估计可能非常嘈杂,这可能会限制 BN 在减少协变量偏移方面的有效性。此外,如果批量大小非常小,训练期间使用的批量均值和方差的估计与测试所用均值和方差相差会较大。
做了一系列的对比实验,实验中所有的训练都是基于标准SGD优化。
各个模型在CIFAR-10的实验结论,m表示batch size:
1)在m小于等于32的时候,各模型的性能都还能维持在较高水平;
2)对于没有BN的模型,m=2时性能最佳;
3)对于有BN的模型,m=4和8时效果更好。
总结:
对于较大的批量大小,能保持稳定训练的可选学习率的范围变小,通常无法使用到最佳学习率,原因是权重更新的方差会随批量大小线性增加。在大规模训练中,对于给定的计算资源,使用小批量可以更好地保证模型的通用性和训练稳定性。在大多数情况下,batch size小于等于32时模型的性能较优,当batch size等于2或4时,模型性能可能会达到最优。
如果要使用batch进行归一化处理,或者使用的是大型数据集,这时我们也可以用较大的batch,比如32或64。但是需要注意的一点是,为了保证训练效率,这些数据最好是分布式处理的,比如最好的方法是在多个处理器上分别做BN和随机梯度优化,这样做的优势是对于单个处理器而言,这其实还是在做小批量优化。而且根据文章的实验,BN的最优batch size通常比SGD的还要小。