Github深度学习面试题答案

Github深度学习面试题答案(一)—— 深度学习相关


本文是对于github上一篇关于无人驾驶的深度学习方面提问的
‘’部分个人见解+论坛内外对该问题的解答‘’
本文属于搬运+整合的笔记贴,主要是为了自身学习用。
搬运会标明出处,如有侵权,无意冒犯,
希望原作者联系我,我会进行处理,感谢。

Github面试题地址:https://github.com/Ewenwan/MVision**

1、机器学习和深度学习的区别,各自适用于什么问题

  1. 机器学习:囊括了几乎所有对世界影响最大的方法(包括深度学习),主要目的是设计和分析一些能让计算机自动学习的算法
    深度学习:可以理解为含有多层隐藏层的神经网络,属于机器学习的子类,是利用深度神经网络来解决特征表达的一种学习过程
  2. 两者对比:
    a 、 应用场景
    机器学习 ---- 指纹识别,特征物体检测等领域已经达到商业化要求
    深度学习 ---- 主要文字识别,人脸技术,语义分析,智能监控等领域。
    b 、所需数据量
    机器学习适应于各种数据量,在数据量小的场景效果突出
    当数据量增大的时候,深度学习算法更加突出
    c 、执行时间 – 训练算法所需的时间量
    由于神经网络有多个隐藏层(或者说有多个超参数),因此在训练算法时需要指数时间,训练成本相对于机器学习来说很大。
    d 、解决问题的方法
    机器学习算法遵循标准程序解决问题,拆分问题–分别解决–合并结果–获得答案
    深度学习集中方式解决问题,不必进行问题拆分

2、随机梯度下降(stochastic gradient descent)

SGD算法 – 从样本中随机抽出一组,训练后按梯度更新一次,然后再抽取一组,在更新一次,在样本量及其大的情况下,可能不用训练完所有的样本就可以获得一个损失值在可接受范围之内的模型,是一种逐个样本进行loss计算进行迭代的方法。

  • SGD的做法实际上是 – 扫描所有的训练样本,首先是第一组训练样本(x(1),y(1)),然后只处理第一个训练样本 – 我们的梯度下降只对这第一个训练样本的代价函数进行。换句话说是,我们只要关注第一个样本,然后把参数稍微修改一点使其对第一个训练样本的拟合变得更好一点完成这个内层循环(for i = 1,…,m)以后,再转向第二个训练样本,把参数稍微修改一点使其对第二个训练样本的拟合变得更好一点,然后再转向第三个训练样本以此类推直到完成所有的训练集。
  • SGD算法在每一次计算之后便更新参数,而不需要将所有的训练集求和,在梯度下降算法还没有完成一次迭代时,随机梯度下降算法就已经走出了很远。但是这样的算法存在的问题是,不是每一步都朝着‘正确’的方向迈出的。因此算法虽然会逐渐走向全局最小的位置,但是可能无法touch到最小值的那一点,反而是在最小值点附近徘徊。 从波士顿房价预测(深度学习典型例子)的例子中可以看出,SGD的特点 – 总体上收敛,局部有一点震荡。 SGD的优势 – SGD不需要对所有的m个训练样本求和来得到梯度项,只需要对单个训练样本求出这个梯度项,在这个过程中我们已经开始优化参数了。

3、神经网络训练如何解决过拟合和欠拟合

解决过拟合:

  • a、获取更多的训练数据
    训练数据越多,模型的泛化能力越好,这个是最优的方法,但是很多情况下我们无法获取更多的数据,因此需要其他方法

  • b、减小网络容量
    这是防止过拟合最简单的方法 在深度学习中,模型容量就是模型中可学习参数的个数。 参数越多,模型就拥有越大的记忆容量。 减小网络容量,即减少参数的个数,即对层数和每层的单元个数进行处理。

  • c、添加权重正则化 – L1,L2正则化

根据奥卡姆剃刀原理: 如果一件事有两件解释,那么最可能正确的解释就是最简单的那个,即假设更少的那个。

简单的模型(参数更少的模型)比复杂模型更不容易过拟合。
通过强制让模型权重只能取得较小的值来降低过拟合
实现方法:向网络损失函数中添加与较大权重值相关的成本。
L1:添加的成本与权重系数的绝对值成正比。
L2:添加的成本与权重系数的平方成正比。

  • d、添加dropout正则化
    暂时丢弃一部分神经元及其连接的方法,可防止过拟合,同时指数级/高效地连接不同的架构。
    使用了Dropout技术的神经网络会设定一个保留率p,然后每一个神经元在一个批量的训练中以概率1-p随即训练是否去掉,最后推断时所有神经元都要保留。
    Dropout的缺点在于会使得明确的代价函数不再被明确定义。
  • e、Early stopping
    将权重初始化为小值,这时,只会用到神经网络的线性部分,网络能力比较弱。
    随着训练时间的增长,会越来越多的用到网络的非线性部分,网络的能力逐渐增强。 这时观察验证集错误率,如果持续增加的话,就可以提早停止训练。
  • f、多个模型平均
    将多个模型bias小的模型平均,会得到一个variance小的模型
  • g、贝叶斯方法
    对权重进行采样,然后对采样的权值分别预测输出,然后平均输出值。

4、L1正则化(L1 normalization)和L2正则化(L2 normalization)区别,具体有何用途

a、L1正则化 – 在原本损失函数基础上加上权重参数的绝对值

在这里插入图片描述
或者
在这里插入图片描述

L1正则化对所有参数的惩罚力度都一样,可以让一部分权重变为0,因此产生稀疏模型,能够去除某个些特征(权重为0则等效于去除)。

b、L2正则化 – 在原本损失函数的基础上加上权重参数的平方和
在这里插入图片描述
或者
Github深度学习面试题答案_第1张图片

L2正则化减少了权重的固定比例,使得权重平滑,L2正则化不会使权重变为0(不会产生稀疏模型),所以选择了更多的特征.

具体区别:
A、L1可以产生0解,L2可以产生趋近0的解
B、L1获得稀疏解,L2获得非零稠密解 – L1使得权重系数,L2使得权重平滑
C、如果事先假定只有非常少数的特征是重要的,可以用L1
D、L1优点是能够获得sparse模型,对于large-scale的问题来说这一点很重要,因为可以减少存储空间
E、L2优点是实现简单,能够起到正则化的作用。缺点就是L1的优点:无法获得sparse模型

  • 参考blog:
    https://blog.csdn.net/ybdesire/article/details/84946128

5、L1正则化相比于 L2正则化为何具有稀疏解?

相比L2正则化,L1正则化的稀疏性具有本质的不同,L1正则化产生的更稀疏的解是指最优值中的一些参数为0.

由于个人能力,仅能从数据计算的角度解释,数据先验的角度暂不理解。

假设只有一个参数w,损失函数为L(w),分别加上L1正则化和L2正则化后有:
在这里插入图片描述

假设L(W)在0出的倒数为d0
在这里插入图片描述

那么,引入L2正则化项后,在0处导数为

在这里插入图片描述

引入L1正则化项后,在0处导数为
Github深度学习面试题答案_第2张图片

总结为:
L1和L2正则化项在0处导数不一样,对于L2,损失函数在0处导数不变;
而对于L1,损失函数在0处导数有突变,从d0+λ到d0-λ,导致原函数在0处会有一个极小值点。
因此在优化时,很可能会优化到该极小值点上,即w=0处.

  • 参考blog:
    https://blog.csdn.net/ybdesire/article/details/84946128

6、CNN基本原理,CNN的哪些部分是神经元

解释”CNN基本原理”的角度— CNN的定义 + CNN的各层意义

CNN神经元 —— 神经元就是指一个带权重W和偏置B,以及激活方程f的一个单元 输入I和输出O的关系是 O = f(WI+B)

CNN的定义:
卷积网络(convolutional network),也叫作卷积神经网络(convolutional neural network,CNN),是一种专门用来处理具有类似网格结构的数据的神经网络。

CNN的各层意义:
搭建一个神经网络,通常都是
Input > convolutional Layer(s)(+activated) > pooling Layer(s) > fully-connected > Output
其中卷积层和池化层可以视情况任意增加,即是 in- loop(>-conv-pooling-…-conv-pooling>)- fc > out
Github深度学习面试题答案_第3张图片

下面主要对卷积层,池化层和全连接层进行说明

Input和Output层作用和意义暂不说明

---------------------------------Convolutions Layer(卷积层)的作用和意义 : ---------------------------------

  • Conv layer作用:卷积层从输入像素数组矩阵(input image)中提取最基本的特征。
  • 提取方式是卷积层使用“卷积核”(convolution kernel)提取局部特征,
    在这个角度看,卷积核 == 特征提取器 == 过滤器 / 滤波器(filter)

Github深度学习面试题答案_第4张图片

对于该图的理解 —— 像素矩阵输入后经过卷积核映射后(矩阵运算)后,输出一个5 * 5的矩阵。
如图,一个7 * 7的矩阵,卷积核为3 * 3,输出为(7-3+1) * (7-3+1)= 5 * 5 的矩阵,
矩阵放置到了经过bagging后的7 * 7矩阵。

- 理解局部感知概念

  • 在人脑识别图片的过程中,并不是对整张图片同时识别,
  • 而是先感知到某个local feature(从狗头感知到狗,猫尾巴感知到猫),
  • 然后再从更高层次对局部进行综合操作,从而得到全局信息。
  • 通过局部感知提取局部特征,使得模型的计算参数减少,计算成本降低。
  • 然而剩下的参数依然较多,这时引入权值共享机制:
  通俗来说权值共享指 —— 
  给一张输入图片,用一个卷积核去扫这张图,卷积核里面的数就叫权重,这张图每个位置是被同样的卷积核扫的,
  所以权重是一样的,也就是共享。
  • 引入权值共享的原因:
    同一层下的神经元的连接参数只与特征的提取有关,而与具体的位置无关
    因此可以保证同一层中所有位置的连接是权值共享的,既同一层中都使用同一个卷积核进行过滤。

参照blog:
卷积神经网络CNN基本原理详解
https://blog.csdn.net/woaijssss/article/details/79535052
CNN卷积神经网络原理详解(上)
https://blog.csdn.net/LEEANG121/article/details/102633718?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=1329187.8310.16178419329314091&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

---------------------------------Activated function(激活函数)的作用和意义:---------------------------------

  • 激活函数并非独立的一层,而是卷积后应该进行激活处理。
  • 所谓激活,实际上是对卷积层的输出结果做一次非线性映射。
  • 如果不用(其实就相当于激活函数是f(x)=x),这种情况下,每一层的输出都是上一层输入的线性函数。
    容易得出,无论有多少神经网络层,输出都是输入的线性组合,与没有隐层的效果是一样的,这就是最原始的感知机了,其并不能解决线性不可分问题,而卷积后的输出结果并非全部线性可分,因此需要进行激活。
  • 正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。
  • 不加激活函数具体原因 >>> 7、CNN去掉激活函数会怎么样

常用的激励函数有:
Sigmoid函数
Tanh函数
ReLU
Leaky ReLU
ELU
Maxout
激励层建议:首选ReLU,因为迭代速度快,但是有可能效果不佳。如果ReLU失效的情况下,考虑使用Leaky
ReLU或者Maxout,此时一般情况都可以解决。Tanh函数在文本和音频处理有比较好的效果。

---------------------------------Pooling layer(池化层)的作用和意义:---------------------------------

  • 池化也称为欠采样或下采样。
  • 主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。
  • 主要有:
  • 一般池化: Max Pooling:最大池化 Average Pooling:平均池化
  • 重叠池化 : OverlappingPooling
  • 空金字塔池化 : Spatial Pyramid Pooling

---------------------------------Full-connected layer(全连接层)的作用和意义:---------------------------------

  • 作用:连接所有特征,将输出值送给分类器(如softmax分类器)

  • 在来到FC层之前,已经经过若干次卷积+激励+池化,
    如果神经元数目过大,学习能力强,有可能出现过拟合。
    因此可以引入dropout,局部归一化(LRN)、数据增强等操作来防止过拟合。

  • 当来到FC层之后,可以理解为一个简单的多分类神经网络,通过softmax函数得到最终的输出,整个模型训练完毕。

  • 下图展示了一个含有多个卷积层+激励层+池化层的过程:
    Github深度学习面试题答案_第5张图片

7、CNN去掉激活函数会怎么样

  • 激活函数的作用是加入非线性因素,提高神经网络对模型的表达能力,解决线性模型不能解决的问题。
  • 不带激活函数的单层感知机是一个线性分类器,不能解决线性不可分的问题
  • 反映到CNN中,应该理解为

“激活函数是用来加入非线性因素的,因为线性模型的表达力不够”

  • 这句话字面的意思很容易理解,但是在具体处理图像的时候是什么情况呢?
  • 我们知道在神经网络中,对于图像,
    我们主要采用了卷积的方式来处理,也就是对每个像素点赋予一个权值,这个操作显然就是线性的。
    但是对于我们样本来说,不一定是线性可分的,
    为了解决这个问题,我们可以进行线性变化,或者我们引入非线性因素,解决线性模型所不能解决的问题。
  • 参考blog:
    https://blog.csdn.net/yjl9122/article/details/70198357
    https://blog.csdn.net/program_developer/article/details/78704224

8、介绍下你了解的轻量级CNN模型(了解)

轻量级深度学习网络(一):详解谷歌轻量级网络MobileNet-v1
https://blog.csdn.net/chenyuping333/article/details/81363125?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

轻量级模型:MobileNet V2
https://blog.csdn.net/kangdi7547/article/details/81431572?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

9、无监督/半监督深度学习(了解)?

解答思路:首先了解无监督/半监督学习,再到无监督/半监督深度学习

  • 无监督/半监督、监督学习参考blog:
    https://blog.csdn.net/jcjx0315/article/details/73288501

监督学习(Supervised Learning
监督学习是使用已知正确答案的示例来训练网络的
其中:数据集的创建和分类 中对分类和回归的解释值得记录
在数学上,我们在神经网络中找到一个函数,这个函数的输入是一张图片(图像检测应用),
当目标不在图片中,输出0,否则为1.这个过程叫分类。
在这种情况下,我们进行的通常是一个yes or no的训练,
但是,监督学习还能输出一组介于0和1值,这个任务我们称为回归。

无监督学习(Unsupervised Learning)
无监督学习适用于具有数据集但无标签的情况。
无监督学习采用输入集,并尝试查找数据中的模式。
无监督的学习方法包括:
自编码
主成分分析
随机森林
K均值聚类
生成对抗网络

半监督学习(Semi-supervised Learning)
半监督学习在训练阶段结合了大量未标记的数据和少量标签数据,与使用所有标签数据的模型相比,使用训练集的训练模型在训练时可以更为准确,而且训练成本更低。
为什么使用未标记数据有时可以帮助模型更准确,关于这一点的体会就是:
即使你不知道答案,但你也可以通过学习来知晓,有关可能的值是多少以及特定值出现的频率。

对于无监督深度学习和半监督深度学习:

  • 半监督深度学习,深度学习需要用到大量有标签数据,即使在大数据时代,干净能用的有标签数据也是不多的,由此引发深度学习与半监督学习的结合。
  • 半监督深度学习定义:有标签数据+无标签数据混合城的训练数据中使用的深度学习算法
  • 半监督深度学习算法大致有三类:

第一类 — 无标签数据预训练,有标签数据微调
好的初始化,能够让结果更加稳定,迭代次数更少
初始化方式主要有两种:无监督预训练,伪有监督预训练
无监督预训练:
a、用所有数据逐层重构预训练,对网络的每一侧给,都做重构自编码,得到参数后用有标签数据微调
b、用所有数据训练重构自编码网络,然后把自编码网络的参数,作为初始参数,用有标签数据微调。
伪有监督与训练:
通过某种方式/算法(如半监督算法,k均值聚类算法等),给无标签数据附上伪标签信息,先用这些伪标签信息来预训练网络,然后再用有标签数据微调。

第二类 — 使用从网络得到的深度特征来做半监督算法 给神经网络制造标签数据,相当于简洁的self-training。 一般流程为:
先用有标签数据训练网络(此时网络一般过拟合),从该网络中提取所有数据的特征,以这些特征来用某种分类算法对无标签数据进行分类,挑选你认为的分类正确的无标签数据加入到训练集,再训练网络,如此循环。
由于网络得到新的数据(挑选出来分类后的无标签数据)会更新提升,使得后续提出来的特征更好,后面对无标签数据分类就更精确,挑选后加入到训练集中又继续提升网络。对于该想法的性能,个人保持猜疑态度,由于噪声的影响,挑选加入到训练无标签数据一般都带有有标签噪声(就是某些无标签数据被分类错误),这些噪声会误导网络且被网络学习记忆

第三类 — 让网络以半监督学习的方式运行
第一类和第二类都是用了有标签数据和无标签数据,但就神经网络本身而言,其实还是运行再一种有监督的方式上。 让深度学习真正成为半监督算法的方法:
Github深度学习面试题答案_第6张图片

b 、2015-Semi-Supervised Learning with Ladder Networks
2015年诞生半监督ladderNet,ladderNet是其他文章中先提出来的想法,但这篇文章使它 work in semi-supervised fashion,而且效果非常好,达到了当时的 state-of-the-art 性能。
ladderNet是有监督算法和无监督算法的有机结合。前面提到,很多半监督深度学习算法是用无监督预训练这种方式对无标签数据进行利用的,但事实上,这种把无监督学习强加在有监督学习上的方式有缺点:两种学习的目的不一致,其实并不能很好兼容。
无监督预训练一般是用重构样本进行训练,其编码(学习特征)的目的是尽可能地保留样本的信息;而有监督学习是用于分类,希望只保留其本质特征,去除不必要的特征。
ladderNet 通过 skip connection 解决这个问题,通过在每层的编码器和解码器之间添加跳跃连接(skip connection),减轻模型较高层表示细节的压力,使得无监督学习和有监督学习能结合在一起,并在最高层添加分类器,ladderNet就变身成一个半监督模型。
ladderNet 有机地结合了无监督学习和有监督学习,解决兼容性问题,发展出一个端对端的半监督深度模型。

  • 参考blog:
    https://zhuanlan.zhihu.com/p/33196506

10、Relu为什么比sigmod好?

a 、采用sigmoid作为激活函数进行指数运算时,计算量大,尤其是在反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用relu激活函数,整个过程的计算量节省很多。
b 、对于深层网络,sigmoid函数进行反向传播时,很容易出现梯度消失的情况(在sigmoid接近饱和区域时,变换太缓慢,倒数趋向于0,这时候会造成信息丢失),从而无法完成深层网络的训练。
c 、Relu会使一部分神经元的输出为,这样造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

你可能感兴趣的:(深度学习)