深度学习快问快答

tech2022-10-03  111

1. 什么是反向传播算法

反向传播(英文名Backpropagation)是一种与最优化方法(如梯度下降)结合使用的,用来训练神经网络的常见方法。该方法对网络中的所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。

2. 反向传播与梯度下降是什么关系?

反向传播是用来计算梯度的,而梯度下降用这些梯度来更新权重,从而寻找损失函数的极小值。本质上来说梯度下降是一种寻找函数极小值的方法。

3. 归一化或标准化有什么意义

首先,这是两个极易混淆的概念,一般来说归一化特指将数据rescale到0-1的空间,而标准化则是通过减去均值再除以标准差将数据映射到均值为0,标准差为1的高斯分布(正太分布)。不用太纠结名字,看实际使用时用到的公式即可。而在实际应用中这两种都见过,yolo v3使用归一化,而pytorch官方文档在归一化的基础上再进行标准化,且其均值和方差是从image net数据集计算得来。 归一化或标准化有一下两个好处:

将损失函数多维自变量缩放到相同的程度,这样有利于梯度下降法朝着同一个方向(指向极小值)前进,而不像“椭圆”那个曲折前进,收敛更快。 图片有利于平衡各个特征对损失函数的影响,避免损失函数被某些极端特征控制。

4. 梯度消失和梯度爆炸是怎样产生的?

产生原因 观察上面的求导公式,可见某个节点的梯度和后面几层的激活函数倒数及权重都有关系。以sigmoid为例,其导数范围是0至0.25,一直叠加肯定会出现梯度消失,然而w增加了其不确定性。梯度爆炸的原因也差不多,如果w值比较大则很可能会出现梯度爆炸。 相同条件下sigmoid应该是比较容易出现梯度消失的,不仅其导数小,其饱和区(梯度为0)也很大。而相比之下tanh会好一点,其导数范围是0至1。

如何避免

权值初始化或预训练,避免初始权重太大导致梯度爆炸使用Relu,relu在大于0的地方导数为1,小于0则为0。由于relu在0处不可导,一般会指定改点的导数值为0或1。另外在小于零的区域relu会造成节点死亡。使用正则化,限制w,避免过大使用BN,BN让每一层的的输入保持在0均值的分布,可以让激活函数的自变量保持在非饱和区(对于sigmoid和tanh而言)。

参考: 梯度消失和梯度爆炸原因及其解决方案 详解机器学习中的梯度消失、爆炸原因及其解决方法

5. 三大激活函数

5.1 sigmoid

方程: 值域:0~1 导函数: 导函数值域:0~0.25 特点:导数值域较小,收敛慢;指数计算比较慢;

5.2 tanh

方程: 值域:-1~1 导函数: 导函数值域:0~0.1 特点:相对于原点中心对称,权重更新更快?;

5.1 relu

方程: 值域:0~正无穷 导函数: 导函数值域:0或1 特点:x正轴范围导数为1,负轴范围导数为0;计算快; 疑问:激活函数输入为负应该不太容易出现吧?relu的非线性足够强吗?

6. 正则化

正则化在机器学习中一般用于防止过拟合。首先说一下范数的概念:对于一个n维向量W,其范数定义为

0范数:向量中非0元素的个数 1范数:所有元素绝对值之和 2范数:就是向量模,各元素平方和再开根号

所谓的正则化就是在损失函数后面加上权重W的范数,为什么这样做就可以抑制过拟合? 过拟合产生的原因一般是模型过去复杂,以至于在训练集中表现极好,相反由于削弱了泛化能力,结果在测试集表现很差。 L0和L1正则: 根据上述分析,要避免模型过于复杂,减小参数量即可(稀疏,dropout也是干这个的),这正好符合0范数,但是0范数非常难求,研究者又发现在某些情况下0范数和1范数是等价的,所以大家就都用1范数了。在另一方面,将某些权重置0相当于忽略掉某些特征,也可以起到特征选择的效果。 L2正则: 2范数会让W每个元素都很小,接近0,但是和0范数是完全不同的效果。 求导可以发现L1倾向于让W匀速接近0,而L2会让W较小。一般认为较小的W对于抗过拟合效果更好。(为什么?还要深究) 参考: 机器学习中常常提到的正则化到底是什么意思?

7. 池化层怎么进行反向传播

池化层只传递误差到上一层,不会更新参数,因为没有参数可以更新 平均池化: 误差平均分配给上一层 最大池化: 误差给上一层最大值(正向传播时会记录位置)

参考: Pooling池化层的反向求导细节 CNN中一些特殊环节的反向传播

8. 解释一下端到端模型

个人理解: 判断一个网络是不是end to end 最直接的是看训练过程,一次就可以训练完成,只产出一个模型的就是端到端,而需要分批训练多的模型的就可以认为是two-stage的网络。 比如Faster RCNN首先需要训练一个RPN网络用于对anchors进行分类(前景、背景)以及优化坐标,经过RPN网络生成ROI(上文的前景),ROI再次进行后面的分类和回归训练。这就是一个典型的two-stage网络。 而yolo系列输入图片,经过一系列的卷积直接输出一个feature map,这个feature map每个节点有很多个维度,分别对应预测的分类、坐标、置信度等,只有一个模型,是一个典型的端到端网络。 其实YOLO和Faster-RCNN的stage-one挺像的,所以说在性能上faster-rcnn不可能比后来这些差多少,甚至可能更好,后来这些网络更多是提升了速度,而在性能方面主要是用了更好的特征提取网络以及多尺度特征等策略。而Faster-RCNN的优势是有两次定位和分类,其效果理论上效果应该比end to end更好。

9. 解释一下多任务学习

所谓的多任务学习是指多个任务融合到一个网络中,他们共享特征提取层,而后在网络末端分道扬镳各自完成自己的任务。其直观表现是损失函数是复合的,一般来说至少会包括分类损失和定位损失,甚至可能更多。 多任务学习的好处是可以将各种任务融合到一个网络里,而不需要给每个任务一个单独的网络。多任务学习不是一个多么神秘、新颖的概念,事实上Fast RCNN就是多任务的。Fast RCNN的改进之一便是将RCNN中的SVM分类器换为了softmax,然后和定位回归损失一起作为损失函数,这便是一个多任务网络。 当然、多任务学习也是有一定的挑战的,比如一个任务的损失可能在损失函数里占主导地位,这样会导致其他任务学习不好。

10. 解释一下pytorch的动态计算图

pytorch的动态图有两层意思: 第一层含义是:计算图的正向传播是立即执行的。无需等待完整的计算图创建完毕,每条语句都会在计算图中动态添加节点和边,并立即执行正向传播得到计算结果。

第二层含义是:计算图在反向传播后立即销毁。下次调用需要重新构建计算图。如果在程序中使用了backward方法执行了反向传播,或者利用torch.autograd.grad方法计算了梯度,那么创建的计算图会被立即销毁,释放存储空间,下次调用需要重新创建。

11. focal loss 有什么作用

focal loss本质上是解决难易样本不均衡的问题。 one stage算法不像two stage算法可以先提取ROI区域,从而控制正负样本的比例(一般为1:3)。事实上one stage算法会生成数以万计的候选框,其绝大多数都是没有意义的负易样本,这会导致模型无法学习到有效的特征,降低模型表达能力,这是one stage算法效果不如two stage算法的主要原因。 如何让难样本在损失函数中占比更大?focal loss的思路很简单,给难样本一个更大的权重即可。完整公式如下:

参考:5分钟理解Focal Loss与GHM——解决样本不平衡利器

11. 网络轻量化的两个方向

减少参数和计算量,注意这两者并不一定是正相关。

计算公式

最新回复(0)