深度学习面试相关

批量归一化(BN)如何实现?作用

实现过程:

计算训练阶段mini_batch数量激活函数前结果的均值和方差,然后对其进行归一化,最后对其进行放缩和平移。

作用:

  1. 可以使用更高的学习率进行优化
  2. 移除或使用较低的dropout
  3. 降低L2权重衰减系数
  4. 调整数据的分布,不考虑激活函数,它让没一层的输出归一化到了均值为0方差为1的分布,这保证了梯度的有效性,可以解决反向传播过程中的梯度问题。

什么是Dropout?为什么有用?它如何工作的?

背景:如果模型的参数太多,数据量又太少,则容易产生过拟合。为了解决过拟合,就同时训练多个网络,然后多个网络取平均。---费时
介绍: Dropout可以 防止过拟合 ,在前向传播的时候,在某个神经元的激活值 以一定的概率P停止工作,这样可以使模型的泛化性更强。
Dropout效果跟bagging效果类似(bagging是减少方差variance,而boosting是减少偏差bias)
加入Dropout会使得神经网络训练时间长,模型预测时不需要Dropout,记得关掉
具体流程:

  1. 随机删除(临时)网络中一定的隐藏神经元,输入输出保持不变。
  2. 让输入通过修改后的网络,然后把得到的损失同时修改后的网络进行反向传播。在未删除的神经元上进行参数更新。
  3. 重复该过程(恢复之前删除掉的神经元,以一定概率删除其他神经元。前向传播得到误差,反向传播更新参数。)

如何选择dropout的概率

input layer的概率推荐为0.8,hidden layer推荐为0.5

为什么Dropout可以解决过拟合?

1.取平均的作用
Dropout产生了许多子结构之后的操作,父神经网络有N个节点,加入Dropout之后可以看作在权值不同的情况下(参数共享)将模型数量扩增到指数级别
2. 减少神经元之间复杂的共适应关系,迫使网络去学习更加鲁棒。

CNN的组成

对图像(不同的数据窗口数据)和滤波矩阵做内积(逐个元素相乘在求和)的操作就是所谓的卷积操作
卷积神经网络是由输入层卷积层激活层池化层全连接层组成
1) 最左边:
数据输入层,对数据做一些处理:

去均值:把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果
归一化:把所有的数据都归一到同样的范围
PCA:主成分分析
白化:目的是去除输入数据的冗余信息

经过白化处理后,新的数据X'满足两个性质:
(1)特征之间相关性较低;
(2)所有特征具有相同的方差。

CNN只对训练集做"去均值"操作

2)中间是:

CONV:卷积层,线性乘积求和
Relu:激活层,Relu是激活函数的一种

激活函数的作用是:引入非线性因素,提高了模型的表达能力
如果没有激活函数,那么模型就只有线性变换,可想而知线性模型能表达的空间是有限的。而激活函数引入了非线性因素,比线性模型拥有更大的模型空间。

Pool:池化层,即取区域平均或最大。池化层的作用就是:减小图像尺寸即数据降维,缓解过拟合,保持一定程度的旋转和平移不变性。

PS:网络设计中,为什么卷积核设计尺寸都是奇数?

  1. 保证像素点中心位置,避免位置信息偏移
  2. 填充边缘时能保证两边都能填充,原矩阵依然对称

3)最右边:

FC:全连接层

卷积神经网络的结构

CNN层次结构 输出尺寸 作用
输入层 \(W_1*H_1*3\) 卷积网络的原始输入,可以是原始或预处理后的像素矩阵
卷积层 \(W_1*H_1*K\) 权重共享、局部连接,利用平移不变性从全局特征图提取局部特征图
激活层 \(W_1*H_1*K\) 将卷积层的输出结果进行非线性映射
池化层 \(W_2*H_2*K\) 进一步筛选特征,可以有效减少后续网络层次所需的参数量
全连接层 \((W_2 \cdot H_2 \cdot K) * C\) 将多维特征展平为2维特征,通常低微度特征对应任务的学习目标(类别或回归值)

卷积层和全连接层的区别?

  1. 卷积层是局部连接,所以提取到的是局部信息;全连接是全局连接,提取到的是全局信息
  2. 当卷积层的局部连接是全局连接时就是全局连接,全连接层是卷积层的特例。

卷积层和池化层的区别?

卷积层 池化层
结构 零填充时输出维度不变,而通道数改变 通常特征维度会降低,通道数不变
稳定性 输入特征发生细微改变时,输出结果会改变 感受域内的细微变化不影响输出结果
作用 感受域内提取局部关联特征 感受域内提取泛化特征,降低维度
参数量 与卷积核尺寸,卷积核个数相关 不引入额外参数

另:

  • 卷积层有参数,池化层没有参数
  • 经过卷积层节点矩阵深度会改变,池化层不会改变节点矩阵的深度,但是它可以缩小节点矩阵的大小

卷积层有哪些基本参数

  • 卷积核大小(Kernel Size)
    定义卷积的感受野
    (过去常设为5, 如LeNet-5,现在多设为3,通过堆叠3x3的卷积核来达到更大的感受域)

  • 卷积核步长(stride)
    常见设为1,可以覆盖所有相邻位置特征的组合;当设置为更大值时,相当于对特征组合降采样。

  • 填充方式(padding)

  • 输入通道数
    指定卷积操作时卷积核的深度

  • 输出通道数
    指定卷积核的个数

PS:
感受野:CNN每一层输出的特征图上的像素点在原始图像上映射的区域大小。

如何计算卷积层的输出大小

\[O = \frac{W - K + 2P}{S}+1 \]

K是卷积核尺寸,P是填充(Padding),S是步长(stride)

如何计算卷积层/全连接层的参数量及计算量?

\[卷积层的参数量= (filter size * 前一层特征图的通道数) * 当前层filter数量 + 当前层filter数量 = (卷积核长度 * 卷积核宽度 * 通道数 + 1) * 卷积核个数 \]

对于全连接层的参数量的计算方法,其实和卷积层参数量的计算方法是一样的
如VGG-16最后一次卷积得到的feature map为7*7 * 512,全连接层是将feature map展开成一维向量1 * 4096,实际就是用4096个7 * 7 * 512的filter去做卷积(可以理解为是一个卷积层)
那第一个FC的参数量就是 \(7 * 7 * 512 * 4096 = 102760448\)
全连接层参数冗余。全连接层参数就可占整个网络参数80%左右

注:
+1代表偏置

\[卷积层的计算量 = 输出的feature map * 当前filter \]

以VGG_16为例,Conv1-1输入224 * 224 * 3, 64个3 * 3 filter,输出feature map为224 * 224 * 64
feature map中的每一个像素点,都是64个3 * 3filter共同作用于原图计算一次得到的,所以它的计算量为 3 * 3 * 64
已知单个像素的计算量,乘以feature map所有像素,就是一次卷积的计算量:\(224 * 224 * 64 * 3 * 3 * 64\)

举例:

输入层矩阵维度为96 * 96 * 3,第一层卷积层使用尺寸为 5 * 5,深度为16的过滤器(也就是卷积核尺寸为5 * 5,卷积核数量为16),那么这层卷积层的参数个数为\(5 * 5 * 3 * 16 + 16 = 1216\)

全连接层的计算量:和卷积层计算量的计算方法是一样的。

VGG_16最后一次得到的feature map为7 * 7 * 512,全连接层是将feature map展开为一维向量 1 * 4096,则FC层的计算量为\(7 * 7 * 512 * 1 * 4096 = 102760448\)

PS:
这也得到了一个结论:

  • 需要减少网络参数时主要针对全连接层
  • 进行计算优化时,重点放在卷积层。

参考:https://zhuanlan.zhihu.com/p/77471991

怎样才能减少卷积层的参数量

  • 使用堆叠小卷积核代替大卷积核

VGG网络中2个3* 3的卷积核可以代替1个5 * 5的卷积核

  • 使用分离卷积操作

将原本K * K * C的卷积操作分离成K * K * 1和1 * 1 * C的两部分操作

  • 添加1 * 1的卷积操作

与分离卷积类似,但通道数可变,在K * K * C1卷积前添加1 * 1 * C2的卷积核(满足C2 < C1)

  • 在卷积层前使用池化操作

池化可以降低卷积层的输入特征维度

1 * 1卷积的作用

  • 加入非线性函数。卷积层之后经过激活层提升网络的表达能力。
  • 对卷积核通道数进行降维和升维,减小参数量

CNN中的空洞卷积有什么作用

空洞卷积也叫做扩张卷积,在保持参数个数不变的情况下增大卷积核的感受野,同时它可以保证输出的特征映射的大小保持不变。一个扩张率为2的3 * 3的卷积核,感受野与5 * 5的卷积核相同,但参数数量仅为9个。

采用宽卷积,窄卷积的好处是什么?

宽卷积、窄卷积其实是一种填充方式

  • 宽卷积("SAME"填充)
    对卷积核不满足整除条件的输入特征进行补全,以使卷积层的输出维度保持与输入特征维度一致
  • 窄卷积("VALID"填充)
    不进行任何填充,在输入特征边缘位置若不足以进行卷积操作,则对边缘信息进行舍弃,因此在步长为1的情况下该填充方式的卷积层输入特征维度可能会略小于输入特征的维度。

如何提高卷积神经网络的泛化能力?

1.增加数据
2.使用更大批次 在相同迭代次数和学习率的条件下,每批次采用更多的数据将有助于模型更好的学习到正确的模式
3.调整数据分布 模型过多地学习某类数据容易导致其输出结果偏向于该类型的数据
4.调整目标函数
5.调整网络结构 浅层卷积神经网络中,参数量较少往往使模型的泛化能力不足而导致欠拟合,此时通过叠加卷积层可以有效地增加网络参数,提高模型表达能力;深层卷积网络中,若没有充足的训练数据则容易导致模型过拟合,此时通过简化网络结构减少卷积层数可以起到提高模型泛化能力的作用
6. 数据增强 通过平移、旋转、加噪声等一些列变换来增加训练数据,同类数据的表现也变得更多样,有助于模型提高泛化能力,需要注意的数据变化应尽可能不破坏元数据的主体特征
7. 权值正则化 在损失函数中添加一项权重矩阵的正则项作为惩罚项,用来惩罚损失值较小时网络权重过大的情况,此时往往是网络权值过拟合了数据样本
8.dropout 即网络结构上的正则化,通过随机性地屏蔽某些神经元的输出让剩余激活的神经元作用,可以是模型的容错性更强

卷积神经网络的优点?为什么用小卷积核?

多个小的卷积核叠加使用要远比一个大的卷积核单独使用效果要好的多

  • 局部连接
    每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连,这样减少了很多参数。

  • 权值共享
    一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数

  • 下采样
    Pooling层利用图像局部相关性的原理,对图像进行子抽样,可以减少数据处理量同时保留有用信息。通过去掉Feature Map中不重要的样本,进一步减少参数数量。

如何理解权值共享

权值共享是由LeNet5模型提出来的。以CNN为例,在一张图进行卷积的过程中,使用的是同一个卷积核的参数。

比如,一个3 * 3 * 1的卷积核,这个卷积核内的9个参数是被整张图共享的,而不会因为图像内位置的不同而改变卷积核内的全系数。

通俗说:就是用一个卷积核不改变其内权系数的情况下卷积处理整张图片。

为什么需要反向传播

  • 反向传播快速、简单且易于实现
  • 没有要调整的参数
  • 不需要网络的先验知识
  • 模型不需要学习函数的特性

反向传播是如何工作的?

  1. 输入层接收x
  2. 使用权重w对输入进行建模
  3. 每个隐藏层计算输出,数据在输出层准备就绪
  4. 实际输出和期望输出之间的差异称为误差
  5. 返回隐藏层并调整权重,以便在以后的运算中减少此错误
    这个过程一直重复,知道我们得到所需的输出,训练阶段在监督下完成。一旦模型稳定下来,就可以用于生产了。

神经网络中包含哪些超参数

通常可以将超参数分为三类:网络参数优化参数正则化参数

  • 网络参数:可指网络层与层之间的交互方式(相加、相乘或者串接等)、卷积核数量和卷积核尺寸、网络层数(也称深度)和激活函数等

  • 优化参数:一般指学习率、被样本数量(batch size)、不同优化器的参数以及部分损失函数的可调参数

  • 正则化:权重衰减系数,dropout比率

为什么要进行超参数调优

本质上,这是模型优化寻找最优解和正则项之间的关系。
网络模型优化调整的目的是为了寻找全局最优解(或者相比更好的局部最优解),而正则项又希望模型尽量拟合到最优。通常,两者存在一定的对立,但两者的目标是一致的,即最小化期望风险。
模型优化希望最小化经验风险,而容易陷入过拟合,正则项用来约束模型复杂度。所以如何平衡两者之间的关系,得到最优或者较优的解就是超参数调整优化的目的。

神经网络调参,要往哪方面想?

  • 损失函数的选择是否合适
  • 学习率选取的是否合适
  • batch size选择的是否合适
  • 训练样本是否正常,是否需要增强
  • 是否有设置batch normalization(数据归一化)
  • 激活函数的类型是否合适
  • 选取合适的优化算法(如梯度下降,Adam等)
  • 是否存在过拟合

神经网络调参有哪些技巧?

  1. 准备数据

1.1 保证有大量、高质量并且带有干净标签的数据
1.2 样本要随机化,防止大数据淹没小数据
1.3 样本要做归一化

2.预处理

0均值和1方差化

  1. minibatch

建议值128,不要过大的数值,否则很容易过拟合

  1. 梯度归一化

其实就是计算出来梯度后,除以minibatch的数量

  1. 学习率
  1. 用一个一般的lr开始,然后逐渐的减小它
  2. 建议值是0.01,适用于很多NN的问题,一般倾向于小一点
  3. 对于调学习率的建议:如果在验证集上性能不再增加就让学习率除以2或者5,然后继续,学习率会一直变得很小,到最后就可以停止训练了
  4. 很多人设计学习率的一个原则是检测一个比率(范数和权值范数之间的比率),如果这个比率在\(10^{-3}\)附近,如果小于这个值,学习会很慢,如果大于这个值,那么学习很不稳定,由此可能带来失败
  1. 使用验证集
    可以知道什么时候开始降低学习率,和什么时候停止训练

  2. 权重初始化的选择

  3. 使用Dropout

  4. early stop,发现val_loss没更新,就尽早停止

如何提高小型网络的精度

  • 模型蒸馏技术
  • 利用AutoML进行网络结构的优化
posted @ 2023-03-04 20:47  牛犁heart  阅读(50)  评论(0编辑  收藏  举报