NNDL: 改进神经⽹络的学习⽅法

机器学习(八):神经网络(1) (主要参考书籍《神经网络与深度学习》)1. 什么是神经网络1.1 从感知器说起……什么是感知器?很简单,前面我们已经说过了: output=sign(wTx)output=sign(w^Tx) 什么意思呢?我们有一些输入,我们会根据这些输入做出一个决定:YES OR NOT。我们可能会想这么简单有什么用呢?那我们得想一下电脑——CPU和人脑的组成了。先从简单的CPU说起:只需要简单与或非三个 阅读详情

万丈高楼平地起,反向传播是深度学习这栋大厦的基石,所以在这块花多少时间都是值得的

前面一章,我们深入理解了反向传播算法如何工作,本章的主要目的是改进神经网络的学习方法,本章涉及的技术包括:

  • 交叉熵代价函数
  • 四种称为规范化的⽅法(L1 和 L2 规范化,弃权和训练数据的⼈为扩展)
  • 更好的权重初始化⽅法
  • 如何选择神经网络的超参数

交叉熵代价函数

通过前面的学习,我们知道,神经网络一直在努力地让代价函数变小,现在我们抛出一个问题,代价函数从初始值到我们理想状态的值,这个过程所消耗的时间是怎样的情况呢?

对于人类来说,我们犯比较明显的错误的时候,改正的效果也很明显,神经网络也是这样的么?让我们通过下面的一个小例子来详细看看:

640?wx_fmt=png
ia_200002750

假设有这样一个神经元,我们希望当输入为1的时候,输出为0,让我们通过梯度下降的方式来训练权重和偏置,⾸先将权重和偏置初始化为0.6 和 0.9,前面我们说过,S型神经元的输出计算方式为:

输⼊,权重为,和偏置b的S型神经元的输出是:

将0.6 和 0.9带入,即可得到输出为:0.82,很显然和目标0相差甚远,那么就只能继续寻找最优解了,随着迭代期的增加,神经元的输出、权重、偏置和代价的变化如下⾯⼀系列图形所⽰:

640?wx_fmt=png
ia_200002751

可以看到,200次迭代后,输出已经满足我们的需求了,毕竟只要小于0.5我们都可以归为0,接下来再将初始权重和偏置都设置为2.0,此时初始输出为0.98,这是和⽬标值的差距相当⼤的,现在看看神经元学习的过程:

640?wx_fmt=png640?wx_fmt=png

这次可以明显地看到迭代150次左右没有很明显的变化,随后速度就快了起来。

这个例子引出了一个问题,包括在其他一般的神经网络中也会出现,为何会学习缓慢呢?我们在训练中应该怎么避免这个情况?思考一下,问题的原因其实很简单

权重和偏置是根据梯度下降的形式来更新其对应的值,学习缓慢就意味着代价函数的偏导数很小

让我们从数学公式的角度来理解这句话和上面的图,对于目前提供的单个样例的输入和输出:

再结合前面第一章讲的代价函数的定义:

  • w 表⽰所有的⽹络中权重的集合
  • b 是所有的偏置
  • n 是训练输⼊数据的个数
  • a 是表⽰当输⼊为x时输出的向量,可以理解为output

类比一下,此时的代价函数为:

接下来就是求权重和偏置的偏导数,推导之前说明一下前面的公式:

推导过程如下:

640?wx_fmt=png
ia_200002754

从推导结果可以看到偏导数的值和成正比,回顾下前面讲的S型神经元中激活函数的图像:

640?wx_fmt=png
ia_200002755

我们可以从这幅图看出,当神经元的输出接近1的时候,曲线变得相当平,所以就很小,同时也可以得出代价函数C权重和偏置的偏导数也很小,这就是训练速度缓慢的原因

再看上面代价函数值和迭代次数的图,中间部分非常陡峭,前后非常平缓,是不是非常契合的变化的?类似其他的神经网络,也是这样的原因造成训练缓慢,使用均方误差作为代价函数还有个缺点就是容易陷入局部最优解的沼泽中

引⼊交叉熵代价函数

我们已经抛出了神经网络训练缓慢的原因,接下来就是考虑如何解决这个问题

研究表明,我们可以通过使⽤交叉熵代价函数来替换⼆次代价函数

为了理解什么是交叉熵,我们稍微改变⼀下之前的简单例⼦;假设,我们现在要训练⼀个包含若⼲输⼊变量的的神经元,输⼊,权重为,和偏置b:

640?wx_fmt=png
ia_200002756

相关说明:

我们如下定义这个神经元的交叉熵代价函数:

其中对数图像如下:

640?wx_fmt=png
ia_200002757

从上面这个公式以及图像可以看出,交叉熵是有资格作为代价函数的:

  • 总是非负的
  • 实际输出值和目标输出值之间的差距越小,最终的交叉熵的值接越低

交叉熵作为代价函数更好的地方在于避免了学习速度下降的问题,那么到底是怎么解决的呢?很显然,解决问题的关键点在于,话不多说,先求出代价函数针对和的偏导数再说:

640?wx_fmt=png
ia_200002758

可以看到,对权重学习的速度直接被消掉了,只和成正相关,也就是说输出和实际值的误差越大,学习的速率也就越快

回过头来用交叉熵作为代价函数,看看此时的损失函数值和迭代次数的关系:

640?wx_fmt=png640?wx_fmt=png

通过对比可以看到此时的变化曲线有以下特点:

  • 误差越大,学习速度越快
  • 迭代周期明显变小

其推⼴到有很多神经元的多层神经⽹络上的交叉熵公式为:

交叉熵的含义?源⾃哪⾥?

交叉熵可以帮我们完善二次代价函数的缺点,但交叉熵到底是怎么来的呢?

在上一小节,我们有推导二次代价函数对于权重和偏置的偏导数,我们知道造成训练缓慢的原因在于:

如果将偏导数里面的去掉,这样做会产生一个怎样的结果呢?

640?wx_fmt=png
ia_200002761

对此⽅程关于a进⾏积分,得到:

这是⼀个单独的训练样本对代价函数的贡献,为了得到整个的代价函数,我们需要对所有的训练样本进⾏平均, 得到了:

过度拟合和规范化

如何解决模型在训练过程中出现的过拟合问题

规范化

增加训练样本的数量是⼀种减轻过度拟合的⽅法,但是样本本身就是比较稀缺的资源

还有其他的⼀下⽅法能够减轻过度拟合的程度吗?⼀种可⾏的⽅式就是降低⽹络的规模,然⽽,⼤的⽹络拥有⼀种⽐⼩⽹络更强的潜⼒,能使用大的网络更好

我们可以使用规范化的技术来缓解过拟合问题,常见的手段是权重衰减(weight decay)或者L2 规范化,L2规范化的想法是增加⼀个额外的项到代价函数上,这个项叫做规范化项(统计学习方法中引入的结构风险),下⾯是规范化的交叉熵:

公式前面一项是交叉熵的表达式,第二项表示的是所有权重平方的和(使用一个因子进行量化调整),其中称为规范化参数。

直觉地看,规范化的效果是让⽹络倾向于学习⼩⼀点的权重,其他的东西都⼀样的。⼤的权重只有能够给出代价函数第⼀项⾜够的提升时才被允许。换⾔之,规范化可以当做⼀种寻找⼩的权重和最⼩化原始的代价函数之间的折中。

这两部分之前相对的重要性就由λ的值来控制了:λ越⼩,就偏向于最⼩化原始代价函数,反之,倾向于⼩的权重。

为何规范化可以帮助减轻过度拟合

我们已经看到了规范化在实践中能够减少过度拟合了,这是令⼈振奋的,不过这背后的原因还不得⽽知!通常的说法是:

⼩的权重在某种程度上,意味着更低的复杂性,也就对数据给出了⼀种更简单却更强⼤解释,因此应该优先选择。

接下来我们利用一个简单的回归任务对上述解释进行研究,如下一个简单的数据集,我们为其建立模型:

640?wx_fmt=png
ia_200002762

我们先考虑使用多项式来拟合数据:

640?wx_fmt=png
ia_200002763

根据奥姆剃刀原则以及我们各自的经验,显然会选择下面的模型。以此类推,丛神经网络的角度,规范化得到的较小的权重应该会更好,实验也证明了这一点。

我们应当时时记住这⼀点,规范化的神经⽹络常常能够⽐⾮规范化的泛化能⼒更强,这只是⼀种实验事实(empirical fact)

规范化的其他技术

除了L2外还有很多规范化技术:

  • L1规范化
  • 弃权(Dropout)
  • 人为增加训练样本

L1规范化:这个⽅法是在未规范化的代价函数上加上⼀个权重绝对值的和:

L1规范化倾向于聚集⽹络的权重在 相对少量的⾼重要度连接上,⽽其他权重就会被驱使向0接近

弃权(Dropout):弃权(Dropout)是⼀种相当激进的技术。和L1、L2规范化不同,弃权技术并不依赖对代价函数的修改。

假设我们有⼀个训练数据x和对应的⽬标输出y。通常我们会通过在⽹络中前向传播x,然后进⾏反向传播来确定对梯度的贡献。使⽤弃权技术,这个过程就改了,我们会从随机(临时)地删除⽹络中的⼀半的隐藏神经元开始,同时让输⼊层和输出层的神经元保持不变

⼈为扩展训练数据:数据量大到一定程度可以弥补算法的差距,没啥好说的。

权重初始化

创建了神经⽹络后,我们需要进⾏权重和偏置的初始化:之前的⽅式就是根据独⽴⾼斯随机变量来选择权重和偏置,其被归⼀化为均值为0,标准差1

采用均值为0标准差为的⾼斯随机分布初始化这些权重

如何选择神经⽹络的超参数

直到现在,我们还没有解释对诸如学习速率η,正则化参数λ等等超参数选择的⽅法,目前只是给出那些效果很好的值而已。实践中,当你使⽤神经⽹络解决问题时,寻找好的超参数其实是比较困难的一件事情。

本节会给出⼀些⽤于设定超参数的启发式想法,⽬的是帮你发展出⼀套⼯作流来确保 很好地设置超参数:

  • 宽泛策略:
    • 将复杂的问题简单化,比如先减少目标类别,简化网络结构
    • 在问题简化后可以方便地进行对超参数进行调节,快速调试是哪个超参数有问题
  • 学习速率:可以观察在某些学习速率下,迭代周期和训练代价的折线图变化情况,主要观察训练代价开始下降的学习率,学习速率可以变成可变的,在不同的迭代次数用不同的学习率
  • 早停法:这是我个人用得比较多的方法,判断验证集的准确率以及训练代价,比如效果不再提升,就可以考虑停止迭代,输出对应模型
  • 正则化参数:开始时不包含正则化(λ = 0.0),确定 η 的值,使⽤确定出来的 η,我们可以使⽤验证数据来选择好的 λ。从尝试 λ = 1.0 开始,然后根据验证集上的性能按照因⼦ 10 增加或减少其值。⼀旦我已经找到⼀个好的量级,你可以改进 λ 的值。这⾥搞定后,你就可以返回再重新优化 η。
  • 自动技术:网格搜索

点击阅读原文,查看博文地址。

往期推荐:

640?wx_fmt=png

Michael Rash-Linux Firewalls.rar 立即下载

相关推荐

人工势场法在自动驾驶避障中的实践与优化

本文深入探讨了人工势场法在自动驾驶避障中的核心原理与实践优化。通过解析引力与斥力模型,揭示了经典算法在局部最优和目标不可达等问题上的局限性,并重点介绍了改进斥力场函数、引入道路边界斥力及动态参数调整等关键优化策略,有效提升了该局部路径规划算法在复杂动态场景下的实用性与鲁棒性。

weixin_29208327的博客 929

nndl-复旦-神经网络与深度学习笔记1

第一章 使用机器学习模型步骤: 数据预处理 特征提取 特征转换 常用的有主成分分析(PCA),线性判别(LDA) 降维:特征抽取、特征选择 升维 预测 表示学习 局部表示 一种表示颜色的方法是以不同名字来命名不同的颜色, 这种表示方式叫作局部表示, 也称为离散表示或符号表示. 局部表示通常可以表示为one-hot 向量的形式.假设所有颜色的名字构成一个词表 ????, 词表大小为 |????|. 我们可以用一个 |????| 维的 one-hot 向量来表示每一种颜色. 在第 ???? 种颜色

weixin_42301220的博客 1085

autoware 激光-相机联合标定

autoware进行激光-相机联合标定 ~~~ 刚开始进行激光-相机联合标定的时候,出现了不少问题,在此记录一下整体标定流程,以防忘记。在此,特别感谢佳明师弟,在录制数据集时提供的帮助。 ~~~ 0.系统配置: Ubuntu18.04系统 ROS Melodic opencv 3.2.0 vlp-16 一.安装autoware 这部分网上教程挺多的,但我在编译的过程中仍存在不少bug,唉~_~。 二.安装calibration_camera_lidar,从a...

nuo112的博客 1万+

深度学习--神经网络Neural Network and Deep Learning

一:两种神经网络 感知型和S型,权重w和偏置b 感知型规则模型: 实际上,⽹络中单个感知器上⼀个权重或 偏置的微⼩改动有时候会引起那个感知器的输 出完 全翻转,如0变到1 S型: S型神经元有多个输⼊,x1,x2,…。但是这些输⼊可以取0和1中的任意 值,⽽不仅仅是0或1。 二 神经网络架构 输入层,隐藏层,输出层,, 多次感知器MLP 三 梯度下降学习法: ⼀直使⽤它。 重复⼀下,我们训练神经⽹络的⽬的是找到能最⼩化⼆次代价函数C(w,b)的权重和偏置。 为了计算梯度∇

xusenquan的博客 354

诊断CAPL自动化(5) ——没有CANdela,无法编辑cdd数据库文件,也能轻松完成诊断测试

🍅我们知道cdd数据库文件,是CANoe测试环境的重要组件,它可以让我们更加轻松的完成诊断测试工作;但是创建和编辑cdd文件是需要CANdela 来完成的,一个 liscense 就要将近二十万,成本确实高🍅特别是在处理22/2E/31服务的时候,频繁的增加功能,可能需要频繁的用CANdela 修改CDD,我测试开发过程中,一般很少去修改cdd,有这个时间,纯手撸也开发完了,就一个CANdela,鬼知道此时此刻到了谁手里,我也懒得去找。🍅演示软硬件环境;目录📘前言。

蚂蚁小兵 5756

《C#零基础入门之百识百例》(七)算数运算符 -- 圆的面积

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C# 有丰富的内置运算符,本文带你学习C# 中算数运算符。

陈言必行 -- Unity游戏开发领域优质博主 3615

NNDL 实验二 pytorch入门

了解了算子和张量,张量的运算,学习了数据预处理的方法。

m0_56164577的博客 505

Python爬虫技术:使用Playwright和Twitter API v2高效获取Twitter/X数据完全教程

遵守规则:始终遵循Twitter的使用条款和速率限制错误处理:实现完善的错误处理和重试机制数据质量:进行数据清洗和验证性能优化:使用异步处理和合理的延迟设置可维护性:模块化代码,便于维护和扩展。

2201_76125261的博客 671

深度神经⽹络为何很难训练

系列文章:《Neural Networks and Deep Learning》读书笔记系列:1.识别手写字反向传播算法如何工作NNDL: 改进神经⽹络的学习⽅法神经⽹络可以计算任何函数...

howie6879's blog 403

包成功安装tiny-cuda-nn,记录安装过程中的问题解决,附带pytorch3d安装【踩坑指南】

该包可以显著提高NeRF训练速度,是和NeRFstudio等框架中,必须使用的。本文提供tiny-cuda-nn可以安装的完整包的下载链接,可以直接上传到项目中安装。附带笔者遇到的问题的解决方案。

zik的博客 7030

Kong API Gateway 配置与深入

Kong是一个开源的、高性能的API网关,提供了一种简单易用的服务间路由、流量管理和安全防护方案,其最初起源于Nginx Inc.,但后迁移至Apache Software Foundation。Kong支持RESTful、GraphQL、TCP/UDP等协议,可与AWS Lambda、Azure Functions、Google Cloud Functions等云函数平台集成。其主要功能包括:服务发现与负载均衡、请求代理、身份认证与授权、缓存、日志记录、监控指标、灰度发布、多种插件等。

AI天才研究院 2286

NNDL 作业10:第六章课后题(LSTM | GRU)

第六章课后题(LSTM | GRU)

weixin_52086410的博客 487

ESP32设备驱动-VCNL4040趋近传感器

VCNL4040 将趋近传感器 (PS)、环境光传感器 (ALS) 和高功率 IRED 集成到一个小型封装中。它通过CMOS工艺将光电二极管、放大器和模数转换电路集成到一个芯片中。

视觉与物联智能 944

HBU-NNDL 作业10:第六章课后题(LSTM | GRU)

LSTM GRU

m0_57215376的博客 992

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

关于梯度下降算法

前边博文说了关于MNIST手写字体的识别,现在专门记录下使用梯度下降算法进行学习的方法: 我们将⽤符号 x 来表⽰⼀个训练输⼊。为了⽅便,把每个训练输⼊ x 看作⼀个 28 *28 = 784维的向量。每个向量中的项⽬代表图像中单个像素的灰度值。我们⽤ y = y(x) 表⽰对应的期望输出,这⾥ y 是⼀个 10 维的向量。例如,如果有⼀个特定的画成 6 的训练图像,x,那么y(x) = (0

zgx123666的专栏 868

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

Neural Networks and Deep Learning习题解答--改进神经网络的学习方法

神经网络与深度学习习题解答 改进神经网络的学习方法 最近在看Michael Nielsen的Neural Networks and Deep Learning,这本书是以网页的形式放在网上,非常合适入门,附上传送地址:http://neuralnetworksanddeeplearning.com/chap1.html#learning_with_gradient_descent 国内哈工...

剑启郁兰的博客 4125

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【NNDL 实验二 pytorch入门】

本文主要是对张量和算子进行简单的解释,以及使用pytorch实现张量运算和数据的预处理。

weixin_58402555的博客 1127

神经网络 python pdf_2020最新版《神经网络与深度学习》中文版PDF免费开放下载

推荐一本由美国量⼦物理学家、科学作家 Michael Nielsen编写的非常好的深度学习入门书籍-《Neural Network and Deep Learning》,中文译为《神经网络与深度学习》。这是一本解释人工神经网络和深度学习背后核心思想的免费在线书籍。前⾔《神经⽹络和深度学习》是⼀本免费的在线书。本书会教会你: • 神经⽹络,⼀种美妙的受⽣物学启发的编程范式,可以让计算机从观测数据中进...

weixin_39582708的博客 703
上一篇: 反向传播算法如何工作
下一篇: 神经⽹络可以计算任何函数的可视化证明
老胡的储物柜
博客等级 码龄12年 1145粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值