深度学习机器学习面试问题准备(必会)

2018 年 4 月 27 日 数据挖掘入门与实战

 向AI转型的程序员都关注了这个号👇👇👇


大数据挖掘DT数据分析  公众号: datadw


第一部分:深度学习

1、神经网络基础问题

(1)Backpropagation(要能推倒) 
  后向传播是在求解损失函数L对参数w求导时候用到的方法,目的是通过链式法则对参数进行一层一层的求导。这里重点强调:要将参数进行随机初始化而不是全部置0,否则所有隐层的数值都会与输入相关,这称为对称失效。 
大致过程是:

  • 首先前向传导计算出所有节点的激活值和输出值, 

  • 计算整体损失函数: 


  • 然后针对第L层的每个节点计算出残差(这里是因为UFLDL中说的是残差,本质就是整体损失函数对每一层激活值Z的导数),所以要对W求导只要再乘上激活函数对W的导数即可 






(2)梯度消失、梯度爆炸 
  梯度消失:这本质上是由于激活函数的选择导致的, 最简单的sigmoid函数为例,在函数的两端梯度求导结果非常小(饱和区),导致后向传播过程中由于多次用到激活函数的导数值使得整体的乘积梯度结果变得越来越小,也就出现了梯度消失的现象。 



  梯度爆炸:同理,出现在激活函数处在激活区,而且权重W过大的情况下。但是梯度爆炸不如梯度消失出现的机会多。 
   
(3)常用的激活函数

激活函数 公式 缺点 优点
Sigmoid 1、会有梯度弥散
2、不是关于原点对称
3、计算exp比较耗时
-
Tanh 梯度弥散没解决 1、解决了原点对称问题
2、比sigmoid更快
ReLU 梯度弥散没完全解决,在(-)部分相当于神经元死亡而且不会复活 1、解决了部分梯度弥散问题
2、收敛速度更快
Leaky ReLU - 解决了神经死亡问题
Maxout 参数比较多,本质上是在输出结果上又增加了一层 克服了ReLU的缺点,比较提倡使用

(4)参数更新方法

方法名称 公式
Vanilla update x += - learning_rate * dx
Momentum update动量更新 v = mu * v - learning_rate * dx # integrate velocity
x += v # integrate position

Nesterov Momentum x_ahead = x + mu * v 
v = mu * v - learning_rate * dx_ahead
x += v

Adagrad 
(自适应的方法,梯度大的方向学习率越来越小,由快到慢)
cache += dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)

Adam m = beta1*m + (1-beta1)dx
v = beta2*v + (1-beta2)
(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)



(5)解决overfitting的方法 
  dropout, regularization, batch normalizatin,但是要注意dropout只在训练的时候用,让一部分神经元随机失活。 
  Batch normalization是为了让输出都是单位高斯激活,方法是在连接和激活函数之间加入BatchNorm层,计算每个特征的均值和方差进行规则化。 
  

2、CNN问题

(1) 思想 
  改变全连接为局部连接,这是由于图片的特殊性造成的(图像的一部分的统计特性与其他部分是一样的),通过局部连接和参数共享大范围的减少参数值。可以通过使用多个filter来提取图片的不同特征(多卷积核)。 
   
(2)filter尺寸的选择 
  通常尺寸多为奇数(1,3,5,7) 
   
(3)输出尺寸计算公式 
  输出尺寸=(N - F +padding*2)/stride + 1 
  步长可以自由选择通过补零的方式来实现连接。 
   
(4)pooling池化的作用 
  虽然通过.卷积的方式可以大范围的减少输出尺寸(特征数),但是依然很难计算而且很容易过拟合,所以依然利用图片的静态特性通过池化的方式进一步减少尺寸。 
   
(5)常用的几个模型,这个最好能记住模型大致的尺寸参数。

名称 特点
LeNet5 –没啥特点-不过是第一个CNN应该要知道
AlexNet 引入了ReLU和dropout,引入数据增强、池化相互之间有覆盖,三个卷积一个最大池化+三个全连接层
VGGNet 采用1*1和3*3的卷积核以及2*2的最大池化使得层数变得更深。常用VGGNet-16和VGGNet19
Google Inception Net
我称为盗梦空间网络
这个在控制了计算量和参数量的同时,获得了比较好的分类性能,和上面相比有几个大的改进:
  1、去除了最后的全连接层,而是用一个全局的平均池化来取代它;
  2、引入Inception Module,这是一个4个分支结合的结构。所有的分支都用到了1*1的卷积,这是因为1*1性价比很高,可以用很少的参数达到非线性和特征变换。
  3、Inception V2第二版将所有的5*5变成2个3*3,而且提出来著名的Batch Normalization;
  4、Inception V3第三版就更变态了,把较大的二维卷积拆成了两个较小的一维卷积,加速运算、减少过拟合,同时还更改了Inception Module的结构。
微软ResNet残差神经网络(Residual Neural Network) 1、引入高速公路结构,可以让神经网络变得非常深
2、ResNet第二个版本将ReLU激活函数变成y=x的线性函数

2、RNN

1、RNN原理: 
  在普通的全连接网络或CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被成为前向神经网络(Feed-forward+Neural+Networks)。而在RNN中,神经元的输出可以在下一个时间戳直接作用到自身,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出。所以叫循环神经网络 
2、RNN、LSTM、GRU区别

  • RNN引入了循环的概念,但是在实际过程中却出现了初始信息随时间消失的问题,即长期依赖(Long-Term Dependencies)问题,所以引入了LSTM。

  • LSTM:因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸。推导forget gate,input gate,cell state, hidden information等因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸的变化是关键,下图非常明确适合记忆: 

  • GRU是LSTM的变体,将忘记门和输入们合成了一个单一的更新门。 

3、LSTM防止梯度弥散和爆炸 
  LSTM用加和的方式取代了乘积,使得很难出现梯度弥散。但是相应的更大的几率会出现梯度爆炸,但是可以通过给梯度加门限解决这一问题。 
   
4、引出word2vec 
  这个也就是Word Embedding,是一种高效的从原始语料中学习字词空间向量的预测模型。分为CBOW(Continous Bag of Words)和Skip-Gram两种形式。其中CBOW是从原始语句推测目标词汇,而Skip-Gram相反。CBOW可以用于小语料库,Skip-Gram用于大语料库。具体的就不是很会了。




3、GAN

1、GAN的思想 
  GAN结合了生成模型和判别模型,相当于矛与盾的撞击。生成模型负责生成最好的数据骗过判别模型,而判别模型负责识别出哪些是真的哪些是生成模型生成的。但是这些只是在了解了GAN之后才体会到的,但是为什么这样会有效呢? 
  假设我们有分布Pdata(x),我们希望能建立一个生成模型来模拟真实的数据分布,假设生成模型为Pg(x;