AI⾯试必备深度学习100问1-50题答案解析
正则化是为了防止1、梯度下降算法的正确步骤,(正确步骤dcaeb)(梯度下降法其实是根据函数的梯度来确定函数的极⼩值),这⾥的问题与其说是梯度下降算法的步骤不如说类似图图像分类训练的整个流程:⽹络初始化-输⼊to输出-期望输出与实际差值-根据误差计算更新权值-迭代进⾏。
a.计算预测值和真实值之间的误差;
b.重复迭代,直⾄得到⽹络权重的最佳值;
c.把输⼊传⼊⽹络,得到输出值;
d.⽤随机值初始化权重和偏差;
e.对每⼀个产⽣误差的神经元,调整相应的(权重)值以减⼩误差。
2、已知:⼤脑是有很多个叫做神经元的东西构成,神经⽹络是对⼤脑的简单的数学表达。每⼀个神经元都有输⼊、处理函数和输出。神经元组合起来形成了⽹络,可以拟合任何函数。为了得到最佳的神经⽹络,我们⽤梯度下降⽅法不断更新模型。
给定上述关于神经⽹络的描述,什么情况下神经⽹络模型被称为深度学习模型?(正确是A)
A.加⼊更多层,使神经⽹络的深度增加;
B.有维度更⾼的数据;
C.当这是⼀个图形识别的问题时;
D.以上都不正确
神经⽹络理论上说是仿照⽣物神经学⼀层层迭代处理结构(⽣物学认为视觉系统是层级结构),层层抽象与迭代,多少层算深层结构没有硬性的规定,⼀般要超过2层。
3、训练CNN时,可以对输⼊进⾏旋转、平移、缩放等预处理提⾼模型泛化能⼒。这么说是对,还是不对?(正确答案:对)
扩充数据是提⾼泛化能⼒常⽤的⽅式,对数据的平移、旋转等是对CNN训练数据的扩充的操作⽅式。
4、下⾯哪项操作能实现跟神经⽹络中Dropout的类似效果?
A.Boosting
B.Bagging
C.Stacking
D.Mapping(正确:B)
典型的神经⽹络其训练流程是将输⼊通过⽹络进⾏正向传导,然后将误差进⾏反向传播,Dropout就是针对这⼀过程之中,随机地删除隐藏层的部分单元,进⾏上述过程。步骤为:1)随机删除⽹络中的⼀些隐藏神经元,保持输⼊输出神经元不变;2)将输⼊通过修改后的⽹络进⾏前向传播,然后将误差通过修改后的⽹络进⾏反向传播;3)对于另外⼀批的训练样本,重复上述操作。他的作为从Hinton的原⽂以及后续的⼤量实验论证发现,dropout可以⽐较有效地减轻过拟合的发⽣,⼀定程度上达到了正则化的效果。A:Boosting⽅法是⼀种⽤来提⾼弱分类算法准确度的⽅法,这种⽅法通过构造⼀个预测函数系列,然后以⼀定的⽅式将他们组合成⼀个预测函数。B:bagging同样是弱分类器组合的思路,它⾸先随机地抽取训练集(training set),以之为基础训练多个弱分类器。然后通过取平均,或者投票(voting)的⽅式决定最终的分类结果。因为它随机选取训练集的特点,Bagging可以⼀定程度上避免过渡拟合(overfit)。C:stacking:它所做的是在多个分类器的结果上,再套⼀个新的分类器。这个新的分类器就基于弱分类器的分析结果,加上训练标签(training label)进⾏训练。⼀般这最后⼀层⽤的是LR。D:Sammon Mapping降维算法。
5、下列哪⼀项在神经⽹络中引⼊了⾮线性?(正确:B)
A.随机梯度下降;
B.修正线性单元(ReLU);
C.卷积函数;
D.以上都不正确
"线性"="齐次性"+"可加性","齐次性"是指类似于: f(ax)=af(x),"可加性"是指类似于: f(x+y)=f(x)+f(y),
这⾥没有太多特别的原因, 就是⼀个名字. "⾮线性"当然就是这两条⾄少之⼀不成⽴。修正线性单元是⾮线性的激活函数。
6.CNN的卷积核是单层的还是多层的?
⼀般⽽⾔,深度卷积⽹络是⼀层⼜⼀层的。层的本质是特征图, 存贮输⼊数据或其中间表⽰值。⼀组卷积核则是联系前后两层的⽹络参数表达体, 训练的⽬标就是每个卷积核的权重参数组。描述⽹络模型中某层的厚度,通常⽤名词通道channel数或者特征图feature map数。不过⼈们更习惯把作为数据输⼊的前层的厚度称之为通道数(⽐如RGB三⾊图层称为输⼊通道数为3),把作为卷积输出的后层的厚度称之为特征图数。卷积核(filter)⼀般是3D多层的,除了⾯积参数, ⽐如3x3之外, 还有厚度参数H(2D的视
为厚度1). 还有⼀个属性是卷积核的个数N。卷积核的厚度H, ⼀般等于前层厚度M(输⼊通道数或feature map数). 特殊情况M > H。卷积核的个数N, ⼀般等于后层厚度(后层feature maps 数,因为相等所以也⽤N表⽰)。卷积核通常从属于后层,为后层提供了各种查看前层特征的视⾓,这个视⾓是⾃动形成的。卷积核厚度等于1时为2D卷积,对应平⾯点相乘然后把结果加起来,相当于点积运算;卷积核厚度⼤于1时为3D卷积,每⽚分别平⾯点求卷积,然后把每⽚结果加起来,作为3D卷积结果;1x1卷积属于3D卷积的⼀个特例,有厚度⽆⾯积, 直接把每⽚单个点乘以权重再相加。归纳之,卷积的意思就是把⼀个区域,不管是⼀维线段,⼆维⽅阵,还是三维长⽅块,全部按照卷积核的维度形状,对应逐点相乘再求和,浓缩成⼀个标量值也就是降到零维度,作为下⼀层的⼀个feature map的⼀个点的值!可以⽐喻⼀渔夫坐⼀个渔船撒⽹打鱼,鱼塘是多层⽔域,每层鱼⼉不同。船每次移位⼀个stride到⼀个地⽅,每个渔夫撒⼀⽹,得到收获,然后换⼀个距离stride再撒,如此重复直到遍历鱼塘。A渔夫盯着鱼的品种,遍历鱼塘后该渔夫描绘了鱼塘的鱼品种分布;B渔夫盯着鱼的重量,遍历鱼塘后该渔夫描绘了鱼塘的鱼重量分布;还有N-2个渔夫,各⾃兴趣各⼲各的;最后得到N个特征图,描述了鱼塘的⼀切!2D卷积表⽰渔夫的⽹就是带⼀圈浮标的渔⽹,只打上⾯⼀层⽔体的鱼;3D卷积表⽰渔夫的⽹是多层嵌套的渔⽹,上中下层⽔体的鱼⼉都跑不掉;1x1卷积可以视为每次移位stride,甩钩钓鱼代替了撒⽹;下⾯解释⼀下特殊情况的 M > H:实际上,除了输⼊数据的通道数⽐较少之外,中间层的feature map数很多,这样中间层算卷积会累死计算机(鱼塘太深,每层鱼都打,需要的鱼⽹太重了)。所以很多深度卷积⽹络把全部通道/特征图划分⼀下,每个卷积核只看其中⼀部分(渔夫A的渔⽹只打捞深⽔段,渔夫B的渔⽹只打捞浅⽔段)。
这样整个深度⽹络架构是横向开始分道扬镳了,到最后才⼜融合。这样看来,很多⽹络模型的架构不完全是突发奇想,⽽是是被参数计算量逼得。特别是现在需要在移动设备上进⾏AI应⽤计算(也叫推断), 模型参数规模必须更⼩, 所以出现很多减少握⼿规模的卷积形式, 现在主流⽹络架构⼤都如此。
7.什么是卷积?
8.什么是CNN的池化pool层?
池化,简⾔之,即取区域平均或最⼤,如下图所⽰(图引⾃cs231n)上图所展⽰的是取区域最⼤,即下图左边部分中左上⾓2x2的矩阵中6最⼤,右上⾓2x2的矩阵中8最⼤,左下⾓2x2的矩阵中3最⼤,右下⾓2x2的矩阵中4最⼤,所以得到上图右边部分的结果:6 8 3 4。关于池化的作⽤最可靠的解释是在尽量保持原数据关系的基础上进⾏变化降低维度,常⽤的是平均和最⼤池化法。
9.简述下什么是⽣成对抗⽹络。
GAN之所以是对抗的,是因为GAN的内部是竞争关系,⼀⽅叫generator,它的主要⼯作是⽣成图⽚,并且尽量使得其看上去是来⾃于训练样本的。另⼀⽅是discriminator,其⽬标是判断输⼊图⽚是否属于真实训练样本。更直⽩的讲,将generator想象成制造商,⽽discriminator是警察。generator⽬的是尽可能把造的跟真的⼀样,从⽽能够骗过discriminator,即⽣成样本并使它看上去好像来⾃于真实训练样本⼀样。GAN的主要思想是拥有两个竞争的神经⽹络模型。⼀个将噪声数据作为输⼊,并产⽣样本(所谓的⽣成器)。另⼀个模型(称为判别器)从⽣成器和训练数据接收样本,并且必须能够区分两个来源。这两个⽹络进⾏连续的博弈,⽣成器学习产⽣越来越多的现实样本,鉴别器正在学习越来越好地区分⽣成的数据和实际数据。这两个⽹络同时进⾏训练,最后的希望是竞争能够使⽣成器⽣成的样本与实际数据不可区分。
10.学梵⾼作画的原理是什么?
⼀个训练好的图像识别模型,⽐如训练毕加索画式的猫的分类模型会给你反馈⼀个概率分数,表⽰它相信这是⼀张“毕加索猫”照⽚的程度。这中间经历了很多CNN层,每层CNN都在狗狗照⽚上寻输⼊样本是毕加索猫的图形特征证据,越底层的神经元分析的特征越具体,越⾼层越抽象。当然,最后模型会给出很低的分数,如果输⼊是⼀个狗照⽚识别毕加索猫的过程中,如果让模型能够修改输⼊的样本⼜会怎
样呢?给模型⽹络中加⼀个反馈回路,让每⼀层⽹络可以朝着使最后分数变⼤的⽅向上修改狗狗照⽚。每次迭代⽹络中的每层都会在狗照上增加⼀些毕加索猫的特征痕迹,可以迭代很多次,让狗狗照⽚中加⼊越来越多的毕加索猫的实物特征。这就是使⽤卷积神经⽹络艺术作画的概念基础,让艺术风格模型的CNN按图形特征修改输⼊图⽚,叠加艺术效果。⼤致的实现思路如下:1)输⼊特征图像,训练风格模型,让计算机学会艺术风格。2)输⼊待处理图,风格模型引导修改输⼊图⽚,⽣成新的图像,输出“艺术画”。
11.请简要介绍下tensorflow的计算图。
Tensorflow是⼀个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是⼀种有向图,Tensorflow中的每⼀个节点都是计算图上的⼀个Tensor, 也就是张量,⽽节点之间的边描述了计算之间的依赖关系(定义时)和数学操作(运算时)。a=x*y; b=a+z;
duce_sum(b);
12.你有哪些deep learning(rnn、cnn)调参的经验?
1、参数初始化,参数初始化影响收敛速度和收敛结果甚⾄造成Nan等问题,下⾯的n_in为⽹络的输⼊⼤⼩,uniform均匀分布初始化:w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])。normal⾼斯分布初始化⽅法如下:w = np.random.randn(n_in,n_out) * stdev
# stdev为⾼斯分布的标准差,均值设为0
2、数据预处理⽅式:
zero-center ,这个挺常⽤的.X -= np.mean(X, axis = 0) # zero-centerX /= np.std(X, axis = 0) # normalize。PCA whitening,这个⽤的⽐较少. 13.CNN最成功的应⽤是在CV,那为什么NLP和Speech的很多问题也可以⽤CNN解出来?为什么AlphaGo⾥也⽤了CNN?这⼏个不相关的问题的相似性在哪⾥?CNN通过什么⼿段抓住了这个共性?
不相关问题的相关性在于,都存在局部与整体的关系,由低层次的特征经过组合,组成⾼层次的特征,并且得到不同特征之间的空间相关性。如下图:低层次的直线/曲线等特征,组合成为不同的形状,最后得到汽车的表⽰。
CNN抓住此共性的⼿段主要有四个:局部连接/权值共享/池化操作/多层次结构。局部连接使⽹络可以提取数据的局部特征;权值共享⼤⼤降低了⽹络的训练难度,⼀个Filter只提取⼀个特征,在整个图⽚(或者语⾳/⽂本)中进⾏卷积;池化操作与多层次结构⼀起,实现了数据的降维,将低层次的局部特征组合成为较⾼层次的特征,从⽽对整个图⽚进⾏表⽰。
14.LSTM结构推导,为什么⽐RNN好?
推导forget gate,input gate,cell state, hidden information等的变化;因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防⽌梯度消失或者爆炸。
15.Sigmoid、Tanh、ReLu这三个激活函数有什么缺点或不⾜,有没改进的激活函数。
1、1)sig:容易出现梯度消失(gradient  vanishing)的现象:当激活函数接近饱和区时,变化太缓慢,导数接近0,根据后向传递的数学依据是微积分求导的链式法则,当前导数需要之前各层导数的乘积,⼏个⽐较⼩的数相乘,导数结果很接近0,从⽽⽆法完成深层⽹络的训练。2)Sigmoid的输出不是0均值(zero-centered)的:这会导致后层的神经元的输⼊是⾮0均值的信号,这会对梯度产⽣影响。以
f=sigmoid(wx+b)为例,假设输⼊均为正数(或负数),那么对w的导数总是正数(或负数),这样在反
向传播过程中要么都往正⽅向更新,要么都往负⽅向更新,导致有⼀种捆绑效果,使得收敛缓慢。3)幂运算相对耗时.
2、Tanh:解决了Sigmoid函数的⾮zero-centered问题,但是它也存在梯度消失和幂运算的问题。其实 tanh(x)=2sigmoid(2x)-1。
3、Relu:(1)ReLU的输出不是zero-centered;(2)Dead  ReLU  Problem(神经元坏死现象):某些神经元可能永远不会被激活,导致相应参数永远不会被更新(在负数部分,梯度为0)。产⽣这种现象的两个原因:参数初始化问题;learning  rate太⾼导致在训练过程中参数更新太⼤。解决⽅法:采⽤Xavier初始化⽅法,以及避免将learning  rate设置太⼤或使⽤adagrad等⾃动调节learning  rate的算法。(3)ReLU不会对数据做幅度压缩,所以数据的幅度会随着模型层数的增加不断扩张。为了解决ReLU的dead cell的情况,发明了Leaky Relu,即在输⼊⼩于0时不让输出为0,⽽是乘以⼀个较⼩的系数,从⽽保证有导数存在。同样的⽬的,还有⼀个ELU,函数⽰意图如下:
还有⼀个激活函数是Maxout,即使⽤两套w,b参数,输出较⼤值。本质上Maxout可以看做Relu的泛化版本,因为如果⼀套w,b全都是0的话,那么就是普通的ReLU。Maxout可以克服Relu的缺点,但是参数数⽬翻倍。
16、为什么引⼊⾮线性激励函数?
第⼀,对于神经⽹络来说,⽹络的每⼀层相当于f(wx+b)=f(w'x),对于线性函数,其实相当于f(x)=x,那么在线性激活函数下,每⼀层相当于⽤⼀个矩阵去乘以x,那么多层就是反复的⽤矩阵去乘以输⼊。根
据矩阵的乘法法则,多个矩阵相乘得到⼀个⼤矩阵。所以线性激励函数下,多层⽹络与⼀层⽹络相当。⽐如,两层的⽹络f(W1*f(W2x))=W1W2x=Wx。第⼆,⾮线性变换是深度学习有效的原因之⼀。原因在于⾮线性相当于对空间进⾏变换,变换完成后相当于对问题空间进⾏简化,原来线性不可解的问题现在变得可以解了。
上图可以很形象的解释这个问题,左图⽤⼀根线是⽆法划分的。经过⼀系列变换后,就变成线性可解的问题了。如果不⽤激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每⼀层输出都是上层输⼊的线性函数,很容易验证,⽆论你神经⽹络有多少层,输出都是输⼊的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。正因为上⾯的原因,我们决定引⼊⾮线性函数作为激励函数,这样深层神经⽹络就有意义了(不再是输⼊的线性组合,可以逼近任意函数)。最早的
想法是sigmoid函数或者tanh函数,输出有界,很容易充当下⼀层输⼊(以及⼀些⼈的⽣物解释)。
17、请问⼈⼯神经⽹络中为什么ReLu要好过于tanh和sigmoid function?
函数图形如下:
第⼀,采⽤sigmoid等函数,算激活函数时(指数运算),计算量⼤,反向传播求误差梯度时,求导涉及除法和指数运算,计算量相对⼤,⽽采⽤Relu激活函数,整个过程的计算量节省很多。
第⼆,对于深层⽹络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),这种现象称为饱和,从⽽⽆法完成深层⽹络的训练。⽽ReLU就不会有饱和倾向,不会有特别⼩的梯度出现。
第三,Relu会使⼀部分神经元的输出为0,这样就造成了⽹络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发⽣(以及⼀些⼈的⽣物解释balabala)。当然现在也有⼀些对relu的改进,⽐如prelu,random relu等,在不同的数据集上会有⼀些训练速度上或者准确率上的改进,具体的⼤家可以相关的paper看。多加⼀句,现在主流的做法,会多做⼀步batch normalization,尽可能保证每⼀层⽹络的输⼊具有相同的分布[1]。⽽最新的paper[2],他们在加⼊bypass connection之后,发现改变batch normalization的位置会有更好的效果。
18、为什么LSTM模型中既存在sigmoid⼜存在tanh两种激活函数,⽽不是选择统⼀的sigmoid或者tanh?这样做的⽬的是什么?
sigmoid ⽤在了各种gate上,产⽣0~1之间的值,这个⼀般只有sigmoid最直接了。tanh ⽤在了状态和输出上,是对数据的处理,这个⽤其他激活函数或许也可以。⼆者⽬的不⼀样,另可参见A Critical Revie
w of Recurrent Neural Networks for Sequence Learning的section4.1,说了那两个tanh都可以替换成别的。
19、如何解决RNN梯度爆炸和弥散的问题?
为了解决梯度爆炸问题,Thomas Mikolov⾸先提出了⼀个简单的启发性的解决⽅案,就是当梯度⼤于⼀定阈值的的时候,将它截断为⼀个较⼩的数。具体如算法1所述:算法:当梯度爆炸时截断梯度,下图可视化了梯度截断的效果。它展⽰了⼀个⼩的rnn(其中W为权值矩
阵,b为bias项)的决策⾯。这个模型是⼀个⼀⼩段时间的rnn单元组成;实⼼箭头表明每步梯度下降的训练过程。当梯度下降过程中,模型的⽬标函数取得了较⾼的误差时,梯度将被送到远离决策⾯的位置。截断模型产⽣了⼀个虚线,它将误差梯度拉回到离原始梯度接近的位置。
梯度爆炸,梯度截断可视化为了解决梯度弥散的问题,我们介绍了两种⽅法。第⼀种⽅法是将随机初始化,改为⼀个有关联的矩阵初始化。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。