ML、DL、CV常见的问题整理

一些ML、DL、CV常见的问题整理。参考链接

LeNet、AlexNet、VGG、GoogleNet、ResNet

一文读懂LeNet、AlexNet、VGG、GoogleNet、ResNet到底是什么?

  1. LeNet:5×5卷积(6)+2×2池化 | 5×5卷积(16)+2×2池化 | 5×5卷积(120) | 全连接64 | 全连接classes
  • 输入图像只有28×28,当尺寸过大,如224×224,效果就不好
  1. AlexNet:11×11卷积(96, s=4)+池化 | 5×5卷积(256)+池化 | 两个3×3卷积(384)+一个3×3卷积(256)+池化 | 两个(4096全连接+drop) | 全连接1000
  • 数据增广:通过对训练随机加一些变化,比如平移、缩放、裁剪、旋转、翻转或者增减亮度等
  • 使用Dropout抑制过拟合
  • 使用ReLU激活函数减少梯度消失现象
  1. VGG-16:
  • 有13层卷积和3层全连接层
  • 严格使用3×3的卷积层和池化层来提取特征
  • 每层卷积将使用ReLU作为激活函数
  • 在全连接层之后添加dropout来抑制过拟合
  1. GoogLeNet/Inception:
  • 将1×1,3×3,5×5的Conv和3×3的pooling堆叠在一起,一方面增加了网络的width,一方面增加了网络对尺度的适应性(不同卷积大小可以捕捉不同尺度特征)
  • 3×3卷积的运算量很大,5×5卷积的运算量更大。所以,为了提高效率,使用1×1卷积进行降维调整通道,这样可以减小运算量。同时,一层变成两层,可以增加网络的非线性
  • 引入辅助分类器:就相当于整个网络结构中有三个softmax。最深层的softmax对整个网络都有影响,中层的只对中层以内的有影响,浅层的只对浅层以内的有影响。

纵览轻量化卷积神经网络

纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception

  1. SqueezeNet
  • 主要是其中的fire模块,一个fire模块由Squeeze和Expand部分组成
  • Squeeze部分由1×1卷积组成
  • Expand部分由1×1卷积和3×3卷积concatenate
  • 就是特征图先由1×1卷积降维,然后分两条路,一条1×1卷积,一条3×3卷积,然后再concat
  1. MobileNet
  • 卷积块特点:普通卷积替换为深度卷积和点卷积;除第一个卷积层和最后的全连接层,所有卷积层后都有BN、ReLU相连;其中的ReLU都变成了ReLU6。增加非线性与泛化能力;不是用池化,而是用步长为2(s2)的卷积方式下采样
  • Depthwise Separable Convolution = depthwise convolution(3×3) + pointwise convolution(1×1)。
  • 输出的每一个 feature map 要包含输入层所有 feature map 的信息(否则叫信息不流畅?)。然而仅采用 depth-wise convolution,是没办法做到这点,因此需要 pointwise convolution 的辅助。
  • 下面用输入三通道,输出四通道举例说明计算量
  • 普通卷积计算量:3×3×3×4=108
  • 深度可分离卷积计算量:3×3×1×3+1×1×3×4=39
  1. ShuffleNet
  • shuffle 具体来说是 channel shuffle,是将各部分的 feature map 的 channel 进行有序的打乱,构成新的 feature map,以解决 group convolution 带来的「信息流通不畅」问题。(MobileNet 是用 point-wise convolution 解决的这个问题)
  • 主要采用channel shuffle、pointwise group convolutions和depthwise separable convolution来修改原来的ResNet单元
  • channel shuffle:(看参考链接,讲的很详细)
  • 主要要了解group的概念
  1. 总结
  • 轻量化实现技巧:
网络轻量化实现技巧
SqueezeNet1×1卷积核压缩 feature map 数量
MobileNetDepth-wise convolution
ShuffleNetDepth-wise convolution
Xception略改进Depth-wise convolution
  • 前三个是真正意义上的轻量化网络,而 Xception 是为提升网络效率,在同等参数数量条件下获得更高的性能。轻量化主要得益于 depth-wise convolution,但是要注意「信息流通不畅问题」。
  • 解决「信息流通不畅」的问题,MobileNet 采用了 point-wise convolution,ShuffleNet 采用的是 channel shuffle。MobileNet 相较于 ShuffleNet 使用了更多的卷积,计算量和参数量上是劣势,但是增加了非线性层数,理论上特征更抽象,更高级了;ShuffleNet 则省去 point-wise convolution,采用 channel shuffle,简单明了,省去卷积步骤,减少了参数量。

BN系列相关问题

BN系列相关问题

  1. BN的背景/基本原理
  • 提到训练收敛的问题,需要先解释一个现象,叫做内部协变量偏移(Internal Covariate Shift),对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是covariate shift问题只发生在输入层。
  • 而BatchNorm的基本思想就是,能不能让每个隐层节点的激活输入分布固定下来呢?这样就避免了“Internal Covariate Shift”问题了。所以就有了BN中的数据标准化处理,BN 其实就是在做 feature scaling,而且它的目的也是为了在训练的时候避免这种 Internal Covariate Shift 的问题。
  1. 基本公式(就是均值方差归一化,可以看参考链接)
  2. 为什么BN能抑制过拟合:简单理解来说,BN就是对每一批数据归一化到相同的分布,而每一批数据的均值和方差都有一定的差别,而不是固定的值(可以认为是引入了噪声,这就可以认为是进行了data augmentation),这个差别增加了模型的鲁棒性,一定程度上减少过拟合。
  3. Sync BN:在一般的视觉问题上,单卡的batchsize其实已经够大,没必要把所有卡上的都统计一遍。然而到了现在的检测或者分割问题上,有些大模型单卡只能bs=1,这样的话BN完全无法发挥作用,所以我们需要在更多的卡上同步bn。

优化器

不同的优化器1不同的优化器2
(第一个好好看啊)

  1. BGD:批量梯度下降采用整个训练集的数据来计算,由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手。对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。
  2. SGD:随机梯度下降通过每个样本来迭代更新一次,如果样本量很大的情况,那么可能只用其中部分的样本。SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。
  3. MBGD:Mini-Batch Gradient Descent每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。和 SGD 的区别是每一次循环不是作用于每个样本,而是具有 n 个样本的批次。

挑战1:局部极小值、鞍点、震荡等问题

挑战2:SGD对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。LR会随着更新的次数逐渐变小。

(应对挑战1)

  1. Momentum:SGD 在遇到沟壑时容易陷入震荡。为此,可以为其引入动量 Momentum,加速 SGD 在正确方向的下降并抑制震荡。就如,当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。
  2. Nesterov Accelerated Gradient:在计算梯度时,不是在当前位置,而是未来的位置上

(应对挑战2)

  1. Adaptive gradient algorithm (Adagrad):这个算法就可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性
  2. Adadelta:这个算法是对 Adagrad 的改进
  3. RMSprop:RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的
  4. Adaptive Moment Estimation (Adam):这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum

如何选择优化器?

  • 如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。

梯度消失和梯度爆炸

  1. 链式法则是一个连乘的形式,所以当层数越深的时候,梯度将以指数形式传播。梯度消失问题和梯度爆炸问题一般随着网络层数的增加会变得越来越明显。在根据损失函数计算的误差通过梯度反向传播的方式对深度网络权值进行更新时,得到的梯度值接近0或特别大,也就是梯度消失或爆炸。梯度消失或梯度爆炸在本质原理上其实是一样的。
  2. 梯度消失:梯度消失就会导致偏导数极端的小,从而导致很多层学习得很慢几乎都不学习,很多层就变成了僵尸层,深度神经网络就变成了浅层神经网络。(0.5×0.5×0.5×0.5×…)(出现的原因有可能是使用了不合适的激活函数,如层数太深使用的sigmoid,sigmoid的梯度是不可能超过0.25的)
  3. 梯度爆炸就会导致偏导数极端的大,从而导致很多层乱学习,走火入魔了,而且数值可能大到超出了合法范围的值,变成了NaN值,从而导致无法再学习。(1.5×1.5×1.5×1.5×…)

过拟合与欠拟合

举个例子:

下面是四组预测产生的错误率:

数据集第一组第二组第三组第四组
训练集15%0.5%1%15%
验证集16%1%11%30%
结论欠拟合拟合度刚好过拟合欠拟合&过拟合
  1. 第一组属于欠拟合,因为对训练集的错误率太高了,与人类预测能力不符合
  2. 第二组拟合得刚好,对训练集和验证集的错误率都挺好,也与人相似
  3. 第三组属于过拟合,虽然训练集错误率低且符合人类预测的错误率,但是验证集的错误率很高,与训练集的相差过大,说明模型对训练集拟合过度了
  4. 第四组属于既欠拟合又过拟合

怎么缓解:

  1. 首先排除数据问题,也就是要同源。同时还要正常,不能人类都很难区分,怎么指望计算机分出来呢
  2. 解决欠拟合:更大的神经网络;增加训练次数;尝试其他优化算法;尝试不同神经网络架构
  3. 解决过拟合:降低模型复杂度;更多训练数据;正则化;尝试不同的神经网络架构;增加噪声(途径很多)

正则化:我们可以通过降低模型的复杂度来防止过拟合,这种原则也就是正则化。

  • 也就是说,并非只是以最小化损失为目标,而是以最小化损失和复杂度为目标
  • 现在,我们的训练优化算法是一个由两项内容组成的函数:一个是损失项,用于衡量模型与数据的拟合度;另一个是正则化项,用于衡量模型复杂度。
  • L2正则化就是其中一种,它的实现分为两步。第一步,就是在成本函数后面加点”尾巴“;第二部,就是在计算偏导数的时候加点”尾巴“。
  • 计算偏导的时候,加入尾巴后,dw 就变大了,那么 w=w-r×dw 就会更小,所以L2正则化被成为”权重衰减“,因为它让权重变小了。极端情况下,假设一些神经元相关的权重为0,那么就可以极端的认为这些神经元不起作用,就可以极端的认为现在的网络变成了”很简单的网络“。(注意这里的”极端“,其实还是起作用的,只是比较小的权重)

目标检测网络

(可见博客目标检测——RCNN与YOLO系列

评价指标

(mAP,Recall,Precision,Accuracy,F1,ROC/AUC等)
(可见博客《机器学习》笔记

上采样的方式

上采样的方式

  1. 插值:插值常用的方式有nearest interpolation、bilinear interpolation、bicubic interpolation。
  2. 上采样 upsampling:上采样指的是任何可以让图像变成更高分辨率的技术。最简单的方式是重复采样(就是复制呗)和插值(插值应该属于上采样的一种):将输入图片进行rescale到一个想要的尺寸,而且计算每个点的像素点,使用如双线性插值等插值方法对其余点进行插值来完成上采样过程。
  3. 上池化 unpooling:特点是在Maxpooling的时候保留最大值的位置信息,之后在unPooling阶段使用该信息扩充Feature Map,除最大值位置以外,其余补0。(这就是它与upsampling的不同,SegNet就用到了这个方法)
  4. 转置卷积/反卷积/逆卷积/分数步长卷积
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

damonzheng46

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值