出处:数据科学家养成记 深度学习笔记4:深度神经网络的正则化

恍恍惚惚,又20天没写了。今天笔者要写的是关于机器学习和深度学习中的一项关键技术:正则化。相信在机器学习领域摸爬滚打多年的你一定知道正则化是防止模型过拟合的核心技术之一,关于欠拟合和过拟合的问题,本篇笔者就不再展开来说,笔者年初就在一篇文章中详细通俗地阐述了过拟合的相关问题。想要看的朋友猛戳谈谈过拟合

总的来说,监督机器学习的核心原理莫过于如下公式:

该公式可谓是机器学习中最核心最关键最能概述监督学习的核心思想的公式了:所有的有监督机器学习,无非就是正则化参数的同时最小化经验误差函数。最小化经验误差是为了极大程度的拟合训练数据,正则化参数是为了防止过分的拟合训练数据。你看,多么简约数学哲学。正如之前所说,监督机器学习是为了让我们建立的模型能够发现数据中普遍的一般的规律,这个普遍的一般的规律无论对于训练集还是未知的测试集,都具有较好的拟合性能。通俗点举例就是,考试能力很强,应用能力很差,或者是模拟考很强,高考却一般。

先不扯远了,继续回到公式。第一项经验误差函数在机器学习中无疑地位重要,但它不是笔者今天要讲的,今天要讲的是公式的第二项:正则化项。第二项中 λ 为正则化系数,通常是大于 0 的,是一种调整经验误差项和正则化项之间关系的系数。λ = 0 时相当于该公式没有正则化项,模型全力讨好第一项,将经验误差进行最小化,往往这也是最容易发生过拟合的时候。随着 λ 逐渐增大,正则化项在模型选择中的话语权越来越高,对模型的复杂性的惩罚也越来越厉害。所以,在实际的训练过程中,λ 作为一种超参数很大程度上决定了模型生死。

L1 和 L2 范数

系数 λ 说完了,然后就是正则化项,正则化项形式有很多,但常见的也就是 L1 和 L2 正则化。下面笔者就带大家好好拾掇拾掇这些个 L1 L2。

在说常见的 L1 和 L2 之前,先来看一下 L0 正则化。L0 正则化也就是 L0 范数,即矩阵中所有非 0 元素的个数。如何我们在正则化过程中选择了 L0 范数,那该如何理解这个 L0 呢?其实非常简单,L0 范数就是希望要正则化的参数矩阵 W 大多数元素都为 0。如此简单粗暴,让参数矩阵 W 大多数元素为 0 就是实现稀疏而已。说到这里,权且打住,想必同样在机器学习领域摸爬滚打的你一定想问,据我所知稀疏性不通常都是用 L1 来实现的吗?这里个中缘由笔者不去细讲了,简单说结论:在机器学习领域,L0 和 L1 都可以实现矩阵的稀疏性,但在实践中,L1 要比 L0 具备更好的泛化求解特性而广受青睐。先说了 L1,但还没解释 L1 范数是什么,L1 范数就是矩阵中各元素绝对值之和,正如前述所言,L1 范数通常用于实现参数矩阵的稀疏性。至于为啥要稀疏,稀疏有什么用,通常是为了特征选择和易于解释方面的考虑。

再来看 L2 范数。相较于 L0 和 L1,其实 L2 才是正则化中的天选之子。在各种防止过拟合和正则化处理过程中,L2 正则化可谓风头无二。L2 范数是指矩阵中各元素的平方和后的求根结果。采用 L2 范数进行正则化的原理在于最小化参数矩阵的每个元素,使其无限接近于 0 但又不像 L1 那样等于 0,也许你又会问了,为什么参数矩阵中每个元素变得很小就能防止过拟合?这里我们就拿深度神经网络来举例说明吧。在 L2 正则化中,如何正则化系数变得比较大,参数矩阵 W 中的每个元素都在变小,线性计算的和 Z 也会变小,激活函数在此时相对呈线性状态,这样就大大简化了深度神经网络的复杂性,因而可以防止过拟合。

至于 L1 和 L2,江湖上还有一些混名,L1 就是江湖上著名的 lasso,L2 呢则是岭回归。二者都是对回归损失函数加一个约束形式,lasso 加的是 L1 范数,岭回归加的是 L2 范数。可以从几何直观上看看二者的区别。

L1 和 L2 的下降速度

L1 和 L2 的模型空间

神经网络的正则化

说了半天的范数,下面我们就来看看在神经网络中如何进行正则化操作防止过拟合。为了跟前面笔记保持一致,我们在神经网络训练过程中继续采用交叉熵损失函数:

加了正则化项之后,损失函数形式如上所示,损失函数变了,反向传播的梯度计算也就变了,相应的反向传播也需要重新定义函数。

带正则化项的损失函数的定义:

def compute_cost_with_regularization(A3, Y, parameters, lambd):    """Implement the cost function with L2 regularization. See formula (2) above.Arguments:A3 -- post-activation, output of forward propagation, of shape (output size, number of examples)Y -- "true" labels vector, of shape (output size, number of examples)parameters -- python dictionary containing parameters of the modelReturns:cost - value of the regularized loss function (formula (2))"""m = Y.shape[1]W1 = parameters["W1"]W2 = parameters["W2"]W3 = parameters["W3"]cross_entropy_cost = compute_cost(A3, Y) # This gives you the cross-entropy part of the costL2_regularization_cost = 1/m * lambd/2 * (np.sum(np.square(W1))+np.sum(np.square(W2))+np.sum(np.square(W3)))cost = cross_entropy_cost + L2_regularization_cost    return cost

反向传播的函数定义:

def backward_propagation_with_regularization(X, Y, cache, lambd):    """Implements the backward propagation of our baseline model to which we added an L2 regularization.Arguments:X -- input dataset, of shape (input size, number of examples)Y -- "true" labels vector, of shape (output size, number of examples)cache -- cache output from forward_propagation()lambd -- regularization hyperparameter, scalarReturns:gradients -- A dictionary with the gradients with respect to each parameter, activation and pre-activation variables"""m = X.shape[1](Z1, A1, W1, b1, Z2, A2, W2, b2, Z3, A3, W3, b3) = cachedZ3 = A3 - YdW3 = 1./m * np.dot(dZ3, A2.T) +  lambd/m * W3db3 = 1./m * np.sum(dZ3, axis=1, keepdims = True)dA2 = np.dot(W3.T, dZ3)dZ2 = np.multiply(dA2, np.int64(A2 > 0))dW2 = 1./m * np.dot(dZ2, A1.T) + lambd/m * W2db2 = 1./m * np.sum(dZ2, axis=1, keepdims = True)dA1 = np.dot(W2.T, dZ2)dZ1 = np.multiply(dA1, np.int64(A1 > 0))dW1 = 1./m * np.dot(dZ1, X.T) + lambd/m * W1db1 = 1./m * np.sum(dZ1, axis=1, keepdims = True)gradients = {"dZ3": dZ3, "dW3": dW3, "db3": db3,"dA2": dA2,                 "dZ2": dZ2, "dW2": dW2, "db2": db2, "dA1": dA1, "dZ1": dZ1, "dW1": dW1, "db1": db1}    return gradients

在实例中,加了正则化项和没加正则化项的模型分类结果可如图所见:

未经正则化处理的分类模型结果

加上正则化后的模型分类结果

效果显而易见,加了正则化之后,神经网络的过拟合情况得到极大的缓解。

参考资料:

https://www.coursera.org/learn/machine-learning

https://blog.csdn.net/zouxy09/article/details/24971995

https://www.deeplearning.ai/

深度学习笔记4:深度神经网络的正则化相关推荐

  1. 深度学习笔记:卷积神经网络的可视化--卷积核本征模式

    目录 1. 前言 2. 代码实验 2.1 加载模型 2.2 构造返回中间层激活输出的模型 2.3 目标函数 2.4 通过随机梯度上升最大化损失 2.5 生成滤波器模式可视化图像 2.6 将多维数组变换 ...

  2. 2020-4-22 深度学习笔记20 - 深度生成模型 5 (有向生成网络--sigmoid信念网络/可微生成器网络/变分自编码器VAE/生产对抗网络GAN/生成矩匹配网络)

    第二十章 深度生成模型 Deep Generative Models 中文 英文 2020-4-17 深度学习笔记20 - 深度生成模型 1 (玻尔兹曼机,受限玻尔兹曼机RBM) 2020-4-18 ...

  3. 2020-4-20 深度学习笔记20 - 深度生成模型 3 (实值数据上的玻尔兹曼机)

    第二十章 深度生成模型 Deep Generative Models 中文 英文 2020-4-17 深度学习笔记20 - 深度生成模型 1 (玻尔兹曼机,受限玻尔兹曼机RBM) 2020-4-18 ...

  4. 深度学习笔记:卷积神经网络的Tensorflow实现

    文章出处:深度学习笔记11:利用numpy搭建一个卷积神经网络 免费视频课程:Hellobi Live | 从数据分析师到机器学习(深度学习)工程师的进阶之路 在上一讲中,我们学习了如何利用 nump ...

  5. 【深度学习笔记1】神经网络的搭建与简单应用

    目录 推荐阅读 前言 神经网络与深度学习 使用Tensorflow搭建神经网络 环境搭建和导包遇到的问题: 问题1:Duplicate registrations for type 'optimize ...

  6. [深度学习笔记(1)]深度学习入门

    本系列是博主刚开始接触深度学习时写的一些笔记,写的很早了一直没有上传,趁着假期上传一下,作为分享,希望能帮助到你. 目录 前言 一.什么是深度学习 二.深度学习的应用 三.深度神经网络的难题 3.1 ...

  7. 1.3)深度学习笔记------浅层神经网络

    目录 1)Neural Network Overview 2)Neural Network Representation 3)Computing a Neural Network's Output(重 ...

  8. 吴恩达深度学习笔记- lesson4 卷积神经网络

    文章目录 Week 1 卷积神经网络基础 4.1.1 计算机视觉(Computer vision) 4.1.2 边缘检测示例(Edge detection example) 4.1.3 更多边缘检测内 ...

  9. 深度学习 笔记(线性神经网络)

    3.1. 线性回归 - 动手学深度学习 2.0.0-beta1 documentation 目录 3.1. 线性回归 - 动手学深度学习 2.0.0-beta1 documentation 3.1 线 ...

  10. 深度学习笔记:卷积神经网络的可视化--特征图

    目录 1. 前言 2. 模型的训练 3. 特征图可视化 3.1 加载保存的模型¶ 3.2 图像预处理:将图像转换为张量 3.3 例化一个模型用于返回各层激活输出(即feature map) 3.5 各 ...

最新文章

  1. 损坏防浪涌电插排内部电路
  2. 树的Prufer 编码和最小生成树计数
  3. ElasticSearch-7.10版本最新万字长文教程【距离搞懂ELK核心你只差这一片文章】
  4. 基本响应性的Web设计测试工具
  5. java 静态 编译_Java中的动态和静态编译
  6. 实时判断数据流中的第K大元素
  7. 快速掌握——LCD1602液晶显示(多组实验,附带源程序)
  8. 数据包络分析-两阶段网络DEA(two stage network)
  9. 大牛直播sdk简单播放端demo使用
  10. 锐捷无线项目调试(AC调试)
  11. QtSQL的使用心得
  12. python msp430_MSP430
  13. 汉字字形码是计算机用来实现对汉字的输出,汉字编码字形码
  14. 所有大学都教Java,培训班也输出了大量Java程序员,为什么社会上的Java程序员还没有饱和?
  15. BZOJ3168. [HEOI2013]钙铁锌硒维生素(线性代数+二分图匹配)
  16. Android Studio导入第三方sdk
  17. 【深度学习】什么是解耦?
  18. is not marked as executable. If this was downloaded or copied form an untrusted source
  19. GUID分区和MBR分区简介
  20. 5.3.4 消费组稳定后,原有消费者重新加入消费组

热门文章

  1. iapp启动图代码_代码神器:拒绝重复编码,这款IDEA插件了解一下.....
  2. 个人计算机与手机的区别,手机与电脑的CPU是一回事吗?一共有六大区别,看看你知道多少!...
  3. python顺序控制语句_Python学习之 流程控制语句
  4. python中break和continue区别_Shell break和continue跳出循环详解
  5. 编码utf-8的不可映射字符_不要在 MySQL 中使用“utf8”,请使用“utf8mb4”
  6. mysql db 复制_MySQL管理工具MySQL Utilities — mysqldbcopy(6)
  7. php内存映射,如何用ZwMapViewOfSection将Driver分配的内存映射到App空间?
  8. mf怎么使mysql信息分区_细聊MySQL的分区功能
  9. 数据服务器性能测算依据,如何对服务器性能计算的公式参考(tpmc-tpcc).pdf
  10. 计算机在管理会计中的应用毕业论文,计算机在管理会计中的应用写毕业论文用的,帮帮找..._中级会计职称_帮考网...