/--->【DL-CV】更高级的参数更新/优化(一)
【DL-CV】批量归一化(BN算法)<前篇---后篇>
                      /--->【DL-CV】更高级的参数更新/优化(二)


在损失函数那篇文章中,我们引入了正则化并简单介绍了L2正则化。其作用是防止网络过拟合,提高网络的泛化能力。本文将介绍一些防止过拟合的方法,

过拟合

所谓过拟合,就是网络对训练集极度适应,以至于训练出来的权重几乎只服务于训练集,导致在训练好的网络在跑训练集的时候表现得很好(准确率高),而跑测试集或其他数据表现得很差。过拟合的出现将降低网络的泛化能力,是非常糟糕的事情。


正则化是抑制网络过拟合,提高网络泛化能力的一种方法。Dropout是其替代品,也能防止过拟合提高泛化能力。下面介绍这两种方法

正则化

正则化通过在损失函数上加上正则化损失来实现,根据正则化损失定义的不同,正则化又能分为好几种。

L2正则化

$$R(W)=\sum_k \sum_l W^2_{k,l}$$
L2正则化是是最常用的正则化方法,即对于网络中的每个权重值$w$,向损失函数中增加一个$\frac{1}{2}\lambda w^2$作为正则化惩罚,其中$\lambda$是正则化强度;乘了个$\frac{1}{2}$是很常见的事,因为这样式子关于 $w$ 梯度就是 $\lambda w$ 而不是 $2\lambda w$ 了。

L2正则化可以直观地理解为对于大数值的权重向量进行严厉惩罚(平方惩罚),驱使权重往更加均匀的方向发展而不是某些权重绝对值很大某些权重绝对值很小,这样能提高网络的泛化能力。

L1正则化

$$R(W)=\sum_k \sum_l| W_{k,l}|$$
L1正则化是另一个常用的正则化方法,即对于网络中每个权重值$w$,向损失函数增加一个$\lambda|w|$作为其正则化惩罚,其中$\lambda$是正则化强度。

L1正则化相对于L2正则化对大数值权重的惩罚没那么重(没有平方惩罚),他会让权值在最训练的过程中非常接近零(L2则是让权重变成分散的小数值)。在实践中,如果不是特别关注某些明确的特征选择,一般说来L2正则化都会比L1正则化效果好


L1正则化也可以和L2正则化组合使用变成$\lambda_1|w|+\lambda_2w^2$,这也被称作Elastic net regularizaton。不过没这么常用就是了

随机失活(Dropout)

Dropout堪称对付过拟合的超级武器,其使用简单,效果强劲。我们先来介绍dropout的使用:

  • 在训练的时候,Dropout的实现方法是让隐层神经元以超参数$1-p$的概率被设置为0,$p$的概率维持激活值(随机失活,加入随机性)
  • 在预测时不使用随机失活,但是每层的输出要乘以$p$(因为训练时每层只有有p的激活值被维持,为维持同样的输出,预测时每层激活值要乘以p,抵消随机性)

Dropout可以理解为,在每次训练时,随机抽取一部分神经元组成一个子网络,基于输入数据只更新子网络的参数(子网络并不相互独立,因为他们共享着参数)。最后在测试时不使用随机失活,可以理解为对子网络们做了模型集成,以此来计算出一个平均的预测。

p = 0.5 # 激活神经元的概率. p值更高 = 随机失活更弱def train_step(X):""" X中是输入数据 """# 3层neural network的前向传播H1 = np.maximum(0, np.dot(X, W1 ) + b1)U1 = np.random.rand(*H1.shape) < p # 第一个随机失活遮罩H1 *= U1 # drop!H2 = np.maximum(0, np.dot(H1, W2) + b2)U2 = np.random.rand(*H2.shape) < p # 第二个随机失活遮罩H2 *= U2 # drop!out = np.dot(H2, W3) + b3# 反向传播略# 参数更新略def predict(X):H1 = np.maximum(0, np.dot(W1, X) + b1) * p # 注意:激活数据要乘以pH2 = np.maximum(0, np.dot(W2, H1) + b2) * p # 注意:激活数据要乘以pout = np.dot(W3, H2) + b3

Dropout的理解

一种理解是Dropout避免了特征间的相互适应。如上图,假如网络中的神经元学到了如上特征,“有耳朵”,“有尾巴”,“毛毛的”等等特征,这些特征组合起来判断是否是猫。正常来说(作为人来说),特征越多越好,但在这种情况下(深度学习),完全依靠这些特征将可能导致过拟合的发生。使用Dropout后,网络的部分连接将被中断,网络不能依赖这些特征的组合来给出结果,而是只能使用零散的特征来给出判断,这在某种程度上防止了过拟合,提高了网路的泛化能力。

更多解释和理解可参考此文

推荐:反向随机失活(Inverted Dropout)

上面提到的Dropout方法在测试时每层激活值是要乘$p$的,额外的乘法操作会降低测试时的效率。所以更多时候我们会使用一个叫Inverted Dropout 的方法,他把随机性抵消的操作从预测阶段搬到了训练阶段:在训练阶段的Dropout操作后,我们对神经元的激活值除以$p$来抵消随机性。这样预测阶段会更高效。

p = 0.5 # 激活神经元的概率. p值更高 = 随机失活更弱def train_step(X):""" X中是输入数据 """# 3层neural network的前向传播H1 = np.maximum(0, np.dot(X, W1 ) + b1)U1 = (np.random.rand(*H1.shape) < p) / p # 第一个随机失活遮罩,/pH1 *= U1 # drop!H2 = np.maximum(0, np.dot(H1, W2) + b2)U2 = (np.random.rand(*H2.shape) < p) / p # 第二个随机失活遮罩H2 *= U2 # drop!out = np.dot(H2, W3) + b3# 反向传播略# 参数更新略def predict(X):H1 = np.maximum(0, np.dot(X, W1) + b1)  # 免去*pH2 = np.maximum(0, np.dot(H1, W2) + b2) out = np.dot(H2, W3) + b3

除了将神经元随机置0的Dropout外,还有将权重值随机置0的DropConnect,兴趣自查

【DL-CV】正则化,Dropout相关推荐

  1. keras添加正则化全连接_第16章 Keras使用Dropout正则化防止过拟合

    Dropout虽然简单,但可以有效防止过拟合.本章关于如何在Keras中使用Dropout.本章包括: dropout的原理 dropout的使用 在隐层上使用dropout 我们开始吧. 16.1 ...

  2. 2.1.2 Dropout正则化以及其他正则化

    Dropout正则化 Dropout介绍 除了L2正则化之外,还有一个很重要的正则化方法叫随机失活(Dropout),下面,我们来了解一下. 如图所示,假设网络中的每一层的节点都以抛硬币的形式来设置概 ...

  3. 抑制过拟合之正则化与Dropout

    避免过拟合: 1.增大数据集合 – 使用更多的数据,噪声点比减少(减少数据扰动所造成的影响) 2.减少数据特征 – 减少数据维度,高维空间密度小(减少模型复杂度) 3.正则化 / dropout / ...

  4. keras添加L1正则化,L2正则化和Dropout正则化及其原理

    一.什么是正则化,用来干嘛的? 正则化(regularization),是指在线性代数理论中,不适定问题通常是由一组线性代数方程定义的,而且这组方程组通常来源于有着很大的条件数的不适定反问题.大条件数 ...

  5. python正则_正则化方法及Python实现

    正则化有助于克服过度拟合模型的问题.过度拟合是偏差和方差平衡的概念.如果过度拟合,机器学习模型将具有较低的准确性.当我们的机器学习模型试图从数据中学习更多属性时,就会添加来自训练数据的噪声.这里的噪声 ...

  6. 吴恩达深度学习之二《改善深层神经网络:超参数调试、正则化以及优化》学习笔记

    一.深度学习的实用层面 1.1 训练/开发/测试集 机器学习时代,数据集很小,可能100.1000.10000条,这种级别.可以按 70%.30% 划分训练集和测试集,训练后直接用测试集评估.或者按 ...

  7. Keras中Dropout的用法详解

    本文借鉴整理三篇文章,比较全面的用法总结了,看完本文无需再查阅其他资料 一.Keras 中使用 Dropout 正则化减少过度拟合 Dropout正则化是最简单的神经网络正则化方法.其原理非常简单粗暴 ...

  8. python正则化函数_正则化方法及Python实现

    正则化有助于克服过度拟合模型的问题.过度拟合是偏差和方差平衡的概念.如果过度拟合,机器学习模型将具有较低的准确性.当我们的机器学习模型试图从数据中学习更多属性时,就会添加来自训练数据的噪声.这里的噪声 ...

  9. 985 CV 找不到工作? 4 点诚恳建议

    观点讨论 Editor:啸林 From:新智元 [新智元导读]985研究生,学计算机视觉,出来后找不到工作?新智元带你看看这个70万浏览量问题下的答案干货:找工作难,是因为前两年AI领域泡沫太大.然而 ...

  10. 深度学习中的正则化技术(附Python代码)

    作者:SHUBHAM JAIN 翻译:和中华 校对:丁楠雅 本文约3500字,建议阅读20分钟. 本文简单介绍了什么是正则化以及在深度学习任务中可以采用哪些正则化技术,并以keras代码具体讲解了一个 ...

最新文章

  1. body里写注释 postman_HTTP Status 415 – Unsupported Media Type(使用@RequestBody后postman调接口报错)...
  2. linux下的PHP和windows下的php的区别
  3. Android 友盟分享躺过的几个坑,大坑,坑爹啊
  4. 愚人节整人软件测试自学,2020愚人节整蛊整人攻略大全
  5. CodeForces - 1339D Edge Weight Assignment(思维)
  6. ecshop flow.php?step=checkout,【原创文章】推荐两种调试ecshop php程序日志记录的方法...
  7. 13日直播预告丨Oracle多套库整合到多租户平台案例分享
  8. opencv3.1.0 编译H3516A 成功后调用时出现的问题
  9. 华为畅享8的悬浮窗在哪里_1299元起,更大超清屏幕+强劲续航 华为畅享20 SE发布...
  10. php分配变量,php之smarty分配变量
  11. android 去广告浏览器,Adblock Browser(去广告浏览器) V1.3.1 安卓版
  12. 计算机桌面图标扁了,电脑桌面图标及文字变扁怎么办
  13. MATLAB之特征值和特征向量
  14. WinForm下多层架构的实现
  15. api接口—闲鱼搜索的数据
  16. Qt延时和startTimer
  17. Mybatis初学一个问题困扰一下午 The error may exist in com/.........
  18. macOS上的改键指南--使用Karabiner
  19. golang 实现华容道
  20. 冯唐:成大事者,必经的3个阶段

热门文章

  1. linux centos history 查看命令历史 显示时间戳
  2. 笨办法学python 3 48题_附录练习 8-10 笨办法学Python3
  3. oracle 表收缩,Oracle 收缩表大小 Oracle Shrink Table
  4. iyiw oracle_Oracle 单行函数
  5. 星型模型 3nf的区别_数据库和数据仓库的区别和联系
  6. java异常机制_全面理解java异常机制
  7. JAVA转smali软件_Java2Smali(Java代码转Smali工具)
  8. python压缩文件_Python压缩及解压文件
  9. logback日志pattern_Springboot整合log4j2日志全解
  10. mysql存储过程详细教程