转自网络
在深度学习基础网络不断进化的过程当中,能够发现新的模型不只性能有极大地提高,网络的复杂度一般也会更低。深度学习网络模型的复杂度直接关系到其实际应用中的速度与可行性,所以这里总结一下 CNN 复杂度的含义与计算方式。框架
一般,咱们假设计算机运行一行基础代码须要一次运算,那么模型的时间复杂度即为模型的运算次数,用浮点运算次数 FLOPs(FLoating-point OPerations) 表示。首先来看一个最简单的单层卷积的时间复杂度。ide
其中,函数
而特征图的尺寸 M 又与输入矩阵大小 X,卷积核尺寸 K,Padding 和步长 Stride 有关,其计算公式为:性能
M = (X - K + 2 * Padding )/Stride + 1
注:为了方便说明,上述所提到的卷积核尺寸 K 与输入矩阵大小 X 均为正方形;
且为了简洁,省略了模型中的偏置 bias。学习
对于总体的卷积网络而言,其时间复杂度的计算方式为各层复杂度的累加。其计算方式以下:设计
其中,3d
在深度学习中,空间复杂度通常指的是访存量,包括两个部分:参数量,输出特征图。code
参数量:模型全部带参数的层的权重参数总量(即模型体积,下式左半部分)。orm
特征图:模型在实时运行过程当中,每层输出的特征图大小(下式右半部分)。
注:实际上有些层(例如 ReLU)实际上是能够经过原位运算完成的,此时就不用统计输出特征图了。
感觉野是深度学习中最为重要的概念之一,定义为:在卷积神经网络CNN中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称做感觉野(Receptive Field)。通俗来讲就是卷积层输出的一个点映射到输入矩阵上的区域大小。感觉野的大小直接影响到模型的输出特征,如对于目标检测模型,不一样尺寸的目标所适配的感觉野大小也不一样,所以为了让模型可以适应多尺度的目标检测,一般会借助图像金字塔,或融合多个卷积层的特征,以得到最佳的检测性能。
为了更直观的理解感觉野,能够借助以下的示意图(为了方便,将二维简化成一维)。这是一个三层的 CNN 网络,每一层卷积核的 kernel_size=3, stride=1 ,那么最上层的特征所对应的感觉野为7x7。
其中 RF 表示特征感觉野大小, l 表示层数,l=0 表示输入层, 此时 RF0=1 , feature_stride_0=1 。
根据感觉野的计算公式能够获得每一层的感觉野大小:
第一层
第二层
第三层
但若是有dilated conv的话,计算公式为
深度学习的模型训练一般采用梯度更新的方法,且通常层数越深,就能够处理更为复杂的问题。可是随之也带了许多弊端,如梯度消失与梯度爆炸。
神经网络的反向传播是逐层对函数偏导相乘,所以当神经网络层数很是深的时候,最后一层产生的误差就由于乘了不少的小于1的数而愈来愈小,最终就会变为0,从而致使层数比较浅的权重没有更新,这就是梯度消失。
产生的缘由:
梯度爆炸与梯度消失相似,当每层的偏导数值都大于1时,通过多层的权重更新以后,梯度就会以指数形式增长,即为梯度爆炸。
产生缘由:
逐层训练加微调
该方法由 Geoffrey Hinton 于2006年提出,具体流程为每次只训练一层神经网络,待权重稳定以后,再使用该层网络的输出进行后一层网络的输入,重复该步骤至训练全部网络层。最后再对整个模型进行finetune,获得最优的模型。
梯度剪切
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,而后更新梯度的时候,若是梯度超过这个阈值,那么就将其强制限制在这个范围以内。这能够防止梯度爆炸。
权重正则化
比较常见的是L1正则,和L2正则,在各个深度框架中都有相应的API可使用正则化。
relu、leakrelu、elu等激活函数
Relu: 若是激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络均可以获得相同的更新速度,relu就这样应运而生。
batchnorm
batchnorm全名是batch normalization,简称BN,即批规范化,经过规范化操做将输出信号x规范化到均值为0,方差为1,保证网络的稳定性。
残差结构
残差结构中的 shortcut 有效地避免了梯度消失与爆炸问题。
LSTM
LSTM全称是长短时间记忆网络(long-short term memory networks),是不那么容易发生梯度消失的,主要缘由在于LSTM内部复杂的“门”(gates),以下图,LSTM经过它内部的“门”能够接下来更新的时候“记住”前几回训练的”残留记忆“,所以,常常用于生成文本中。