如果你怀疑神经网络过度拟合了数据,即存在高方差问题,那么最先想到的方法可能就是正则化,另一个解决高方差的方法就是准备更多的数据,这也是非常可靠的办法,但你可能无法时时准备足够多的训练数据,或者获取更多数据的成本更高,但正则化通常有助于避免过度拟合,或减小网络误差,下面讲一下正则化的作用原理。

这里使用逻辑回归来实现这些设想,求成本函数J(w,b)J(w,b)J(w,b)的最小值,函数参数包含一些训练数据和不同数据中个体预测的损失,www和bbb是逻辑回归中的两个参数,www是一个多维度参数矢量,bbb是一个实数,在逻辑回归函数中加入正则化,只需添加参数λ\lambdaλ,也就是正则化参数,得到关于逻辑回归的正则化表达式如下所示:J(w,b)=1m∑i=1mL(y^(i),y(i))+λ2m∣∣w∣∣22J(w,b)=\frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}||w||_{2}^2J(w,b)=m1​i=1∑m​L(y^​(i),y(i))+2mλ​∣∣w∣∣22​∣∣w∣∣22=∑j=1nxwj2=wTw||w||_2^2=\sum_{j=1}^{n_x}w_j^2=w^Tw∣∣w∣∣22​=j=1∑nx​​wj2​=wTw此方法称为L2正则化,因为这里用了欧几里得法线,所以被称为向量参数W的L2范数。

为什么只正则化参数www,为什么不再加上参数bbb呢?可以这么做,只是习惯省略不写,因为www通常是一个高维参数矢量,已经可以表达高偏差问题,www可能含有很多参数,我们不可能拟合所有参数,而bbb只是单个数字,所以www几乎涵盖所有参数,而不是bbb。如果加了参数bbb,其实也没有什么太大影响,因为b只是众多参数中的一个,所以通常省略不计,但加上这个参数也是没影响的。

L2正则化是最常见的正则化表达式,可能听说过L1正则化,L1正则化加的不是L2范数,而是如下的表达式:J(w,b)=1m∑i=1mL(y^(i),y(i))+λ2m∣w∣J(w,b)=\frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}|w|J(w,b)=m1​i=1∑m​L(y^​(i),y(i))+2mλ​∣w∣这也称为参数www向量的L1范数,无论分母是mmm还是2m2m2m,它都是一个比例常量。如果用的是L1正则化,得到的www最终会是稀疏的,也就是说www向量中有很多0,有人说这样有利于压缩模型,因为集合中参数均为0,存储该模型所占用的内存更少。实际上,虽然L1正则化使模型变得稀疏,却没有降低太多存储内存,所以吴恩达先生认为这并不是L1正则化的目的,至少不是为了压缩模型。人们在训练模型时越来越倾向于使用L2正则化。

我们来看最后一个细节,KaTeX parse error: Undefined control sequence: \ambda at position 1: \̲a̲m̲b̲d̲a̲是正则化参数,我们通常使用验证集或交叉验证来配置这个参数,尝试各种各样的数据,寻找最好的参数。我们要考虑训练集之间的权衡,把参数正常值设置为较小值,这样可以避免过拟合。λ\lambdaλ是另外一个需要调整的超级参数,顺便说一下,为了方便编写代码,在python编程语言中,λ\lambdaλ是一个保留字段,编写代码时,我们删掉a,写成lambd,以免与python中的保留字段冲突,我们用lambd来代替lambda正则化参数。这就是在逻辑回归函数中实现L2正则化的过程。

如何在神经网络中实现L2正则化呢?神经网络含有一个成本函数,该函数包含从w[1],b[1]w^{[1],b^{[1]}}w[1],b[1]到w[L],b[L]w^{[L],b^{[L]}}w[L],b[L]的所有参数,字母L是神经网络所含的层数,在神经网络中加上正则化后的表达式为:J(w[1],b[1],...,w[l],b[l])=1m∑i=1mL(y^[i],y[i])+λ2m∑l=1L∣∣w[l]∣∣2J(w^{[1]},b^{[1]},...,w^{[l]},b^{[l]})=\frac{1}{m}\sum_{i=1}^mL(\hat{y}^{[i]},y^{[i]})+\frac{\lambda}{2m}\sum_{l=1}^L||w^{[l]}||^2J(w[1],b[1],...,w[l],b[l])=m1​i=1∑m​L(y^​[i],y[i])+2mλ​l=1∑L​∣∣w[l]∣∣2我们把∣∣w[l]∣∣2||w^{[l]}||^2∣∣w[l]∣∣2称为平方范数,这个范数矩阵被定义为矩阵中所有元素的平方求和,看下求和公式的具体参数。∣∣w[l]∣∣F2=∑i=1n[l−1]∑j=1n[l](wij[l])2||w^{[l]}||_F^2=\sum_{i=1}^{n^{[l-1]}}\sum_{j=1}^{n^{[l]}}(w_{ij}^{[l]})^2∣∣w[l]∣∣F2​=i=1∑n[l−1]​j=1∑n[l]​(wij[l]​)2第一个求和符号其iii值从1到n[l−1]n^{[l-1]}n[l−1],第二个求和符号其jjj值从1到n[l]n^{[l]}n[l],因为www是一个维度为(n[l−1],n[l])(n^{[l-1]},n^{[l]})(n[l−1],n[l])的多维矩阵,n[l−1]n^{[l-1]}n[l−1]表示隐藏单元的数量,n[l]n^{[l]}n[l]表示l层单元的数量,该矩阵范数被称为“佛罗贝尼乌斯范数”,用下标F标注,鉴于线性代数中一些神秘晦涩的原因,我们不称之为“矩阵L2范数∣∣⋅∣∣22||\cdot||_2^2∣∣⋅∣∣22​”,而称它为”佛罗贝尼乌斯范数”。矩阵L2范数听起来更自然,但鉴于一些大家无须知道的特殊原因,按照惯例,我们称之为“佛罗贝尼乌斯范数”,它表示一个矩阵中所有元素的平方和。

如何使用该范数实现梯度下降呢?用bp计算出dwdwdw的值,bp会给出损失函数JJJ对www的偏导数,实际上是dw[l]=∂J∂w[l]=∂J∂w[l]+λmw[l]dw^{[l]}=\frac{\partial J}{\partial w^{[l]}}=\frac{\partial J}{\partial w^{[l]}}+\frac{\lambda}{m}w^{[l]}dw[l]=∂w[l]∂J​=∂w[l]∂J​+mλ​w[l]参数的更新公式表示为w[l]=w[l]−αdw[l]w^{[l]}=w^{[l]}-\alpha dw^{[l]}w[l]=w[l]−αdw[l]使用新定义的dw[l]dw^{[l]}dw[l],该定义含有代价函数导数和相关参数,以及最后添加的额外正则项。

这也是L2正则化有时被称为“权重衰减”的原因,我们把加入正则项的损失函数的求导结果放进参数www的更新方程中,w[l]w^{[l]}w[l]的更新公式表示为:w[l]=w[l]−αλmw[l]−α∂J∂w[l]w^{[l]}=w^{[l]}-\frac{\alpha \lambda}{m}w^{[l]}-\alpha \frac{\partial J}{\partial w^{[l]}}w[l]=w[l]−mαλ​w[l]−α∂w[l]∂J​。该正则项说明,不管w[l]w^{[l]}w[l]是什么我们都试图让它变得更小,实际上相当于我们给矩阵www乘以了(1−αλm)(1-\frac{\alpha \lambda}{m})(1−mαλ​)倍的权重。矩阵www减去αλm\frac{\alpha \lambda}{m}mαλ​倍的它,也就是用这个系数乘于矩阵www,该系数小于1,。因此L2范数正则化也被称为“权重衰减”,因为它就像一般的梯度下降。

深度学习的实用层面 —— 1.4 正则化相关推荐

  1. 深度学习的实用层面 —— 1.9 正则化输入

    训练神经网络,其中一个加速训练的方法就是归一化输入. 假设我们有一个训练集,它有两个输入特征,所以输入特征x是二维的,如图是数据集的散点图,归一化输入需要两个步骤,第一步是零均值化,计算公式为μ=1m ...

  2. 吴恩达深度学习笔记5-Course2-Week1【深度学习的实用层面】

    改善深层神经网络:超参数调试.正则化以及优化 深度学习的实用层面 一.训练.验证.测试集 样本数据分成以下三个部分: 训练集(train set): 用于对模型进行训练. 验证集(hold-out c ...

  3. 3.深度学习的实用层面

    第一周:深度学习的实用层面 项目进展得一个关键性得因素就是划分高质量得训练集,验证集,测试集.这有助于提高循环迭代得效率.验证集也称为development set 也称为dev set. 验证集主要 ...

  4. 吴恩达【优化深度神经网络】笔记01——深度学习的实用层面

    文章目录 引言 一.训练集/验证集/测试集(Train/Dev/Test sets) 1. 数据集选择 2. 补充:交叉验证(cross validation) 二.偏差和方差(Bias/Varian ...

  5. 吴恩达《优化深度神经网络》精炼笔记(1)-- 深度学习的实用层面

    AI有道 不可错过的AI技术公众号 关注 吴恩达的深度学习专项课程的第一门课<神经网络与深度学习>的所有精炼笔记我已经整理完毕.迷路的小伙伴请见文章末尾的推荐阅读: 在接下来的几次笔记中, ...

  6. Coursera吴恩达《优化深度神经网络》课程笔记(1)-- 深度学习的实用层面

    红色石头的个人网站:redstonewill.com Andrew Ng的深度学习专项课程的第一门课<Neural Networks and Deep Learning>的5份笔记我已经整 ...

  7. 深度学习的实用层面 —— 1.3 机器学习基础

    初始化模型之后,首先要知道算法的偏差高不高,如果偏差较高,试着评估训练集或者训练数据的性能,如果偏差的确很高,甚至无法拟合训练集,那么你要做的就是选择一个新网络,比如含有更多隐层或者隐藏单元的网络,或 ...

  8. 吴恩达深度学习笔记 course 2 1.1~1.14 深度学习的实用层面

    1.1 Train/dev/test sets 在构建一个神经网络的时候我们往往需要设计很多参数,如:layers,learning rates ,acivation functions,hidden ...

  9. 深度学习的实用层面 —— 1.1 训练/开发/测试集

    在配置训练.验证和测试数据集的过程中做出正确决策会在很大程度上帮助大家创建高效的神经网络. 在训练神经网络时,我们需要做出很多决策,例如神经网络分多少层,每层含有多少个隐藏单元,学习速率是多少,各层采 ...

最新文章

  1. 使用Python,机器学习和深度学习的5个很棒的计算机视觉项目创意!
  2. 18种方法让你集中精力工作
  3. LOADRUNNER 登陆功能测试实例(转)
  4. 线程了解以及创建线程的Threading模块中的部分方法
  5. 连续两年入选Gartner公共云容器,阿里云在边缘容器方面做了什么?
  6. Mycat高级进阶---Mycat注解
  7. Adobe下周将推新补丁和新的更新模式
  8. 未找到uniwebview_UniWebView.dll
  9. LCD1602中文资料
  10. 境外电商-香港汇丰银行基础知识
  11. 使用和风天气接口获取天气信息
  12. ecno是什么的缩写_nbcs是什么意思的缩写?
  13. 十二种人生感悟(转贴)
  14. FreeRTOS动态创建任务
  15. Rethinking the Smaller-Norm-Less-Informative Assumption in Channel Pruning of Convolution Layers简记
  16. 7.STM32F407ZG串口通信配置流程
  17. 一些专业术语的中英文对照
  18. 如何编写接口测试用例
  19. github语法使用
  20. HTML 定位(position)

热门文章

  1. 网域高科家具行业网站开发管理系统
  2. 使用TLS安全的访问Minio服务​​​​​​​
  3. 什么样才能叫精通java_Java学到什么程度才能叫精通?
  4. java 课后习题 判断两个圆是否相交 圆和直线的位置关系
  5. cloudflare 利用API将域名批量解析到cloudflare
  6. 自动/持续部署Docker 的tomcat web项目(一)
  7. C#LeetCode刷题之#342-4的幂(Power of Four)
  8. Flask框架——上下文、flask_script扩展
  9. 数仓大法好!跨境电商 Shopee 的实时数仓之路
  10. 杀掉僵尸 MapReduce 任务的两种方式