理解一:
DNN可以理解为有很多隐藏层的神经网络。这个很多其实也没有什么度量标准, 多层神经网络和深度神经网络DNN其实也是指的一个东西,当然,DNN有时也叫做多层感知机(Multi-Layer perceptron,MLP)。我们讲到的神经网络都默认为DNN。层与层之间是全连接的,也就是说,第i层的任意一个神经元一定与第i+1层的任意一个神经元相连。结构图如下所示。
理解二:
从dnn、cnn关系角度(广义)
dnn是deep neural networks的意思,深度神经网路。cnn是convolutional neural networks,卷积神经网络。前者包含后者。前者是一个宽泛的概念,大概就是深度学习的意思,可以指RNN, CNN, DBN等等。后者CNN主要是做视觉图像的。即:dnn主要侧重deep,并没有正式的定义说基本组成就只能是全连接。
全卷积网络(full convolutional network,FCN)是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。FCN对图像进行像素级的分类,从而解决了语义级别的图像分割问题。与经典的CNN在卷积层使用全连接层得到固定长度的特征向量进行分类不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷基层的特征图(feature map)进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后奇偶在上采样的特征图进行像素的分类。
FCN将传统CNN中的全连接层转化成一个个的卷积层。如下图所示,在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个类别的概率。FCN将这3层表示为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,7,7)、(4096,1,1)、(1000,1,1)。所有的层都是卷积层,故称为全卷积网络。
简单的说,FCN与CNN的区别在于FCN把CNN最后的全连接层换成卷积层,输出一张已经label好的图。
原文链接:https://blog.csdn.net/qq_36269513/article/details/80420363
CNN(Convolutional Nueral Network,卷积神经网络)是一个在输人和输出之间至少有一层(tf.nn.conv2d)由可学习的卷积核产生输出的神经网络。使用卷积核对输人层(张量)的每个点进行卷积。通过在输入张量上滑动(卷积)来生成一个卷积后的输出。卷积核又称滤波器、内核或者张量;卷积后输出的激活图又称特征图;对于每一层有几个卷积核卷积就有几个对应的激活图。CNN由卷积层、池化层(子采样层、降采样层)、全连接层组成,可以避免前期对图像的复杂预处理。
循环神经网络(Recurent Neural Network, RNN),又称递归神经网络,源自1982 年John Hopfield提出的霍普菲尔德网络。霍普菲尔德网络因为实现困难,因而在其被提出时并没有被合适地应用。该网络的结构也于1986 年后被全连接神经网络以及一些传统的机器学习算法所取代。
传统的机器学习算法非常依赖于人工提取的特征,使得基于传统机器学习的图像识别、语音识别以及自然语言处理等问题存在特征提取的瓶颈。而基于全连接神经网络的方法也存在参数太多、无法利用数据中的时间序列信息等问题。随着更加有效的循环神经网络结构被不断提出,循环神经网络的挖掘数据中时序信息和语义信息的深度表达能力被充分利用,并在语音识别、语言模型、机器翻译以及时序分析等方面实现了突破。
循环神经网络是一种将节点定向连接成环的人工神经网络,其内部状态可以展示动态时序行为。在之前介绍的全连接神经网络或卷积神经网络模型中,网络结构都是从输入层到隐藏层再到输出层,层与层之间是全连接或部分连接的,但每层之间的节点是无连接的。RNN对序列中的每个元素重复同样的处理,输出依赖于前面的计算。RNN可以看作是储存了到目前为止已计算信息的存储器。隐藏层仅有循环体(一个循环体包括很多中间层)和全连接层。
在时刻t,状态St浓缩了前面序列x0,x1,x2, . xt-1的信息,用来作为输出Ot的参考。由于序列长度可以无限长,维度有限的s状态不可能将序列的全部信息都保存下来,因此模型必须学习只保留与后面任务Ot, Ot+1,…相关的最重要的信息,如上图所示。
注意:虽然RNN理论上支持无限长序列,但是实际训练过程中,如果序列过长, 一方面会导致训练时出现梯度消失和梯度爆炸的问题;另一方面,展开后的循环神经网络会古用过大的内存。所以, 实际中会规定一个最大长度, 当序列长度超过规定长度后会对序列进行截断。
在上图中,循环神经网络对长度为N的序列展开后,可以视为一个有N个中间层的前馈神经网络。这个前馈神经网络没有循环链接,因此可以直接使用反向传播算法(BP算法)进行训练,而不需要其他特别的优化算法。这样的训练方法称为“沿时间反向传播算法”( Back Propagation Trough Time,BPTT),它是训练循环神经网络最常见的方法。RNN除了BPTT外,还有正常的BP。
对于一个序列数据,可以将这个序列上不同时刻的数据依次传入循环神经网络的输入层:而输出既可以是对序列下一时刻的预测,也可以是对当前时刻信息的处理结果。循环神经网络要求每一时刻都有一个输入,但是不一定每个时刻都需要有输出。
网络在t时刻接收到输入xt之后,隐藏层的值是St输出值是Ot。St的值不仅仅取决于xt,还取决于St-1。可以用下面的公式来表示循环神经网络的计算方法:
Ot= g(VSt)
上式是输出层的计算公式,输出层是一个全连接层,也就是它的每个节点都和隐藏层的每个节点相连。其中V是输出层的权重矩阵,g是激活函数。
St=f(Uxt +WSt-1)
上式是隐藏层的计算公式,它是循环层。其中U是输入x的权重矩阵,W是上一次的值St-1作为这一次的输入的权重矩阵, f是激活函数。
从上面两个公式可以看出,循环层和全连接层的区别就是循环层多了一个权重矩阵W。
循环体状态与最终输出的维度通常不同,因此为了将当前时刻的状态转化为最终的输出,循环神经网络还需要另外一个全连接神经网络来完成这个过程。这和卷积神经网络中最后的全连接层的意义是一样的。
如果当前预测位置和相关信息之间的间隔不断增大,简单循环神经网络就有可能丧失学习到距离如此远的信息的能力:或者在复杂语言场景中,有用信息的间隔有大有小、长短不一,此时循环神经网络的性能也会受到限制。在这种情况下,1997 年Hochreiter 和Schmidhuber提出了长短时记忆(Long Short-term Memory, LSTM) 网络。
LSTM网络是循环神经网络的一种特殊类型, 它可以学习长期依赖的信息。采用LSTM网络结构的循环神经网络,比标准的循环神经网络表现更好。与单一循环体结构不同,LSTM网络结构是一种拥有三个“门”结构的特殊网络结构。在很多问题上,LSTM网络都取得相当巨大的成功,并得到了广泛的使用。LSTM网络通过特殊的设计来避免长期依赖问题。记住长期的信息是LSTM网络在实践中的默认行为,而不是它需要付出很大代价才能获得的能力。因此,目前大多数循环神经网络都是通过LSTM网络结构实现的。
原始RNN的隐藏层只有一个状态h,如图 (a)所示,它对于短期的输入非常敏感。LSTM网络增加一个状态c,让它来保存长期的状态,如图(b)所示。
新增加的状态c,称为单元状态。把上图(b)按照时间维度展开,如下图所示。
由上图可以看出:在t时刻,LSTM网络的输入有三个,即当前时刻网络的输入值xt、上一时刻LSTM网络的输出值ht-1以及上一时刻的单元状态ct-1;LSTM网络的输出有两个,即当前时刻LSTM网络输出值ht,和当前时刻的单元状态ct。注意,x、c、h都是向量。
LSTM网络的关键,就是怎样控制长期状态c。在这里,LSTM的思路是使用三个控制开关:第一个开关,负责控制继续保存长期状态c;第二个开关,负责控制把即时状态输入到长期状态c;第三个开关,负责控制是否把长期状态c作为当前的LSTM网络的输出。LSTM 控制开关示意图如下图所示。
LSTM网络靠一些“门”的结构让信息有选择性地影响循环神经网络中每一时刻的状态。 门实际上就是一层全连接层,它的输入是一个向量,输出是一个0~1 之间的实数向量。 假设W是门的权重向量, b是偏置项, 那么门可以表示为
g(x)=σ(Wx+b)
门的使用,就是用门的输出向量按元素乘以需要控制的向量。当门的输出为0时,任何向量与之相乘都会得到0向量,这就相当于什么都不能通过:当门的输出为1时,任何向量与之相乘都不会有任何改变,这就相当于什么都可以通过。因为σ (也就是sigmoid函数)的值域是(0, 1), 所以门的状态都是半开半闭的。
LSTM网络用两个门来控制单元状态c的内容,一个是遗忘门(Forget Gate),它决定了上一时刻的单元状态ct-1有多少保留到当前时刻的单元状态ct;另一个是输入门(Input Gate), 它决定了当前时刻网络的输入xt,有多少保存到单元状态ct。LSTM网络用输出门(Output Gate) 来控制单元状态ct有多少输出到LSTM网络的当前输出值ht。
第一步:遗忘门
RNN
LSTM
长短期记忆网络旨在克服梯度消失(RNN最大障碍)问题。可长时间保留信息。
双向循环神经网络是循环神经网络的变种。在标准的循环神经网络(RNN) 中,状态是从前往后单向传播的,在时序上处理序列,往往忽略了未来的上下文信息。然而在有些问题中,当前时刻的输出不仅和之前的状态有关,也和之后的状态相关。此时就需要使用双向循环神经网络(BRNN)来解决这个问题。
双向循环神经网络的基本思想是每一个训练序列向前和向后分别是两个循环神经网络,而且两个网络都连接着一个输出层。这个结构给输出层提供输入序列中每一个点的完整的过去和未来的上下文信息。
双向循环神经网络是由两个独立的循环神经网络叠加在起组成的, 其输出由这两个循环神经网络(RNN)的输出拼接而成。其结构示意图如下。
在任一时刻t输入会同时提供给这两个方向相反的循环神经网络,两个独立的网络独立进行计算,各自产生该时刻的新状态和输出:而双向循环神经网络的最终输出是这两个单向循环神经网络输出的简单拼接。两个循环神经网络除方向不同以外,其余结构完全对称。 每一个网络中的循环体可以自由选用任意结构,如RNN或LSTM网络。
深层循环神经网络(Deep RNN)是循环神经网络的另一个变种。为了增强模型的表达能力,可以在网络中设置多个循环层,将每层循环网络的输出传给下一层进行处理。结构示意图如下。
假设在一个L层的深层循环神经网络中,每一时刻的输入xt到输出ot之间有L个循环体,网络可以从输入中抽取更加高层的信息。和卷积神经网络类似,深层循环神经网络每一层循环体中的参数是一致的,而不同层中的参数可以不同。
8/9 引言
生成模型是机器学习模型的一个分类,他们用来描述数据如何生成。为了训练生成模型,首先在任意域中累积大量数据,然后训练模型来构建或生成类似的数据。也就是说,生成模型可以构建类似我们给他的数据,包括自编码器、GAN、序列模型等。与生成模型对应的是判别模型,其中生成模型目标为学习联合概率P(X,Y),而判别模型旨在学习条件概率P(Y|X);生成模型没有标签(Conditional GAN有标签),判别模型有标签。
在机器学习领域最近取得的成功案例中,判别模型处在前列。尽管模型不用生成新的样本或数据,但模型可以对给定输入进行预测。生成模型最新进展背后的思想是将生成模型转换为预测模型,然后利用深度学习算法来学习这样一个问题。
我们有一个生成器模型q(x |h)将低维潜藏空间h(通常表示为简单分布的噪声)映射到输人空间x。这与解码器在自编码器中的作用非常相似。
现在的目标是要引人一个判别模型p(y|x),它可以将一个输人实例x与一个是/否的二元回答y相关联,这个回答是关于x是生成器模型根据输入生成的数据或者是我们训练数据集中的真实样本。
GAN是由Ian Goofellow领导的蒙特利尔大学的一组研究人员提出的。GAN模型的核心思想是建立两种互相竞争的神经网络模型。第一种网络模型将噪声作为输人并产生样本(因此称为生成器)。第二种模型(称为判别器)从生成器和实际训练数据中获取样本,并且应该能够区分这两种来源。生成网络和判别网络在玩一个连续的游戏,其中生成器模型正在学习生成更真实的样本或示例,而判别器模型正在学习如何更好地区分生成的数据和真实数据。两种网络同时训练,目标是互相竞争,使生成的样本与真实数据不可区分。
GAN包括很多种类:Vanilla GAN、Conditional GAN、Info GAN、Wasserstein GAN、Coupled GAN、等。
在这里,我们构建一个由两个主要组件组成的模型: 一个编码器模型q(h|x),将输入映射到另一个空间(称为隐藏空间或者潜在空间,用h表示);一个解码器模型q(x|h),从隐藏的输入空间中学习相反的映射。
这些组件(编码器和解码器)连接在一起形成一个端到端的可训练模型。编码器和解码器模型都是结构不同的神经网络,例如RNN和注意力网络,以获得期望的结果。
自编码器是一种神经网络, 我们训练它使得它可以将其输入复制到其输出。它有一
个隐藏层(我们称之为h),隐藏层描述了表示输入的编码。网络可以看成由两部分组成:
1、编码函数: h=f(x)。2、用于重建的解码函数: r=g(h)。
下图显示了一个带有n个输入和m个神经元的隐藏层的基本自编码器。
人们设计的自编码器无法学习对输人的完美复制。我们限制它们只能对输入进行近似的复制,并仅复制类似于训练数据的输入。由于模型被迫优先考虑输人的哪些部分应该被复制,它通常会学习数据的有用属性。
自编码器包括:欠完备的自编码器(编码层比输入层维度小,迫使自编码器捕捉最显著的特征)、基本自编码器、加性高斯噪声自编码器(输入数据被破坏,训练时将原始输入[未损坏]和重建输出比较,从而重建原始输入图像。和基本自编码器相比,可以大幅度提高模型的准确性)、稀疏自编码器(将稀疏性加入损失函数中,有助于降低损失函数值)。
仿射变换:保留点、直线和平面的线性映射方法
深度信念网络( Deep Belief Network, DBN)是一类由多层隐藏单元组成、层之间有连接的深度神经网络。DBN的不同之处在于这些隐藏单元不与层内的其他单元交互。
DBN可以通过使用一组训练数据集来学习如何在无监督的情况下概率性地重建输人。它是大量随机变量相互作用下的联合(多变量)分布。DBN是基于统计学与计算机科学的结合并依赖概率论、图算法、机器学习等概念的表达形式。这些隐藏层可以充当特征检测器。经过训练后,DBN 可以通过监督训练来分类。DBN结构如下图所示。
DBN采用一次训练一层的贪婪训练方式。这使得它成为第一个有效的深度学习算法之一。
DBN可以看作由诸如受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)或自编码器等简单的无监督网络构成。在这些网络中,每个子网络的隐藏层都服务于下一个可见层。RBM是一个无向生成模型,具有(可见的)输人层和隐藏层,层之间有连接但连接不在层内。该拓扑结构会加速逐层无监督训练过程。对比散度应用于每个子网络,从最低层的数据集开始(最低可见层是训练数据集)。
详情可见:https://my.oschina.net/u/876354/blog/1626639
注意力机制可以让一个神经网络能够只关注其输入的一部分信息,它能够选择特定的输入。
GAT(图注意力网络)详情可见:https://blog.csdn.net/weixin_36474809/article/details/89401552
多列卷积神经网络(Multi-Column Convolutional Neural Network)模型,利用全卷积神经网络模型。可应用于人群计数,结构图如下所示。由于透视失真,图片常包含不同尺寸的头,只有一种卷积核不够,所以提出多列不同卷积以适应多种尺寸;最后18年的CSRNet验证了每一列学习到的信息都差不多,推翻了该理论。最后,该网络用了1*1的卷积层来把多通道的张量变成平面,取代了原来的全连接,使得输入图片的尺寸可以任意,使得该网络模型的应用范围更加广泛。
详情可见:https://blog.csdn.net/weixin_44585583/article/details/97115198?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158470808819726867814192%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158470808819726867814192&biz_id=0&utm_source=distribute.pc_search_result.none-task
GoogLeNet 最大的特点就是使用了 Inception 模块,它的目的是设计一种具有优良局部拓扑结构的网络,即对输入图像并行地执行多个卷积运算或池化操作,并将所有输出结果拼接为一个非常深的特征图。因为 11、33 或 5*5 等不同的卷积运算与池化操作可以获得输入图像的不同信息,并行处理这些运算并结合所有结果将获得更好的图像表征。
另一方面,Inception 网络是复杂的(需要大量工程工作)。它使用大量 trick 来提升性能,包括速度和准确率两方面。它的不断进化带来了多种 Inception 网络版本的出现。包括:Inception v1Inception v2 和 Inception v3Inception v4 和 Inception-ResNet。
Inception v1 其中一种原理图如下所示:
详情可见:https://baijiahao.baidu.com/s?id=1601882944953788623&wfr=spider&for=pc
Dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器(隐层节点)间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。也就是说,我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征。原理图如下。
详情可见:https://blog.csdn.net/program_developer/article/details/80737724
ResNet是在2015年有何凯明,张翔宇,任少卿,孙剑共同提出的,ResNet使用了一个新的思想,ResNet的思想是假设我们涉及一个网络层,存在最优化的网络层次,那么往往我们设计的深层次网络是有很多网络层为冗余层的。那么我们希望这些冗余层能够完成恒等映射,保证经过该恒等层的输入和输出完全相同。具体哪些层是恒等层,这个会有网络训练的时候自己判断出来。
残差网络可以解决梯度消失/爆炸和网络退化问题,提高深度神经网络准确性。
X是这一层残差块的输入,也称作F(x)为残差,x为输入值,F(X)是经过第一层线性变化并激活后的输出,该图表示在残差网络中,第二层进行线性变化之后激活之前,F(x)加入了这一层输入值X,然后再进行激活后输出。在第二层输出值激活前加入X,这条路径称作shortcut连接。
误差是衡量观测值和真实值之间的差距,残差是指预测值和观测值之间的差距。
ResNet的方法是加上所有跳跃连接(不一定两层),每两层增加一个捷径,构成一个残差块。具体如下图所示。
ResNets即使网络再深,训练的表现却不错,比如说训练误差减少,就算是训练深达100层的网络也不例外,有人甚至在1000多层的神经网络中做过实验。
详情可见:https://www.cnblogs.com/gczr/p/10127723.html
图片来源:https://blog.csdn.net/lff1208/article/details/77717149
DNN按理解二理解,则可以看出哪些网络含有卷积层、池化层或者全连接层,分类如下。
卷积层
DNN、FCN、CNN、GAN、自编码器、MCNN、Inception、dropout、残差网络
池化层
DNN、CNN、GAN、自编码器、Inception、dropout
全连接层
DNN、CNN、RNN、LSTM、BRNN、CRNN、GAN、自编码器、DBN、RBN、dropout、残差网络
参考文献:
1 Manpreet Singh Ghotra.TensorFlow 神经网络编程[M].机械工业出版社.2018.
2 包子阳.神经网络编程与深度学习–基于TensorFlow框架和Python技术实现[M].电子工业出版社.2019.