3. DNN神经网络的正则化

1. DNN神经网络的前向传播(FeedForward)

2. DNN神经网络的反向更新(BP)

3. DNN神经网络的正则化

1. 前言

和普通的机器学习算法一样,DNN也会遇到过拟合的问题,需要考虑泛化,这里我们就对DNN的正则化方法做一个总结。

2. DNN的L1和L2正则化

想到正则化,我们首先想到的就是L1正则化和L2正则化。L1正则化和L2正则化原理类似,这里重点讲述DNN的L2正则化。

而DNN的L2正则化通常的做法是只针对与线性系数矩阵\(W\),而不针对偏倚系数\(b\)。利用我们之前的机器学习的知识,我们很容易可以写出DNN的L2正则化的损失函数。

假如我们的每个样本的损失函数是均方差损失函数,则所有的m个样本的损失函数为:

\[
J(W,b) = \frac{1}{2m}\sum\limits_{i=1}^{m}||a^L-y||_2^2
\]
则加上了L2正则化后的损失函数是

\[
J(W,b) = \frac{1}{2m}\sum\limits_{i=1}^{m}||a^L-y||_2^2 + \frac{\lambda}{2m}\sum\limits_{l=2}^L||w||_2^2
\]
其中,$\lambda\(1即我们的正则化超参数,实际使用时需要调参。而\)w\(为所有权重矩阵\)W$的所有列向量。

如果使用上式的损失函数,进行反向传播算法时,流程和没有正则化的反向传播算法完全一样,区别仅仅在于进行梯度下降法时,W的更新公式。

回想我们在DNN神经网络的反向更新(BP)中,\(W\)的梯度下降更新公式为:

\[
W^l = W^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}(a^{x, l-1})^T
\]
则加入L2正则化以后,迭代更新公式变成:

\[
W^l = W^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}(a^{i, l-1})^T -\alpha \lambda W^l
\]
注意到上式中的梯度计算中\(\frac{1}{m}\)我忽略了,因为\(\alpha\)是常数,而除以\(m\)也是常数,所以等同于用了新常数\(\alpha\)来代替\(\frac{\alpha}{m}\)。进而简化表达式,但是不影响损失算法。

类似的L2正则化方法可以用于交叉熵损失函数或者其他的DNN损失函数,这里就不累述了。

3. DNN通过集成学习的思路正则化

除了常见的L1和L2正则化,DNN还可以通过集成学习的思路正则化。在集成学习原理中,我们讲到集成学习有Boosting和Bagging两种思路。而DNN可以用Bagging的思路来正则化。常用的机器学习Bagging算法中,随机森林是最流行的。它 通过随机采样构建若干个相互独立的弱决策树学习器,最后采用加权平均法或者投票法决定集成的输出。在DNN中,我们一样使用Bagging的思路。不过和随机森林不同的是,我们这里不是若干个决策树,而是若干个DNN的网络。

首先我们要对原始的\(m\)个训练样本进行有放回随机采样,构建\(N\)组\(m\)个样本的数据集,然后分别用这\(N\)组数据集去训练我们的DNN。即采用我们的前向传播算法和反向传播算法得到N个DNN模型的\(W,b\)参数组合,最后对\(N\)个DNN模型的输出用加权平均法或者投票法决定最终输出。

不过用集成学习Bagging的方法有一个问题,就是我们的DNN模型本来就比较复杂,参数很多。现在又变成了\(N\)个DNN模型,这样参数又增加了\(N\)倍,从而导致训练这样的网络要花更加多的时间和空间。因此一般N的个数不能太多,比如5-10个就可以了。

4. DNN通过Dropout正则化

这里我们再讲一种和Bagging类似但是又不同的正则化方法:Dropout。

所谓的Dropout指的是在用前向传播算法和反向传播算法训练DNN模型时,一批数据迭代时,随机的从全连接DNN网络中去掉一部分隐藏层的神经元。

比如我们本来的DNN模型对应的结构是这样的:

在对训练集中的一批数据进行训练时,我们随机去掉一部分隐藏层的神经元,并用去掉隐藏层的神经元的网络来拟合我们的一批训练数据。如下图,去掉了一半的隐藏层神经元:

然后用这个去掉隐藏层的神经元的网络来进行一轮迭代,更新所有的\(W,b\)。这就是所谓的dropout。

当然,dropout并不意味着这些神经元永远的消失了。在下一批数据迭代前,我们会把DNN模型恢复成最初的全连接模型,然后再用随机的方法去掉部分隐藏层的神经元,接着去迭代更新\(W,b\)。当然,这次用随机的方法去掉部分隐藏层后的残缺DNN网络和上次的残缺DNN网络并不相同。

总结下dropout的方法: 每轮梯度下降迭代时,它需要将训练数据分成若干批,然后分批进行迭代,每批数据迭代时,需要将原始的DNN模型随机去掉部分隐藏层的神经元,用残缺的DNN模型来迭代更新\(W,b\)。每批数据迭代更新完毕后,要将残缺的DNN模型恢复成原始的DNN模型。

从上面的描述可以看出dropout和Bagging的正则化思路还是很不相同的。dropout模型中的W,b是一套,共享的。所有的残缺DNN迭代时,更新的是同一组\(W,b\);而Bagging正则化时每个DNN模型有自己独有的一套\(W,b\)参数,相互之间是独立的。当然他们每次使用基于原始数据集得到的分批的数据集来训练模型,这点是类似的。

使用基于dropout的正则化比基于bagging的正则化简单,这显而易见,当然天下没有免费的午餐,由于dropout会将原始数据分批迭代,因此原始数据集最好较大,否则模型可能会欠拟合。

5. DNN通过增强数据集正则化

增强模型泛化能力最好的办法是有更多更多的训练数据,但是在实际应用中,更多的训练数据往往很难得到。有时候我们不得不去自己想办法能无中生有,来增加训练数据集,进而得到让模型泛化能力更强的目的。

对于我们传统的机器学习分类回归方法,增强数据集还是很难的。你无中生有出一组特征输入,却很难知道对应的特征输出是什么。但是对于DNN擅长的领域,比如图像识别,语音识别等则是有办法的。以图像识别领域为例,对于原始的数据集中的图像,我们可以将原始图像稍微的平移或者旋转一点点,则得到了一个新的图像。虽然这是一个新的图像,即样本的特征是新的,但是我们知道对应的特征输出和之前未平移旋转的图像是一样的。

6. 总结

DNN的正则化的方法是很多的,还是持续的研究中。在Deep Learning这本书中,正则化是洋洋洒洒的一大章。里面提到的其他正则化方法有:Noise Robustness, Adversarial Training,Early Stopping等。如果大家对这些正则化方法感兴趣,可以去阅读Deep Learning这本书中的第七章。

(欢迎转载,转载请注明出处。欢迎沟通交流: [email protected])

原文地址:https://www.cnblogs.com/huangyc/p/10111589.html

时间: 2024-10-18 21:31:52

3. DNN神经网络的正则化的相关文章

2. DNN神经网络的反向更新(BP)

1. DNN神经网络的前向传播(FeedForward) 2. DNN神经网络的反向更新(BP) 1. 前言 DNN前向传播介绍了DNN的网络是如何的从前向后的把数据传递过去的,但是只有这个过程还不够,我们还需要想办法对所有参数进行一个梯度的更新,才能使得网络能够慢慢的学习到新的东西. 在神经网络中有一种通用的方法来更新参数,叫做反向更新BP. 2. DNN反向更新过程 根据前面的前向传播的过程我们得到了一个传播公式,其中\(\sigma\)是激活函数,对具体的函数不做要求,可以是线性激活函数,

79、tensorflow计算一个五层神经网络的正则化损失系数、防止网络过拟合、正则化的思想就是在损失函数中加入刻画模型复杂程度的指标

''' Created on Apr 20, 2017 @author: P0079482 ''' import tensorflow as tf #获取一层神经网络边上的权重,并将这个权重的L2正则化损失加入名称为'losses'的集合中 def get_weight(shape,lambda1): #生成一个变量 var = tf.Variable(tf.random_normal(shape),dtype=tf.float32) #add_to_collection函数将这个新生成变量的L

神经网络DNN ——正则化

一.过拟合与正则化作用 1.先了解什么是过拟合 了解什么是过拟合问题,以下面图片为例,我们能够看到有两个类别,蓝色是分类曲线模型. 欠拟合:图1分类,不能很好的将X和O很好的分类,属于欠拟合. 正拟合:图2有两个X被误分类,但是大部分数据都能很好的分类,误差在可接受范围内,分类效果好,属于良好的拟合模型. 过拟合:图3虽然能够全部分类正确,但分类曲线明显过于复杂,模型学习的时候学习了过多的参数项,但其中某些参数项是无用的特征.当我们进行识别测试集数据时,就需要提供更多的特征,如果测试集包含海量的

卷积神经网络(CNN)模型结构

卷积神经网络(CNN)模型结构 转载:http://www.cnblogs.com/pinard/p/6483207.html 看到的一片不错的文章,先转过来留着,怕以后博主删了.哈哈哈 在前面我们讲述了DNN的模型与前向反向传播算法.而在DNN大类中,卷积神经网络(Convolutional Neural Networks,以下简称CNN)是最为成功的DNN特例之一.CNN广泛的应用于图像识别,当然现在也应用于NLP等其他领域,本文我们就对CNN的模型结构做一个总结. 在学习CNN前,推荐大家

stanford coursera 机器学习编程作业 exercise4--使用BP算法训练神经网络以识别阿拉伯数字(0-9)

在这篇文章中,会实现一个BP(backpropagation)算法,并将之应用到手写的阿拉伯数字(0-9)的自动识别上. 训练数据集(training set)如下:一共有5000个训练实例(training instance),每个训练实例是一个400维特征的列向量(20*20 pixel image).用 X 矩阵表示整个训练集,则 X 是一个 5000*400 (5000行 400列)的矩阵 另外,还有一个5000*1的列向量 y ,用来标记训练数据集的结果.比如,第一个训练实例对应的输出

随笔杂谈1

因为快要毕业了嘛,就找了份软件实习生的工作,九月20号面的试,然后21号就开始上班了:第一个礼拜不清楚自己要做什么,感觉有点糟糕,云里雾里的,公司是创业初期的小公司,老板是做销售的. 然后第二个礼拜的话,就大致了解了工作内容了.其实我们公司主推的是一款使用了DNN神经网络算法的芯片,它的主要功能就是对用户的语音进行识别处理,然后将信息整合成单片机可以识别的数据,通过相对应的协议发送给家用电器上的单片机:然后那个芯片是其他公司的,部分面向硬件的代码不开源,大部分处理数据的代码给我们公司,代码注释基

信号为E时,如何让语音识别脱“网”而出?

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯教育云发表于云+社区专栏 一般没有网络时,语音识别是这样的 ▽ 而同等环境下,嵌入式语音识别,是这样的 ▽ 不仅可以帮您边说边识.出口成章,有个性化名字的时候也难不倒它. 这就是嵌入式语音识别的魅力. 本文将从微信智聆的嵌入式语音识别引擎的实现和优化, 介绍嵌入式语音识别的技术选型. 01 语音识别,大体是这么来的 语音识别,能让机器"听懂"人类的语音,把说话内容识别为对应文本. 开始于上世纪50年代 从最初的小词量

深度神经网络DNN的多GPU数据并行框架 及其在语音识别的应用

深度神经网络(Deep Neural Networks, 简称DNN)是近年来机器学习领域中的研究热点,产生了广泛的应用.DNN具有深层结构.数千万参数需要学习,导致训练非常耗时.GPU有强大的计算能力,适合于加速深度神经网络训练.DNN的单机多GPU数据并行框架是腾讯深度学习平台的一部分,腾讯深度学习平台技术团队实现了数据并行技术加速DNN训练,提供公用算法简化实验过程.对微信语音识别应用,在模型收敛速度和模型性能上都取得了有效提升--相比单GPU 4.6倍加速比,数十亿样本的训练数天收敛,测

【原创】深度神经网络(Deep Neural Network, DNN)

线性模型通过特征间的现行组合来表达“结果-特征集合”之间的对应关系.由于线性模型的表达能力有限,在实践中,只能通过增加“特征计算”的复杂度来优化模型.比如,在广告CTR预估应用中,除了“标题长度.描述长度.位次.广告id,cookie“等这样的简单原始特征,还有大量的组合特征(比如”位次-cookie“ 表示用户对位次的偏好).事实上,现在很多搜索引擎的广告系统用的都是Logistic Regression模型(线性),而模型团队最重要的工作之一就是“特征工程 (feature engineer