zoukankan      html  css  js  c++  java
  • 深度学习中的常见问题汇总(一)

    深度学习中的常见问题汇总(一)

    转自

    1.CNN复杂度分析

    在深度学习基础网络不断进化的过程中,可以发现新的模型不仅性能有极大地提升,网络的复杂度通常也会更低。深度学习网络模型的复杂度直接关系到其实际应用中的速度与可行性,因此这里总结一下 CNN 复杂度的含义与计算方式。

    1.1时间复杂度

    通常,我们假设计算机运行一行基础代码需要一次运算,那么模型的时间复杂度即为模型的运算次数,用浮点运算次数 FLOPs(FLoating-point OPerations) 表示。首先来看一个最简单的单层卷积的时间复杂度。

    其中,

    • M 为每个卷积核输出特征图(Feature Map)的尺寸长度
    • K 为卷积核(Kernel)的尺寸大小
    • C_in 输入的通道数,即上一层的输出通道数目
    • C_out 卷积层具有的卷积核个数,即输出通道数目

    而特征图的尺寸 M 又与输入矩阵大小 X,卷积核尺寸 K,Padding 和步长 Stride 有关,其计算公式为:

    M = (X - K + 2 * Padding )/Stride + 1
    

    注:为了方便说明,上述所提到的卷积核尺寸 K 与输入矩阵大小 X 均为正方形;
    且为了简洁,省略了模型中的偏置 bias。

    对于整体的卷积网络而言,其时间复杂度的计算方式为各层复杂度的累加。其计算方式如下:

    其中,

    • D 为卷积层的数目
    • i 为第 i 个卷积层
    • Ci 为第 i 层卷积的输出通道数目

    1.2空间复杂度

    在深度学习中,空间复杂度一般指的是访存量,包括两个部分:参数量,输出特征图。

    参数量:模型所有带参数的层的权重参数总量(即模型体积,下式左半部分)。

    特征图:模型在实时运行过程中,每层输出的特征图大小(下式右半部分)。

    • 参数量只与卷积核的尺寸 K 、通道数 C 、卷积的总层数 D 相关,而与输入数据的大小无关。
    • 输出特征图的空间占用比较容易,就是其空间尺寸 M^2 和通道数 C 的连乘。

    注:实际上有些层(例如 ReLU)其实是可以通过原位运算完成的,此时就不用统计输出特征图了。

    2.CNN网络的感受野

    2.1感受野的含义

    感受野是深度学习中最为重要的概念之一,定义为:在卷积神经网络CNN中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野(Receptive Field)。通俗来说就是卷积层输出的一个点映射到输入矩阵上的区域大小。感受野的大小直接影响到模型的输出特征,如对于目标检测模型,不同尺寸的目标所适配的感受野大小也不同,因此为了让模型能够适应多尺度的目标检测,通常会借助图像金字塔,或融合多个卷积层的特征,以获得最佳的检测性能。

    为了更直观的理解感受野,可以借助如下的示意图(为了方便,将二维简化成一维)。这是一个三层的 CNN 网络,每一层卷积核的 kernel_size=3, stride=1 ,那么最上层的特征所对应的感受野为7x7。

    2.2感受野的计算方式

    其中 RF 表示特征感受野大小, l 表示层数,l=0 表示输入层, 此时 RF0=1 , feature_stride_0=1 。

    根据感受野的计算公式可以得到每一层的感受野大小:

    第一层

    第二层

    第三层

    但如果有dilated conv的话,计算公式为

    3.梯度消失、爆炸的解决方案

    深度学习的模型训练通常采用梯度更新的方法,且一般层数越深,就可以处理更为复杂的问题。但是随之也带了许多弊端,如梯度消失与梯度爆炸。

    3.1梯度消失

    神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新,这就是梯度消失。

    产生的原因:

    • 网络层数较深
    • 采用不合适的损失函数,比如sigmoid

    3.2梯度爆炸

    梯度爆炸与梯度消失类似,当每层的偏导数值都大于1时,经过多层的权重更新之后,梯度就会以指数形式增加,即为梯度爆炸。

    产生原因:

    • 网络层数较深
    • 权重初始值太大
    • 训练样本有误

    3.3解决方法

    • 逐层训练加微调

      该方法由 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通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“,因此,经常用于生成文本中。

    持续更新ing 。。。

    ——无善无恶心之体, 有善有恶意之动, 知善知恶是良知, 为善去恶是格物
  • 相关阅读:
    【持久化框架】Mybatis与Hibernate的详细对比
    [Linux] day03——REHL部署
    [Linux] day02——什么是Linux
    [Linux] day01——运维
    java也可以做出很漂亮的界面
    python的沙盒环境--virtualenv
    Java虚拟机(JVM)中的内存设置详解
    高手教大家如何配置JVM参数
    最全的静态网站生成器(开源项目)
    Java 8 简明教程
  • 原文地址:https://www.cnblogs.com/danpe/p/10774125.html
Copyright © 2011-2022 走看看