[深度学习入门]基于Python的理论与实现[感知机、神经网络、误差反向传播法及相关技巧](二)

简介: 笔记

第四章:神经网络的学习


 通常要解决某个问题时,人们习惯以自己的经验和直觉来分析问题找出规律,然后反复试验推进。

 “学习”是指从训练数据中自动获取最优权重参数的过程。

 机器学习在前期收集问题的各项特征数据,用模型从数据中发现答案,争取避免人为介入。

 深度学习在数据收集上(比如选/不选哪些特征的数据)较之机器学习更能避免人为介入。

18.png

神经网络的学习目标是寻找权重参数的最优值,在学习的过程需要有数值类指标来表示当前的状态。

 通常,我们用损失函数来作为这个指标。损失函数表示神经网络当前的性能与最优目标的差距,一般用均方误差和交叉熵误差等。

 均方误差:

19.png

(yk表示神经网络的输出,tk表示训练数据,k表示数据的维度)

 交叉熵误差:

20.png

(log表示以e为底数的自然对数(ln)。yk是神经网络的输出,tk是正确解标签。并且,tk中只有正确解标签的索引为1,其他均为0(one-hot表示)。因此,上式实际上只计算对应正确解标签的输出的自然对数)

 上述几种损失函数的代码实现(common/functions.py):

21.png

mini-batch学习:

 不管是机器学习还是神经网络学习,在遇到要处理的训练数据量在万级以上的时候,如果以全部数据为对象求损失函数的和,计算过程太长。因此,从全部数据中随机选出多个小批量数据,作为全部数据的近似,然后对这几个批次的数据进行训练,这种方式称为mini-batch学习。

 为何要设定损失函数:

 学习的目标是获得使识别精度尽可能高的神经网络,为什么不直接把识别精度作为指标,而是要另外引入损失函数呢?

 这里需要考虑导数的连续性问题。假设某个神经网络正确识别出了100个训练数据中的32个,识别精度为32%,以识别精度为指标的话,微调参数,识别精度不会有反应,即使有反应也是不连续地、突然地变化(类似于阶跃函数)。

 在参数变化而精度不变的阶段,参数的导数为0,神经网络无法进行学习。

 梯度:

 在神经网络的学习中,寻找最优参数(权重和偏置)时,要寻找使损失函数的值尽可能小的参数。为此需要计算参数的导数,并以这个导数为指引,逐步更新参数的值。

 由全部变量的偏导数汇总而成的向量称为梯度。

 梯度法:

 虽然梯度的方向并不一定指向最小值(可能指向局部极小值或者鞍点),但是沿着梯度方向能够最大限度地减小损失函数的值,所以以梯度信息为线索,作为最小值位置的寻找方向。函数的取值沿着梯度方向前进一定距离后重新计算梯度,再沿着新梯度方向前进的过程就是梯度法。

22.png

经过对x、y轴求偏导后为:

23.png

神经网络的学习步骤:

 前提

 神经网络存在合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为“学习”。神经网络的学习分成下面4个步骤。

 步骤1(mini-batch)

 从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch的损失函数的值。

 步骤2(计算梯度)

 为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。

 步骤3(更新参数)

 将权重参数沿梯度方向进行微小更新。

 步骤4(重复)

 重复步骤1、步骤2、步骤3。


第五章:误差反向传播法


 在之前的内容中,我们介绍了神经网络的学习,同时在更新损失函数关于权重梯度的时候,使用了微分计算。该方法虽然容易实现,但是在计算过程中比较消耗时间。如何去高效的计算权重数梯度?此时就必须通过误差反向传播实现。

 计算图求解的优势:

 优势一:计算图可以集中精力于局部计算。无论全局的计算有多么复杂,各个步骤所要做的就是对象节点的局部计算。通过局部计算,最后求出最优解。

 优势二:利用计算图可以将中间的计算结果全部保存起来,通过反向传播高效计算导数。

 计算图:

24.png25.png

上图中,“从左向右进行计算”是一种正方向上的传播,简称为正向传播(forward propagation)。正向传播是从计算图出发点到结束点的传播。

 既然有正向传播这个名称,当然也可以考虑反向(从图上看的话,就是从右向左)的传播。实际上,这种传播称为反向传播(backward propagation)。

26.png

27.png

通过链式法则计算得:

28.png

a. 加法节点的反向传播

加法节点的反向传播只是将输入信号直接输出到下一个节点。

29.png

形如:

30.png

b. 乘法节点的反向传播

乘法的反向传播会将上游的值乘以正向传播时的输入信号的“翻转值”后传递给下游。

image.png

形如:

image.png

不同层中误差反向传播介绍

a. 激活函数-ReLU层

image.pngimage.png

b. 激活函数-Sigmoid层

image.pngimage.pngimage.png

c. Affine层

  神经网络的正向传播中进行的矩阵的乘积运算在几何学领域被称为“仿射变换”。因此,这里将进行仿射变换的处理实现为“Affine层”。

image.pngimage.pngimage.png

d. Softmax-with-Loss层

 Softmax层将输入值正规化(将输出值的和调整为1)之后再输出。

 Softmax层中的误差反向传播也包含作为损失函数的交叉熵误差(cross entropy error),所以称为“Softmax-with-Loss层”。其简易计算图如下:

image.png

神经网络学习全貌图(包含反向传播版):

 前提

 神经网络中有合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为学习。神经网络的学习分为下面4个步骤。

 步骤1(mini-batch)

 从训练数据中随机选出一部分数据。

 步骤2(计算梯度)

 计算损失函数关于各个权重参数的梯度。(该步骤中实现误差反向传播法)

 步骤3(更新参数)

 将权重参数沿梯度方向进行微小更新。

 步骤4(重复)

 重复步骤1、步骤2、步骤3。


第六章:与学习相关的技巧


 权重参数的更新

 训练神经网络的目的是找到使损失函数的值尽可能小的参数。寻找最优参数的过程称为最优化(optimization)。因为参数空间非常复杂,所以无法通过数学式一下子求出最小值。在前几章中,我们曾将参数的梯度(导数)作为寻找最优参数的线索。下面将介绍SGD、Monmentum、AdaGrad和Adam四种常见的最优化方法。


a. SGD

 使用参数的梯度,沿着梯度方向更新参数,重复该步骤多次,从而逐渐靠近最优参数,这个过程称为随机梯度下降法(stochastic gradient descent),简称SGD。

image.png

(这里把需要更新的权重参数记为 W,而η 表示学习率,实际上会取 0.01 或 0.001 这些事先决定好的值。式子中的← 表示用右边的值更新左边的值。)

 SGD虽然简单且容易实现,但是在解决某些问题时可能没有效率。在具体说明缺点之前,我们先来思考求函数:f(x, y) = 1/20 * x^2 + y^2的最小值问题。注意此处的x平方较于y平方前面除以20,即x轴方向的梯度比y轴方向的要平缓很多。

image.png

SGD的缺点就在于,如果函数的形状非均向(anisotropic),比如呈延伸状,搜索的路径就会非常低效。其根本原因是梯度的方向没有指向最小值的方向。

image.png

b. Momentum:

 Momentum是“动量”的意思,和物理相关。

 这里新出现的变量v,对应物理上的速度。式(6.3)表示物体在梯度方向上受力,在力的作用下速度增加,类似于小球在地面上滚动。式(6.3)中的αv,在物体不受任何力时,承担使物体逐渐减速的任务(α设定小于1大于0的值),对应物理上的摩擦力或空气阻力。

image.png

x 轴方向上一直受同一方向的力,y轴方向上,像小球在碗中滚动一样,从高处滚动底处再到高处,交互地受到正反两个方向的力,所以y轴方向上的速度不稳定。和SGD相比,减弱了“之”字形的变动程度。

image.png

c. AdaGrad

  在神经网络的训练中,过小的学习率会导致训练时间长,过大的学习率会导致网络不能收敛、在最优值附近徘徊。实际上,一开始“多” 学,然后逐渐“少”学的方法,在神经网络的学习中经常被使用。AdaGrad会为参数的每个元素适当调整学习率,同时进行训练。

image.png

这里出现的新变量h,保存了以前的所有梯度值的平方和。在更新W时学习率η除以h的开根号,意味着参数的元素中变动较大的元素的学习率将变小(抑制震荡)。

 由于y 轴方向上的梯度较大,因此刚开始变动较大,但是后面会根据这个较大的变动按比例进行调整,减小更新的步伐。因此,y 轴方向上的更新程度被减弱,“之”字形的变动程度有所衰减。

image.png

d. Adam

  Adam方法的基本思路更像是融合Momentum和AdaGrad二者的优点,此外还进行了超参数的“偏置校正

image.png

权重参数的初始值

 权重初始化的目的是防止神经网络的正向传播过程中层激活函数的输出损失梯度出现爆炸或消失。如果发生任何一种情况,损失梯度太大或者太小,都无法有效向后反传,即便可以反向传播,神经网络也需要花更长的时间来达到收敛。

 为了提高模型的泛化能力,我们采用一个技巧是权值衰减(weightdecay),即以减小权重参数的值为目的进行学习的方法。

 但初始值不可以设为0,因为那样由于参数相同以及输出值都一样,不同的节点根本无法学习到不同的特征,这样就失去了网络学习特征的意义了。

 严格地说,初始值设成一样的值的时候都会出现这种问题,所以必须随机生成初始值。

image.pngimage.png

Xavier初始值的特点是:与前一层有n个节点连接时,初始值使用标准差为(1/n)的开根号的分布。使用Xavier初始值后的结果如上图所示。从这个结果可知,越是后面的层,图像变得越歪斜(tanh函数作为激活函数的时候能改善),但是呈现了比之前更有广度的分布。

 当激活函数使用ReLU时,一般推荐使用ReLU专用的初始值,也就是KaimingHe等人推荐的初始值,也称为“He初始值”。He初始值的特点是:与前一层有n个节点连接时,初始值使用标准差为(2/n)的开根号的分布。

image.pngimage.png

相关文章
|
9月前
|
运维 监控 数据可视化
Python 网络请求架构——统一 SOCKS5 接入与配置管理
通过统一接入端点与标准化认证,集中管理配置、连接策略及监控,实现跨技术栈的一致性网络出口,提升系统稳定性、可维护性与可观测性。
|
12月前
|
机器学习/深度学习 算法 量子技术
GQNN框架:让Python开发者轻松构建量子神经网络
为降低量子神经网络的研发门槛并提升其实用性,本文介绍一个名为GQNN(Generalized Quantum Neural Network)的Python开发框架。
313 4
GQNN框架:让Python开发者轻松构建量子神经网络
|
机器学习/深度学习 存储 算法
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
反向传播算法虽是深度学习基石,但面临内存消耗大和并行扩展受限的问题。近期,牛津大学等机构提出NoProp方法,通过扩散模型概念,将训练重塑为分层去噪任务,无需全局前向或反向传播。NoProp包含三种变体(DT、CT、FM),具备低内存占用与高效训练优势,在CIFAR-10等数据集上达到与传统方法相当的性能。其层间解耦特性支持分布式并行训练,为无梯度深度学习提供了新方向。
888 1
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
|
9月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的青少年网络使用情况分析及预测系统
本研究基于Python大数据技术,构建青少年网络行为分析系统,旨在破解现有防沉迷模式下用户画像模糊、预警滞后等难题。通过整合多平台亿级数据,运用机器学习实现精准行为预测与实时干预,推动数字治理向“数据驱动”转型,为家庭、学校及政府提供科学决策支持,助力青少年健康上网。
|
10月前
|
JavaScript Java 大数据
基于python的网络课程在线学习交流系统
本研究聚焦网络课程在线学习交流系统,从社会、技术、教育三方面探讨其发展背景与意义。系统借助Java、Spring Boot、MySQL、Vue等技术实现,融合云计算、大数据与人工智能,推动教育公平与教学模式创新,具有重要理论价值与实践意义。
|
11月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
696 18
|
JSON 网络安全 数据格式
Python网络请求库requests使用详述
总结来说,`requests`库非常适用于需要快速、简易、可靠进行HTTP请求的应用场景,它的简洁性让开发者避免繁琐的网络代码而专注于交互逻辑本身。通过上述方式,你可以利用 `requests`处理大部分常见的HTTP请求需求。
841 51
|
11月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
571 0
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
305 4

热门文章

最新文章

推荐镜像

更多