吴恩达老师深度学习视频课笔记:总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengbingchun/article/details/82890599

吴恩达老师深度学习视频课网址为:https://mooc.study.163.com/smartSpec/detail/1001319001.htm/?utm_source=weibo.com&utm_medium=timeline&utm_campaign=deepLearning&utm_content=wnd20170831

这篇是基于之前所有笔记的简单总结,笔记列表如下:

回归公式推导及C++实现: https://blog.csdn.net/fengbingchun/article/details/79346691

单隐含层神经网络公式推导及C++实现(二分类): https://blog.csdn.net/fengbingchun/article/details/79370310

多隐含层神经网络公式推导(二分类): https://blog.csdn.net/fengbingchun/article/details/79433425

深度学习的实用层面: https://blog.csdn.net/fengbingchun/article/details/79773525

优化算法: https://blog.csdn.net/fengbingchun/article/details/79828816

超参数调试、Batch正则化和程序框架: https://blog.csdn.net/fengbingchun/article/details/79834758

构建机器学习项目(机器学习策略)(1): https://blog.csdn.net/fengbingchun/article/details/79942441

构建机器学习项目(机器学习策略)(2): https://blog.csdn.net/fengbingchun/article/details/79948264

卷积神经网络: https://blog.csdn.net/fengbingchun/article/details/80262495

深度卷积网络: https://blog.csdn.net/fengbingchun/article/details/80786455

目标检测: https://blog.csdn.net/fengbingchun/article/details/80867608

人脸识别: https://blog.csdn.net/fengbingchun/article/details/80904688

神经风格迁移(neural style transfer): https://blog.csdn.net/fengbingchun/article/details/80933394

循环神经网络: https://blog.csdn.net/fengbingchun/article/details/82778671

自然语言处理与词嵌入: https://blog.csdn.net/fengbingchun/article/details/82822015

序列模型和注意力机制: https://blog.csdn.net/fengbingchun/article/details/82829137

1.神经网络和深度学习

逻辑回归(Logistic Regression)是一个二分分类算法。逻辑回归的目标是最小化其预测与训练数据之间的误差。为了训练逻辑回归模型中的参数w和b,需要定义一个成本函数。

成本函数(cost function):它是针对整个训练集的。衡量参数w和b在整个训练集上的效果。

损失函数或误差函数(loss function or error function):它是针对单个训练样本进行定义的。可以用来衡量算法的效果,衡量预测输出值与实际值有多接近。

梯度下降法的核心是最小化成本函数。使用梯度下降法可以找到一个函数的局部极小值。

逻辑回归公式推导过程如下:

选择激活函数时的一些经验:不同层的激活函数可以不一样。如果输出层值是0或1,在做二元分类,可以选择sigmoid作为输出层的激活函数;其它层可以选择默认(不确定情况下)使用ReLU作为激活函数。使用ReLU作为激活函数一般比使用sigmoid或tanh在使用梯度下降法时学习速度会快很多。一般在深度学习中都需要使用非线性激活函数。唯一能用线性激活函数的地方通常也就只有输出层。    

深度学习中的权值w不能初始化为0,偏置b可以初始化为0.     

反向传播中的求导需要使用微积分的链式法则。

单隐含层神经网络公式推导如下:

多隐含层神经网络的推导步骤非常类似于单隐含层神经网络的步骤,只不过是多重复几遍。

逻辑回归是一个浅层模型(shadow model),或称单层神经网络;单隐含层神经网络是一个双层神经网络。当我们数神经网络有几层的时候,我们不能把输入层数进去,只算上隐含层和输出层的数量。

多隐含层神经网络公式,如下:

各层矩阵w,b维数的确定,如下:

深度神经网络(deep neural network)很好用的原因: 假如你在建一个人脸识别或人脸检测系统,深度神经网络所做的事就是:当你输入一张脸部的照片,然后你可以把深度神经网络的第1层当成一个特征检测器或边缘检测器,例如在第1层创建一个大概有20个隐层单元的深度神经网络,隐层单元就是下图的这些小方块,一个小方块就是一个隐层单元,它会去找这张照片里的垂直或水平边缘的方向等,即第1层去找这张照片的各个边缘;然后它可以把检测到的边缘组合成面部的不同部分,比如说,可能有一个神经元会去找眼睛的部分,另外还有别的在找鼻子的部分,然后把这些许多的边缘结合在一起,就可以开始检测人脸的不同部分;最后再把这些部分放在一起,比如鼻子、眼睛、下巴,就是识别或检测不同的人脸。你可以直觉上把这种神经网络的前几层当做检测简单的函数,比如边缘,之后把它们跟后几层结合在一起,那么总体上就能学习更多复杂的函数。边缘(edge)检测器其实相对来说都是针对照片中非常小块的面积;面部检测器就会针对于大一些的区域。一般的概念是,一般会从比较小的细节入手,比如边缘,然后在一步步到更大更复杂的区域,比如一只眼睛或是一个鼻子;再把眼睛鼻子装一块组成更复杂的部分。这种从简单到复杂的金字塔状表示方法或者组成方法,也可以应用在图像或者人脸识别以外的其它数据上。

参数和超参数(hyper parameters):参数包括各层的w和b。学习率α、梯度下降法中的迭代次数、隐含层数、各隐含层的单元数、激活函数的选择,这些都需要自己来设置,这些数字实际上控制了最终参数w和b的值。所以它们被称为超参数。因为这些超参数在某种程度上决定了最终得到的w和b。

2.改善深层神经网络

训练、验证和测试数据集(training、development and test sets):训练神经网络时,我们需要作出很多决策,如神经网络分多少层(layers)、每层含有多少个隐藏层单元(hidden units)、学习率(learning rates)、各层采用哪些激活函数(activation functions)等。开始一个新应用时,我们不可能从一开始就准确预测出这些信息和其它的超参数。实际上,应用型机器学习是一个高度迭代的过程。通常在项目启动时,我们会先有一个初步想法,比如构建一个含有特定层数(certain number of layers)、特定隐藏层单元数量、特定数据集的神经网络。然后编码并尝试运行这些代码。通过运行和实验,你得到该神经网络结果,告知你设置这些配置信息后的运行结果是怎样的。然后基于输出结果,重新完善你的想法、改变策略,或者为了找到更好的神经网络不断迭代更新自己的方案。

我们通常会把数据集分为三部分:一部分作为训练集(training set);一部分作为交叉验证集(hold-out cross validation set),有时也称为验证集(development set);一部分作为测试集(test set)。首先,对训练集执行训练算法,然后通过验证集选择最好的模型,最后在测试集上对选择的最终模型进行评估。为了无偏评估(unbiased estimate)算法的状态,在机器学习发展的小数据量时代,常见的做法是将数据集七三分,即70%作为训练集,30%作为测试集;如果有验证集,则60%作为训练集,20%作为验证集,20%作为测试集。如果数据集仅有100、1000或10000,按上述比例划分是非常合理的。但是在大数据时代,数据量可能是百万级别,或更大,那么验证集和测试集占数据总量的比例会趋向于变得更小。验证集的目的就是验证不同的算法,校验哪种算法更有效,因此验证集要足够大才能评估。通过验证集可以选择几种较好的算法,最后通过测试集选择最终的算法。测试集的主要目的是评估算法的效果。在训练模型时,要保证验证集和测试集的数据来自同一分布。有时没有测试集也是可以的,因为测试集的主要目的是对所选定的神经网络做出无偏评估(unbiased estimate)。如果不需要无偏评估也可以不设置测试集。在机器学习中,如果只有一个训练集和一个验证集而没有测试集,在这种情况下,人们经常将训练集称为训练集,而把验证集称为测试集。

偏差(bias)/方差(variance):高偏差我们称为欠拟合(underfitting),高方差称为过拟合(overfitting)。理解偏差和方差的两个关键是训练集误差(train set error)和验证集误差(development set error),如下图:

 通过查看训练集误差和验证集误差,我们便可以判断出现有算法是否具有高方差,高偏差。假设:(1)、训练集误差为1%,验证集误差为11%,此种情况属于高方差;(2)、训练集误差为15%,验证集误差为16%,此种情况属于高偏差;(3)、训练集误差为15%,验证集误差为30%,此种情况属于高偏差、高方差;(4)、训练集误差为0.5%,验证集误差为1%,此种情况正常,属于低偏差、低方差。注:以上假设的前提是:基于最优误差(optimal error)或贝叶斯误差(Bayes error)接近0%,即人眼辨别的错误率接近0%,且训练集和验证集数据来自相同分布。

当我们训练神经网络的时用到的基本方法(basic recipe)是判断算法偏差或方差是否偏高。初始模型训练完成后,我们首先要判断算法的偏差高不高,如果偏差过高,甚至无法拟合数据集,就需要试图选择(pick)一个新网络,比如含有更多隐藏层或者隐藏单元的网络,或者花费更多的时间来训练网络,或者尝试更先进(more advanced)的优化算法或者尝试其它不同的神经网络架构(neural network architectures)。一般采用更大规模的网络会有所帮助。反复尝试,直到拟合数据为止。一旦偏差降低到可接受的数值,然后检查方差是否正常。如果方差高,最好的解决办法是采用更多的数据。如果无法获得更多数据,我们也可以尝试通过正则化(regularization)来减少过拟合。有时为了能够找到更合适的神经网络架构,我们不得不反复尝试,直到找到一个低偏差和低方差的架构。

正则化(regularization):解决高方差(过度拟合)一般有两种方法,一个是正则化,一个是准备更多数据。正则化是一种非常实用的减少方差的方法。 

L1范数正则化、L2范数正则化。λ是正则化参数,通常用验证集来配置这个参数。L2范数正则化也被称为权重衰减(weight decay)。在神经网络中,L2范数一般被称为弗罗贝尼乌斯范数(frobenius norm),如下图:

Dropout正则化:直观上,dropout可以随机删除(knocking out)网络中的神经单元,好像每次迭代之后,神经网络都会变得比之前更小。dropout可以采用inverted dropout方法,其有一个参数为keep_prob,如果你担心某些层比其它层更容易发生过拟合,可以把某些层的keep_prob值设置的比其它层更低。也可以有些层应用dropout,而有些层不使用dropout。应用dropout,只含有一个超参即keep_prob。dropout的一大缺点就是成本函数J不再被明确定义,因为每次迭代都会随机移除一些节点。

其它几种减少神经网络过拟合的方法:(1)、训练数据扩增(dataaugmentation):水平翻转原有图像、随意裁剪原有图像、旋转并随机缩放原有图像等增加额外假(fake)训练数据,这样可以不用增加额外的花费,代价几乎为0。(2)、early stopping:提早停止训练神经网络,因为验证集误差通常会先呈下降趋势,然后在某个节点处开始上升,在此节点处停止训练神经网络。

加速训练的方法:归一化输入(normalize your inputs)。归一化输入需要两个步骤:第一:零均值化(subtract out or to zero out the mean);第二:归一化方差(normalizethe variances).

需要用同样的方法调整测试集,我们希望不论是在训练数据还是在测试数据都是通过相同的μ和σ2,其中μ和σ2是由训练集数据计算得来的。归一化输入的原因:应用梯度下降法,使学习算法运行的更快,可以更快地找到最小值,更容易优化.

梯度消失与梯度爆炸(vanishing/exploding gradients):当你训练深度网络时,导数或坡度(slope)有时会变得非常大或非常小,这加大了训练的难度,明智地选择随机初始化权重可以避免这个问题,即设置的权重矩阵,既不会增长过快,也不会太快下降到0.

梯度的数值逼近(numerical approximation of gradients):在实施back propagation时,有一个测试叫梯度校验(gradient checking),它的作用是确保back propagation正确实施,可以使用双边误差(two sided difference).

优化算法能够帮助你快速训练模型。

 mini-batch梯度下降法:把训练集分割(split)为小一点的子训练集,这些子集被叫做mini-batch。

batch梯度下降法指的是:同时处理整个训练集,只有处理完整个训练集才更新一次权值和偏置。并且预期每次迭代的成本都会下降,如果成本函数(cost function)J是迭代次数的一个函数,它应该会随着每次迭代而减少,如果J在某次迭代中增加了,那肯定在某处出现了问题。

mini-batch梯度下降法指的是:每次同时处理的是单个mini-batch,而不是同时处理整个训练集,每处理完单个子集时都会更新一次权值和偏置。但是与batch梯度下降法不同的是,如果成本函数(cost function)J是迭代次数的一个函数,则并不是每次迭代J都是下降的,它的趋势是向下,但是也带有更多的噪声;在mini-batch梯度下降法中,没有每次迭代J都是下降的也是可以的,但是走势应该是向下的

选择mini-batch的大小:假设m为整个训练集的大小。一种极端情况下,如果mini-batch的大小为m,其实就是batch梯度下降法。另一种极端情况下,如果mini-batch的大小为1,则叫做随机梯度下降法(stochastic gradient descent),每个样本都是一个独立的mini-batch。随机梯度下降法永远不会收敛,而是会一直在最小值附近波动,但是并不会在达到最下值时停留下来。实际中,mini-batch的大小应该在1和m之间选择,1太小而m太大。

如果训练集较少,直接使用batch梯度下降法,样本集较少就没必要使用mini-batch梯度下降法。一般说的少是指样本集总数小于2000.如果样本集数目较大的话,一般的mini-batch大小在64至512之间,如64、128、256、512。考虑到电脑内存布局和访问的方式,有时mini-batch的大小为2的n次方,code会运行的较快一些。

指数加权平均(exponentially weighted averages):关键公式vt=βvt-1+(1-β)θt。

偏差修正(bias correction):可以让平均数计算更加准确。如果你关心初始时期的偏差,在刚开始计算指数加权平均数的时候,偏差修正能帮助你在早期获得更好的估计。即用vt/(1-βt)= (βvt-1+(1-β)θt)/ (1-βt)替代之前vt=βvt-1+(1-β)θt,你会发现,随着t的增加,β的t次方将接近于0,所以当t很大的时候,偏差修正几乎没有作用。

动量梯度下降法(gradient descent with momentum):运行速度几乎总是快于标准的梯度下降算法。基本的想法就是计算梯度的指数加权平均并利用该梯度更新你的权值。在mini-batch或batch梯度下降法中,第t次迭代过程中,你会计算导数dw,db.

RMSprop(root mean square prop,均方根):也可以加速梯度下降。

Adam(Adaptive Moment Estimation):将momentum和RMSprop结合在一起。

Learning rate decay(学习率衰减):加快学习算法的一个办法就是随时间慢慢减少学习率,称之为学习率衰减。

Tuning process(调试处理):神经网络的调整会涉及到许多不同超参数的设置。需要调试的重要超参数一般包括:学习率、momentum、mini-batch size、隐藏单元(hidden units)、层数、学习率衰减。一般对于你要解决的问题而言,你很难提前知道哪个参数最重要。超参值的搜索过程可以随机取值和精确搜索,考虑使用由粗糙到精细的搜索过程。

超参数搜索过程:Re-test hyper parameters occasionally、Babysitting one model(计算机资源有限时)、Training many models in parallel。 

Batch Normalization(Batch 归一化):会使超参数搜索变得容易,使神经网络对超参数的选择更加稳定(robust),Batch归一化通常和训练集的mini-batch一起使用。

3. 结构化机器学习项目

查准率(precision):例如,在你的分类器标记为猫的例子中,有多少真的是猫,例如有95%的查准率,意味着分类器说这图有猫的时候,有95%的机会真是猫。

查全率(recall):对于所有真猫的图像,你的分类器正确识别出的百分比,实际为猫的图像中,有多少被系统识别出来。 

事实证明,查准率和查全率之间往往需要折衷,两个指标都要顾及到。用查准率和查全率来评估分类器是比较合理的。但如果仅有两个评估指标,很难去快速地选择出好的分类器。不推荐用两个评估指标查准率和查全率来选择一个分类器,需要找到一个新的评估指标,能够结合查准率和查全率。在机器学习文献中,结合查准率和查全率的标准方法是F1分数(F1 score),F1分数非正式地可以认为是查准率(P)和查全率(R)的平均值,正式地F1分数公式是:2/(1/P+1/R),在数学中,这个函数叫做the harmonic mean of precision P andrecall R。

Improving your model performance:想要让一个监督学习算法达到实用基本上希望或假设你可以完成两件事情:首先,你的算法对训练集的拟合很好,即做到低偏差;第二,在训练集上做的很好,然后推广到开发集和测试集也很好,即低方差。为了减少偏差,可使用的策略包括:训练更大的模型、训练时间更长一些;使用更好的优化算法,比如momentum、RMSProp;使用更好的算法,比如Adam;或者可以试试寻找更好的新神经网络架构,更好的超参数;改变激活函数,改变层数或隐藏单元数;试用其它模型或其它模型架构,如循环神经网络和卷积神经网络。为了减少方差,可使用的策略包括:收集更多数据去训练;尝试正则化,包括L2正则化和Dropout,数据增强;尝试不同的神经网络架构,超参数搜索。

进行误差分析:可进行人工统计或可同时并行评估几个想法。进行误差分析时,你应该找一组错误例子,可能在你的开发集里或者在你的测试集里,观察错误标记的例子,看看假阳性(false positives)和假阴性(false negatives),统计属于不同错误类型的错误数量。在这个过程中,你可能会得到启发,归纳出新的误差类型。总之,通过统计不同错误标记类型占总数的百分比可以帮你发现哪些问题需要优先解决或者给你构思新优化方向的灵感。

清楚标注错误的数据:对于训练集:事实证明,深度学习算法对于训练集中的随机误差是相当鲁棒的,只要你标记出错的样本离随机误差不太远,如果误差足够随机,那么放着这些误差不管可能也没问题而不要花太多时间修复它们。只要总数据集足够大,实际误差可能不会太高。深度学习算法对随机误差很鲁棒,但对系统性的错误就没那么鲁棒了,比如说,如果做标记的人一直把白色的狗标记成猫,那就成问题了,因为你的分类器学习之后,会把所有的白色的狗都分类成猫。如果担心开发集或测试集上标记出错的样本带来的影响,他们一般建议你在误差分析时,添加一个额外的列,这样你也可以统计标签Y错误的样本数。在开发集或测试集中,针对这些错误的标记,如果严重影响了你在开发集上评估算法的能力,那么你就应该去花时间修正错误的标签,但是如果它们没有严重影响到你用开发集评估成本偏差的能力,那么可能就不应该花宝贵的时间去处理。

建议看3个数字来确定是否值得去人工修正标记出错的数据:整体开发集误差;错误标记的数量或百分比;其它原因导致的错误。如果你要去修正开发集数据,这里有一些额外的方针和原则需要考虑:首先,不管用什么修正手段,都要同时作用到开发集和测试集上,因为开发集和测试集必须来自相同的分布。其次,你要考虑同时检验算法本应判断错误却判断正确的样本。

在不同分布上进行训练和测试:记住:设立开发集的目的是告诉你的团队去瞄准的目标。即开发集、测试集中要包含真实场景的样本。训练集可以包含一些非真实场景的样本。

迁移学习(transfer learning):神经网络可以从一个任务中学得知识并将这些知识应用到另一个独立的任务中,例如,也许你已经训练好一个能够识别像猫这样的对象的神经网络,然后使用那些知识,或者部分学习到的知识去帮助你更好地阅读x射线扫描图,这就是所谓的迁移学习。经验规则是,如果你有一个小数据集,就只训练输出层前的最后一层,或者是最后一两层,但是如果你有很多数据,那么也许你可以重新训练网络中的所有参数。这个在图像识别数据的初期训练阶段,有时称为预训练或微调(pre-trainingor fine tuning),因为你在用图像识别数据去预先初始化或者预训练神经网络的权重,然后更新所有的权重。迁移学习有效的原因:有很多低层次特征比如说边缘检测,曲线检测,阳性对象检测,从非常大的图像识别数据库中学得的这些能力可能有助于你的学习算法在放射科诊断中做的更好,算法学到了很多结构信息、图像形状的信息,其中一些知识可能会很有用。

 迁移学习什么时候是有意义的,如果你想从任务A学习并迁移一些知识到任务B,那么当任务A和任务B都有同样的输入x时,迁移是有意义的,如输入都是图像,或输入都是音频。当任务A的数据比任务B的数据多得多时,迁移学习意义更大。如果你觉得任务A的底层特征可以帮助任务B的学习,那迁移学习更有意义一些。

多任务学习:在迁移学习中,你的步骤是串行的,你从任务A中学到的,然后迁移到任务B。在多任务学习中,你是开始学习试图让一个神经网络同时做几件事情,然后希望这里的每个任务都能帮到其它所有任务。例如,在研发无人驾驶车辆,那么你的无人驾驶车可能需要同时检测不同的物体,比如检测行人、车辆、停车标志、交通灯等其它物体,输入图像x,输出将不是一个标签,而是四个标签,因为四个物体可能同时出现在一张图里。那么你现在可以做的是训练一个神经网络来预测这些y值。另外你也可以训练四个不同的神经网络,而不是训练一个神经网络做四件事,但神经网络一些早期特征在识别不同物体时都会用到,你会发现,训练一个神经网络做四件事会比训练四个完全独立的神经网络分别做四件事性能会更好,这就是多任务学习的力量

什么是端到端的深度学习:简而言之,以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理,端到端的深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它。事实证明,端到端深度学习的挑战之一是:需要大量数据才能让系统表现良好。当你的数据集较小的时候,传统流水线方法其实效果也不错,通常做的更好。端到端学习可以表现很好,也可以简化系统架构,让你不需要搭建那么多手工设计的单独组件,但并不是每次都能成功。

4. 卷积神经网络

神经网络的前几层可以检测边缘,然后后面几层可能检测到物体的部分,接下来靠后的一些层可能检测到完整的物体,如下图示例:

在卷积神经网络术语中,它被称为过滤器(filter),在论文中,有时它被称为核(kernel)而不是过滤器(filter)。卷积运算过程,如下图,用卷积运算实现垂直边缘检测:

通过使用不同的过滤器,可以找出垂直或水平的边缘。还有其它过滤器,如Sobel过滤器、Scharr过滤器。一般将垂直过滤器,顺时针翻转90度,就会得到水平过滤器。一般垂直过滤器,左边是正值,中间是0,右边是负值;而一般水平过滤器,上边是正值,中间是0,下边是负值。在深度学习中,你不一定要去使用研究者们推荐的这些过滤器,可以把矩阵中的这9个数字,当成9个参数,并且在之后可以学习使用反向传播算法,其目标就是理解这9个参数,通过反向传播,你可以学习另一种滤波器,这种滤波器对于数据的捕捉能力,甚至可以胜过之前任何的滤波器(单纯的水平边缘和垂直边缘),它可以检测出45度、75度或73度,甚至是任何角度的边缘。

Padding:有一个n*n的图像,用一个f*f的过滤器做卷积,那么输出的结果维即大小就是(n-f+1)*(n-f+1)。按照这种运算会有2个缺点:第一个缺点是每次做卷积操作,你的图像就会缩小,作了几次卷次操作,可能会缩小到1*1的大小;第二个缺点是,边角的像素,这个像素点只会被一个输出所触碰或者使用,但是如果在中间的像素点,就会有许多的区域与之重叠,所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息。为了解决这两个问题,你可以在卷积操作之前填充所处理的图像,可以沿着图像边缘,在填充一层像素,卷积后会得到和原始图像一样大小的图像。习惯上,你可以用0填充,如果p是填充的数量,那么输出就变成了(n+2p-f+1)*(n+2p-f+1)。

至于选择填充多少个像素,通常有两个选择,分别叫做Valid卷积和Same卷积。Valid卷积意味着不填充(no dapping),即p=0。Same卷积意味着填充后你的输入大小和输出大小是一样的,即p=(f-1)/2,习惯上,计算机视觉中,f通常是奇数。

卷积步长:如下图,假如输入图像为n*n,过滤器为f*f,padding为p,步长(stride)为s,则输出大小为((n+2p-f)/s+1)*((n+2p-f)/s+1)。如果商不是整数,我们向下取整,即floor函数,这个原则实现的方式是,你只在篮框完全包括在图像或填充完的图像内部时才对它进行运算。如果有任意一个蓝框移动到了外面,那么你就不要进行相乘操作,这是一个惯例:

Convolutions over volumes:在BGR图像上进行卷积操作,如下图,依次取过滤器这27个数,然后乘以相应的红、绿、蓝通道中的数字,然后把这些数加起来,就得到了输出的数。图像的通道数必须和过滤器的通道数一致。过滤器的参数选择不同,你就可以得到不同的特征检测器。按照计算机视觉的惯例,当你的输入有特定的高、宽和通道数时,你的过滤器可以有不同的高、不同的宽,但是必须有一样的通道数。理论上,我们的过滤器,只关注红色通道、或者只关注绿色通道是可行的:

Multiple filters: 如下图,可以同时使用两个过滤器,其中一个过滤器可能用来检测垂直边缘,另一个过滤器用来检测水平边缘,输出结果为4*4*2。如果你有一个n*n*nc的输入图,然后卷积上一个f*f*nc的过滤器,然后得到一个(n-f+1)*(n-f+1)*n’c的输出,其中n’c为过滤器的个数:

单层卷积网络:如下图,在6*6的BGR图像上进行卷积操作,有2个3*3*3的过滤器,通过卷积后产生2个4*4的结果,在此结果上加上偏差(bias),再应用非线性激活函数ReLU,再把两个结果矩阵堆叠起来,最终得到一个4*4*2的矩阵。这就是卷积神经网络的一层:

输出图像中的通道数量就是神经网络中这一层所使用的过滤器数量。过滤器中通道的数量必须与输入中通道的数量一致。每个过滤器都有一个偏差参数,它是一个实数。

一个典型的卷积网络通常有三种类型的层:一个是卷积层(Convolution),通常用Conv来标注;一个是池化层(Pooling),经常叫做POOL;还有一个是全连接层(Fully connected),用FC表示。虽然仅用卷积层也有可能构建出很好的神经网络,但大部分神经网络架构师依然会添加池化层和全连接层。一般池化层和全连接层比卷积层更容易设计.

池化层:除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。池化类型有最大池化(max pooling),如下图所示,在此例中,filter的大小为2,stride位2 ,这两个是最大池化的超参。最大池化运算的实际作用就是:如果在过滤器中提取到某个特征,那么保留其最大值;如果没有提取到某个特征,可能不存在这个特征,那么其中的最大值也还是很小:

计算卷积层输出大小的公式同样适用于最大池化:((n+2p-f)/s)+1,这个公式也可以计算最大池化的输出大小。计算最大池化的方法就是分别对每个通道执行相同的计算过程,nc个通道中每个通道都单独执行最大池化运算。 

平均池化:另外一种类型的池化,它不太常用,选取的不是每个过滤器的最大值,而是平均值。

池化的超级参数包括过滤器大小(filter size)和步长(stride)。其中f=2,s=2应该频率比较高,其效果相当于高度和宽度缩减一半。你也可以根据自己的意愿增加表示padding的其它超级参数,但是很少这么用。最大池化时,往往很少用到超级参数padding,当然也有例外情况。最大池化的输入是nh*nw*nc,假设没有padding,输出为((nh-f/s)+1)*((nw-f/s)+1)*nc。需要注意的一点是,池化过程中没有需要学习的参数。反向传播没有参数适用于最大池化。最大池化只是计算神经网络某一层的静态属性。

卷积神经网络示例:假设有一张32*32*3的输入图像,如下图所示,用于手写体数字识别,想识别它是从0到9这10个数字中的哪一个。让我们来构建一个神经网络来实现这个功能。此网络结构和LeNet-5非常相似。假设第一层使用filter大小为5*5,stride为1,padding为0,filter的个数是6,那么输出为28*28*6,将这层标记为CONV1,它有6个filter,增加了bias,应用了非线性函数(激活函数),可能是ReLU,最后输出CONV1的结果。然后构建一个池化层,选用最大池化,超参f=2,s=2,padding=0,最终输出为14*14*6,将这层标记为POOL1。在卷积网络文献中,卷积有两种分类,一类卷积是一个卷积层和一个池化层一起作为一层;另一类卷积是把卷积层作为一层,而池化层单独作为一层。人们在计算神经网络有多少层时,通常只是统计具有权重和参数的层,因此池化层没有权重和参数,只有一些超级参数。这里采用的是把CONV1和POOL1共同作为一个卷积,并标记为Layer1。接着在构建一个卷积层,filter为5*5,stride为1,padding为0,使用16个filter,输出一个10*10*16的矩阵,标记为CONV2,然后最大池化,f=2,s=2,输出为5*5*16的矩阵,标记为POOL2,这是Layer2。现在将POOL2平整化为一个大小为400(即5*5*16)的一维向量。然后利用这400个单元构建下一层。下一层有120个单元,这是第一个全连接层,标记为FC3,此连接层的权重W[3]为(120,400),b[3]为(120,1)。接着再添加一个全连接层,有84个单元,标记为FC4。最后用这84个单元填充一个softmax单元,这个softmax会有10个输出:

在神经网络中,另一种常见模式就是一个或多个卷积层后跟随一个池化层,然后一个或多个卷积层后再跟一个池化层,然后是几个全连接层,最后是一个softmax。

Why convolutions:和只用全连接层相比,卷积层的两个主要优势在于:参数共享(parameter sharing)和稀疏连接(sparsity of connections)。

Why look at case studies?:过去几年,计算机视觉研究中的大量研究都集中在如何把卷积层、池化层以及全连接层这些基本构件组合起来形成有效的卷积神经网络。找感觉最好的方法之一就是去看一些案例,就像很多人通过看别人的代码来学习编程一样。实际上,在计算机视觉中表现良好的神经网络框架往往也适用于其它任务。也就是说,如果有人已经训练或者计算出擅长识别猫、狗、人的神经网络或者神经网络框架,而你的计算机视觉任务是构建一个自动驾驶汽车,你完全可以借鉴别人的神经网络框架来解决自己的问题。经典网络(classic networks)包括:LeNet-5、AlexNet、VGG、ResNet又称残差网络是一个152层的神经网络、Inception。

残差网络(Residual Networks, ResNets):非常非常深的网络是很难训练的,因为存在梯度消失和梯度爆炸问题。跳远连接(skip connections),它可从某一网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。我们可以利用跳远连接构建ResNets,它使我们可以训练非常深的网络,有时深度能够超过100层。ResNets是由残差块(residual block)构建的。所谓残差块,如下图所示,这是一个两层神经网络,在L层进行激活,得到a[l+1],再次进行激活得到a[l+2]。计算过程从a[l]开始,首先进行线性激活得到z[l+1],然后通过ReLU非线性激活得到a[l+1];接着再次进行线性激活得到z[l+2],最后通过ReLU非线性激活得到a[l+2]。换句话说,信息流从a[l]到a[l+2],需要经过以上所有步骤。在残差网络中有一点变化,我们将a[l]直接快进拷贝到神经网络的深层,在应用ReLU非线性激活前加上a[l],这是一条捷径(shortcut),a[l]的信息直接到达神经网络的深层,不再沿着主路径传递,等式a[l+2]=g(z[l+2])变为a[l+2]=g(z[l+2]+a[l]),也就是加上的这个a[l]产生了一个残差块。a[l]插入的时机是在线性激活之后ReLU激活之前。有时候,除了shartcut,还有另一个术语”跳远连接(skip connection)”,就是指a[l]跳过一层或者好几层,从而将信息传递到神经网络的更深层。使用残差块能够训练更深的神经网络。所以构建一个ResNet网络就是通过将很多这样的残差块堆积在一起形成一个深度神经网络。

Residual Network:如下图,原始是一个普通网络(plain network),把它变成ResNet的方法是加上所有跳远连接,每两层增加一个捷径,构成一个残差块。5个残差块连接在一起,构成一个残差网络。如果我们使用标准优化算法训练一个普通网络,比如梯度下降等其它热门优化算法,如果没有多余的残差,凭经验,你会发现随着网络深度的加深,训练误差会先减少然后增多;而理论上,随着网络深度的加深,应该训练得越来越好才对,也就是说,理论上网络深度越深越好,但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。而实际上,随着网络深度的加深,训练误差会越来越多。但是有了ResNets就不一样了,即使网络再深,训练误差也会减少,就算训练深达100层的网络也不例外。

谷歌Inception网络简介:Inception网络的作用就是用来确定在构建卷积层时该如何决定filter的大小及要不要添加pooling层。如下图,输入层为28*28*192,而Inception网络或Inception层的作用就是代替人工确定卷积层中的filtersize,或确定是否需要创建卷积层或池化层。如果使用1*1filter做卷积,假设输出为28*28*64;如果使用3*3的filter,输出是28*28*128;然后把第二个输出值堆积到第一个输出值上;如果使用5*5的filter,输出是28*28*32;如果使用池化操作,这里池化后输出是28*28*32;依次把上面这些输出堆积起来。有了这样的Inception模块,你就可以输入某个量,作为输出,它累加了所有数字,这里的最终输出为32+32+128+64=256。Inception模块的输入为28*28*129,输出为28*28*256.这就是Inception网络的核心内容。基本思想是Inception网络不需要人为决定使用哪个filter,或者是否需要pooling,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连起来,让网络自己学习它需要什么样的参数,采用哪些filter组合。

迁移学习:如果你要做一个计算机视觉的应用,相比于从头训练权重,或者说从随机初始化权重开始,不如你下载别人已训练好的网络结构的权重,你通常能够进展的相当快。用这个作为预训练,然后转换到你感兴趣的任务上。计算机视觉的研究社区,非常喜欢把许多数据集上传到网上,比如ImageNet,MS COCO或者Pascal类型的数据集。你可以下载花费了别人几周甚至几个月而做出来的开源的权重参数,把它当作一个很好的初始化用在自己的神经网络上。用迁移学习把公共的数据集的知识迁移到你自己的问题上。如下图,假如说你要建立一个猫的检测器用来检测你自己的宠物猫,Tigger,Misty或者Neither,忽略两只猫同时出现在一种图的情况。你现在可能没有Tigger和Misty的大量图像,所以你的训练集会很小。此时可以从网上下载一些神经网络的开源实现,不仅把代码下载下来也要把权重(weights)下载下来。有许多训练好的网络你都可以下载,例如ImageNet,它有1000个不同的类别,因此这个网络会有一个Softmax单元,它可以输出1000个可能类别之一。你可以去掉这个Softmax层,创建你自己的Softmax单元用来输出Tigger,Misty,Neither三个类别。就网络而言,建议你把所有的层都看作是冻结的(frozen)。你冻结的网络中包含所有层的参数,你只需要训练和你的Softmax层有关的参数。这个Softmax层有三个可能的输出。通过使用其他人预训练的权重,你很可能得到很好的性能,即使只有一个小的数据集。幸运的是,大多数深度学习框架都支持这种操作,事实上,取决于用的框架。如果你的数据越多,你可以冻结越少的层,训练越多的层。这个理念就是,如果你有一个更大的训练集,也许有足够多的数据,那么不要单单训练一个Softmax单元,而是考虑训练中等大小的网络,包含你最终要用的网络的后面几层。最后,如果你有大量数据,你应该做的就是用开源的网络和它的权重把整个当作初始化然后训练整个网络.

数据增强(data augmentation):大部分的计算机视觉任务使用很多的数据,数据增强是经常使用的一种技巧来提高计算机视觉系统的表现。在当下,计算机视觉的主要问题是没有办法得到充足的数据。计算机视觉中常见的数据增强方法: (1)、垂直镜像对称(mirroring on the vertical axis);(2)、随机裁剪(random cropping)。理论上,你还可以使用旋转(rotation)、剪切(shearing)、局部扭曲(local warping)。第二种经常使用的方法是色彩转换(color shifting),如给R、G、B三通道加上不同的失真值(different distorition)。对R、G、B有不同的采样方式,其中一种影响颜色扭曲的算法叫PCA即主成分分析,有时候被称作PCA颜色增强.

目标定位:如下图,图像分类任务就是算法遍历图像,判断其中的对象是不是car。图像定位分类(classification with localization)不仅要用算法判断图像中的是不是car,还要在图像中标记出car的位置。图像分类的思路可以帮助学习分类定位,而对象定位的思路又有助于学习对象检测。如果想定位图像中car的位置,除了让神经网络输出softmax类预测分类外,还可以让神经网络多输出几个单元即输出一个边界框(bounding box),标记为bx,by,bh,bw,这四个数字是被检测对象的边界框的参数化表示.

 Landmark detection:利用神经网络进行对象定位,即通过输出四个参数值bx,by,bh,bw,给出图像中对象的边界框。神经网络可以通过输出图像中特征点(landmarks)的坐标来实现对目标特征的识别。如下图,选定人脸的64个landmarks,并生成包含这些landmarks的标签训练集,然后利用神经网络输出脸部关键landmarks的位置。批量添加神经网络的输出单元,用以输出要识别的各个landmarks的坐标值.

Object detection:如下图,假设你想构建一个car检测算法,步骤是:首先是创建一个标签(label)训练集,X和Y表示适当剪切的car图像样本。在训练集上,你一开始可以使用适当剪切的图像,就是整张图像X几乎都被汽车占据。有了训练集,就可以开始训练卷积网络了。输入这些适当剪切过的图像,卷积网络输出Y,0或1表示图像中有car或没有car.

训练完这个卷积网络,就可以用它来实现滑动窗口目标检测,如下图。具体步骤如下:假设这是一张测试图像,首先选定一个特定大小的窗口,将这个红色小方块输入卷积网络,卷积网络开始进行预测,即判断红色方框内有没有汽车,滑动窗口目标检测算法接下来会继续处理第二个图像,即红色方框稍向右滑动之后的区域,并输入给卷积网络,因此输入给卷积网络的只是红色方框内的区域,再次运行卷积网络,然后处理第三个图像,依次重复操作,直到这个窗口滑过图像的每一个位置,把这些剪切后的小图像输入卷积网络,对每个位置按0或1进行分类,这就是所谓的图像滑动窗口操作。也可以选择一个更大的窗口,截取更大的区域并输入给卷积网络处理。你可以根据卷积网络对输入大小的要求调整这个区域。以上是以固定步幅滑动窗口,遍历整幅图像输出结果。这样做,不论car在图像中的什么位置,总有一个窗口可以检测到它。滑动窗口目标检测算法也有明显的缺点就是计算成本,因为你在图像中剪切出太多小方块,卷积网络要一个个处理。如果你选用的步幅很大,显然会减少输入卷积网络的窗口个数,但是粗粒度可能会影响性能,反之,如果采用小粒度或小步幅,传递给卷积网络的小窗口会特别多,这意味着超高的计算成本.

Convolutional implementation of sliding windows:为了构建滑动窗口的卷积应用,首先要知道如何将神经网络的全连接层转化成卷积层。如下图,假设对象检测算法输入一个14*14*3的图像,使用16个filter,大小为5*5,在filter处理后输出为10*10*16,然后通过2*2的最大池化(pooling)操作使图像减少到5*5*16,然后添加一个连接400个单元的全连接层,接着再添加一个全连接层,最终通过softmax输出Y,用4个数字来表示Y,这四个分类可以是人、car、背景或其它对象。如何把这些全连接层转化为卷积层?针对第一个全连接层,我们可以用5*5的filter来实现,数量是400个,输出是1*1*400。再添加另外一个卷积层,filter的大小是1*1,数量是400。最后经由1*1的filter的处理得到一个softmax激活值.

通过卷积实现滑动窗口对象检测算法,如下图,假设向滑动窗口卷积网络输入14*14*3的图像。测试集图像是16*16*3,在最初的滑动窗口算法中,你会把这片蓝色区域输入卷积网络,生成1或0分类,接着滑动窗口,步幅为2个像素,向右滑动2个像素,将这个绿框区域输入给卷积网络,运行整个卷积网络,得到另外一个标签0或1,依次将其它框输入卷积网络。我们在这个16*16*3的图像上滑动窗口,卷积网络运行了4次,于是输出了4个标签(labels)。结果发现,这4次卷积操作中的很多计算都是重复的。滑动窗口的卷积应用,使得卷积网络在这4次操作过程中很多计算都是重复的。如果直接将这个16*16*3的图像输入网络,输出是2*2*4,而不是1*1*4。所以该卷积操作的原理是我们不需要把输入图像分割成4个子集分别执行前向操作,而是把它们作为一张图像输入给卷积网络进行计算,其中的公有区域可以共享很多计算。假如对一个28*28*3的图像应用滑动窗口操作,如果以同样的方式运行前向操作(forward prop),最后得到8*8*4的结果。我们可以对大小为28*28*3的整张图像进行卷积操作,一次得到所有预测值,如果足够幸运,神经网络便可以识别出car的位置。这个算法存在一个缺点就是边界框的位置可能不够准确.

Bounding box predictions:在滑动窗口中,你取离散的位置集合,然后在它们上面跑分类器,在这种情况下,这些边界框,没有一个能完美匹配car位置。其中一个能得到更精准的边界框的算法是YOLO算法。YOLO意思是你只看一次。如下图,大体描述为:比如你的输入图像是100*100的,然后再图像上放一个网格,假如用3*3的网格,将图像分类和定位算法应用到9个格子上,需要这样定义训练标签,对于9个格子中的每一个指定一个标签y,每个格子都有一个这样的向量[pc,bx,by,bh,bw,c1,c2,c3],YOLO算法的做法是取car的中点,然后将这个car分配给包含对象中点的格子。目标输出是3*3*8,因为这里有3*3格子,然后对于每个格子,你都有一个8维向量y。把car分配到一个格子的过程是观察car的中点,然后将这个car分配到其中点所在的格子,所以即使car可以横跨多个格子,也只会被分配到9个格子其中之一。LOYO算法可以达到实时识别.

Intersection over union(交并比):如何判断对象检测算法是working well,可以通过交并比函数(intersection over union, IoU),如下图,如果实际边界框是红色框,你的算法给出的是紫色的边界框,交并比函数做的是计算两个边界框交集和并集之比。一般约定,在计算机检测任务中,如果IoU大于或等于0.5就说检测正确,一般约定0.5是阈值,但是也可以根据实际需求定义更大的阈值.

Non-max suppression(非极大值抑制):你的算法可能对同一个对象作出多次检测,非最大值抑制可以确保你的算法对每个对象只检测一次。如下图,假如是一个19*19的格子,因为要在361个格子上都跑一次图像检测和定位算法,那么很多格子有车的概率都会很高,非最大值抑制就是清理这些检测结果。这个算法做的是,首先看看每次每个检测结果的概率pc,首先找概率最大的那个,如0.9,非最大值抑制就会逐一审视剩下的矩形,即和这个最大的边界框有很高交并比,高度重叠的其它边界框,那么这些输出就会被抑制,如0.6,0.7,变暗。接下来逐一审视剩下的矩形,找出概率最高的一个0.8,我们认为,这里也检测出一辆车,然后非最大值抑制算法就会去掉其它IoU值很高的矩形。所以,现在每个矩形都会被高亮显示或者变暗,如果你直接抛弃那些变暗的矩形,那就剩下高亮显示的那些,这就是最后得到的两个检测结果。非最大值意味着你只输出概率最大的分类结果。执行过程:首先这个19*19的网格上跑一遍算法,加入只有car检测,你会得到19*19*5的输出尺寸,[ pc,bx,by,bh,bw],接下来为了应用最大值抑制算法,我们对所有的边界框进行预测,需要先去掉比如pc<0.6的边界框,即算法认为这里存在car的概率至少为0.6,否则就抛弃。这就抛弃了所有概率比较低的输出边界框。接下来剩下的边界框,一直选择概率pc最高的边界框,然后把它输出成预测结果。接下来,抛弃所有剩下的边界框和这个边界框有很高交并比的边界框。接下来重复以上操作,把没处理的边界框都处理完.

 Anchor boxes:如果你想让一个格子检测出多个对象,你可以使用Anchorboxes。如下图,3*3的格子,其中行人的中点和car的中点几乎在同一个地方,两者都落入到同一个格子中。Anchor boxes思路:预先定义两个不同形状的anchor box,把预测结果和这两个anchor box关联起来。一般来说,你可能会用更多的anchor box。接下来,你需要定义cost label,不是之前的向量的8个输出,而是16个输出,即3*3*16。如果一个格子中有三个对象或者两个对象都分配到一个格子中,算法对这两种情况处理不好,需要引入一些默认手段专门处理这种情况。

什么是神经风格迁移(neural style transfer):如下图,Content为原始拍摄的图像,Style为一种风格图像。如果用Style来重新创造Content照片,神经风格迁移可以帮你生成Generated图像.

5. 序列模型

Why sequence models?:序列数据例子,如下图:(1).语音识别(speech recognition):给定一个输入音频片段X,并要求输出片段对应的文字记录Y,这里输入和输出都是序列数据(sequence data)。因为X是按时序播放的音频片段,输出Y是一系列单词。(2). 音乐生成(music generation):只有输出数据Y是序列;输入数据可以是空集,也可以是单一的整数,这个数可能指代你想要生成的音乐风格,也可能是你想要生成的那首曲子的头几个音符。无论怎样,输入X可以是空的或者就是某个数字,然输入Y是一个序列。(3). 情感分类(sentiment classification):输入数据X是序列。(4). DNA序列分析(DNA sequence analysis);(5). 机器翻译(machine translation);(6).视频行为识别(video activity recognition);(7). 命名实体识别(name entity recognition):可能会给出一个句子,要求识别出句中的人名。所有这些问题都可以被称作使用标签数据(X,Y)作为训练集的监督学习。序列问题可以有很多不同的类型,有些问题里输入X和输出数据Y都是序列,但是X和Y有时也会有不一样的长度。在一些问题里,只有X或Y是序列.

符号(Notation):使用x<t>来索引序列中的位置,t意味着它们是时序序列;使用Tx来表示输入序列的长度;使用Ty来表示输出序列的长度;Tx和Ty可以有不同的长度;x(i)<t>来表示训练样本i的输入序列中第t个元素;Tx(i)来表示第i个训练样本的输入序列长度;y(i)<t>来表示训练样本i的输出序列中第t个元素;Ty(i)来表示第i个训练样本的输出序列长度。

自然语言处理(Natural Language Processing, NLP)怎样表示一个序列里单独的单词,如下图:想要表示一个句子里的单词,第一件事是做一张词表,有时也称为词典(dictionary),意思是列一列你的表示方法中要用到的单词,如第一个单词是a,第二个单词是aaron,等等,用了10000个单词大小的词典。一般常见的词典大小为30000到50000,有的也会用百万词典。接下来你可以用one-hot表示法来表示词典里的每个单词,x<t>指代句子里的任意词,它就是个one-hot向量,是因为只有一个值是1,其余值都是0.

循环神经网络,如下图:假如你从左往右的顺序读句子,第一个单词假如是x<1>,将第一个词输入一个神经网络层,然后尝试预测输出y<1>,判断这是否是人名的一部分。循环神经网络做的是,当它读到句中的第二单词时,假如是x<2>,它不是仅用x<2>就预测出y<2>,它也会输入一些来自时间步(time-step)1的信息。具体而言,时间步1的激活值就会传递到时间步2。然后,在下一个时间步,循环神经网络输入单词x<3>,然后它尝试输出预测结果y<3>,等等。一直到最后一个时间步,输入x<Tx>,然后输出y<Ty>.在这个例子中Tx=Ty,如果Tx!=Ty那么这个网络结构需要作出一些改变。在每一个时间步中,循环神经网络传递一个激活值到下一个时间步中用于计算。要开始整个流程,我们在零时刻,需要编造一个激活值,这通常是零向量。也有些研究员会随机用其它方法初始化a<0>,不过使用零向量作为零时刻的伪激活值是最常见的选择。循环神经网络的画法一般有两种,一种是分步画法,一种是图表画法。循环神经网络是从左向右扫描数据,同时每个时间步的参数也是共享的。我们用wax来表示从x<1>到隐藏层的连接,每个时间步使用的都是相同的参数Wax,而激活值也就是水平连接是由参数waa决定的,同时每一个时间步都使用相同的参数waa,同样的,输出结果由wya决定。在这个循环神经网络中,它的意思是在预测y<3>时,不就要使用x<3>的信息,还要使用来自x<1>和x<2>的信息。因为来自x<1>的信息可以通过这样的路径来帮助预测y<3>。这个循环神经网络的一个缺点就是,它只使用了这个序列中之前的信息来做出预测,尤其,当预测y<3>时它没有用到x<4>,x<5>,x<6>等等的信息,所以这就有一个问题。所以这个特定的神经网络结构的一个限制是它在某一个时刻的预测仅使用了从序列中之前的输入信息并没有使用序列中后部分的信息。双向循环神经网络(BRNN)可以处理这个问题。

不同类型的循环神经网络:如下图,(1). 多对多结构(many-to-many architecture):因为输入序列有很多的输入而输出序列也有很多输出。(2). 多对一结构(many-to-one architecture):因为它有很多的输入,然后输出一个数字。(3). 一对一结构(one-to-one architecture):类似于一个小型的标准的神经网络,输入x然后得到输出y。(4). 一对多结构:如音乐生成。多对多结构可以是输入和输出长度是不同的,如机器翻译.

Gated Recurrent Unit(GRU,门控循环单元):GRU改变了RNN的隐藏层,使其可以更好地捕捉深层连接并改善了梯度消失问题.

LSTM(long short term memory) unit:LSTM有时比GRU更有效。LSTM比GRU出现的早。GRU的优点是模型更加简单,更容易创建一个更大的网络,它只有两个门,在计算性上,也运行的更快,它可以扩大模型的规模。但是LSTM更加强大和灵活,它有三个门而不是两个。GRU和LSTM的主要公式如下图:

Bidirectional(双向) RNN:这个模型可以让你序列的某点处不仅可以获取之前的信息还可以获取未来的信息。如下图,给定一个输入序列x<1>到x<4>,这个序列首先计算前向的a<1>,然后计算前向的a<2>,接着a<3>,a<4>。而反向序列,从a<4>开始,反向进行,计算反向的a<3>,计算完了反向的a<3>后可以用这些激活值计算反向的a<2>, 然后是反向的a<1>.把所有的这些激活值都计算完了,就可以预测计算结果了。比如时间步3的预测结果,信息从x<1>过来,流经前向的a<1>到前向的a<2>,到前向的a<3>,再到y<3>,所以从x<1>,x<2>,x<3>来的信息都会考虑在内。而从x<4>来的信息,会流过反向的a<4>,到反向的a<3>再到y<3>,这样使得时间步3的预测结果不仅输入了过去的信息还有现在的信息。这一步涉及了前向和反向的传播信息以及未来的信息。这就是双向循环神经网络,并且这些基本单元不仅仅是标准的RNN单元也可以是GRU单元或LSTM单元。这个双向RNN网络模型的缺点是你需要完整的数据的序列你才能预测任意位置。比如说,你要构建一个语音识别系统,那么双向RNN模型需要你考虑整个语音表达,但是如果直接用这个去实现的话,你需要等待这个人说完,然后获取整个语音表达才能处理这段语音并进一步做语音识别.

Word representation:词嵌入(word embedding),是语言表示的一种方式,可以让算法自动理解一些类似的词比如男人、女人,国王、王后等。通过词嵌入的概念,即使你的模型标记的训练集相对较小,也可以构建NLP(自然语言处理)应用。词表示(word representation)的一个缺点是它把每个词孤立起来,这样使得算法对相关词的泛化能力不强,任何两个one-hot向量的内积都是0.

如果我们不用one-hot表示而是用特征化表示(featurized representation)来表示每个词,如下图,比如可以用gender, royal, age, food, size, cost等有300个不同的特征,这样对于不同的单词算法会泛化的更好。这种高维特征的表示能够比one-hot更好的表示不同的单词:

基础模型:比如你想通过输入一个法语句子来将它翻译成一个英语句子,如下图,seq2seq模型,用x<1>一直到x<5>来表示输入句子的单词,然后我们用y<1>到y<6>来表示输出的句子的单词,如何训练一个新的网络,来输入序列x和输出序列y,这里有一些方法。首先,我们先建立一个网络,这个网络叫做编码网络,它是一个RNN的结构,RNN的单元可以是GRU,也可以是LSTM,每次只向该网络中输入一个法语单词,将输入序列接收完毕后,这个RNN网络会输出一个向量来代表这个输入序列。之后,你可以建立一个解码网络,它以编码网络的输出作为输入,之后它可以被训练为每次输出一个翻译后的单词,一直到它输出序列的结尾或者句子的结尾标记,这个解码网络的工作就结束了.

图像描述(image captioning):如下图,给出一张图片,比如这张猫的图片,它能自动地输出该图片的描述,一只猫坐在椅子上。如何训练出这样的网络通过输出图像来输出描述?方法如下:将图片输入到卷积神经网络中,比如一个预训练的AlexNet结构,然后让其学习图片的编码,或者学习图片的一系列特征,如果去掉最后的softmax单元,这个预训练的AlexNet结构会输出一个4096维的特征向量,向量表示的是这张图片的描述,所以这个预训练网络可以是图像的编码网络,接着你可以把这个向量输入到RNN中,RNN要做的就是生成图像的描述,每次生成一个单词,让网络输出序列或者说一个一个地输出单词序列.

Attention model intuition: 如下图,注意力模型(attention model)非常适用于机器翻译中的长句子。对于长句子,人工会一边读一边翻译,在神经网络中记忆非常长句子是非常困难的。注意力模型翻译的很像人类一次翻译句子的一部分。注意力模型会计算注意力权重,图中α表示注意力权重.

GitHubhttps://github.com/fengbingchun/NN_Test  

猜你喜欢

转载自blog.csdn.net/fengbingchun/article/details/82890599