这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」
本篇主要包含Batch Normalization、基础卷积神经网络以及损失函数相关面试经验。
一、Batch Normalization
**1.批标准化(Batch Normalization)**可以理解为是一种数据预处理技术,使得每层网络的输入都服从(0,1)0均值,1方差分布,如果不进行BN,那么每次输入的数据分布不一致,网络训练精度自然也受影响。前向公式:
前向传播代码
def batchnorm_forward(x, gamma, beta, eps):
N, D = x.shape
#为了后向传播求导方便,这里都是分步进行的
#step1: 计算均值
mu = 1./N * np.sum(x, axis = 0)
#step2: 减均值
xmu = x - mu
#step3: 计算方差
sq = xmu ** 2
var = 1./N * np.sum(sq, axis = 0)
#step4: 计算x^的分母项
sqrtvar = np.sqrt(var + eps)
ivar = 1./sqrtvar
#step5: normalization->x^
xhat = xmu * ivar
#step6: scale and shift
gammax = gamma * xhat
out = gammax + beta
#存储中间变量
cache = (xhat,gamma,xmu,ivar,sqrtvar,var,eps)
return out, cache
复制代码
后向传播代码
def batchnorm_backward(dout, cache):
#解压中间变量
xhat,gamma,xmu,ivar,sqrtvar,var,eps = cache
N,D = dout.shape
#step6
dbeta = np.sum(dout, axis=0)
dgammax = dout
dgamma = np.sum(dgammax*xhat, axis=0)
dxhat = dgammax * gamma
#step5
divar = np.sum(dxhat*xmu, axis=0)
dxmu1 = dxhat * ivar #注意这是xmu的一个支路
#step4
dsqrtvar = -1. /(sqrtvar**2) * divar
dvar = 0.5 * 1. /np.sqrt(var+eps) * dsqrtvar
#step3
dsq = 1. /N * np.ones((N,D)) * dvar
dxmu2 = 2 * xmu * dsq #注意这是xmu的第二个支路
#step2
dx1 = (dxmu1 + dxmu2) 注意这是x的一个支路
#step1
dmu = -1 * np.sum(dxmu1+dxmu2, axis=0)
dx2 = 1. /N * np.ones((N,D)) * dmu 注意这是x的第二个支路
#step0 done!
dx = dx1 + dx2
return dx, dgamma, dbeta
复制代码
Batch Norm即批规范化,目的是为了解决每批数据训练时的不规则分布给训练造成的困难,对批数据进行规范化,还可以在梯度反传时,解决梯度消失的问题。
Batchnorm也是一种正则的方式,可以代替其他正则方式如dropout,但通过这样的正则化,也消融了数据之间的许多差异信息。
2. batchnorm的几个参数,可学习的参数有哪些?
第四步加了两个参数γ和β,分别叫做缩放参数和平移参数,通过选择不同的γ和β可以让隐藏单元有不同的分布。这里面的γ和β可以从你的模型中学习,可以用梯度下降,Adam等算法进行更新。
3. Batch Normalization的作用
神经网络在训练的时候随着网络层数的加深,激活函数的输入值的整体分布逐渐往激活函数的取值区间上下限靠近,从而导致在反向传播时低层的神经网络的梯度消失。而BatchNormalization的作用是通过规范化的手段,将越来越偏的分布拉回到标准化的分布,使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题。
①不仅仅极大提升了训练速度,收敛过程大大加快;②还能增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;③另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。
4. BN层怎么实现
1.计算样本均值。2.计算样本方差。3.样本数据标准化处理。4.进行平移和缩放处理。引入了γ和β两个参数。来训练γ和β两个参数。引入了这个可学习重构参数γ、β,让我们的网络可以学习恢复出原始网络所要学习的特征分布。
**5.BN一般用在网络的哪个部分啊?**先卷积再BN
Batch normalization 的 batch 是批数据, 把数据分成小批小批进行 stochastic gradient descent. 而且在每批数据进行前向传递 forward propagation 的时候, 对每一层都进行 normalization 的处理
6.BN为什么要重构
恢复出原始的某一层所学到的特征的。因此我们引入了这个可学习重构参数γ、β,让我们的网络可以学习恢复出原始网络所要学习的特征分布。
7.BN层反向传播,怎么求导
反向传播:
反向传播需要计算三个梯度值,分别是
定义
为从上一层传递过来的残差。
观察缩放和移位与归一化公式,可以看到从xi到yi的链式计算过程:
上式三个加号对应三条链式计算。
8. batchnorm训练时和测试时的区别
训练阶段:首先计算均值和方差(每次训练给一个批量,计算批量的均值方差),然后归一化,然后缩放和平移。
测试阶段:每次只输入一张图片,这怎么计算批量的均值和方差,于是,就有了代码中下面两行,在训练的时候实现计算好mean、 var,测试的时候直接拿来用就可以了,不用计算均值和方差。
9.先加BN还是激活,有什么区别(先激活)
目前在实践上,倾向于把BN放在ReLU后面。也有评测表明BN放ReLU后面效果更好。
二、基础卷积神经网络
1.CNN的经典模型
LeNet,AlexNet,VGG,GoogLeNet,ResNet,DenseNet
2.对CNN的理解
CNN= 数据输入层 (Input Layer)+ {[卷积计算层(CONV Layer )*a+ReLU激励层 (ReLU Layer)]*b+ 池化层 (Pooling Layer ) }*c+全连接层 (FC Layer) * d 。
3.CNN和传统的全连接神经网络有什么区别?
在全连接神经网络中,每相邻两层之间的节点都有边相连,于是会将每一层的全连接层中的节点组织成一列,这样方便显示连接结构。而对于卷积神经网络,相邻两层之间只有部分节点相连,为了展示每一层神经元的维度,一般会将每一层卷积层的节点组织成一个三维矩阵。全连接神经网络和卷积神经网络的唯一区别就是神经网络相邻两层的连接方式。
4.讲一下CNN,每个层及作用
卷积层:用它来进行特征提取
池化层:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征,
激活函数:是用来加入非线性因素的,因为线性模型的表达能力不够。
全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。
5.为什么神经网络使用卷积层?-共享参数,局部连接;
使用卷积层的前提条件是什么?-数据分布一致
6.resnet相比于之前的卷积神经网络模型中,最大的改进点是什么?,解决了什么问题
跳跃连接(residual block)和瓶颈层。resnet本身是一种拟合残差的结果,让网络学习任务更简单,可以有效地解决梯度弥散的问题。
Resnet为啥能解决梯度消失,怎么做的,能推导吗?
由于每做一次卷积(包括对应的激活操作)都会浪费掉一些信息:比如卷积核参数的随机性(盲目性)、激活函数的抑制作用等等。这时,ResNet中的shortcut相当于把以前处理过的信息直接再拿到现在一并处理,起到了减损的效果。
7.resnet第二个版本做了哪些改进,Resnet性能最好的变体是哪个,结构是怎么样的,原理是什么?
Resnetv2:1、相比于原始的网络结构,先激活的网络中f是恒等变换,这使得模型优化更加容易。2、使用了先激活输入的网络,能够减少网络过拟合。
Resnet性能最好的变体是Resnext。
ResNeXt可以说是基于Resnet与Inception 'Split + Transfrom + Concat'而搞出的产物,结构简单、易懂又足够强大。(Inception网络使用了一种split-transform-merge思想,即先将输入切分到不同的低维度中,然后做一个特征映射,最后将结果融合到一起。但模型的泛化性不好,针对不同的任务需要设计的东西太多。)
ResNeXt提出了一个基数(cardinatity)的概念,用于作为模型复杂度的另外一个度量。基数(cardinatity)指的是一个block中所具有的相同分支的数目。
与 ResNet 相比,相同的参数个数,结果更好:一个 101 层的 ResNeXt 网络,和 200 层的 ResNet 准确度差不多,但是计算量只有后者的一半。
ResNet的特点 引入跳跃连接,有效地解决了网络过深时候梯度消失的问题,使得设计更深层次的网络变得可行。
8.简述InceptionV1到V4的网络、区别、改进
Inceptionv1的核心就是把googlenet的某一些大的卷积层换成11, 33, 5*****5的小卷积,这样能够大大的减小权值参数数量。
inception V2在输入的时候增加了batch_normal,所以他的论文名字也是叫batch_normal,加了这个以后训练起来收敛更快,学习起来自然更高效,可以减少dropout的使用。
inception V3把googlenet里一些77的卷积变成了17和71的两层串联,33的也一样,变成了13和31,这样加速了计算,还增加了网络的非线性,减小过拟合的概率。另外,网络的输入从224改成了299.
inception v4实际上是把原来的inception加上了resnet的方法,从一个节点能够跳过一些节点直接连入之后的一些节点,并且残差也跟着过去一个。另外就是V4把一个先11再33那步换成了先33再11.
论文说引入resnet不是用来提高深度,进而提高准确度的,只是用来提高速度的。
9. DenseNet为什么比ResNet有更强的表达能力?
DenseNet在增加深度的同时,加宽每一个DenseBlock的网络宽度,能够增加网络识别特征的能力,而且由于DenseBlock的横向结构类似 Inception block的结构,使得需要计算的参数量大大降低。
三、损失函数
1.说一下smooth L1 Loss,并阐述使用smooth L1 Loss的优点
Smooth L1的优点:①相比于L1损失函数,可以收敛得更快。②相比于L2损失函数,对离群点、异常值不敏感,梯度变化相对更小,训练时不容易跑飞。
2. L1_loss和L2_loss的区别
平均绝对误差(L1 Loss): 平均绝对误差(Mean Absolute Error,MAE) 是指模型预测值f(x)和真实值y之间距离的平均值,其公式如下:
均方误差MSE (L2 Loss):均方误差(Mean Square Error,MSE)是模型预测值f(x) 与真实样本值y 之间差值平方的平均值,其公式如下
3.为何分类问题用交叉熵而不用平方损失?啥是交叉熵
1.用平方误差损失函数,误差增大参数的梯度会增大,但是当误差很大时,参数的梯度就会又减小了。2.使用交叉熵损失是函数,误差越大参数的梯度也越大,能够快速收敛。
分类中为什么交叉熵损失函数比均方误差损失函数更常用?
交叉熵损失函数关于输入权重的梯度表达式与预测值与真实值的误差成正比且不含激活函数的梯度,而均方误差损失函数关于输入权重的梯度表达式中则含有,由于常用的sigmoid/tanh等激活函数存在梯度饱和区,使得MSE对权重的梯度会很小,参数w调整的慢,训练也慢,而交叉熵损失函数则不会出现此问题,其参数w会根据误差调整,训练更快,效果更好。
4.一张图片多个类别怎么设计损失函数,多标签分类问题
多标签分类怎么解决,从损失函数角度考虑
分类问题名称 输出层使用激活函数 对应的损失函数
二分类 sigmoid函数 二分类交叉熵损失函数(binary_crossentropy)
多分类 Softmax函数 多类别交叉熵损失函数(categorical_crossentropy)
多标签分类 sigmoid函数 二分类交叉熵损失函数(binary_crossentropy)
(多标签问题与二分类问题关系在上文已经讨论过了,方法是计算一个样本各个标签的损失(输出层采用sigmoid函数),然后取平均值。把一个多标签问题,转化为了在每个标签上的二分类问题。)
5. LR的损失函数?它的导数是啥?加了正则化之后它的导数又是啥?
Logistic regression (逻辑回归)是当前业界比较常用的机器学习方法。
Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题,利用Logistic函数(或称为Sigmoid函数),自变量取值范围为(-INF, INF),自变量的取值范围为(0,1),函数形式为:
LR的损失函数为交叉熵损失函数。
参考文献
LeCun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11): 2278-2324.
Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[J]. Advances in neural information processing systems, 2012, 25: 1097-1105.
Simonyan K, Zisserman A. Very deep convolutional networks for large-scale image recognition[J]. arXiv preprint arXiv:1409.1556, 2014.
Szegedy C, Liu W, Jia Y, et al. Going deeper with convolutions[C].Proceedings of the IEEE conference on computer vision and pattern recognition. 2015: 1-9.
He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C].Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.
Huang G, Liu Z, Van Der Maaten L, et al. Densely connected convolutional networks[C].Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 4700-4708.
He K, Zhang X, Ren S, et al. Identity mappings in deep residual networks[C].European conference on computer vision. Springer, Cham, 2016: 630-645.
Xie S, Girshick R, Dollár P, et al. Aggregated residual transformations for deep neural networks[C].Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 1492-1500.