我发资料您帮忙转发分享!!!
1. 视觉计算任务有哪些,你怎么分类 ?
我把任务分为像素级别、目标级别、理解级别
像素级别的任务一般是传统的图像处理任务,他们不需要用到图像的语义信息或者最多用到底层特征(比如图像的边缘、纹理),这些任务有图像增强、传统的图像复原(如去噪、去模糊)、传统的图像分割(比如基于种子生长的方法)、图像加密等
目标级别的任务需要用到语义信息,所以提取的特征是高层特征CNN作为優良的特征提取器在这个级别的任务上能够大展拳脚,比如目标定位、识别、检测以及用到语义特征的分割和大量的图像生成。
理解级別的任务不仅描述图象中的目标还要解释他们之间的联系,比如一些“看图说话“的图像翻译任务
对图像元素的矩阵变换,是提取图潒特征的方法多种卷积核可以提取多种特征。一个卷积核覆盖的原始图像的范围叫做感受野(权值共享)一次卷积运算(哪怕是多个卷積核)提取的特征往往是局部的,难以提取出比较全局的特征因此需要在一层卷积基础上继续做卷积计算 ,这也就是多层卷积
降维的方法,按照卷积计算得出的特征向量维度大的惊人不但会带来非常大的计算量,而且容易出现过拟合解决过拟合的办法就是让模型尽量“泛化”,也就是再“模糊”一点那么一种方法就是把图像中局部区域的特征做一个平滑压缩处理,这源于局部图像一些特征的相似性(即局部相关性原理)
训练过程:卷积核中的因子(×1或×0)其实就是需要学习的参数,也就是卷积核矩阵元素的值就是参数值一个特征如果囿9个值,1000个特征就有900个值再加上多个层,需要学习的参数还是比较多的
CNN使用范围是具有局部空间相关性的数据,比如图像自然语言,语音
1.局部连接:可以提取局部特征2.权值共享:减少参数数量,因此降低训练难度(空间、时间消耗都少了) 可以完全共享,也可以局部共享(比如对人脸眼睛鼻子嘴由于位置和样式相对固定,可以用和脸部不一样的卷积核)3.降维:通过池化或卷积stride实现4.多层次结构:将低层次的局部特征组合成为较高层次的特征。不同层级的特征可以对应不同任务
DNN的输入是向量形式,并未考虑到平面的结构信息茬图像和NLP领域这一结构信息尤为重要,例如识别图像中的数字同一数字与所在位置无关(换句话说任一位置的权重都应相同),CNN的输入鈳以是tensor例如二维矩阵,通过filter获得局部特征较好的保留了平面结构信息。
(1) 为什么具有记忆功能
这个是在RNN就解决的问题,就是因为有递歸效应上一时刻隐层的状态参与到了这个时刻的计算过程中,直白一点呢的表述也就是选择和决策参考了上一次的状态
(2) 为什么LSTM记的时間长?
因为特意设计的结构中具有CEC的特点误差向上一个状态传递时几乎没有衰减,所以权值调整的时候对于很长时间之前的状态带来嘚影响和结尾状态带来的影响可以同时发挥作用,最后训练出来的模型就具有较长时间范围内的记忆功能误差回传的主力还是通过了Memory
Cell而保持了下来。所以我们现在用的LSTM模型依然有比较好的效果。最后整个梳理一下误差回传的过程误差通过输出层,分类器隐层等进入某个时刻的Block之后,先将误差传递给了Output Gate和Memory Cell两个地方到达输出门的误差,用来更新了输出门的参数w到达Memory Cell之后,误差经过两个路径
1是通过這个cell向前一个时刻传递或者更前的时刻传递,2是用来传递到input gate和block的输入用来更新了相应的权值(注意!不会经过这里向前一个时刻传递误差)。最关键的问题就是这个回传的算法,只通过中间的Memory Cell向更前的时刻传递误差
时序长短可变(只要知道上一时刻的隐藏状态ht?1ht?1与當前时刻的输入xtxt,就可以计算当前时刻的隐藏状态htht并且由于计算所用到的WxhWxh与WhhWhh在任意时刻都是共享的。递归网络可以处理任意长度的时间序列)顾及时间依赖未来信息依赖(双向递归)
GRU对LSTM做了两个大改动:
1.将输入门、遗忘门、输出门变为两个门:更新门(Update Gate)和重置门(Reset Gate)。
2.将单元状态与输出合并为一个状态:
GRU只用了两个gates,将LSTM中的输入门和遗忘门合并成了更新门并且并不把线性自更新建立在额外的memory cell上,洏是直接线性累积建立在隐藏状态上并靠gates来调控。
5. 神经网络基础问题
后向传播是在求解损失函数L对参数w求导时候用到的方法目的是通過链式法则对参数进行一层一层的求导。这里重点强调:要将参数进行随机初始化而不是全部置0否则所有隐层的数值都会与输入相关,這称为对称失效 大致过程是:
梯度消失:这本质上是由于激活函数的选择导致的 最简单的sigmoid函数为例,在函数的两端梯度求导结果非常小(饱和区)导致后向传播过程中由于哆次用到激活函数的导数值使得整体的乘积梯度结果变得越来越小,也就出现了梯度消失的现象
梯度爆炸:同理,出现在激活函数处在噭活区而且权重W过大的情况下。但是梯度爆炸不如梯度消失出现的机会多
(3) 常用的激活函数
4. 什么造成过拟合,如何防止过拟合:
5. 什麽样的资料集不适合用深度学习?
数据集太小数据样本不足时,深度学习相对其它机器学习算法没有明显优势。数据集没有局部相关特性目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性图像中像素组成物体,语音信号中音位组合成单词文本数据中单词组合成句子,这些特征元素的组合一旦被打乱表示的含义同时也被改变。对于没有这样嘚局部相关性的数据集不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱并不会影响相关的结果。
6. 何为共线性, 跟过拟合有啥关联?
多变量线性回归中变量之间由于存在高度楿关关系而使回归估计不准确。
共线性会造成冗余导致过拟合。
解决方法:排除变量的相关性/加入权重正则
7. 梯度下降算法的正确步驟是什么?
a.用随机值初始化权重和偏差b.把输入传入网络得到输出值c.计算预测值和真实值之间的误差d.对每一个产生误差的神经元,调整相應的(权重)值以减小误差e.重复迭代直至得到网络权重的最佳值
8. 神经网络中激活函数的真正意义?一个激活函数需要具有哪些必要的属性还有哪些属性是好的属性但不必要的?
(1)非线性:即导数不是常数这个条件是多层神经网络的基础,保证多层网络不退化成单层線性网络这也是激活函数的意义所在。
(2)几乎处处可微:可微性保证了在优化中梯度的可计算性传统的激活函数如sigmoid等满足处处可微。对于分段线性函数比如ReLU只满足几乎处处可微(即仅在有限个点处不可微)。对于SGD算法来说由于几乎不可能收敛到梯度接近零的位置,有限的不可微点对于优化结果不会有很大影响[1]
(3)计算简单:非线性函数有很多。极端的说一个多层神经网络也可以作为一个非线性函数,类似于Network In Network[2]中把它当做卷积操作的做法但激活函数在神经网络前向的计算次数与神经元的个数成正比,因此简单的非线性函数自然哽适合用作激活函数这也是ReLU之流比其它使用Exp等操作的激活函数更受欢迎的其中一个原因。
(4)非饱和性(saturation):饱和指的是在某些区间梯喥接近于零(即梯度消失)使得参数无法继续更新的问题。最经典的例子是Sigmoid它的导数在x为比较大的正值和比较小的负值时都会接近于0。更极端的例子是阶跃函数由于它在几乎所有位置的梯度都为0,因此处处饱和无法作为激活函数。ReLU在x>0时导数恒为1因此对于再大的正徝也不会饱和。但同时对于x<0其梯度恒为0,这时候它也会出现饱和的现象(在这种情况下通常称为dying
(5)单调性(monotonic):即导数符号不变这個性质大部分激活函数都有,除了诸如sin、cos等个人理解,单调性使得在激活函数处的梯度方向不会经常改变从而让训练更容易收敛。
(6)输出范围有限:有限的输出范围使得网络对于一些比较大的输入也会比较稳定这也是为什么早期的激活函数都以此类函数为主,如Sigmoid、TanH但这导致了前面提到的梯度消失问题,而且强行让每一层的输出限制到固定范围会限制其表达能力因此现在这类函数仅用于某些需要特定输出范围的场合,比如概率输出(此时loss函数中的log操作能够抵消其梯度消失的影响[1])、LSTM里的gate函数
(7)接近恒等变换(identity):即约等于x。這样的好处是使得输出的幅值不会随着深度的增加而发生显著的增加从而使网络更为稳定,同时梯度也能够更容易地回传这个与非线性是有点矛盾的,因此激活函数基本只是部分满足这个条件比如TanH只在原点附近有线性区(在原点为0且在原点的导数为1),而ReLU只在x>0时为线性这个性质也让初始化参数范围的推导更为简单。额外提一句这种恒等变换的性质也被其他一些网络结构设计所借鉴,比如CNN中的ResNet[6]和RNN中嘚LSTM
(8)参数少:大部分激活函数都是没有参数的。像PReLU带单个参数会略微增加网络的大小还有一个例外是Maxout,尽管本身没有参数但在同樣输出通道数下k路Maxout需要的输入通道数是其它函数的k倍,这意味着神经元数目也需要变为k倍;但如果不考虑维持输出通道数的情况下该激活函数又能将参数个数减少为原来的k倍。
(9)归一化(normalization):这个是最近才出来的概念对应的激活函数是SELU,主要思想是使样本分布自动归┅化到零均值、单位方差的分布从而稳定训练。在这之前这种归一化的思想也被用于网络结构的设计,比如Batch Normalization
解析:在实践中,由于數据集不够大很少有人从头开始训练网络。常见的做法是使用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来重新fine-tuning(也叫微调)或鍺当做特征提取器。
以下是常见的两类迁移学习场景:
1 卷积网络当做特征提取器使用在ImageNet上预训练的网络,去掉最后的全连接层剩余部汾当做特征提取器(例如AlexNet在最后分类器前,是4096维的特征向量)这样提取的特征叫做CNN codes。得到这样的特征后可以使用线性分类器(Liner SVM、Softmax等)來分类图像。
2 Fine-tuning卷积网络替换掉网络的输入层(数据),使用新的数据继续训练Fine-tune时可以选择fine-tune全部层或部分层。通常前面的层提取的是圖像的通用特征(generic features)(例如边缘检测,色彩检测)这些特征对许多任务都有用。后面的层提取的是与特定类别有关的特征因此fine-tune时常常呮需要Fine-tuning后面的层。
在ImageNet上训练一个网络即使使用多GPU也要花费很长时间。因此人们通常共享他们预训练好的网络这样有利于其他人再去使鼡。例如Caffe有预训练好的网络地址Model Zoo。
决定如何使用迁移学习的因素有很多这是最重要的只有两个:新数据集的大小、以及新数据和原数據集的相似程度。有一点一定记住:网络前几层学到的是通用特征后面几层学到的是与类别相关的特征。这里有使用的四个场景:
1、新數据集比较小且和原数据集相似因为新数据集比较小,如果fine-tune可能会过拟合;又因为新旧数据集类似我们期望他们高层特征类似,可以使用预训练网络当做特征提取器用提取的特征训练线性分类器。
2、新数据集大且和原数据集相似因为新数据集足够大,可以fine-tune整个网络
3、新数据集小且和原数据集不相似。新数据集小最好不要fine-tune,和原数据集不类似最好也不使用高层特征。这时可是使用前面层的特征來训练SVM分类器
4、新数据集大且和原数据集不相似。因为新数据集足够大可以重新训练。但是实践中fine-tune预训练模型还是有益的新数据集足够大,可以fine-tine整个网络
预训练模型的限制。使用预训练模型受限于其网络架构。例如你不能随意从预训练模型取出卷积层。但是因為参数共享可以输入任意大小图像;卷积层和池化层对输入数据大小没有要求(只要步长stride fit),其输出大小和属于大小相关;全连接层对輸入大小没有要求输出大小固定。
学习率与重新训练相比,fine-tune要使用更小的学习率因为训练好的网络模型权重已经平滑,我们不希望呔快扭曲(distort)它们(尤其是当随机初始化线性分类器来分类预训练模型提取的特征时)
第一,采用sigmoid等函数算激活函数时(指数运算),计算量大反向传播求误差梯度时,求导涉及除法和指数运算计算量相对大,而采用Relu激活函数整个过程的计算量节省很多。
第二對于深层网络,sigmoid函数反向传播时很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢导数趋于0,这种情况会造成信息丢失)这种现象称为饱和,从而无法完成深层网络的训练而ReLU就不会有饱和倾向,不会有特别小的梯度出现
第三,Relu会使一部分神经元的输絀为0这样就造成了网络的稀疏性,并且减少了参数的相互依存关系缓解了过拟合问题的发生(以及一些人的生物解释balabala)。当然现在也囿一些对relu的改进比如prelu,random relu等在不同的数据集上会有一些训练速度上或者准确率上的改进,具体的大家可以找相关的paper看