深度学习面试问题准备
问:为什么要使用深度学习?
答:深度学习使用了多层神经网络,能够更深地挖掘训练集的特征,从而能够在测试集中有更高的识别率。在mnist实验中,如果只使用Softmax逻辑回归,那么最高只能达到93%的识别率。如果使用一个三层神经网络,就能够达到97%。
问:如何搭建一个神经网络?
答:对于一个总共L层的神经网络,一般来讲,第L层的激活函数使用Softmax进行分类,前面L-1层使用Relu或者tanh。
问:为什么隐藏层要使用Relu,不跟输出层一样使用Softmax?
答:Softmax是在分类时不得不使用的,它的学习速度很慢,因为只有原点附近的数据才能有效地进行梯度下降,当数据在两端时曲线过于平缓,很难对参数进行训练。RELU是全线性的,不存在这个问题,任何时候都可以快速学习。
问:简述一下神经网络一个epoch的训练过程。
答:首先每一层都要进行权重初始化,然后从输入层到输出层,进行一次正向传播。算出预测值后,再从输出层开始,根据基于成本函数的梯度下降法,进行反向传播。反向传播本质上是链式求导法则,可以得到每一个参数在下一个epoch之前要变化多少。
问:什么是梯度消失和梯度爆炸?
答:梯度消失从直观上来讲,是指第L层的输入数据几乎全部重叠在了一起,不可能画出一条曲线对不同的数据进行分类。用数学描述就是方差太低。如果每一层的权重的初始化因子太小,就会导致这个问题。梯度爆炸是指第L层的输入数据方差太大,而分类曲线在每一个epoch中只能移动一小格,可能要很多次学习之后才能够拟合训练集,是因为权重初始化的因子太大造成的。
问:如何解决梯度消失和梯度爆炸的问题?
答:进行合理的权重初始化,可以解决这个问题。例如对于我们最常用的RELU,可以使用tf.sqrt(2 / n[l-1])作为初始化因子,这样RELU层在输入01标准化的数据时,也会输出一组01标准化的数据。
问:为什么要进行Batch Norm?
答:BN可以让当前层的输入数据01标准化,这样成本函数的曲面就不会倾斜,从而在训练时成本函数更容易降到最低,换句话说可以适应更大的机器学习率,增加学习效率。另外,计算机更擅长计算较小的数值,所以也可以提高每一个epoch的速率。在进行训练时,第0层不可以有任何可学习参数,所以mu和sigma要同时运用于训练集和测试集。其于各层需要加入可学习参数gamma和beta。
问:为什么要进行mini-batch?
答:我们在单次训练时,不论是增大训练集,还是增加神经网络的复杂度,都会增大内存的占用量。当内存占用量大到一定程度时,必然会导致计算速度的变慢。为了解决这个问题,我们一次只训练一个批次,分多次完成一个epoch的训练。mini-batch不但能增加一个epoch的学习速率,还能减少epoch的总数。这是因为不同的批次之间可能存在相似性,这样相当于某些数据在一个epoch中训练了多次。
问:什么是bias-variance tradeoff,实现的方式有哪些?
答:我们在训练模型时很容易overfitting,在训练集中有很高的识别率,但测试集的识别率很低。这种情况属于低偏差,高方差。但是我们在降低方差的时候,很有可能提高方差,所以我们要bias-variance tradeoff,从而达到总体识别率的提升。实现方式一般有两种。1.dropout正则化,随机删除节点,减少模型对某个固定节点的依赖。这种方法一般在大型神经网络中才奏效,在小型网络中,降低方差的同时会大大增加偏差,无法做到tradeoff。2.通过数据处理,平移,旋转或者扭曲图像,增大训练集。这种方法有益无害,不会增大偏差。实际上,CNN能够提高识别率的原因,就在于能够识别平移不变性,与增大训练集的效果是一样的。
问:为什么要使用学习率衰减?
答:当成本函数接近最小值时,如果学习率过大,会跨过最小值,这样可能经过多次学习也达不到最小值。为了防止这种现象,可以在训练过程中使用学习率衰减,使得训练后期成本函数能够下降到更小的值。最常用的方法是指数衰减法。
问:如何建立一个卷积神经网络?
答:一个经典的CNN,由两个卷积层和一个全连接层组成。在单个卷积层中,先经过若干个过滤器,再进行最大池化。过滤器的作用是提取特征,最大池化的作用是增加平移不变性。经过两个卷积层后,将输出向量展开成一个全连接层,再经过Softmax进行分类。
问:CNN如何进行调参?
答:过滤器的大小可以是33也可以是55,对训练的影响不大,但是数量很重要,在一定程度内增加过滤器数量有助于提高识别率,经典的做法是第1层32个,第2层64个。也不能太多,因为会严重减慢训练速度。