卷积神经网络中的基础知识点总结

什么是卷积?

对卷积的理解

对卷积的最早接触是在信号与系统中,描述系统对输入信号的响应。
连续形式:
f ( n ) ∗ g ( n ) = ∫ − ∞ + ∞ f ( τ ) g ( n − τ ) d τ f(n)*g(n) = \int_{ - \infty }^{ + \infty } {f(\tau)g(n-\tau)d\tau} f(n)g(n)=+f(τ)g(nτ)dτ
离散形式:
f ( n ) ∗ g ( n ) = ∑ τ = − ∞ + ∞ f ( τ ) g ( n − τ ) f(n)*g(n) = \sum_{ \tau=- \infty }^{ + \infty } {f(\tau)g(n-\tau)} f(n)g(n)=τ=+f(τ)g(nτ)
  卷积操作就是对两个函数进行“卷积”,本质上就是先将一个函数翻转然后进行滑动,与另一个函数叠加。“积”指的就是积分/求和,在连续情况下,叠加指的是对两个函数的乘积求积分,在离散情况下就是加权求和;“卷”其实很生动地表达了翻转和滑动的过程。如果从信号经过系统产生响应的角度来看,这些操作所代表的含义是,某一时刻的系统响应不仅跟当前时刻输入信号的响应值有关,也跟过去所有时刻输入信号的响应都有关系,是对过去的所有输入的效果的累积,并且信号对应与响应函数加权求和,所以进行了翻转。
  在图像处理中,卷积其实就是把每个像素周边的像素都考虑进来,对当前像素和卷积核进行某种加权处理。但是在图像卷积中,似乎翻转的概念没有特别突显,图像处理矩阵翻转应该是在x轴和y轴上都需要进行翻转,但是一般图像处理中的卷积核都是对称的,所以翻转前后不会产生变化;而在神经网络中的卷积核的参数都是预测出来的,可能代表的“卷积”含义有些区别,但结果也不受到影响。

卷积神经网络(与DNN、RNN的区别)

  说到卷积神经网络的起源,还是要从深度神经网络说起,这里指的DNN是原始的全连接的神经网络,即没有引入卷积操作。全连接神经网络的结构里,下层神经元和所有上层神经元都会形成连接,它的缺点是参数数量的剧增,可能带来的影响有:(1)模型更复杂,容易过拟合;(2)优化函数随着层数加深,越来越容易陷入局部最优解;(3)梯度消失/爆炸现象严重。
(后面会针对过拟合/欠拟合问题、解决局部最优问题、梯度消失和爆炸问题做具体描述。)
  对于CNN来说,并不是所有上下层神经元都能直接相连,而是通过不同的卷积核相连接提取不同的特征图,同一个卷积核在所有图像内是共享的,图像通过卷积操作后仍然保留原先的位置关系。若输入尺寸 ( w 1 , h 1 , C i n ) (w_1,h_1,C_{in}) w1,h1,Cin),输出尺寸 ( w 2 , h 2 , C o u t ) (w_2,h_2,C_{out}) (w2,h2,Cout),则全连接的参数量是 w 1 × h 1 × C i n × w 2 × h 2 × C o u t w_1×h_1×C_{in}×w_2×h_2×C_{out} w1×h1×Cin×w2×h2×Cout,而卷积神经网络变为 k s i z e 2 × C i n × C o u t k_{size}^2×C_{in}×C_{out} ksize2×Cin×Cout卷积神经网络的特点是:局部感知、权值共享;优点是:参数少、训练快、得分高、易迁移,因此后来居上,碾压了全连接的神经网络。
  虽然CNN使得图像空间产生了一定的关联,但是DNN的另一个问题是无法对时间序列上的变化进行建模。在普通的全连接网络或CNN中,每层神经元的信号只能向下一层传播,样本的处理在各个时刻独立,因此又被成为前向神经网络(Feed-forward Neural Networks)。而在循环神经网络(RNN)中,神经元的输出可以在下一个时间节点直接作用到自身,因此,t+1时刻网络的最终结果是该时刻输入和历史共同作用的结果。然而,在时间轴上,它的梯度传播几次就会消失,或者说当前的结果无法影响太遥远的过去。为了解决时间上的梯度消失,长短时记忆单元LSTM,通过门的开关实现时间上记忆功能。

卷积的种类:

普通卷积

  最原始的卷积操作,在输入图像与卷积核进行卷积后的结果会损失部分值,这是因为边缘上的像素永远不会位于卷积核中心,而卷积核也没法扩展到边缘区域以外。因此,丢失了图片边界处的众多信息。
  一般希望输入和输出的大小应该保持一致,为解决这个问题,可以在进行卷积操作前,对原矩阵进行边界填充(Padding),如下图所示。在矩阵的边界上填充一些值,以增加矩阵的大小,通常都用“0”来进行填充的。在神经网络模块代码中,常用的padding形式分为:

  • valid padding:不进行任何处理,只使用原始图像,不允许卷积核超出原始图像边界。
  • same padding:进行填充,允许卷积核超出原始图像边界,并使得卷积后结果的大小与原来的一致。

  卷积核每次滑动的行数和列数称为Stride,如下图所示stride=1。stride=2可以压缩输出图的尺寸为1/2。

卷积常见问题:

1、特征图尺寸的计算,或者感受野大小的计算?
  如果已知图像的输入尺寸 F i n F_{in} Fin,卷积核大小 k k k,padding为 P P P,stride为 S S S,计算公式如下:
F o u t = F i n − k + 2 P S + 1 F_{out}=\frac{F_{in}-k+2P}{S}+1 Fout=SFink+2P+1
  感受野的计算可以将输出设为1,然后逆算输入尺寸 F i n F_{in} Fin

2、如何增加感受野?
(1)增加网络层数;(2)增大卷积核的尺寸;(3)设置卷积的stride为2;(4)增加pooling层stride为2;(5)使用下采样,双线性插值;(6)使用空洞卷积(dilate_rate=2)。

3、卷积核的大小一般为奇数×奇数,如 1×1,3×3,5×5,7×7都是最常见的。为什么没有偶数×偶数,并且为什么不用很大的卷积核呢?

  • 更容易padding:图像的大小为n×n,卷积核大小为k×k,padding的幅度设为(k-1)/2,stride为1时,卷积后的输出就为(n-k+2*((k-1)/2))/1+1=n,即输出保证了卷积前后尺寸不变。但是如果k是偶数的话,(k-1)/2就不是整数了。
  • 更容易找到卷积锚点:进行卷积操作时一般会以卷积核模块的一个位置为基准进行滑动,这个基准通常就是卷积核模块的中心。若卷积核为奇数,卷积锚点很好找,自然就是卷积模块中心;但如果卷积核是偶数,这时候就没有办法确定了。
  • 最早人们以为,卷积核越大,感受野(receptive field)越大,看到的图片信息越多,因此获得的特征越好。但是,大的卷积核会导致计算量的暴增,不利于模型深度的增加,计算性能也会降低。在Inception网络中,利用2个3×3卷积核的组合比1个5×5卷积核的效果更佳,并且参数量降低,因此后来3×3卷积核被广泛应用在各种模型中。

4、怎么才能减少卷积层的参数量,卷积的通道和空间不可分离吗?

  • 使用1×1的卷积核,作为bottleneck层。
  • 采用分组卷积或深度可分离卷积,将在后文大致讲述。
  • 通道和空间注意力也分别对通道和空间位置赋予了不同的权重。

5、1×1卷积核有什么作用呢?

  • 进行卷积核通道数的降维和升维,减少网络参数;
  • 实现跨通道的交互和信息整合;
  • 增加非线性。

6、怎么计算某一层卷积的参数量或者计算量?
  如果已知图像的输入尺寸 F i n F_{in} Fin,输入通道 C i n C_{in} Cin,卷积核大小 k k k,输出尺寸 F o u t F_{out} Fout,输出通道 C o u t C_{out} Cout,计算公式如下:
参 数 量 = k 2 × C i n × C o u t , 计 算 量 = k 2 × C i n × C o u t × F o u t 2 参数量=k^2×C_{in}×C_{out},计算量=k^2×C_{in}×C_{out}×F_{out}^2 =k2×Cin×Cout=k2×Cin×Cout×Fout2

7、为什么卷积对图像的特征提取是有效的?
(1)在二维图像上处理数据,权值共享,有效降低全连接的参数量
(2)人在认知图像时是分层抽象的,首先理解的是颜色和亮度,然后是边缘、角点、直线等局部细节特征,接下来是纹理、几何形状等更复杂的信息和结构,最后形成整个物体的概念。卷积核是从左到右、从上到下依次扫描整个图像,前面的卷积层捕捉图像局部、细节信息,有小的感受野,后面的卷积层感受野逐层加大,用于捕获图像更复杂,更抽象的信息。
(3)在卷积神经网络中,每一个卷积核所对应的卷积层实际上就是一个系统,一个用于判断图像中某一个特征的系统,但是我们需要的对于判断的某一个特征的系统的具体运算法则并不清楚,所以我们需要通过误差反向传播的方式不断地调整卷积核中的参数使得在训练后调整参数的卷积核能够能够完成当前卷积层(即当前系统)能够判断某一个图像特征的工作。当所有的单个卷积层(单个特征判断系统)都能有效地完成特征判断的任务时,由这些数量众多卷积层所组成的复杂系统CNN就能够完成人类所需要的给予卷积神经网络的复杂任务

8、为什么深度学习图像分类里的图片的输入大小都是224×224呢?
  (1)训练数据,以ImageNet为代表的大多数分类数据集,图像的长宽在300分辨率左右。(2)一般地,从输入到最后一个卷积特征feature map,就是进行信息抽象的过程,然后就经过全连接层/全局池化层的变换进行分类了。这个feature map的大小,如果尺寸太小,那么信息就丢失太严重,如果尺寸太大,信息的抽象层次不够高,计算量也更大,所以7×7的大小是一个很好的平衡。另一方面,图像从大分辨率降低到小分辨率,降低倍数通常是2的指数次方,所以图像的输入最好是7×2的幂次。(3)综上所述, 7 × 2 5 = 224 7×2^5=224 7×25=224与300最接近。

反卷积

  反卷积和卷积的工作过程差不多,主要的区别在于反卷积输出图片的尺寸会大于输入图片的尺寸。如下所示,图中的反卷积的stride为2,通过间隔插入padding来实现的

空洞卷积

  down-sampling 和 pooling_layer 的设计缺陷是:不可进行学习,是设定好的;内部数据结构丢失;小物体信息无法重建。空洞卷积是在卷积核上引入空洞,它的优势是:在增大感受野的同时,内部数据结构的保留以及避免使用 down-sampling这样的操作。如下图所示,dilation_rate=2。

  空洞卷积潜在的问题是:网格效应(损失信息的连续性,对像素级别的预测是致命的),并且采用大 dilation_rate 的信息或许只对一些大物体分割有效果,而对小物体来说可能则有弊无利了。

可变形卷积

  为了应对同样的物体在图像中可能呈现出不同的大小、姿态、视角变化甚至非刚体形变,可变形卷积使得卷积神经网络具有学习空间几何形变的能力。由于标准卷积中的规则格点采样导致了网络难以适应几何形变,因此对卷积核中每个采样点的位置都增加了一个偏移的变量,卷积核就可以在当前位置附近随意的采样,而不再局限于之前的规则格点,这样扩展后的卷积操作被称为可变形卷积。通过增加偏移量来学习几何形变的思想还可方便地扩展到其它计算单元中去,如可变形兴趣区域池化 (deformable ROI pooling)。
在这里插入图片描述

分组卷积

  简单来说,就是对一个输入通道为 M M M 的特征图进行的卷积操作,拆分为对 g r o u p group group 个通道为 M g r o u p \frac{M}{group} groupM 的特征图进行的卷积操作。那么,原卷积的参数量如果为 D K 2 × M × N D_K^2×M×N DK2×M×N,则现在变为 g r o u p × D K 2 × M g r o u p × N g r o u p group×D_K^2×\frac{M}{group}×\frac{N}{group} group×DK2×groupM×groupN ,因此参数量和计算量都会大幅降低。其中, D K D_K DK是卷积核的大小, M M M是输入的通道数, N N N是输出的通道数。下图展示了普通卷积 -> 分组卷积 -> 深度卷积的卷积过程:
在这里插入图片描述
  可以看出,普通卷积的一个卷积核对应产生一个特征图;分组卷积当使用和普通卷积相同的参数量时,能产生g个特征图,g是gruop的数量;深度卷积是单通道卷积,也可以看成是分组卷积的特例,因此对应通道卷积后仍然产生通道数的特征图。不过,深度卷积在不同通道的特征信息没有进行关联,MobileNet是又在整个通道维度上进行了1×1卷积,提出新的深度可分离卷积;ShuffleNet提出了通道混洗(channel shuffle)来帮助信息交换。具体参见https://blog.csdn.net/qq_37002417/article/details/105935425

深度可分离卷积

  把标准卷积分解成深度卷积(depthwise convolution)和逐点卷积(pointwise convolution),大幅度降低参数量和计算量。其中,深度卷积把单一filter应用在每个输入的通道上,然后逐点卷积运用1×1大小的卷积来结合深度卷积的输出。如下图4所示:
在这里插入图片描述
  其中, D K D_K DK是卷积核的大小, M M M是输入的通道数, N N N是输出的通道数。对于图中(a)的标准卷积层而言,会产生 D K 2 × M × N D_K^2×M×N DK2×M×N的参数量,而利用(b)和(c)的分解之后,则会产生 D K 2 × M + M × N D_K^2×M+M×N DK2×M+M×N的参数量。所以,计算量也会同时降低。

什么是池化?

  池化(pooling)的本质,其实就是采样,池化过程一般在卷积过程后。对于大图像来说,只做卷积的话资源消耗太大,并且很容易出现过拟合。因此,在卷积层之后可以适当将图像缩小,例如使用max pooling或者average pooling,如下所示,本质就是为了在尽可能保留图片空间信息的前提下,降低图片的尺寸,增大卷积核感受野,提取高层特征;同时减少网络参数量,预防过拟合

最大池化和平均池化的区别

  • 平均池化:倾向于保留突出背景特征,减少特征提取的方差。
  • 最大池化:倾向于保留突出纹理特征,减少特征提取的偏差。

池化的作用

  • 保留主要特征的同时减少参数和计算量,增大感受野、防止过拟合。池化层不需要保留参数,它采用一个固定的函数进行像素运算,如max pooling filter中采用了max函数,是不需要保留参数的,所以减少了网络的参数量。
  • Invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度) 。如下图所示,使用最大池化即使图像有小的位移,提取到的特征依然会保持不变。由于增强了对位移的鲁棒性,这样可以忽略目标的倾斜、旋转之类的相对位置的变化,以此提高精度。
    在这里插入图片描述

池化的缺点:pooling能够增大感受野,让卷积看到更多的信息,但是它在降维的过程中丢失了一些信息,这在像素信息较为敏感的一些视觉任务中(如分割,检测),一般是较少使用pooling操作来下采样的,通常使用插值(如双线性插值等)或者stride=2的卷积层来进行下采样,尽可能的保留像素信息。

池化的反向传播

  由于pooling操作是不可导的,并且由于pooling操作,使得feature map的尺寸变化,梯度无法对位的进行传播下去。解决这个问题的思想也很简单,在 2×2 pooling中就是把1个像素的梯度传递给4个像素,并且需要保证传递的loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的。

  • mean pooling:前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为 n 份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变。如果直接把梯度复制 n 遍之后反向传播回去,这样会造成loss之和变为原来的 n 倍,网络容易产生梯度爆炸。图示如下 :
  • max pooling:前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。也要满足梯度之和不变的原则,所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id,如下所示:
    在这里插入图片描述

什么是欠拟合和过拟合?

  • 欠拟合:训练误差和验证误差都很大,这种情况称为欠拟合。出现欠拟合的原因是模型尚未学习到数据的真实结构,“欠拟合”常常在模型学习能力较弱,而数据复杂度较高的情况出现,此时模型由于学习能力不足,无法学习到数据集中的“一般规律”,因而导致泛化能力弱,模型在训练集和验证集上的性能都很差。
  • 过拟合:模型在训练集上表现很好,但是在验证集上却不能保持准确,也就是模型泛化能力很差,这种情况很可能是模型过拟合。“过拟合”常常在模型学习能力过强的情况中出现,此时的模型学习能力太强,以至于将训练集单个样本自身的特点都能捕捉到,并将其认为是“一般规律”,导致模型泛化能力下降。

欠拟合主要表现为输出结果的高偏差,而过拟合主要表现为输出结果的高方差。
在这里插入图片描述

产生的原因

  • 欠拟合:(1)模型复杂度过低;(2)特征量过少
  • 过拟合:(1)参数太多,模型复杂度过高;(2)训练样本选取有误,如样本数量太少、选样方法错误、样本标签错误等,导致选取的样本数据不足以代表预定的分类规则;(3)对于决策树模型,如果我们对于其生长没有合理的限制;(4)对于神经网络模型:对样本数据可能存在分类决策面不唯一,随着学习的进行,BP算法使权值可能收敛过于复杂的决策面;权值学习迭代次数足够多(Over training),拟合了训练数据中的噪声和训练样例中没有代表性的特征。

解决方法

  • 欠拟合:(1)增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间;(2)添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强;(3)使用非线性模型,比如核SVM 、决策树、深度学习等模型;(4)减少正则化参数,正则化的目的是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化参数;(5)容量低的模型可能很难拟合训练集,使用集成学习方法,如将多个弱学习器Bagging。
  • 过拟合数据层面(1)数据扩增,即增加训练数据样本;(2)特征工程,筛选组合得到更高质量的特征。模型层面(1)正则化(Regularization)(L1和L2)以及树模型的剪枝策略,XGBoost中的正则项惩罚;(2)Dropout;(3)选择较为简单的模型;(4)集成学习,Bagging策略组合模型降低模型方差。其他(1)Early stopping;(2)加入噪声,给训练样本集更多的样本噪声,使得模型不易完全拟合这些噪声,从而只在大程度上的训练学习我们想要的数据特征关系。

什么是正则化?

  当用比较复杂的模型比如神经网络,去拟合数据时,很容易出现过拟合现象(训练集表现很好,测试集表现较差),这会导致模型的泛化能力下降。这时候,我们就需要使用正则化,可以看作是一种先验信息的约束,降低模型的复杂度。

正则化的几种常用方法:

dropout

   在2012年,Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。简单而言就是,在一次训练迭代的时候,对每一层中神经元的激活值以一定的概率 p p p 停止工作,用余下的神经元所构成的网络来训练本次迭代中的数据(batch_size个样本)。这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征,每层神经元代表一个学习到的中间特征,随机丢弃神经元,即减少中间特征的数量,从而减少冗余,即增加每层各个特征之间的正交性、增强特征的稀疏表示。Dropout带来的缺点是可能减慢收敛速度,由于每次迭代只有一部分参数更新,可能导致梯度下降变慢
   在训练阶段,对应用了dropout的层,每个神经元以keep_prob的概率保留(或以1-keep_prob的概率关闭),没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果;然后在测试阶段,不执行dropout,也就是所有神经元都不关闭,但是对训练阶段应用了dropout的层上的神经元,其输出激活值要乘以keep_prob。而现在主流的方法是Inverted dropout,和传统的dropout方法有两点不同:(1)在训练阶段,对执行了dropout操作的层,其输出激活值要除以keep_prob;(2)测试阶段则不执行任何操作,既不执行dropout,也不用对神经元的输出乘keep_prob。

L1/L2范数

   L1/L2范数正则化是通过对网络权重做正则来限制过拟合,具体是在损失函数加入正则项。 L1范数是指向量中各个元素绝对值之和,即 W W W 的L1范数是绝对值 ∣ ∣ W ∣ ∣ 1 = ∑ ∣ w i ∣ ||W||_1=\sum{|w_i|} W1=wi,可以使权值稀疏,即希望 W W W 的大部分元素都是0。参数稀疏化带来的好处是:(1)能实现特征的自动选择,即去掉这些没有信息的特征,也就是把这些特征对应的权重置为0;(2)模型更容易解释,因为这些未被学为0的特征在某一问题分析上面提供的信息是巨大的,决策性的。L2范数是指向量各元素的平方和然后求平方根,即 W W W 的L2范数是 ∣ ∣ W ∣ ∣ 2 = ∑ w i 2 ||W||_2=\sqrt{\sum{w_i^2}} W2=wi2 。在损失函数的优化过程中,让L2范数的正则项最小,可以使得 W W W 的每个元素都很小,都接近于0,但与L1范数等于0不同。越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象,因为多项式某些分量的影响很小,模型就越平滑。
参考链接:https://blog.csdn.net/zouxy09/article/details/24971995

BN(Batch Normalization)

   之前的研究表明,如果在图像处理中对输入图像进行白化Whiten)操作的话,就是对输入数据分布变换到0均值单位方差的正态分布,那么神经网络会较快收敛。如果将神经网络每一层都当作下一个隐藏层的输入,那么是否可以都进行白化?对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数更新,导致每个隐层都会面临协变量转移的问题,也就是在训练过程中,隐层的输入分布总是变来变去,这就是所谓的内部协变量转移(Internal Covariate Shift),Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是只发生在输入层。独立同分布假设(IID),就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。可见数据分布对于网路训练是较为关键的,如果数据分布总在变化,不易于网络收敛,因为整体分布逐渐往非线性函数的取值区间的上下限两端靠近,这导致反向传播时低层神经网络的梯度消失。
   BN是基于Mini-Batch SGD的,通过一定的规范化手段,把每层神经网络任意神经元输入值的分布强行拉回到均值为0方差为1的标准正太分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,避免梯度消失问题产生,能大大加快训练速度。但是这样会造成,将非线性激活函数替换成线性激活函数效果相同,网络的表达能力下降,因此每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,可能是为了找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。

  训练过程如上所示,先对一个batch_size内的数据求其均值和方差,进行标准化成均值为0方差为1的正态分布,然后训练参数 γ \gamma γ β \beta β。推理时,因为每次只输入一个样本,所以没有办法得到均值和方差的统计量,可以用从所有训练实例中获得的统计量来代替Mini-Batch里面m个训练实例获得的均值和方差统计量,即用全局的统计量。但是想要计算所有图像的均值和方差不太现实,所以每次计算每个batch的均值和方差,然后为了让其与整体分布的均值和方差估计值接近,利用了滑动平均的操作计算更新推理的均值和方差。滑动平均或者指数加权平均,可以用来估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关,相比于直接赋值而言,不会因为某次异常取值而使得滑动平均值波动很大。有了均值和方差,每个隐层神经元也已经有对应训练好的Scale参数和Shift参数,因此可以直接计算了。参考链接:https://blog.csdn.net/just_sort/article/details/104468418
优点:(1)允许较大的学习率;(2)减弱对参数初始化的强依赖性;(3)有轻微的正则化作用,可以防止过拟合。
缺点:(1)对较小的batch size效果不好;(2)BN适用于固定深度的前向神经网络,如CNN,不适用于RNN。

常见问题:

1、Dropout 的 p p p 一般取多少?
   在编写tensorflow程序的时候,会发现训练的时候dropout的参数keep_prob=0.8(0.5,0.9等),在测试的时候keep_prob=1.0,即不进行dropout。在 p = 0.5 p=0.5 p=0.5 随机舍弃神经元时,所有的神经元的排列组合数取得最大值,这就意味着随机生成的网络结构更多,符合dropout的初衷。

2、Dropout和BN在卷积神经网络中的位置如何放置?
   Dropout一般放在全连接层防止过拟合,提高模型泛化能力,在全连接层中一般放在激活函数层之后,如果放在某些激活函数之前,有可能原本为0的节点在经过激活函数后又有了不为0的输出。由于卷积层参数较少,卷积层一般使用BN,BN-Inception原文建议放在ReLU激活函数之前;在ResNetv2中放在后面好像还好了一点,放在ReLU后相当于直接对之后每层的输入进行归一化。目前的话,只是习惯放在激活层前,其实区别不是很大,区别大的是是否使用BN。

3、如何分析深度神经网络训练起来越困难,收敛越来越慢的原因?
  可以从以下几方面解决:(1)学习率设置不当,学习率过大导致训练在局部最小值附近来回震荡,或者学习率过小导致优化步长太小;有可能是发生了梯度消失问题,因此(2)激活函数使用不当;(3)网络中没有使用BN层;(4)网络结构没有使用像ResNet的快捷连接类似的优化结构。

4、BN在推理的时候怎么加速?
  将卷积层和BN层融合,本质上是修改了卷积核的参数,在不增加conv层计算量的同时,省略掉了BN层的计算量。conv层的参数 w , b w,b w,b x 1 = w ∗ x + b x_1 = w*x + b x1=wx+b,BN层的参数 γ , β , σ , μ \gamma,\beta,\sigma,\mu γ,β,σ,μ x 2 = γ ∗ x 1 − μ σ 2 + ϵ + β x_2 = \gamma*\frac{x_1-\mu}{\sqrt{\sigma^2+\epsilon}}+\beta x2=γσ2+ϵ x1μ+β,所以输入为 x x x 的输出结果 x 2 = γ ∗ w σ 2 + ϵ ∗ x + β + γ ∗ ( b − μ ) σ 2 + ϵ x_2 = \frac{\gamma*w}{\sqrt{\sigma^2+\epsilon}}*x+\beta+\frac{\gamma*(b-\mu)}{\sqrt{\sigma^2+\epsilon}} x2=σ2+ϵ γwx+β+σ2+ϵ γ(bμ)

5、BN跨卡训练怎么保证相同的mean和var?
  当进行多卡训练时,每次迭代输入的数据被等分在不同的GPU上前向和后向运算,在迭代完成后合并梯度、更新参数,再进行下一次迭代。因为前向和后向运算的时候,每块卡是独立的,所以BN归一化的样本数量仅仅局限于卡内,相当于批量大小减少了。跨卡同步BN的关键是前向运算的时候取全局的均值和方差,即将每张卡的 x i x_i xi x i 2 x_i^2 xi2 求和,后向运算时也需同步一次。

6、除了BN,还有哪些深度学习中常用的归一化方法?
常用的Normalization方法主要有:

在这里插入图片描述
  如上图所示,(1)BN的计算就是把一个batch的N个样本的每个通道的H×W单独拿出来归一化处理。(2)但是对于LN,其不依赖于batch size和输入sequence的长度,因此可以用于batch size为1和RNN中,LN用于RNN效果比较明显,但是在CNN上效果不如BN。LN中同层神经元的输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差,简单理解为对特征图数值进行归一化。(3)IN针对图像像素做归一化,最初用于图像的风格化迁移。在图像风格化中,生成结果主要依赖于某个图像实例,并且feature map的各个channel的均值和方差会影响到最终生成图像的风格。所以对整个batch归一化不适合图像风格化,因而对H×W做归一化,可以加速模型收敛,并且保持每个图像实例之间的独立。(4)GN是为了解决BN对较小的mini-batch size效果差的问题,GN适用于占用显存比较大的任务,例如图像分割。对这类任务,可能batch_size只能是个位数,再大显存就不够用了,这时BN的表现很差,因为没办法通过几个样本的数据量来近似总体的均值和标准差。GN也是独立于batch的,它是LN和 IN的折中。(5)将 BN、LN、IN 结合,赋予权重,让网络自己去学习归一化层应该使用什么方法,但训练复杂。

什么是梯度消失和梯度爆炸?

梯度消失(vanishing gradients):指的是在训练过程中,梯度(偏导)过早接近于0的现象,导致(部分)参数一直不再更新,整体上表现得像损失函数收敛了,实际上网络尚未得到充分的训练。
梯度爆炸(exploding gradients):指的是在训练过程中,梯度(偏导)过大甚至为NAN(not a number)的现象,导致损失剧烈震荡,甚至发散(divergence)。

原因

  根源是深度神经网络和反向传播,目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。 梯度消失经常出现的两种情况:一是在深层网络中,二是采用了不合适的激活函数,比如sigmoid。梯度爆炸一般出现在:一是深层网络中,二是权值初始化值太大的情况下。

  • 从深层网络角度来讲,不同的层学习的速度差异很大。具体表现为,网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则。在参数更新的计算中,主要的影响因素来自激活函数的偏导当前层的输入(前一层的输出)、以及权重的数值等,这些因子连续相乘,带来的影响是指数级的。
  • 激活函数的角度来讲,计算权值更新信息的时候需要计算前层偏导信息,此时需要对激活函数求导。因此,如果激活函数选择不合适,比如使用sigmoid,梯度消失就会很明显了。这是由于使用sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失。tanh比sigmoid要好一些,但是它的导数仍然是小于1的。除此之外,一旦陷入饱和区,两者的偏导都接近于0,导致权重的更新量很小。
  • 权值初始化的角度来讲,过小,导致梯度消失;过大,导致梯度爆炸。

解决方法

针对梯度爆炸:

  • 梯度剪切:其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。
  • 权重正则化:比较常见的是L1正则和L2正则,在各个深度框架中都有相应的API可以使用正则化。

然而,在深度神经网络中,往往是梯度消失出现的更多一些:

  • Relu等激活函数,解决了梯度消失、爆炸的问题;计算方便,计算速度快;加速了网络的训练。
  • BN:正如上所述,通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到接近均值为0方差为1的标准正太分布,即严重偏离的分布强制拉回比较标准的分布。这样使得激活输入值落在非线性函数对输入比较敏感的区域,输入的小变化就会导致损失函数较大的变化,使得让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
  • 残差结构:跨层连接,不会导致梯度消失。
  • LSTM:LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“,因此,经常用于生成文本中。

常用的优化方法

机器学习:各种优化器Optimizer的总结与比较

如何解决局部最优问题

对局部最优的避免有两个根本方法:
1、深入研究问题的机理,对问题的机理研究的越透彻,就能更准确的找到全局最优,或划定全局最优可能的区域;
2、随机搜索,对机理不明的问题,解的搜索越随机陷入局部最优的可能性就越小。

对于已经陷入局部最优,或怀疑陷入局部最优的情况:
1、“跳出”,也就是在当前解的基础上向其他方向搜索;
2、“重启”,无视当前解并在新的区域重新搜索。

具体方法如下:

  • 以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数,这相当于从多个不同的初始化点开始搜索,从而可能寻找全局最优。
  • 使用随机梯度下降,与标准的梯度下降法精确计算梯度不同,随机梯度下降法在计算梯度时加入了随机的因素。于是,即便陷入局部极小点,它计算出的梯度时加入了随机因素,于是,即便陷入局部极小点,它计算出的梯度可能不为0,这样就有机会跳出局部极小继续搜索。
  • 带动量的梯度下降优化,设置动量,本次前进的步伐,根据上一次的步伐适当调大。好比从高坡滑落的石头,会更有机率跨过一些小坑(局部最优),如果坑非常大,依靠动量的惯性是没法逃出的。
  • 通过不断重置学习率来逃离局部极值点,学习率周期变化,或者自适应学习率。
  • 使用模拟退火算法,模拟退火在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小。在每步迭代过程中,接受“次优解”的概率随着时间的推移而逐渐降低,从而保证算法的稳定。

如何初始化神经网络的权重参数?

  正确初始化神经网络的参数对神经网络的最终性能有着决定性作用:如果参数设置过大,会出现梯度爆炸的现象,导致网络训练过程发散;而如果参数设置过小,会出现梯度消失的现象,导致收敛极其缓慢。

  • 标准正态分布去初始化参数:N(0, 1),每层激活函数的输出集中为-1或者1,这也就意味着激活函数陷入了饱和状态。假设数据点跟权重参数独立且服从均值为0,方差为1的分布,那么累加后的的方差为,相对于权重的标准正态分布来说,z其实是个方差很大的高斯分布,在-1和1这个位置,激活函数对应的导数接近为0,梯度太小,参数更新缓慢或者更新停滞。
  • 采用均匀分布的方式去初始化参数:结果随着层数的增加,每层激活函数的输出逐渐往0靠拢。因为随着层数的增加,方差不断减少,激活函数的输出值渐渐为0,使得参数也难以更新。
  • 为了训练过程中参数能够比较好地去更新,需要一种合理的初始化参数的方式,使得每一层激活函数的输出的方差不变,而这也是Xavier初始化的主要思想。对于Xavier初始化的基本思想是希望激活的平均值为0且激活的方差在每层保持不变,但是,Xavier初始化并不是万能的,它其中一个很大的不足就是假设激活值关于0对称,显然,这个假设不适用于ReLU激活函数。所以如果要保持方差不变,只需要将权重方差的大小加倍即可,这就是He初始化

训练标签的几种形式

one-hot label

  在机器学习中,类别数据是一种只有标签值而没有数值的变量。将决策树算法直接应用于类别数据上,可以不进行任何数据转换,但还有许多机器学习算法并不能直接操作标签数据,这些算法要求所有的输入输出变量都是数值。很容易想到的就是整数编码,每个类别值都分配一个整数值,整数之间存在的自然排序关系也可以被机器学习所利用。但对于不存在次序关系的类别变量,仅使用上述的整数编码是不够的,因为预测值有可能落在两个类别的中间。One-Hot编码指的是将类别标签使用“01向量”来进行表示,又叫独热(一位有效)编码。它的作用是将分类变量作为二进制向量的表示,并为每个整数值都创建一个二值变量,然后将类别对应整数序号的二进制位置1,其余置0。

soft label

  one-hot编码要求每个类别之间相互独立,所以包含的信息量很低,而soft label包含的信息量拥有不同类别之间的关系信息。比如说,一个图像分类的数据库有猫、狗、卡车、汽车等类别,label只给出图A中的物体是狗,图B是卡车,而并没有给出图A里面的狗会更像猫,图B里面的卡车会更像汽车。对比 hard label: [ 1 , 0 , 0 ] [1,0,0] [1,0,0],soft label: [ 0.6 , 0.3 , 0.1 ] [0.6,0.3,0.1] [0.6,0.3,0.1]

label smoothing

  在训练神经网络时,最小化预测概率和标签真实概率之间的交叉熵,从而得到最优的预测概率分布,即
f ( x i ) { + ∞ , i f ( i = y ) 0 , i f ( i ≠ y ) f(x_i) \begin{cases} +\infty, &if(i=y)\\ 0, &if(i \not= y) \end{cases} f(xi){+,0,if(i=y)if(i=y)
  如此一来,神经网络会促使自身往正确标签和错误标签差值最大的方向学习,在训练数据较少,不足以表征所有样本特征的情况下,会导致网络过拟合。标签平滑可以解决上述问题,主要是通过soft one-hot来加入噪声,减少了真实样本标签的类别在计算损失函数时的权重,最终起到了抑制过拟合的效果。进行label smoothing后的真实概率分布如下:
P ( x i ) { ( 1 − ϵ ) , i f ( i = y ) ϵ K − 1 , i f ( i ≠ y ) P(x_i) \begin{cases} (1-\epsilon), &if(i=y)\\ \frac \epsilon {K-1}, &if(i \not= y) \end{cases} P(xi){(1ϵ),K1ϵ,if(i=y)if(i=y)

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值