机器学习面试八股6
91VGG 使用 3*3 卷积核的优势是什么? (采用连续的几个 3x3 的卷积核代替 AlexNet 中的较
大卷积核(11x11,7x7,5x5))
2 个 33 的卷积核串联和 55 的卷积核有相同的感知野,前者拥有更少的参数。多个 33 的卷积
核比一个较大尺寸的卷积核有更多层的非线性函数,增加了非线性表达,使判决函数更具有判
决性。
用 C0 个 33Ci 的卷积核进行卷积操作,所以参数量为 33CiC0
2 个·33 参数量:18
1 个·55 参数量: 25
92Relu 比 Sigmoid 的效果好在哪里?
Sigmoid 的导数只有在 0 的附近时有较好的激活性,而在正负饱和区域的梯度趋向于 0,从而产
生梯度弥散的现象,而 relu 在大于 0 的部分梯度为常数,所以不会有梯度弥散现象。
Relu 的导数计算的更快。Relu 在负半区的导数为 0,所以神经元激活值为负时,梯度为 0,此神
经元不参与训练,具有稀疏性
93 神经网络中权重共享的是? 卷积神经网络、循环神经网络
卷积神经网络可以看做是在空间位置上共享参数,循环神经网络可以看做是在时间位置上
共享参数。卷积神经网络通过卷积核来实现权重共享;循环神经网络在理论上可以看做是
统一神经结构被无限复制的结果
全连接层参数:由于全连接层只能接收一维向量,因此对于输入为 M x N 的图像,需要先
展平为一维的(MxN) x 1。因此若得到的特征图 feature map 大小为 P x Q(对应的一维向量
为(PxQ) x 1),则 map 中每个元素需要 MxN 个权重,分别于输入图对应做加和,于是最后
需要 M x N x P x Q 个参数权重
若原 image 大小为 M x N x K1 单个卷积核大小为 F x F x K1,共 K2 个卷积核,则总共需要 F x
F x K1 x K2 个参数,之所以在卷积神经网络可以用到权值共享,则是考虑到对于一张图像的
某个像素点,其往往具有局部相关性,即与其相邻的像素点相关性较大,越远相关性越小
这样通过一步步增加网络深度,也能慢慢学到图像的全局特征
RNN 中需要用参数共享,一方面跟 CNN 一样,是为了减少参数量
另一方面,由于原始 RNN 是变长的,因此若不共享,每个 W 都不同,那么需要设置多少个
W 就无法提前知晓了,实现上困难
94 神经网络激活函数?
sigmod、tanh、relu
激活函数(activation functions)的目标是负责将神经元的输入映射到输出端,将神经网络
非线性化,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题。。激活函数
是连续的(continuous),且可导的(differential)
当使用 sigmoid 作为激活函数时,随着神经网络隐含层(hidden layer)层数的增加,训练
误差反而加大。表现为:梯度弥散:
靠近输出层的隐含层梯度较大,参数更新速度快,很快就会收敛;
靠近输入层的隐含层梯度较小,参数更新速度慢,几乎和初始状态一样,随机分布;
在含有四个隐藏层的网络结构中,第一层比第四层慢了接近 100 倍!
sigmoid 缺点:
• 激活函数的计算量较大,在反向传播中,当求误差梯度时,求导涉及除法;
• 在反向传播中,容易就会出现梯度消失(函数值趋近于 0 和 1 时)和·梯度爆炸(x=0
处),无法完成深层网络的训练;
• 函数的敏感区间较短,(-1,1)之间较为敏感,超过区间,则处于饱和状态
• 不以零为中心:sigmoid 函数的输出恒为正值,不是以零为中心的,这会导致权值更新
时只能朝一个方向更新,从而影响收敛速度。
1)tanh 的导数取值范围在 0 至 1 之间,优于 sigmoid 的 0 至 1/4,在一定程度上,减轻了梯
度消失的问题(但仍然会有梯度消失问题),即梯度变化更快,也就是在训练过程中收敛
速度更快。
2)输出值以 0 为中心,解决了 sigmoid 函数输出值只为正,梯度只向一个方向更新的问题 。
tanh 的输出和输入能够保持非线性单调上升和下降关系,符合 BP(back propagation)网络
的梯度求解,容错性好,有界。
tanh 和 sigmoid 都是全部激活(fire),使得神经网络较重(heavy)
缺点:依然存在 sigmoid 中梯度消失和爆炸的问题和指数运算计算量大的问题。
95relu,(在正区间解决梯度消失)
即 Rectified Linear Unit,整流线性单元,激活部分神经元,增加稀疏性,当 x 小于 0 时,输
出值为 0,当 x 大于 0 时,输出值为 x.
relu 对比于 sigmoid:
• sigmoid 的导数,只有在 0 附近,具有较好的激活性,而在正负饱和区的梯度都接近于
0,会造成梯度弥散;而 relu 的导数,在大于 0 时,梯度为常数,不会导致梯度弥散。
• relu 函数在负半区的导数为 0 ,当神经元激活值进入负半区,梯度就会为 0,也就是说,
这个神经元不会被训练,即稀疏性;
• relu 函数的导数计算更快,程序实现就是一个 if-else 语句;而 sigmoid 函数要进行浮点四
则运算,涉及到除法;
缺点:不以零为中心:和 Sigmoid 激活函数类似,ReLU 函数的输出不以零为中心,因此只
存在正向梯度。
负值区域(x< 0 )存在梯度消失问题。如果 x < 0,则神经元保持非激活状态,且在反向传
播过程中「杀死」梯度。这样权重无法得到更新,网络无法学习。
在神经网络中,隐含层的激活函数,最好选择 ReLU
所以,要结合具体问题以及激活函数的特点,恰当地选择。下面是一些经验,供参考:
• Sigmoid 函数比较适合于二分类模型。
• 使用 Sigmoid 函数和 tanh 函数,要注意梯度消失问题。
• ReLU 函数是应用比较广泛的激活函数,可以作为你的默认选项。
• 如果网络中存在大量未激活神经元,可以考虑 leaky ReLU 函数。
• ReLU 函数应该只用于隐藏层。
• 如果是回归模型,在输出层上可以使用线性激活函数
当神经网络很深时,梯度呈指数级增长,最后到输入时,梯度将会非常大,我们会得到一
个非常大的权重更新,这就是梯度爆炸的问题
96 如何解决梯度消失和爆炸问题:
1 非饱和的激活函数(如 ReLU)
2 批量规范化(Batch Normalization)
3 梯度截断(Gradient Clipping)
4 更快的优化器
1)、使用 ReLU、LReLU、ELU、maxout 等激活函数
sigmoid 函数的梯度随着 x 的增大或减小和消失,而 ReLU 不会。
2)、使用批规范化
通过规范化操作将输出信号 x 规范化到均值为 0,方差为 1 保证网络的稳定性。从上述分析
分可以看到,反向传播式子中有 w 的存在,所以 w 的大小影响了梯度的消失和爆炸,Batch
Normalization 就是通过对每一层的输出规范为均值和方差一致的方法,消除了 w 带来的放
大缩小的影响,进而解决梯度消失和爆炸的问题。
97 在深度学习中,通常会 finetuning(微调)已有的成熟模型,再基于新数据,修改最后
几层神经网络权值,为什么?
实践中的数据集质量参差不齐,可以使用训练好的网络来进行提取特征。把训练好的网络
当做特征提取器。
决定如何使用迁移学习的因素有很多,这是最重要的只有两个:新数据集的大小、以及新
数据和原数据集的相似程度。有一点一定记住:网络前几层学到的是通用特征,后面几层
学到的是与类别相关的特征。
1、新数据集比较小且和原数据集相似。因为新数据集比较小,如果 fine-tune 可能会过拟
合;又因为新旧数据集类似,我们期望他们高层特征类似,可以使用预训练网络当做特征
提取器,用提取的特征训练线性分类器。
2、新数据集大且和原数据集相似。因为新数据集足够大,可以 fine-tune 整个网络。
3、新数据集小且和原数据集不相似。新数据集小,最好不要 fine-tune,和原数据集不类似,
最好也不使用高层特征。这时可是使用前面层的特征来训练 SVM 分类器。
4、新数据集大且和原数据集不相似。因为新数据集足够大,可以重新训练。但是实践中
fine-tune 预训练模型还是有益的。新数据集足够大,可以 fine-tine 整个网络。
与重新训练相比,fine-tune 要使用更小的学习率。
98 微调时候网络参数是否更新?
答案:会更新。
finetune 的过程相当于继续训练,跟直接训练的区别是初始化的时候。
直接训练是按照网络定义指定的方式初始化。
finetune 是用你已经有的参数文件来初始化。
fine-tuning 模型的三种状态
状态一:只预测,不训练。 特点:相对快、简单,针对那些已经训练好,现在要实际对未
知数据进行标注的项目,非常高效;
状态二:训练,但只训练最后分类层。 特点: fine-tuning 的模型最终的分类以及符合要求,
现在只是在他们的基础上进行类别降维。
状态三:完全训练,分类层+之前卷积层都训练 特点:跟状态二的差异很小,当然状态三
比较耗时和需要训练 GPU 资源,不过非常适合 fine-tuning 到自己想要的模型里面,预测精
度相比状态二也提高不少。
99Attention 机制的作用
Attention 简单理解就是权重分配。
减少处理高维输入数据的计算负担,结构化的选取输入的子集,从而降低数据的维度。
让系统更加容易的找到输入的数据中与当前输出信息相关的有用信息,从而提高输出的质量。
帮助类似于 decoder 这样的模型框架更好的学到多种内容模态之间的相互关系。
100Lstm 和 Gru 的原理
Lstm 由输入门,遗忘门,输出门和一个 cell 组成。第一步是决定从 cell 状态中丢弃什么信息,然
后在决定有多少新的信息进入到 cell 状态中,最终基于目前的 cell 状态决定输出什么样的信
息。
Gru 由重置门和跟新门组成,其输入为前一时刻隐藏层的输出和当前的输入,输出为下一时刻
隐藏层的信息。重置门用来计算候选隐藏层的输出,其作用是控制保留多少前一时刻的隐藏
层。跟新门的作用是控制加入多少候选隐藏层的输出信息,从而得到当前隐藏层的输出。
101 什么是 dropout
在神经网络的训练过程中,对于隐藏层神经单元按一定的概率将其随机从网络中丢弃,从而达
到对于每个 mini-batch 都是在训练不同网络的效果,防止过拟合。
102DropConnect 的原理
防止过拟合方法的一种,对每个节点与之相连的输入权值以一定的概率清 0。
103 用过哪些移动端深度学习框架?
开源的有:小米的 MACE,骁龙的 SNPE,腾讯的 FeatherCNN 和 ncnn,百度的 mobile-deep-
learning(MDL);caffe、tensorflow lite 都有移动端,只是可能没有上面的框架效率高。据传
还有支付宝的 xNN,商汤的 PPL,不过都是自用,未开源。
104Adam
Adam 算法和传统的随机梯度下降不同。随机梯度下降保持单一的学习率(即 alpha)更新
所有的权重,学习率在训练过程中并不会改变。而 Adam 通过计算梯度的一阶矩估计和二
阶矩估计而为不同的参数设计独立的自适应性学习率。
105 学习率的设定类型
1)固定学习率
每次迭代每个参数都使用同样的学习率。找到一个比较好的固定学习率非常关键,否则会
导致收敛太慢或者不收敛。
2)不同的参数使用不同的学习率
如果数据是稀疏的且特征分布不均,似乎我们更应该给予较少出现的特征一个大的更新。
这时可能需要对不同特征对应的参数设定不同的学习率。深度学习的梯度下降算法中
Adagrad 和 Adam 方法都针对每个参数设置了相应的学习率
3)动态调整学习率
动态调整就是我们根据应用场景,在不同的优化阶段能够动态改变学习率,以得到更好的
结果。动态调整学习率是本篇的重点内容,为了解决梯度学习在一些复杂问题时出现的挑
战,数据科学家们在动态调整学习率的策略上做了很多研究和尝试。
4)自适应学习率
自适应学习率从某种程度上讲也算是动态调整学习率的范畴,不过更偏向于通过某种算法
来根据实时情况计算出最优学习率,而不是人为固定一个简单策略让梯度下降按部就班地
实行。
106RNN 梯度消失问题,为什么 LSTM 和 GRU 可以解决此问题
RNN 由于网络较深,后面层的输出误差很难影响到前面层的计算 ,RNN 的某一单元主要受它
附近单元的影响。
而 LSTM 因为可以通过阀门记忆一些长期的信息,相应的也就保留了更多的梯度。
而 GRU 也可通过重置和更新两个阀门保留长期的记忆,也相对解决了梯度消失的问题。
累乘变累加:RNN 的梯度消失主要是因为在计算梯度的时候会出现隐藏层输出对于上一时
刻的隐藏层输出求导,这个偏导算出来是(sigmoid’∈(0, 1/4)*w) 的结果会接近 0,又随着序
列的增长而不断连乘,这样就会导致远距离的输入对于梯度的贡献会逐渐消失,近距离的
输入梯度主导,从而是模型无法学习长距离的依赖关系。LSTM 其实也会有细胞状态对上一
时刻的细胞状态的梯度连乘,但是这个梯度中包含了累加项(f_t + …),其中有一项是忘
记门输出,可以控制梯度不至于过大或者过小。
107RNN 容易梯度消失,怎么解决?
1)、梯度裁剪(Clipping Gradient)
既然在 BP 过程中会产生梯度消失(就是偏导无限接近 0,导致长时记忆无法更新),那么
最简单粗暴的方法,设定阈值,当梯度小于阈值时,更新的梯度为阈值。
优点:简单粗暴
缺点:很难找到满意的阈值
2)、LSTM(Long Short-Term Memory)
一定程度上模仿了长时记忆,相比于梯度裁剪,最大的优点就是,自动学习在什么时候可
以将 error 反向传播,自动控制哪些是需要作为记忆存储在 LSTM cell 中。一般长时记忆模
型包括写入,读取,和忘记三个过程对应到 LSTM 中就变成了 input_gate,output_gate,
forget_gate,三个门,范围在 0 到 1 之间,相当于对输入输出进行加权的学习,利用大量数
据来自动学习加权的参数(即学习了哪些错误可以用 BP 更新参数)。具体的公式表达:
优点:模型自动学习更新参数
108LSTM 跟 RNN 有啥区别
LSTM 与 RNN 的比较
RNN 在处理 long term memory 的时候存在缺陷,因此 LSTM 应运而生。LSTM 是一种变种的
RNN,它的精髓在于引入了细胞状态这样一个概念,不同于 RNN 只考虑最近的状态,LSTM
的细胞状态会决定哪些状态应该被留下来,哪些状态应该被遗忘。
RNN 在处理长期依赖(时间序列上距离较远的节点)时会遇到巨大的困难,因为计算距离
较远的节点之间的联系时会涉及雅可比矩阵的多次相乘,这会带来梯度消失(经常发生)
或者梯度膨胀(较少发生)的问题,这样的现象被许多学者观察到并独立研究。为了解决
该问题,研究人员提出 LSTM。
LSTM 是门限 RNN,其单一节点的结构如下图 1 所示。LSTM 的巧妙之处在于通过增加输入
门限,遗忘门限和输出门限,使得自循环的权重是变化的,这样一来在模型参数固定的情
况下,不同时刻的积分尺度可以动态改变,从而避免了梯度消失或者梯度膨胀的问题。
下面来看一些 RNN 和 LSTM 内部结构的不同:
109LSTM 与 GRU 区别
1)GRU 和 LSTM 的性能在很多任务上不分伯仲。
2)GRU 参数更少因此更容易收敛,但是数据集很大的情况下,LSTM 表达性能更好。
3)从结构上来说,GRU 只有两个门(update 和 reset),LSTM 有三个门(forget,input,
output),GRU 直接将 hidden state 传给下一个单元,而 LSTM 则用 memory cell 把 hidden
state 包装起来
110 卷积层和池化层有什么区别