Deep Learning常见问题(一)

1.为什么要用relu代替sigmoid?

答:sigmoid在正无穷和负无穷导数非常小,此时学习速度非常慢(梯度消失),用relu可以加快学习速度。虽然relu在负半段导数为0,但在数据集足够大的情况下,一般可以让值落在正半段。

2.logistics regression的loss function的理解。

答:-(ylogy'+(1-y)log(1-y')) 其中y是真实label y'是预测label,仔细看,这其实是一个cross entropy!因此可以说,lr是一个最简单的激活函数为sigmoid的神经网络。注意:在lr中cross entropy是凸函数,而在MLP中不是凸函数(intuition的理解一下,MLP找到最优解,因为MLP是对称的(其实每一层所有节点地位都是等价的,只是画着有顺序),所以某一hidden层权重对称变换一下仍然是最优解,这说明有两个以上最优解,所以不是凸函数)。

3.纠正一下loss function和cost function的区别,以前一直以为两个是一样的。

答:loss function指的是单样本的损失,cost function指的是在所有样本上的损失。

4.为什么经常看到把样本写成矩阵的形式(designed matrix)?

答:有效避免了用for loop来遍历数据集,提高运行速度。

5.在MLP中,将bias初始化全为0是可以的,然而初始化weight全为0会有问题,为什么?

答:MLP的一个hidden layer中的所有节点的地位都是等价的,将weight全部初始化为0会导致所有的节点在前向传播和后向传播的过程中都在计算完全一样的函数,这没有任何意义。比较好的做法是随机初始化,一般初始化为较小的随机数。如果初始化的值很大,那么会导致tanh或sigmoid这样的激活函数饱和,梯度非常的小,学习缓慢。

6.关于rank 1的array?

答:在machine learning的编码过程中,要尽量避免使用rank 1的array,也就是shape为(n,)的array。如果要使用列向量,应该定义shape为(n,1),这样转置后能得到正确的(1,n)的行向量。

7.关于训练集,验证集和测试集?

答:在数据量较小的时候,一般训练集和测试集7:3,或者训练集、验证集和测试集6:2:2,但是当数据量很大时,比如有10000000条数据时,并不需要按照这个比例划分,10000条用于验证,10000条用于测试就已经足够了。

8.过拟合、欠拟合、高方差、高偏差。

答:如果在训练集上表现很好,但是测试集上表现不好,则是高方差,对应过拟合。如果在训练集上表现不好,在测试集上表现也不好,则是高偏差,对应欠拟合。高方差和高偏差都是相对base error来说的,base error比如说图片很模糊,人分辨也有15%的error,那么此时训练集上16%的error其实已经很不错了。解决过拟合,一般采用正则化或者增加trainset中的样本数量。

9.神经网络的L2正则?

答:L2正则也称为weight decay。神经网络的L2正则可以看作加上每一层权重矩阵的F范数的平方。

10.为什么在神经网络中使用正则化可以减少过拟合?

答:正则化使得权重参数w变小,也就是每个神经元的影响变小了,从而使得神经网络变简单。

11.关于Inverted dropout。

答:以第三层为例:
d3 = np.random.rand(a3.shape[0],a3.shape[1]) a3 = np.multiply(a3,d3)
a3 /= keep-prob #这一步是为了让a3的期望值不变
(a3代表是三层的网络,a3.shape[0]和a3.shape[1]分别是每层节点数和节点层数)
dropout在forepop和backpop阶段起作用,在prediction的时候是不起作用的。

传统的dropout不执行a3 /= keep-prob这一步,但是在prediction的时候,对训练阶段应用了dropout的神经元,输出激活值要乘以keep-pop。

12.关于data augmentation。

答:对于过拟合问题,一种方式是扩充数据集。可以通过data augmentation的方式来扩充数据集。以cv领域为例,可以对图像进行水平翻转、旋转、裁剪等方式获得新的数据。

13.关于early stopping。

答:early stopping同时监视在训练集和测试集上的误差,在合适的时候及时停止训练。
(两种具体的early stopping算法可以看花书对应章节)

14.关于normalizing inputs(归一化输入)。

答:normalizing inputs可以提高训练速度。具体做法是,在训练集上计算出样本均值u和样本方差σ^2,然后对训练集中的每一个样本做归一化处理,即x = (x-u)/σ,使其均值为0,方差为1。需要注意的是,在测试集上也要进行归一化,并且使用的u和σ是在训练集上计算出来的u和σ。

15.为什么normalizing inputs是有效的?

答:左图为不做normalizing inputs,右图为做了normalizing inputs。可以看到,左图在梯度下降的时候,需要迭代的次数更多。
所以,在遇到特征x1的取值范围为0-1000,特征x2的取值范围为0-1时,考虑一下normalizing inputs。

16.梯度消失与梯度爆炸。

答:当神经网络很深时,梯度呈指数级增长,最后变得非常大,导致每次权重更新的变化也很大,这就是梯度爆炸(RNN中最常见)。
或者梯度逐渐变成趋于0的值,导致权重更新非常缓慢,这就是梯度消失。

16.神经网络的权重初始化。

答:比较好的初始化方式是将权重随机初始化为均值为0,方差为1/n的正态分布(n为特征的数量)。也就是
w[l]=np.random.randn(shape)*np.sqrt(1/n[l-1]) #n[l-1]表示上一层的神经元数量,即输入到该节点的特征数量。
当使用Relu的时候,设置方差为2/n可能会更好一些(1/n对于sigmoid和tanh更好)。

17.mini-batch。

答:使用mini-batch的目的是比batch更快。使用mini-batch时的1次epoch指的是把trainset中的所有数据遍历一遍。比如trainset被分为了10个mini-batch,在这10份上都执行一次梯度下降才算一次epoch。使用mini-batch时画出cost function的图,可能会上下波动,但总体呈下降趋势。

蓝色为整个batch,绿色为mini-batch,紫色为单样本SGD。

18.指数加权平均与偏差修正。

答:vt = β * vt-1 + (1-β) * θt
θt为当前值,vt可近似代表1/(1-β)个θ的平均值。
目的:计算局部的平均值,相比传统的累加求平均,只需要知道vt-1就可以求vt,减少内存和空间。
本质是以指数式递减加权的移动平均。各数值的权重随时间而指数式递减。
每个最新的数据值都依赖于以前的数据结果。一般令v0 = 0,但这样初期的几个计算结果就会和真实的平均值有较大的偏差。
偏差修正:令vt = vt/1-β^t ,随着t的增大,β^t 逐渐接近0,因此对数据前期影响大,对后期影响小。

19.动量梯度下降(GD with momentum)。

答:如上图所示,我们希望在梯度下降的过程中,减小竖直方向上的波动。
GD with momentum:

    初始化Vdw = 0, Vdb = 0
    -在mini-batch上计算dw,db
    -Vdw = β * Vdw + (1-β) * dw
      Vdb = β * Vdb + (1-β) * db
    -w = w - α * Vdw
      b = b - α * Vdb

可以理解为用dw、db的指数加权平均值(Vdw、Vdb)来代替dw、db,竖直方向近似平均值为0,减缓了波动,加快了达到最小值的速度。
在做GD with momentum的时候,一般不需要做偏差修正。

20.RMSprop(root mean square prop)。

答:假设竖直方向为b,水平方向为w,我们希望减缓竖直方向的振幅,加快水平方向的学习速度。

RMSprop:

    初始化Sdw = 0, Sdb = 0
    -在mini-batch上计算dw,db
    -Sdw = β * Sdw + (1-β) * (dw)^2    #dw element-wise square
      Sdb = β * Sdb + (1-β) * (db)^2
    -w = w - α * dw / sqrt(Sdw)
      b = b - α * db / sqrt(Sdb)

为了确保数值稳定,不会除以0,可以w = w - α * dw/sqrt(Sdw + ε),ε为一个很小的值,一般取10^-8。
梯度的较大值db的Sdb也较大,更新时做了db/sqrt(Sdb),减缓了震荡。

21.Adam(momentum与RMSprop的结合)。

答:Adam结合了momentum与RMSprop的思想。

Adam:

    初始化Vdw = 0, Sdw = 0, Vdb = 0, Sdb = 0
    -在mini-batch上计算dw,db
    -Vdw = β_1 * Vdw + (1-β_1) * dw
      Vdb = β_1 * Vdb + (1-β_1) * db    #momentum (一阶矩)
      Sdw = β_2 * Sdw + (1-β_2) * (dw)^2
      Sdb = β_2 * Sdb + (1-β_2) * (db)^2   #RMSprop (二阶矩)
    -Vdw = Vdw / (1 - β_1^t)
      Vdb = Vdb / (1 - β_1^t)
      Sdw = Sdw / (1 - β_2^t)
      Sdb = Sdb / (1 - β_2^t)    #偏差修正
    -w = w - α * Vdw / sqrt(Sdw + ε)
      b = b - α * Vdb / sqrt(Sdb + ε)

超参数default值:
α: needs to be tune
β_1 : 0.9
β_2 : 0.999
ε : 10^-8

22.学习率衰减

答:
learning rate decay:α = 1 / (1 + decayRate * epochNum) * α0
目的:在训练接近最优点的时候,避免大幅度的震荡。
当然,也有很多其他的学习率衰减方式。
比如:α = 0.95^epochNum * α0
或者α = k / sqrt(epochNum) * α0 #k为常数
等等

23.局部最优问题。

答:我们现在认为,局部最优不是问题。因为当神经网络很复杂,参数很多的时候,cost function是定义在一个很高维度的空间上的,局部最优点需要每个维度上都是凸的,这不太可能发生,我们一般遇到的都是鞍点。
我们现在认为问题更多是遇到平稳段(plateaus),即整一段上梯度都很小,学习非常缓慢。
对于平稳段问题,使用momentum,RMSprop,Adam等学习算法可以比较好的解决。

你可能感兴趣的:(Deep Learning常见问题(一))