机器学习与Deep Learning算法问题汇总(Part-2)
7. 什么是梯度弥散?要怎么去解决这个问题?
答: 随着网络层数变深, activations倾向于越大和越小的方向前进, 往大走梯度爆炸(回想一下你在求梯度时, 每反向传播一层, 都要乘以这一层的activations), 往小走进入死区, 梯度消失。 这两个问题最大的影响是, 深层网络难于converge。sigmoid不存在梯度爆炸, 在activations往越大越小的方向上前进时, 梯度都会消失。
解决方法:使用其他**函数替代,比如ReLU等等。
梯度消失 和 爆炸 在ReLU下都存在,ReLU的负半轴梯度为0,所以有时候(比较少见)也还是会梯度消失,这时可以使用PReLU替代,如果用了PReLU还会梯度弥散和爆炸,请调整初始化参数,对自己调参没信心或者就是懒的,请直接上BN。
BN和xavier初始化(经指正,这里最好应该用msra初始化,这是he kaiming大神他们对xavier的修正, 其实就是xavier多除以2)很大程度上解决了该问题。
8. 介绍一下BN算法
答:BN可以看做对输入样本的一种约束,最大作用是加速收敛,减少模型对dropout,careful weight initialnization依赖,可以adopt higher learning rate的优势,收敛速度可以提高10倍以上。
问题提出:
深度网络参数训练时内部存在协方差偏移(Internal Covariate Shift)现象:深度网络内部数据分布在训练过程中发生变化的现象。
为什么会带来不好影响:训练深度网络时,神经网络隐层参数更新会导致网络输出层输出数据的分布发生变化,而且随着层数的增加,根据链式规则,这种偏移现象会逐渐被放大。这对于网络参数学习来说是个问题:因为神经网络本质学习的就是数据分布(representation learning),如果数据分布变化了,神经网络又不得不学习新的分布。为保证网络参数训练的稳定性和收敛性,往往需要选择比较小的学习速率(learning rate),同时参数初始化的好坏也明显影响训练出的模型精度,特别是在训练具有饱和非线性(死区特性)的网络,比如即采用S或双S**函数网络,比如LSTM,GRU。
解决办法:引入Batch Normalization,作为深度网络模型的一个层,每次先对input数据进行归一化,再送入神经网络输入层。
什么是Batch Normalization?
- 首先,是要做normalization,mean=0, variance= 1
- 其次,要用到mini-batch, 方便求mean 和 variance的值
- 当然,还有额外的
来对新生成的distribution做一定幅度的放缩和平移
为什么会用到Batch Normalization?
- 因为covariance问题在每一个层layer上都存在,都需要batch norm来解决问题
- 那么什么是covariance shift问题:在输入层上,如果一部分样本的分布与另一部分样本显著分布不同:[0,1] vs [10,100]。对于一个浅层模型而言,训练第一组样本时,模型可能在描绘函数A,训练第二组样本时,模型发现自己在描绘函数B,完全不同于A,这样就是推翻自己重复劳动,训练低效
- 输入层的这种情况,对于其他层而言,也是一样,无法逃避,如果遇到前层neurons或本层的weights值特别大,可能导致本层output neurons中某些neurons值要远大于其他neurons的值,导致一部分neurons的分布与其他neurons的分布大幅偏离,这样就出现了本层的covariance shift的情况
- 看看原论文里是怎么说的(见下图)
- Covariance shift:由于parameters发生变化,导致本层的activation发生变化,当每层activation的分布都不相同或者差异较大时,训练效率会很低下。因此,解决方案就是同一每一层的activations的分布
关于为什么Batch Normalization 有了normalization, 即mean = 0, variance=1,还不够,为什么要有 ?
- 因为
能够锦上添花,更好解决normalization希望解决的covariance shift的问题。
如何理解“因为 能够锦上添花”?
-
= rescale 和 shift
- normalization 能够让所有layer output distributions 都固定在mean=0, variance=1的特定区域(可以缓解covariance shift problem)
- 但在特定区域的大体框架下,如果可以在垂直方向上有一定程度的放大缩小的自由度(rescale),在水平方向上有一定的移动的自由度(shift)
- 那么,也许所有layer output distributions能够做到更好的相似与稳定(当然,具体值不会相同)
- 从而进一步缓解covariance shift 的问题
关于 是如何学习的?
-
和其他的parameters 一样,在训练中通过反向传递来更新自己
9. 介绍下ROC曲线和AUC值。
答:(1)ROC曲线:
横轴FPR:1-TNR,1-Specificity,FPR越大,预测正类中实际负类越多。
纵轴TPR:Sensitivity(正类覆盖率),TPR越大,预测正类中实际正类越多。
理想目标:TPR=1,FPR=0,即图中(0,1)点,故ROC曲线越靠拢(0,1)点,越偏离45度对角线越好,Sensitivity、Specificity越大效果越好。
(2)AUC值:
AUC (Area Under Curve) 被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围一般在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。
The AUC value is equivalent to the probability that a randomly chosen positive example is ranked higher than a randomly chosen negative example.
这句话有些绕,我尝试解释一下:首先AUC值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值。当然,AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。
简单说:AUC值越大的分类器,正确率越高。
(3)为什么使用ROC曲线
在上图中,(a)和(c)为ROC曲线,(b)和(d)为Precision-Recall曲线。(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,(c)和(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果。可以明显的看出,ROC曲线基本保持原貌,而Precision-Recall曲线则变化较大。
10. cnn做卷积的运算时间复杂度是多少?
答:单个卷积层的时间复杂度:
-
每个卷积核输出特征图
的边长
-
每个卷积核
的边长
-
每个卷积核的通道数,也即输入通道数,也即上一层的输出通道数。
-
本卷积层具有的卷积核个数,也即输出通道数。
- 可见,每个卷积层的时间复杂度由输出特征图面积
、卷积核面积
、输入
和输出通道数
完全决定。
- 其中,输出特征图尺寸本身又由输入矩阵尺寸
、卷积核尺寸
、
、
这四个参数所决定,表示如下: