作者简介: CSDN、阿里云人工智能领域博客专家,新星计划计算机视觉导师,百度飞桨PPDE,专注大数据与AI知识分享。✨公众号:GoAI的学习小屋 ,免费分享书籍、简历、导图等,更有交流群分享宝藏资料,关注公众号回复“加群”或➡️链接 加群。
专栏推荐: ➡️点击访问 《计算机视觉》 总结目标检测、图像分类、分割OCR、等方向资料。 ➡️点击访问 《深入浅出OCR》: 对标全网最全OCR教程,含理论与实战总结。以上价格便宜长期更新,感兴趣小伙伴可关注。
学习者福利: 强烈推荐优秀AI学习网站,包括机器学习、深度学习等理论与实战教程,非常适合AI学习者。➡️网站链接。
技术控福利: 程序员兼职社区招募!技术范围广,CV、NLP均可,要求有一定基础,最好是研究生及以上或有工作经验,也欢迎有能力本科大佬加入!群内Python、c++、Matlab等各类编程单应有尽有, 资源靠谱、费用自谈,有意向者直接访问➡️链接。
导读:本系列深度学习面试题系列总结,资料集合包含机器学习、深度学习等各系列常见问题,系列将分为多篇介绍,可配合下列资料一起学习,内容参考Github及网络资源,仅供个人学习。侵权联系删除!
空洞卷积(Atrous Convolution)也叫做膨胀卷积、扩张卷积,最初的提出是为了解决图像分割在用下采样(池化、卷积)增加感受野时带来的特征图缩小,后再上采样回去时造成的精度上的损失。空洞卷积通过引入了一个扩张率的超参数,该参数定义了卷积核处理数据时各值的间距。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-llfLc4gF-1683167602888)(./images/v2-a08645e392a6a5cb49e271e5310f0dd8_1440w.png)]
可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样,通过调整扩张率得到不同的感受野不大小:
a. 是普通的卷积过程(dilation rate = 1),卷积后的感受野为3
b. 是dilation rate = 2的空洞卷积,卷积后的感受野为5
c. 是dilation rate = 3的空洞卷积,卷积后的感受野为8
可以这么说,普通卷积是空洞卷积的一种特殊情况
参考资料: 吃透空洞卷积(Dilated Convolutions)、『计算机视觉』空洞卷积
在构建模型的过程中,通常会划分训练集、测试集。
当模型在训练集上精度很高,在测试集上精度很差时,模型过拟合;当模型在训练集和测试集上精度都很差时,模型欠拟合。
预防过拟合策略:
主要有三大类:
a. 基本梯度下降法,包括 GD,BGD,SGD;
b. 动量优化法,包括 Momentum,NAG 等;
c. 自适应学习率优化法,包括 Adam,AdaGrad,RMSProp 等。
参考资料: 从SGD到NadaMax,十种优化算法原理及实现
深度学习调参技巧合集
22个神经网络训练技巧
神经网络的深度决定了网络的表达能力,早期的backbone设计都是直接堆叠卷积层,它的深度指的是神经网络的层数;后来的backbone设计采用了更高效的module(或block)堆叠的方式,每个module是由多个卷积层组成,这时深度指的是module的个数。
神经网络的宽度决定了网络在某一层学习到的信息量,指的是卷积神经网络中最大的通道数,由卷积核数量最多的层决定。通常的结构设计中卷积核的数量随着层数越来越多的,直到最后一层feature map达到最大,这是因为越到深层,feature map的分辨率越小,所包含的信息越高级,所以需要更多的卷积核来进行学习。通道越多效果越好,但带来的计算量也会大大增加,所以具体设定也是一个调参的过程,并且各层通道数会按照8×的倍数来确定,这样有利于GPU的并行计算。
在卷积神经网络中,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(如图像的语义分割),这个使图像由小分辨率映射到大分辨率的操作,叫做上采样,它的实现一般有三种方式:
a. 插值,一般使用的是双线性插值,因为效果最好,虽然计算上比其他插值方式复杂,但是相对于卷积计算可以说不值一提,其他插值方式还有最近邻插值、三线性插值等;
b. 转置卷积又或是说反卷积,通过对输入feature map间隔填充0,再进行标准的卷积计算,可以使得输出feature map的尺寸比输入更大;
c. Max Unpooling,在对称的max pooling位置记录最大值的索引位置,然后在unpooling阶段时将对应的值放置到原先最大值位置,其余位置补0;
参考资料:深度卷积网络中如何进行上采样?、三种上采样方法 | Three up sampling methods、上采样(upsampling)
下采样层有两个作用,一是减少计算量,防止过拟合;二是增大感受野,使得后面的卷积核能够学到更加全局的信息。
下采样的方式主要有两种:
a. 采用stride为2的池化层,如Max-pooling和Average-pooling,目前通常使用Max-pooling,因为他计算简单而且能够更好的保留纹理特征;
b. 采用stride为2的卷积层,下采样的过程是一个信息损失的过程,而池化层是不可学习的,用stride为2的可学习卷积层来代替pooling可以得到更好的效果,当然同时也增加了一定的计算量。
参考资料:CNN详解(卷积层及下采样层)
参数量指的是网络中可学习变量的数量,包括卷积核的权重weights,批归一化(BN)的缩放系数γ,偏移系数β,有些没有BN的层可能有偏置bias,这些都是可学习的参数,即在模型训练开始前被赋予初值,在训练过程根据链式法则不断迭代更新,整个模型的参数量主要是由卷积核的权重weights的数量决定,参数量越大,则该结构对平台运行的内存要求越高。
参数量的计算方式:
神经网络的前向推理过程基本上都是乘累加计算,所以它的计算量也是指的前向推理过程中乘加运算的次数,通常用FLOPs来表示,即floating point operations(浮点运算数)。计算量越大,在同一平台上模型运行延时越长,尤其是在移动端/嵌入式这种资源受限的平台上想要达到实时性的要求就必须要求模型的计算量尽可能地低,但这个不是严格成正比关系,也跟具体算子的计算密集程度(即计算时间与IO时间占比)和该算子底层优化的程度有关。
FLOPs的计算方式:
经典的卷积类型
深度可分离卷积将传统的卷积分两步进行,分别是depthwise和pointwise。首先按照通道进行计算按位相乘的计算,深度可分离卷积中的卷积核都是单通道的,输出不能改变feature map的通道数,此时通道数不变;然后依然得到将第一步的结果,使用1*1的卷积核进行传统的卷积运算,此时通道数可以进行改变。
计算量的前后对比:
Kh × Kw × Cin × Cout × H × W
变成了 Kh × Kw × Cin × H × W + 1 × 1 × Cin × Cout × H × W
Addition和Concatenate分支操作统称为shortcut,Addition是在ResNet中提出,两个相同维度的feature map相同位置点的值直接相加,得到新的相同维度feature map,这个操作可以融合之前的特征,增加信息的表达,Concatenate操作是在Inception中首次使用,被DenseNet发扬光大,和addition不同的是,它只要求两个feature map的HW相同,通道数可以不同,然后两个feature map在通道上直接拼接,得到一个更大的feature map,它保留了一些原始的特征,增加了特征的数量,使得有效的信息流继续向后传递。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Pxka0ej-1683167602889)(./images/3e1f4862466b01fdfb642f6c1d6da19b.png)]
参考资料:The difference and connection between contact and add operation (feature fusion)
激活函数(又叫激励函数,后面就全部统称为激活函数)是模型整个结构中的非线性扭曲力,神经网络的每层都会有一个激活函数。
常用的激活函数:Sigmoid函数、tanh函数、Relu函数、Leaky ReLU函数(PReLU)、ELU (Exponential Linear Units) 函数、MaxOut函数
参考资料:常用激活函数的比较、深度学习领域最常用的10个激活函数,一文详解数学原理及优缺点、26种神经网络激活函数可视化、深度学习笔记——常用的激活(激励)函数
不能,因为初始化权重是0,每次传入的不同数据得到的结果是相同的。网络无法更新
权重初始化的目的是在深度神经网络中前向传递时,阻止网络层的激活函数输出爆炸(无穷大)或者消失(0)。如果网络层的输出爆炸或者消失,损失函数的梯度也会变得很大或者很小,无法有效后向传递,使得神经网络需要更长的时间才能收敛甚至无法收敛。
初始化方法有: Xavier初始化、Kaiming初始化、随机初始化
参考资料:神经网络中的权重初始化一览:从基础到Kaiming、深度学习中神经网络的几种权重初始化方法、神经网络参数初始化方法
空洞卷积、池化操作、较大卷积核尺寸的卷积操作
原因:激活函数的选择。
梯度消失:令bias=0,则神经网络的输出结果等于各层权重参数的积再与输入数据集相乘,若参数值较小时,则权重参数呈指数级减小。
梯度爆炸:令bias=0,则神经网络的输出结果等于各层权重参数的积再与输入数据集相乘,若参数值较大时,则权重参数呈指数级增长。
参考资料:出现梯度消失与梯度爆炸的原因以及解决方案、详解机器学习中的梯度消失、爆炸原因及其解决方法
传统的计算机视觉方法需首先基于经验手动设计特征,然后使用分类器分类,这两个过程都是分开的。而深度学习里的卷积网络可实现对局部区域信息的提取,获得更高级的特征,当神经网络层数越多时,提取的特征会更抽象,将更有助于分类,同时神经网路将提取特征和分类融合在一个结构中。
所谓的正则化,就是在原来 Loss Function 的基础上,加了一些正则化项,或者叫做模型复杂度惩罚项,正则化机器学习中一种常用的技术,其主要目的是控制模型复杂度,减小过拟合。
两者的区别:
L1:它的优良性质是能产生稀疏性,导致 W 中许多项变成零。 稀疏的解除了计算量上的好处之外,更重要的是更具有“可解释性”。
L2:使得模型的解偏向于范数较小的 W,通过限制 W 范数的大小实现了对模型空间的限制,从而在一定程度上避免了过拟合。不过岭回归并不具有产生稀疏解的能力,得到的系数仍然需要数据中的所有特征才能计算预测结果,从计算量上来说并没有得到改观。
L1范数更容易产生稀疏的权重,L2范数更容易产生分散的权重
参考资料:l1正则与l2正则的特点是什么,各有什么优势?、深入理解L1、L2正则化
平方损失(预测问题)、交叉熵(分类问题)、hinge损失(SVM支持向量机)、CART回归树的残差损失
总结 | 深度学习损失函数大全
防止参数过分依赖训练数据,减少神经元之间复杂的共适应关系,增加参数对数据集的泛化能力。
一般来说,在合理的范围之内,越大的 batch size 使下降方向越准确,震荡越小;batch size 如果过大,则可能会出现内存爆表和局部最优的情况。小的 bath size 引入的随机性更大,难以达到收敛,极少数情况下可能会效果变好。
参考资料:深度学习中的batch的大小对学习效果有何影响?,深度学习中Batch size对训练效果的影响
参考资料:pytorch 和 tensorflow的区别和选择;TensorFlow与PyTorch编程方式不同
tensorflow 图结构的创建是静态的,即图首先被"编译",然后在运行;不易调试要么从会话请求检查变量,要么学习使用tfdbg调试器
参考资料:Pytorch 分布式训练;深度学习框架分布式训练总结
反馈神经网络正常工作需要的条件就是每一个点提供一个方向,即导数;0值不可微,本质上来说是因为这个地方可画多条切线,但我们需要的只是一条;由于这出现的0值的概率极低,任意选择一个子梯度就OK了,在0处的次微分集合是【0,1】;即选择其中一个就OK了;一般默认是0;
池化层没有可以训练的参数,因此在卷积神经网络的训练中,池化层只需要将误差传递到上一层,并不需要做梯度的计算。要追求一个原则,那就是梯度之和不变。
参考资料:池化层(pooling)的反向传播是怎么实现的
参考资料:计算机视觉面试常见问题
反向传播算法的motivation是期望通过在神经网络的训练过程中自适应的调整各神经元间的连接权值,以寻求最佳的输入输出间的映射函数,使得目标函数或损失函数达到最小,完成分类、回归等任务。
手推反向传播公式:BP(反向传播算法)公式推导及例题解析
CNN的卷积运算并非数学定义的卷积,CNN中的运算是不需要翻转卷积核的。
参考答案:卷积神经网络发展历程;CNN模型演变;一文详解卷积神经网络的演变历程!
优势:
参考资料:深度学习 优缺点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-es1bSZCP-1683167602891)(./images/ce.png)]
参考资料:计算机视觉中的数据增强
warm up, 在刚刚开始训练时以很小的学习率进行训练,使得网络熟悉数据,随着训练的进行学习率慢慢变大,到了一定程度,以设置的初始学习率进行训练,接着过了一些inter后,学习率再慢慢变小;学习率变化:上升——平稳——下降。
参考资料:深度学习 warmup 策略;神经网络中 warmup 策略为什么有效;有什么理论解释么?
2个3*3的卷积核串联和5*5的卷积核有相同的感知野,前者拥有更少的参数。多个3*3的卷积核比一个较大尺寸的卷积核有更多层的非线性函数,增加了非线性表达,使判决函数更具有判决性。
若卷积神将网络的上一层有N个卷积核,则对应的通道数也为N。设群数目为M,在进行卷积操作的时候,将通道分成M份,每个group对应N/M个通道,然后每个group卷积完成后输出叠在一起,作为当前层的输出通道。
并不能说明这个模型无效,导致模型不收敛的原因可能有数据分类的标注不准确,样本的信息量太大导致模型不足以fit整个样本空间。学习率设置的太大容易产生震荡,太小会导致不收敛。可能复杂的分类任务用了简单的模型。数据没有进行归一化的操作。
Sigmoid的导数只有在0的附近时有较好的激活性,而在正负饱和区域的梯度趋向于0,从而产生梯度弥散的现象,而relu在大于0的部分梯度为常数,所以不会有梯度弥散现象。Relu的导数计算的更快。Relu在负半区的导数为0,所以神经元激活值为负时,梯度为0,此神经元不参与训练,具有稀疏性。
神经网络在训练的时候随着网络层数的加深,激活函数的输入值的整体分布逐渐往激活函数的取值区间上下限靠近,从而导致在反向传播时低层的神经网络的梯度消失。而BatchNormalization的作用是通过规范化的手段,将越来越偏的分布拉回到标准化的分布,使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题。
GAN用一个生成模型和一个判别模型,判别模型用于判断给定的图片是不是真实的图片,生成模型自己生成一张图片和想要的图片很像,开始时两个模型都没有训练,然后两个模型一起进行对抗训练,生成模型产生图片去欺骗判别模型,判别模型去判别真假,最终两个模型在训练过程中,能力越来越强最终达到稳态。
减少处理高维输入数据的计算负担,结构化的选取输入的子集,从而降低数据的维度。让系统更加容易的找到输入的数据中与当前输出信息相关的有用信息,从而提高输出的质量。帮助类似于decoder这样的模型框架更好的学到多种内容模态之间的相互关系。
从数据上提升性能:收集更多的数据,对数据做缩放和变换,特征组合和重新定义问题。
从算法调优上提升性能:用可靠的模型诊断工具对模型进行诊断,权重的初始化,用小的随机数初始化权重。对学习率进行调节,尝试选择合适的激活函数,调整网络的拓扑结构,调节batch和epoch的大小,添加正则化的方法,尝试使用其它的优化方法,使用early stopping。
DNN的输入是向量形式,并未考虑到平面的结构信息,在图像和NLP领域这一结构信息尤为重要,例如识别图像中的数字,同一数字与所在位置无关(换句话说任一位置的权重都应相同),CNN的输入可以是tensor,例如二维矩阵,通过filter获得局部特征,较好的保留了平面结构信息。
参考答案:DNN的梯度更新方式
首先,caffe原先的gpu实现group convolution很糟糕,用for循环每次算一个卷积,速度极慢。第二,cudnn7.0及之后直接支持group convolution,但本人实测,速度比github上几个直接写cuda kernel计算的dw convolution速度慢。例如对于n=128, c=512, h=32, w=32, group=512的卷积跑100次,cudnn 7.0里的group convolution需要4秒多,而DepthwiseConvolution大概只需要1秒。
分析了一下dw convolution与普通convolution的理论计算复杂度,举例如下:
卷积1:普通卷积,输入为64*64*256,输出为64*64*256,卷积核大小为3*3。参数为3*3*256*256=590K,计算量为64*64*256*3*3*256=2.42G,计算过程的工作集内存总量(输入输出数据+参数)为64*64*256*2 + 3*3*256*256 = 2.69M。
卷积2:dw卷积,输入为64*64*256,输出为64*64*256,卷积核大小为3*3。参数为3*3*256=2.3K个,计算量为64*64*256*3*3=9.44M,计算过程的工作集内存总量为64*64*256*2 + 3*3*256=2.10M。
卷积3:普通卷积,输入为64*64*16,输出为64*64*16,卷积核大小为3*3。参数为3*3*16*16=2.3K个,计算量为64*64*16*3*3*16=9.44M,计算过程的工作集内存总量为64*64*16*2 + 3*3*16*16=133K。
可以看到卷积2肯定比卷积1快,因为计算量下降到1/256了,但卷积2实际上无法达到卷积1的256倍速度(我记得我测得结果大概是快10倍左右),因为工作集内存大小并没有显著降低。卷积2也无法达到卷积3的速度,因为虽然FLOPS相同,但工作集内存大小相差了很多倍,因此单位数据的计算密度小很多,很难充分利用GPU上的计算单元。
https://blog.csdn.net/qq_39056987/article/details/112157031
注:目前仅参考其他资料,还未整理,后期内容将继续完善。