深度置信网络(Deep Belief Network)
DBNs是一个概率生成模型,与传统的判别模型的神经网络相对,生成模型是建立一个观察数据和标签之间的联合分布,对P(Observation|Label)和 P(Label|Observation)都做了评估,而判别模型仅仅而已评估了后者,也就是P(Label|Observation)。
DBNs由多个限制玻尔兹曼机(Restricted Boltzmann Machines)层组成,一个典型的神经网络类型如图所示。这些网络被“限制”为一个可视层和一个隐层,层间存在连接,但层内的单元间不存在连接。隐层单元被训练去捕捉在可视层表现出来的高阶数据的相关性。
DBNs的灵活性使得它的拓展比较容易。一个拓展就是卷积DBNs(Convolutional Deep Belief Networks(CDBNs))。DBNs并没有考虑到图像的2维结构信息,因为输入是简单的从一个图像矩阵一维向量化的。而CDBNs就是考虑到了这个问题,它利用邻域像素的空域关系,通过一个称为卷积RBMs的模型区达到生成模型的变换不变性,而且可以容易得变换到高维图像。DBNs并没有明确地处理对观察变量的时间联系的学习上,虽然目前已经有这方面的研究,例如堆叠时间RBMs,以此为推广,有序列学习的bbed temporalconvolutionmachines,这种序列学习的应用,给语音信号处理问题带来了一个让人激动的未来研究方向。
目前,和DBNs有关的研究包括堆叠自动编码器,它是通过用堆叠自动编码器来替换传统DBNs里面的RBMs。这就使得可以通过同样的规则来训练产生深度多层神经网络架构,但它缺少层的参数化的严格要求。与DBNs不同,自动编码器使用判别模型,这样这个结构就很难采样输入采样空间,这就使得网络更难捕捉它的内部表达。但是,降噪自动编码器却能很好的避免这个问题,并且比传统的DBNs更优。它通过在训练过程添加随机的污染并堆叠产生场泛化性能。训练单一的降噪自动编码器的过程和RBMs训练生成模型的过程一样。
㈡ 深度卷积神经网络各种改进结构块汇总
这个网络主要源自于Resnet网络,其作用是:
将靠前若干层的某一层数据输出直接跳过多层引入到后面数据层的输入部分。
意味着后面的特征层的内容会有一部分由其前面的某一层线性贡献。
实验表明,残差网络更容易优化,并且能够通过增加相当的深度来提高准确率。
最终可以使得网络越来越深,Resnet152就是一个很深很深的网络。
残差网络的典型结构如下:
这个结构主要是在Inception网络结构中出现。
Inception网络采用不同大小的卷积核,使得存在不同大小的感受野,最后实现拼接达到不同尺度特征的融合。
不同大小卷积核并行卷积的典型结构如下:
这种结构主要利用在InceptionV3中。
利用1x7的卷积和7x1的卷积代替7x7的卷积,这样可以只使用约(1x7 + 7x1) / (7x7) = 28.6%的计算开销;利用1x3的卷积和3x1的卷积代替3x3的卷积,这样可以只使用约(1x3 + 3x1) / (3x3) = 67%的计算开销。
下图利用1x7的卷积和7x1的卷积代替7x7的卷积。
下图利用1x3的卷积和3x1的卷积代替3x3的卷积。
这个结构在Resnet里非常常见,其它网络也有用到。
所谓Bottleneck结构就是首先利用1x1卷积层进行特征压缩,再利用3x3卷积网络进行特征提取,再利用1x1卷积层进行特征扩张。
该结构相比于直接对输入进行3x3卷积减少了许多参数量。
当输入为26,26,512时,直接使用3x3、filter为512的卷积网络的参数量为512x3x3x512=2,359,296。
采用Bottleneck结构的话,假设其首先利用1x1、filter为128卷积层进行特征压缩,再利用3x3、filter为128的卷积网络进行特征提取,再利用1x1、filter为512的卷积层进行特征扩张,则参数量为 512×1×1×128 + 128×3×3×128 + 128×1×1×512 = 278,528。
深度可分离卷积主要在MobileNet模型上应用。
其特点是3x3的卷积核厚度只有一层,然后在输入张量上一层一层地滑动,每一次卷积完生成一个输出通道,当卷积完成后,在利用1x1的卷积调整厚度。
假设有一个3×3大小的卷积层,其输入通道为16、输出通道为32。具体为,32个3×3大小的卷积核会遍历16个通道中的每个数据,最后可得到所需的32个输出通道,所需参数为16×32×3×3=4608个。
应用深度可分离卷积,用16个3×3大小的卷积核分别遍历16通道的数据,得到了16个特征图谱。在融合操作之前,接着用32个1×1大小的卷积核遍历这16个特征图谱,所需参数为16×3×3+16×32×1×1=656个。
这种结构主要存在在Xception网络中。
改进版深度可分离卷积就是调换了一下深度可分离的顺序,先进行1x1卷积调整通道,再利用3x3卷积提取特征。
和普通的深度可分离卷积相比,参数量也会有一定的变化。
改进版深度可分离卷积加上残差网络的结构其实和它的名字是一样的,很好理解。
如下图所示:
在ResNet50里我们认识到一个结构,bottleneck design结构,在3x3网络结构前利用1x1卷积降维,在3x3网络结构后,利用1x1卷积升维,相比直接使用3x3网络卷积效果更好,参数更少,先进行压缩,再进行扩张。
而Inverted resials结构,在3x3网络结构前利用1x1卷积升维,在3x3网络结构后,利用1x1卷积降维,先进行扩张,再进行压缩。
这种结构主要用在MobilenetV2中。
其主要结构如下:
这个结构出现在Deeplabv3语义分割中。
其经过并行的空洞卷积,分别用不同rate的空洞卷积进行特征提取,再进行合并,再进行1x1卷积压缩特征。
空洞卷积可以在不损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。如下就是空洞卷积的一个示意图,所谓空洞就是特征点提取的时候会跨像素。
原文链接: https://blog.csdn.net/weixin_44791964/article/details/103042733
㈢ 基于深度学习的图异常检测如何改进
您好,基于深度学习的图异常检测是一种有效的方法,但是仍然存在一些问题需要改进。以下是几种可能的改进方法:
1. 数据增强:在训练模型之前,可以使用数据增强技术来扩充训练数据集。这可以帮助模型更好地学习数据的特征,并提高模型的准确性。
2. 增加正常数据:在训练模型时,可以增加正常数据的数量,这可以帮助模型更好地学习正常数据的特征,并减少培亩误报率。
3. 引入新的特征:除了使用传统的图像特征,还可以考虑引入新的特征,例如图像的上下文信息、颜色信息等等,以提高模型的准确性。
4. 使用集成学习:集成学习可以将多个模型组合在一起,以提高整体的准确性和稳定性。可以使用不同的深度学习算法或不同的参数来训练多个模型,然后将它们组合在一起,以获得更好的结果。
5. 对抗训练:对抗训练是一种训练模型的方法,其中模型核孙被训练来对抗一些特定的攻击。这可以帮助模型更好地识别异常数据,并提高模型的鲁棒性。
综上所述,基于深度学习的图异常检测可以通过数据增强、增加正常数据、引入新的特征、使用集成学习和对抗训练等方法来改进。这改中链些方法可以帮助模型更好地识别异常数据,并提高模型的准确性和鲁棒性。
㈣ Nature 论文:探索深度神经网络之间的个体差异
深度神经网络(DNNs)是 AI 领域的重要成果,但它的 “存在感” 已经不仅仅限于该领域。
一些前沿生物医学研究,也正被这一特别的概念所吸引。特别是计算神经科学家。
在以前所未有的任务性能彻底改变计算机视觉之后,相应的 DNNs 网络很快就被用以试着解释大脑信息处理的能力,并日益被用作灵长类动烂祥物大脑神经计算的建模框架。经过任务优化的深度神经网络,已经成为预测灵长类动物视觉皮层多个区域活动的最佳模型类型之一。
用神经网络模拟大脑或者试图让神经网络更像大脑正成为主流方向的当下,有研究小组却选择用神经生物学的方法重新审视计算机学界发明的DNNs。
而他们发现,诸如改变初始权重等情况就能改变网络的最终训练结果。这对使用单个网络来窥得生物神经信息处理机制的普遍做法提出了新的要求:如果没有将具有相同功能的深度神经网络具有的差异性纳入考虑的话,借助这类网络进行生物大脑运行机制建模将有可能出现一些随机的影响。要想尽量避免这种现象,从事 DNNs 研究的计算神经科学家,可能需要将他们的推论建立在多个网络实例组的基础上,即尝试去研究多个相同功能的神经网络的质心,以此克服随机影响。
而对于 AI 领域的研究者,团队也希望这种表征一致性的概念能帮助机器学习研究人员了解在不同任务性能水平下运行的深度神经卖大网络之间的差异。
人工神经网络由被称为 “感知器”、相互连接的单元所建立,感知器则是生物神经元的简化数字模型。人工神经网络至少有两层感知器,一层用于输入层,另一层用于输出层。在输入和输出之间夹上一个或多个 “隐藏” 层,就得到了一个 “深层” 神经网络,这些层越多,网络越深。
深度神经网络可以通过训练来识别数据中的特征,就比如代表猫或狗图像的特征。训练包括使用一种算法来迭代地调整感知器之间的连接强度(权重系数),以便网络学会将给定的输入(图像的像素)与正确的标签(猫或狗)相关联。理想状况是,一旦经过训练,深度神经网络应该能够对它以前没有见过的同类型输入进行分类。
但在总体结构和功能上,深度神经网络还不能说是严格地模仿人类大脑,其中对神经元之间连接强度的调整反映了学习过程中的关联。
一些神经科学家常常指出深度神经网络与人脑相比存在的局限性:单个神经元处理信息的范围可能比 “失效” 的感知器更广,例如,深度神经网络经常依赖感知器之间被称为反向传播的通信方式,而这种通信方式似乎并不存在于人脑神经系统。
然而,计算神经科学家会持不同想法。有的时候,深度神经网络似乎是建模大脑的最佳选择。
例如,现有的计算机视觉系统已经受到我们所知的灵长类视觉系统的影响,尤其是在负责识别人、位置和事物的路径上,借鉴了一种被称为腹侧视觉流的机制。
对人类来说,腹侧神经通路从眼睛开始,然后进入丘脑的外侧膝状体,这是一种感觉信息的中继站。外侧膝状体连接到初级视觉皮层中称为 V1 的区域,在 V1 和 V4 的下游是区域 V2 和 V4,它们最终通向下颞叶皮层。非人类灵长类动物的大脑也有类似的结构(与之相应的背部视觉流是一条很大程度上独立的通道,用于处理看到运动和物体位置的信息)。
这里所体现的神经科学见解是,视觉信息处理的分层、分阶段推进的:早期阶段先处理视野中的低级特征(如边缘、轮廓、颜饥配搏色和形状),而复杂的表征,如整个对象和面孔,将在之后由颞叶皮层接管。
如同人的大脑,每个 DNN 都有独特的连通性和表征特征,既然人的大脑会因为内部构造上的差异而导致有的人可能记忆力或者数学能力更强,那训练前初始设定不同的神经网络是否也会在训练过程中展现出性能上的不同呢?
换句话说,功能相同,但起始条件不同的神经网络间究竟有没有差异呢?
这个问题之所以关键,是因为它决定着科学家们应该在研究中怎样使用深度神经网络。
在之前 Nature 通讯发布的一篇论文中,由英国剑桥大学 MRC 认知及脑科学研究组、美国哥伦比亚大学 Zuckerman Institute 和荷兰拉德堡大学的 Donders 脑科学及认知与行为学研究中心的科学家组成的一支科研团队,正试图回答这个问题。论文题目为《Indivial differences among deep neural network models》。
根据这篇论文,初始条件不同的深度神经网络,确实会随着训练进行而在表征上表现出越来越大的个体差异。
此前的研究主要是采用线性典范相关性分析(CCA,linear canonical correlation analysis)和 centered-kernel alignment(CKA)来比较神经网络间的内部网络表征差异。
这一次,该团队的研究采用的也是领域内常见的分析手法 —— 表征相似性分析(RSA,representational similarity analysis)。
该分析法源于神经科学的多变量分析方法,常被用于将计算模型生产的数据与真实的大脑数据进行比较,在原理上基于通过用 “双(或‘对’)” 反馈差异表示系统的内部刺激表征(Inner stimulus representation)的表征差异矩阵(RDMs,representational dissimilarity matrices),而所有双反馈组所组成的几何则能被用于表示高维刺激空间的几何排布。
两个系统如果在刺激表征上的特点相同(即表征差异矩阵的相似度高达一定数值),就被认为是拥有相似的系统表征。
表征差异矩阵的相似度计算在有不同维度和来源的源空间(source spaces)中进行,以避开定义 “系统间的映射网络”。本研究的在这方面上的一个特色就是,使用神经科学研究中常用的网络实例比较分析方法对网络间的表征相似度进行比较,这使得研究结果可被直接用于神经科学研究常用的模型。
最终,对比的结果显示,仅在起始随机种子上存在不同的神经网络间存在明显个体差异。
该结果在采用不同网络架构,不同训练集和距离测量的情况下都成立。团队分析认为,这种差异的程度与 “用不同输入训练神经网络” 所产生的差异相当。
如上图所示,研究团队通过计算对应 RDM 之间的所有成对距离,比较 all-CNN-C 在所有网络实例和层、上的表示几何。
再通过 MDS 将 a 中的数据点(每个点对应一个层和实例)投影到二维。各个网络实例的层通过灰色线连接。虽然早期的代表性几何图形高度相似,但随着网络深度的增加,个体差异逐渐显现。
在证明了深度神经网络存在的显着个体差异之后,团队继续探索了这些差异存在的解释。
随后,研究者再通过在训练和测试阶段使用 Bernoulli dropout 方法调查了网络正则化(network regularization)对结果能造成的影响,但发现正则化虽然能在一定程度上提升 “采用不同起始随机种子的网络之表征” 的一致性,但并不能修正这些网络间的个体差异。
最后,通过分析网络的训练轨迹与个体差异出现的过程并将这一过程可视化,团队在论文中表示,神经网络的性能与表征一致性间存在强负相关性,即网络间的个体差异会在训练过程中被加剧。
总而言之,这项研究主要调查了多个神经网络在最少的实验干预条件下是否存在个体差异,即在训练开始前为网络设置不同权重的随机种子,但保持其他条件一致,并以此拓展了此前与 “神经网络间相关性” 有关的研究。
除了这篇 这篇 研究以外,“深度学习三巨头” 之一、着名 AI 学者 Hinton 也有过与之相关的研究,论文名为《Similarity of Neural Network Representations Revisited》,文章探讨了测量深度神经网络表示相似性的问题,感兴趣的读者可以一并进行阅读。
Refrence:
[1]https://www.nature.com/articles/s41467-020-19632-w#citeas
[2]https://www.quantamagazine.org/deep-neural-networks-help-to-explain-living-brains-20201028/
㈤ 深层神经网络
如上图所示,逻辑回归是一个浅层模型,可以理解为是单层神经网络。深层或浅层是一个程度的问题。如果将逻辑回归模型加入一个隐藏层就变了一个双层神经网络,但还是比较浅的。如果加入 5 个隐藏层,则可以说是一个深层模型。通常可以把隐藏层数当作超参数,然后在交叉验证数据集上进行评估,从而选择合适的深度。
上图是一个 4 层的神经网络,包括三个隐藏层和一个输出层,隐藏层的单元数分别是 5 5 3,输出层只有一个单元。通常用 L 表示神经网络的层数,用 表示第 层的单元数,可以把输入层当作第 0 层孙雹。那么图中 L = 4, , , , , 。可以用 表示第 层的激活值,即 ,用 和 表示在 公式中计算 值的权重,即 。输入用 X 表示,X 也是第 0 层,所以 ,最后一层 ,也就是说 即为神经网络的预测值(输出值)。
假设有一个样本 x,那么:
第一层计算: ,其中 x 也可以表示为 , w 和 b 是会影响第 1 层的激活单元的参数,接下来计算: ,后面几层的计算也是如此。
第二层计算: ,
第三层计算: ,
第四层计算: ,
可以总结出,计算规律为:
前向传播的向量化计算:
输入 X 即 ,是将 m 个样本横向堆叠构成的矩阵,前向传播需要一层一层来迭代计算,所以需要用 for 循环从第 1 层迭代计算到第 L 层,深层神经网络只是比浅层神经网络有更多层的迭代计算。
在上图的神经网络中,除去输入层一共有 5 层,其中 4 个隐藏层,一个输出层。第 1 个隐藏层有 3 个隐藏单元,可以表示为 , 是第 1 个隐藏层的激活函数向量,是一个 3 x 1 的列向量,x 有两个输入特征,所以 x 是 2 x 1 的列向量。在第一层的计算中: ,如果忽略偏置项 , 。 乘以一个 2 x 1 的列向量 x,需要等于一个 3 x 1 的列向量,那么 必须是一个 3 x 2 的矩阵,即 的矩阵。 的结果是一个 3 x 1 的向量, 也搜歼是一个 3 x1 的向量,所以结果 也是一个 3 x 1 的向量。可以发现, 必须是 维的矩阵, 必须是 维的列向量,所以 的维数是 5 x 3,即 , 的维数是 5 x 1,即 x 1,所以在第二层的计算中: ,5 x 3 的矩阵 乘以 3 x 1 的列向量 等于一个 5 x 1 的列向量,再加上一个 5 x 1 的偏置项 ,结果 是一个 5 x 1 的列向量。以此类推, 的维数是 4 x 5, 的维数是 2 x 4, 的维数是 1 x 2。
前面证实了, 必须是 维的矩阵, 必须是 维的列向量。而且,在反向传播中, 和 的维度相同, 和 的维度相同。又因为 ,所以 和 的维度也相同,都是 。
以上是神经网络中单个样本的计算,其中 x 表示单个样本,通常为了加速运算,需要将 m 个样本进行向量化计算,可以用 X 表示 m 个样本,第一个隐藏层的向量化计算公式即为: ,其中 还是 维, X 变为 维, 的结果是 的矩阵, 的维度还是 ,但当一个 的矩阵和 相加时,Python会通过广播将 复制成为 的矩阵,然后两个矩阵逐个元素相加。所以 的维度变为 ,即 3 x m。 表示每一个单独的 横向叠加构成的行向量,即 。
单个样本时, 和 的维世凯冲度相同,都是 ,m 个样本时, 和 的维度相同,都是 ,当 等于 0 时, 等于 ,其中 是 x 的输入特征数。反向传播时,dZ、dA 和 Z、A 的维度相同。
从直觉上可以把深度神经网络的前几层当做探测简单的函数,也就是学习一些低层次的简单特征,之后把它们和后几层结合在一起,也就是把简单的特征结合起来,那么总体上就能学习更多复杂的函数,也就是去探测更复杂的东西。可以把深度学习神经网络和人类大脑做类比,人的大脑也是先探测简单的东西,然后组合起来才能探测复杂的物体。
神经网络为何有效的理论来源于电路理论,它和能够用电路元件计算哪些函数有着分不开的联系,根据不同的基本逻辑门(与,或,非),在非正式情况下,这些函数都可以用相对较小(指隐藏单元数量)但很深的神经网络来计算 ,如果用浅层神经网络则需要指数增长的隐藏单元数量才能达到同样的效果。
上图是一个 4 层的神经网络,梯度下降的一个迭代过程即为前向传播和反向传播的计算过程,如下图所示:
在前向传播计算中,从第 1 层开始,第 层的输入为上一层(第 层)的激活函数计算结果 和当前层的参数 ,输出为当前层激活函数计算结果 ,还要缓存 和 以供反向传播使用, 则输入到下一层(第 层),计算过程如下:
向量化计算为:
当计算完所有层的前向传播后,第 L 层的激活函数计算结果 即当前样本的预测值。接下来将进行反向传播计算,从第 L 层开始,第 层的输入为当前层激活函数计算结果的导数值 和当前层的参数 ,输出为上一层(第 层)激活函数计算结果的导数值 ,以及当前层参数的导数值 ,计算过程如下:
首先
由 可知 ,将 da 带入可求得:
向量化计算为:
首先
在每一层中根据梯度下降公式,更新参数:
这就是神经网络中梯度下降一个迭代的计算过程。
神经网络中的参数包括: W 和 b。超参数包括:学习率 ,梯度下降迭代次数(iterations),隐层数(L),隐藏单元数(units),激活函数(activefunction),因为这些参数是在某种程度上决定了参数 W 和 b 的参数,所以叫做超参数。其他超参数包括:momentum,batch size,正则化参数等
可以通过尝试不同的超参数,观察代价函数曲线变化,从而选择表现最好的超参数。
没有。
https://mooc.study.163.com/smartSpec/detail/1001319001.htm
㈥ 深度神经网络是如何训练的
Coursera的Ng机器学习,UFLDL都看过。没记错的话Ng的机器学习里是直接给出公式了,虽然你可能知道如何求解,但是即使不知道完成作业也不是问题,只要照着公式写就行。反正我当时看的时候心里并没能比较清楚的明白。我觉得想了解深度学习UFLDL教程 - Ufldl是不错的。有习题,做完的话确实会对深度学习有更加深刻的理解,但是总还不是很清晰。后来看了Li FeiFei的Stanford University CS231n: Convolutional Neural Networks for Visual Recognition,我的感觉是对CNN的理解有了很大的提升。沉下心来推推公式,多思考,明白了反向传播本质上是链式法则(虽然之前也知道,但是当时还是理解的迷迷糊糊的)。所有的梯度其实都是对最终的loss进行求导得到的,也就是标量对矩阵or向量的求导。当然同时也学到了许多其他的关于cnn的。并且建议你不仅要完成练习,最好能自己也写一个cnn,这个过程可能会让你学习到许多更加细节和可能忽略的东西。这样的网络可以使用中间层构建出多层的抽象,正如我们在布尔线路中做的那样。例如,如果我们在进行视觉模式识别,那么在第一层的神经元可能学会识别边,在第二层的神经元可以在边的基础上学会识别出更加复杂的形状,例如三角形或者矩形。第三层将能够识别更加复杂的形状。依此类推。这些多层的抽象看起来能够赋予深度网络一种学习解决复杂模式识别问题的能力。然后,正如线路的示例中看到的那样,存在着理论上的研究结果告诉我们深度网络在本质上比浅层网络更加强大。
㈦ AI数学基础13——深层和浅层神经网络
来源于Andrew Ng, 《Why deep representations?》
浅层(shallow)神经网络,顾名思义就是层数很少的神经网络,比如隐藏层的层数为1,如下所示:
深层(Deep)神经网络,顾名思义就是层数很多的神经网运者络,如下所示:
使用深层(Deep)神经网络的机器学习,就是深度学习,按照Andrew Ng的意思,Deep Learning 是一个带有更多市场宣传意味的词,在工程实践中,还是要从层数比较少的神经网络开始,慢慢的加判悄拦深,直到有掘胡效的解决问题。
深层神经网络相对于浅层神经网络的优势有:
1, 提取更加复杂的特征。
在一个神经网络中,位于较浅位置的神经元从输入中提取的是较为简单的一些特征信息,而随着层次的加深,神经元将提取愈加复杂的特征信息,从而使得神经网络能够做出更准确的判断。
2, 避免神经元数量指数增加
㈧ 【阅读笔记】改进卷积神经网络的14个小技巧
原文: https://mp.weixin.qq.com/s/Lh_lJNvV9BGhc6no2ln-_g
原题目误导性太大
1)架构要遵循应用
你也许会被 Google Brain 或者 DeepMind 这些奇特的实验室所发明的那些耀眼的新模型所吸引,但是其中许多在你的用例或者业务环境中要么是不可能实现,要么是实现起来非常不现实。你应该使用对你的特定应用最有意义的模型,这种模型或许比较简单,但是仍然很强大,例如 VGG。
2)网络路径的激增
每年的 ImageNet Challenge 的冠军都会使用比上一届冠军更加深层的网络。从 AlexNet 到 Inception,再到 ResNet,Smith 注意到了“网络中路径数量倍增”的趋势,并且“ResNet 可以是不同长度的网络的指数集合”。
3)争取简单
然而,更大的并不一定是更好的。在名为“Bigger is not necessarily better”的论文中,Springenberg 等人演示了如何用更少的单元实现最先进的结果。参考:https://arxiv.org/pdf/1412.6806.pdf
4)增加对称性
无论是在建筑上,还是在生物上,对称性被认为是质量和工艺的标志。Smith 将 FractalNet 的优雅归功于网络的对称性。
5)金字塔式的形状
你也许经常在表征能力和减少冗余或者无用信息之间权衡。卷积神经网络通常会降低激活函数的采样,并会增加从输入层到最终层之间的连接通道。
6)过度训练
另一个权衡是训练准确度和泛化能力。用类似 drop-out 或者 drop-path 的方法进行正则化可以提高泛化能力,这是神经网络的重要优势。请在比你的实际用例更加苛刻的问题下训练你的网络,以提高泛化性能。
7)全面覆盖问题空间
为了扩展你的训练数据和提升泛化能力,请使用噪声和数据增强,例如随机旋转、裁剪和一些图像操作。
8)递增的特征构造
随着网络结构越来越成功,它们进一部简化了每一层的“工作”。在非常深层的神经网络中,每一层仅仅会递增的修改输入。在 ResNets 中,每一层的输出和它的输入时很相似的,这意味着将两层加起来就是递增。实践中,请在 ResNet 中使用较短的跳变长度。
9)标准化层的输入
标准化是另一个可以使计算层的工作变得更加容易的方法,在实践中被证明可以提升训练和准确率。批量标准化(batch normalization)的发明者认为原因在于处理内部的协变量,但是 Smith 认为,“标准化把所有层的输入样本放在了一个平等的基础上(类似于一种单位转换),这允许反向传播可以更有效地训练”。
10)输入变换
研究表明,在 Wide ResNets 中,性能会随着连接通道的增加而增强,但是你需要权衡训练代价与准确度。AlexNet、VGG、Inception 和 ResNets 都在第一层使用了输入变换以让输入数据能够以多种方式被检查。
11)可用的资源决指引着层的宽度
然而,可供选择的输出数量并不是显而易见的,这依赖于你的硬件能力以及期望的准确度。
12)Summation Joining
Summation 是一种常用的合并分支的方式。在 ResNets 中,使用总和作为连接的机制可以让每一个分支都能计算残差和整体近似。如果输入跳跃连接一直存在,那么 summation 会让每一层学到正确地东西(例如与输入的差别)。在任何分支都可以被丢弃的网络(例如 FractalNet)中,你应该使用这种方式类保持输出的平滑。
13)下采样变换
在池化的时候,利用级联连接(concatenation joining)来增加输出的数量。当使用大于 1 的步长时,这会同时处理连接并增加连接通道的数量。
14)用于竞争的 Maxout
Maxout 被用在你只需要选择一个激活函数的局部竞争网络中。使用求和以及平均值会包含所有的激活函数,所以不同之处在于 maxout 只选择一个“胜出者”。Maxout 的一个明显的用例是每个分支具有不同大小的内核,而 Maxout 可以包含尺度不变性。
1)使用调优过的预训练网络
“如果你的视觉数据和 ImageNet 相似,那么使用预训练网络会帮助你学习得更快”,机器学习公司 Diffbot 的 CEO Mike Tung 解释说。低水平的卷积神经网络通常可以被重复使用,因为它们大多能够检测到像线条以及边缘这些模式。将分类层用你自己的层替换,并且用你特定的数据去训练最后的几个层。
2)使用 freeze-drop-path
Drop-path 会在训练的迭代过程中随机地删除一些分支。Smith 测试了一种相反的方法,它被称为 freeze-path,就是一些路径的权重是固定的、不可训练的,而不是整体删除。因为下一个分支比以前的分支包含更多的层,并且正确的内容更加容易近似得到,所以网络应该会得到更好的准确度。
3)使用循环的学习率
关于学习率的实验会消耗大量的时间,并且会让你遇到错误。自适应学习率在计算上可能是非常昂贵的,但是循环学习率不会这样。使用循环学习率(CLR)时,你可以设置一组最大最小边界,在边界范围内改变学习率。Smith 甚至还在论文《Cyclical Learning Rates for Training Neural Networks》中提供了计算学习率的最大值和最小值的方法。参考:https://arxiv.org/pdf/1506.01186.pdf
4)在有噪声的标签中使用 bootstrapping
在现实中,很多数据都是混乱的,标签都是主观性的或者是缺失的,而且预测的对象可能是训练的时候未曾遇到过的。Reed 等人在文章《TRAINING DEEP NEURAL NETWORKS ON NOISY LABELS WITH BOOTSTRAPPING》中描述了一种给网络预测目标注入一致性的方法。直观地讲,这可以奏效,通过使网络利用对环境的已知表示(隐含在参数中)来过滤可能具有不一致的训练标签的输入数据,并在训练时清理该数据。参考:https://arxiv.org/pdf/1412.6596
5)采用有 Maxout 的 ELU,而不是 ReLU
ELU 是 ReLU 的一个相对平滑的版本,它能加速收敛并提高准确度。与 ReLU 不同,ELU 拥有负值,允许它们以更低的计算复杂度将平均单位激活推向更加接近 0 的值,就像批量标准化一样参考论文《FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS)》,https://arxiv.org/pdf/1511.07289.pdf。如果您使用具有全连接层的 Maxout,它们是特别有效的。
㈨ 经典深度神经网络架构解析 - VGG,ResNet,Inception
深度神经网络对于问题的抽象建立在我们可以通过合适的神经网络架构构造一个通用的函数逼近,使得我们可以从输入样本空间映射到目标样本空间。这一听起来简单的任务在实际构建过程中需要耗费大量的计算和时间以完成模型试验和迭代。而由于迁移学习的可行性,使得我们可以借助已有的在特定分类任务中表现出色的架构来完成类似甚至看起来完全不相关的任务。在学习的过程中,阅读了一些这些经皮饥典的网络架构的相关论文,在此做一个记录。
VGG Net 与之前的经典网络结构相比最突出的特征是大量的使用 3x3 (部分架构中还采用了 1x1 )的小卷积核,并且采用 same padding 来维持卷积前后的 w 和 h,Feature map 的缩放完全交给 2x2 的 max pooling 层来完成,此后基本上所有的卷积神经网络的卷积核都采用 3x3 的尺寸。也正因为采用这个简单的、小的卷积核结构,才使得 VGG 成为同时代网络中最经典的深度神经网络。
在深度神经网络中采用小卷积核的原因:小卷积核通过多层叠加后可以在输入层取得与大卷积核同等规模的感受野,且由于网络层次的增加会同步增加网络的容量 model capacity 和复杂度 model complexity,进一步地,通过叠加多个层次的卷积核还可以减少模型的参数:例如对于通道数为 C 的输入和输出来说,采用 7x7 的卷积核需要的参数是 7x7xCxC = 49C 2 个,而通过叠加 3 层 3x3 的卷积核所需要的参数数量为 3 x [3x3xCxC] = 27C 2 个。
在 VGG 的架构中,作者采用 1x1 卷积的主要目的在于增加网络中的非线性,采用与原有输入特征相同通道数量的 1x1 的卷积结构,执行卷积前后不改变特征的表达的数量,但根据作者的经验在同等架构下带有 1x1 结构的网络表现不如 3x3 的网络,因此在后续广为沿用的 VGG 架构都是单纯的 3x3 网络。
一个值得注意的细节是,为了使得网络具有缩放不变性,作者在训练时先将全部图片缩放至 384x384 的尺寸,在此基础上随机裁剪 224x224 的图片区域作为网络的输入,最后再用经过在指定范围内进行尺寸缩放的图片进行微调。
另一个细节是作者在测试时采用了很多比较高明的技巧如 Ensemble 和 multi-crop 等方法使得测试的结果得到了一定的提升,不过这些提升一般只在竞赛中有意义,在真实的生产环境中应用很少。
ResNet 的提出是基于这样一个发现:直觉上深度神经网络应该的性能应该优于架构类似但相对层数更少的网络,但在实际情况中,随着网络层次的加深,梯度消失 Vanishing gradient 的影响愈加明显,网络的训练变得异常困难。这个现象在作者看来反应出了通过非线性激活的神经网络来构建近似恒等映射是困难的,那么我们可以反其道而行之,我们希望神经网络学习这个特定映射和恒等映射之间的差值,此时,由于给定了一个参考基准,使得整个学习的过程更加的容易,这兆扰个想法实在是精妙!
在此基础上 ResNet 网络的构建都是基于上图中基本单元构成的。
Inception 这个系列目前共有燃猜返 5 篇文章,包括:
其中第一篇是对 Inception 架构的一个简单介绍,第二篇则是在改进 Inception 网络的过程中发现了 Batch Normalization 这一被后续广泛使用的提高网络稳健性的方法,第三篇 Rethinking the Inception Architecture for Computer Vision 这一篇相比前两篇论文信息量更大,作者给了很多构建深度卷积神经网络的建议,并且在这一篇中进一步改进了下图中第一版的 Inception Mole,将 5x5 的卷积核改为两个 3x3 卷积层的叠加,这是一篇十分诚意的论文,值得反复阅读。
相比于 VGG Net,Inception 网络不再是基本的卷积神经网络的堆叠,取而代之的是对不同变体的 Inception Mole 进行叠加。尽管从结构上 Inception 网络更加复杂,但由于大量的使用了 1x1 的卷积核,使得参数量居然比 VGG 还要小。
在此我们除了盲目复杂化网络以外,一个不可避免的问题是:为什么 Inception 网络会有更有的表现?
一种说法是我们在构建网络的过程中很难知道如何选择合适的卷积核,而 Inception Mole 使得我们可以尝试多个不同的选择,让网络自己确定哪个方式更加合适。
另一种说法来自本系列的第 5 篇文章,keras 的作者 Francois Chollet 给出的解释是,在传统的卷积神经网络中,卷积核不仅需要在宽度和高度方向上建立特征识别能力,还要在深度(通道)方向上也构建这一能力。再一次地, 知识的表示形式决定了学习的难易程度 ,我们是否可以将这两个方向的特征识别分离开来,而简化这一任务?这就是 Inception 网路及后续在此基础上衍生出的 Xception 网络的核心思想。
㈩ 深层神经网络的超参数调试、正则化及优化
训练集 ( Training set )
作用是用来拟合模型,通过设置分类器的参数,训练分类模型。后续结合验证集作用时,会选出同一参数的不同取值,拟合出多个分类器。
验证集 ( Dev set )
作用是当通过训练集训练出多个模型后,为了能找出效果最佳的模型,使用各个模型对验证集数据进行预测,并记录模型准确率。选出效果最佳的模型所对应的参数,即用来调整模型参数。如svm中的参数c和核函数等。
测试集 ( Test set )
通过训练集和验证集得出最优模型后,使用测试集进行模型预测。用来衡量该最优模型的性能和分类能力。即可以把测试集当做从来不存在的数据集,当已经确定模型参数后,使用测试集进行模型性能评价。
一个有助于理解的形象比喻:
训练集 —— 课本,学生根据课本里的内容来掌握知识。
验证集 —— 作业,通过作业可以知道 不同学生学习情况、进步的速度快慢。
测试集 —— 考试,考的题是平常都没有见过,考察学生举一反三的能力。
训练集 直接参与了模型调参的过程,显然不能用来反映模型真实的能力(防止课本死记硬背的学生拥有最好的成绩,即防止 过拟合 ) 。
验证集 参与了人工调参(超参数)的过程,也不能用来最终评判一个模型(刷题库的学生不代表其学习能力强)。
所以要通过最终的考试 (测试集) 来考察一个学生(模型)真正的能力。
如何将只有一个包含m个样例的数据集D,产生出训练集S和测试集T(验证集可以省略)?主要有以下三种方法:
自助法 ( bootstrapping )
给定m个样本的数据集D,我们对它进行采样产生数据集D',每次随机从D中挑选一个样本,将其拷贝入D',然后再将样本放回原始数据集D。显然,该样本在下次采样时任然有可能被采到。这个过程重复m次后,我们就得到了含有m个样本的数据集D',这就是自助采样的结果。 样本有重复采样,也有一次也没有被采到的。从未采到的结果是 ,取极限得到
因此,使用自助法约有1/3的数据集没有被选中过,它们用于测试,这种方式叫“外包估计”。
自助法在数据集小,难以划分训练集、测试集的时候有很大的效果,如果数据集足够大的时候,留出法和交叉验证是更好的选择。
留出法 ( hold-out )
将整个数据集D划分为两个互斥的集合,其中一个作为训练集S,另一个作为测试集T。即,D=S∪T,S∩T=∅。在S上训练出模型,T作为测试集,来评估模型效果。
当样本数据量较小(10000条左右及以下)时,通常取其中70%作为训练集,30%作为测试集;或60%作为训练集,验证集和测试集各20%。
交叉验证法 ( cross validation )
如图所示,交叉验证法的实现流程大致如下:
(1) 将整个数据集分成k个大小相似的子集,即D=D1∪D2∪...∪Dk,Di∩Dj=∅(故又称k折交叉验证法,通常取k=10 )。
(2) 对于每一个模型Mi,算法执行k次,每次选择一个Sj(1≤j≤k)作为测试集,其它作为训练集来训练模型Mi,把训练得到的模型在Sj上进行测试,这样一来,每次都会得到一个误差E,最后对k次得到的误差求平均,就可以得到模型Mi的泛化误差。
(3) 算法选择具有最小泛化误差的模型作为最终模型,并且在整个训练集上再次训练该模型,从而得到最终的模型。
交叉验证的主要的目的是 为了选择不同的模型类型(比如一次线性模型、非线性模型) ,而 不是为了选择具体模型的具体参数 。比如在BP神经网络中,其目的主要为了选择模型的层数、神经元的激活函数、每层模型的神经元个数(即所谓的超参数),每一层网络神经元连接的最终权重是在模型选择(即K折交叉验证)之后,由全部的训练数据重新训练。
假设这就是数据集,显然用简单分类器(如逻辑回归)并不能很好地拟合上述数据。这种情况称为 欠拟合 。
相反地,如果采用一个非常复杂的分类器(如深度神经网络或含有隐藏单元的神经网络),拟合效果会非常好。但与此同时,模型的复杂度也会过高,这种称为 过拟合 。
在两者之间,可能会存在一些复杂程度适中、数据拟合适度的分类器,拟合结果较为合理,称为 适度拟合 。
如上图所示,训练集误差和验证集误差均较高时为 高偏差(欠拟合) 情况;训练集误差较高,验证集误差较高低时为 高方差(过拟合) 情况。
(1) 如何减小偏差(防止欠拟合)
① 增大神经网络规模。
(2) 如何减小方差(防止过拟合)
① 增加数据集样本数量;
② 正则化。
参数 是指神经网络中由数据驱动并进行调整的变量,如𝑊和𝑏。
超参数 是指无需数据驱动,而是在训练前或者训练中人为进行调整的变量。例如算法中的learning rate 𝑎(学习率)、iterations(梯度下降法循环的数量)、𝐿(隐藏层数目)、𝑛[𝑙](隐藏层单元数目)、choice of activation function(激活函数的选择)等都需要人为设置,这些数字实际上控制了最后的参数𝑊和𝑏的值,所以它们被称作超参数。
神经网络中的超参数主要分为三类:网络参数、优化参数、正则化参数。
网络参数
可指网络层与层之间的交互方式(相加、相乘或者串接等)、卷积核数量和卷积核尺寸、网络层数(也称深度)和激活函数等。
优化参数
一般指学习率(learning rate)、批样本数量(batch size)、不同优化器的参数以及部分损失函数的可调参数等。
正则化参数
权重衰减系数,随机失活比率(dropout)等。
正则化有利于减小训练集和验证集准确率的方差,防止过拟合。在无法增加样本数量或增加样本数量的成本过高时,正则化是一种行之有效的方法。
一般将任意 维向量 的 - 范数定义为
根据定义:
当 时, 的 范数为 ,表示向量 中非0元素的个数。
当 时, 的 范数为 ,等于向量 中所有元素的绝对值之和。
当 时, 的 范数为 ,等于向量 中所有元素的平方和开根号。
正则化(Regularization) 的主要目的是控制模型复杂度,减小过拟合。最基本的正则化方法是在原目标(代价)函数 中添加惩罚项,对复杂度高的模型进行“惩罚”。
对于神经网络模型, 正则化即在其代价函数中添加 正则项:
其中, 。之后再求解优化问题 即可。
假设某三层神经网络存在过拟合问题,采用dropout正则化会遍历网络的每一层,并设置消除该层中每一个节点的概率(比如0.5),最后得到一个节点更少、规模更小的网络,然后再用反向传播方法进行训练,就能有效防止过拟合。
最常用的方法是 inverted dropout(反向随机失活) 。对于一个三层神经网络( ),以第三层为例,实施dropout的步骤如下:
① 定义一个三层dropout矩阵d3:
d3=numpy.random.rand(a3.shape[0],a3.shape[1])
其中,a3表示神经网络第三层的激活函数矩阵。
② 设置 ( )的大小。 表示保留某个隐藏单元的概率。将第①步产生的随机矩阵d3的每个元素与 进行比较,小于置1,大于置0,得到新的d3矩阵(1表示保留该节点,0表示删除该节点)。
③ 将a3与新的d3矩阵相乘(矩阵对应元素相乘),得到新的激活函数矩阵:
a3 =np.multiply(a3,d3)
④ 将新的a3矩阵除以keep-prob:
a3 /= keep_prob
目的是保证a3的期望值(均值)不变,从而保证第三层的输出不变。
① 使用dropout可以使得部分节点失活,可以起到简化神经网络结构的作用,从而起到正则化的作用。
② 因为dropout是使得神经网络的节点随机失活,这样会让神经网络在训练的时候不会使得某一个节点权重过大。因为该节点输入的特征可能会被清除,所以神经网络的节点不能依赖任何输入的特征。dropout最终会产生收缩权重的平方范数的效果,来压缩权重,达到类似于 正则化的效果。
① dropout在测试阶段不需要使用,因为如果在测试阶段使用dropout可能会导致预测值产生随机变化(因为dropout使节点随机失活)。而且,在训练阶段已经将权重参数除以keep-prob来保证输出的期望值不变,所以在测试阶段没必要再使用dropout。
② 神经网络的不同层在使用dropout的时候,keep-prob可以不同。因为可能有的层参数比较多,比较复杂,keep-prob可以小一些,而对于结构比较简单的层,keep-prob的值可以大一些甚至为1,keep-prob等于1表示不使用dropout,即该层的所有节点都保留。
加快训练速度。
对于一个神经网络模型,考虑其代价函数:
如果未归一化输入,其代价函数的形状会较为细长狭窄。在这样的代价函数的限制下,为避免陷入局部最优解,梯度下降法的学习率必须设置得非常小。
如果归一化输入,代价函数便呈现球形轮廓。这种情况下,不论从哪个位置开始梯度下降法,都能使用较大的学习率,从而更快速、直接地找到全局最优解。
对于包含n个特征的m个样本的数据集,其输入归一化的过程主要分为两步:
① 零均值化
② 归一化方差
其中, 代表第 个样本的特征矩阵。
训练集、验证集、测试集特征矩阵的平均值 和标准差 要保持一致,确保它们归一化后符合同一分布。