【学习笔记】深度学习入门:基于Python的理论与实现-与学习相关的技巧

news2024/11/25 0:33:05

CONTENTS

    • 六、与学习相关的技巧
      • 6.1 参数的更新
      • 6.2 权重的初始值
      • 6.3 Batch Normalization
      • 6.4 正则化
      • 6.5 超参数的验证

六、与学习相关的技巧

6.1 参数的更新

神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化(optimization)。

在之前我们是沿着梯度方向更新参数,不断重复从而逐渐靠近最优参数,这个过程称为随机梯度下降法(stochastic gradient descent),简称SGD,其公式如下:

在这里插入图片描述

将其实现为一个类如下:

class SGD:
    def __init__(self, lr=0.01):
        self.lr = lr
        
    def update(self, params, grads):
        for key in params.keys():
            params[key] -= self.lr * grads[key]

参数paramsgrads(与之前的神经网络的实现一样)是字典型变量,按params['W1']grads['W1']的形式,分别保存了权重参数和它们的梯度。

使用这个SGD类可以按如下方式进行神经网络参数的更新:

network = TwoLayerNet(...)
optimizer = SGD()
for i in range(10000):
	...
	x_batch, t_batch = get_mini_batch(...) # mini-batch
	grads = network.gradient(x_batch, t_batch)
	params = network.params
	optimizer.update(params, grads)
	...

虽然SGD简单,并且容易实现,但是在解决某些问题时可能没有效率。我们来思考一下求下面这个函数的最小值的问题:

在这里插入图片描述

对这种函数应用SGD。从 ( x , y ) = ( − 7.0 , 2.0 ) (x, y) = (−7.0, 2.0) (x,y)=(7.0,2.0)处(初始值)开始搜索,结果如下图所示:

在这里插入图片描述

可以看到SGD呈“之”字形移动。这是一个相当低效的路径。也就是说,SGD的缺点是,如果函数的形状非均向(anisotropic),比如呈延伸状,搜索的路径就会非常低效。

接下来我们介绍Momentum方法,其公式如下:

在这里插入图片描述

这里新出现了一个变量 v v v,对应物理上的速度,该式表示了物体在梯度方向上受力。在物体不受任何力时, α v \alpha v αv项承担使物体逐渐减速的任务( α \alpha α设定为 0.9 0.9 0.9之类的值),对应物理上的地面摩擦或空气阻力。下面是Momentum的代码实现:

class Momentum:
    def __init__(self, lr=0.01, momentum=0.9):
        self.lr = lr
        self.momentum = momentum
        self.v = None
        
    def update(self, params, grads):
        if self.v is None:
            self.v = {}
            for key, val in params.items():
                self.v[key] = np.zeros_like(val)
        for key in params.keys():
            self.v[key] = self.momentum * self.v[key] - self.lr * grads[key]
            params[key] += self.v[key]

使用Momentum解决上式的最优化问题,结果如下图所示:

在这里插入图片描述

虽然 x x x轴方向上受到的力非常小,但是一直在同一方向上受力,所以朝同一个方向会有一定的加速。反过来,虽然 y y y轴方向上受到的力很大,但是因为交互地受到正方向和反方向的力,它们会互相抵消,所以 y y y轴方向上的速度不稳定。因此,和SGD时的情形相比,可以更快地朝 x x x轴方向靠近,减弱“之”字形的变动程度。

在神经网络的学习中,学习率(数学式中记为 η \eta η)的值很重要。学习率过小,会导致学习花费过多时间;反过来,学习率过大,则会导致学习发散而不能正确进行。

在关于学习率的有效技巧中,有一种被称为学习率衰减(learning rate decay)的方法,即随着学习的进行,使学习率逐渐减小。

AdaGrad方法进一步发展了这个想法,针对“一个一个”的参数,赋予其“定制”的值。其公式如下:

在这里插入图片描述

这里新出现了变量 h h h,它保存了以前的所有梯度值的平方和,在更新参数时,通过乘以 1 h \frac{1}{\sqrt h} h 1,就可以调整学习的尺度。这意味着,参数的元素中变动较大(被大幅更新)的元素的学习率将变小。也就是说,可以按参数的元素进行学习率衰减,使变动大的参数的学习率逐渐减小。

AdaGrad的实现过程代码如下:

class AdaGrad:
    def __init__(self, lr=0.01):
        self.lr = lr
        self.h = None
        
    def update(self, params, grads):
        if self.h is None:
            self.h = {}
            for key, val in params.items():
                self.h[key] = np.zeros_like(val)
        for key in params.keys():
            self.h[key] += grads[key] * grads[key]
            params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)

这里需要注意的是,最后一行加上了微小值 1 0 − 7 10^{-7} 107。这是为了防止当self.h[key]中有 0 0 0时,将 0 0 0用作除数的情况。

使用AdaGrad解决之前的问题结果如下:

在这里插入图片描述

Momentum参照小球在碗中滚动的物理规则进行移动,AdaGrad为参数的每个元素适当地调整更新步伐。如果将这两个方法融合在一起即为Adam。其效果如下:

在这里插入图片描述

上面我们介绍了SGD、Momentum、AdaGrad、Adam这几种方法,那么用哪种方法好呢?非常遗憾,(目前)并不存在能在所有问题中都表现良好的方法。这几种方法各有各的特点,都有各自擅长解决的问题和不擅长解决的问题。

基于MNIST数据集的四种更新方法的比较结果如下:

在这里插入图片描述

6.2 权重的初始值

首先不能将权重初始值设为0,这使得神经网络拥有许多不同的权重的意义丧失了。为了防止“权重均一化”(严格地讲,是为了瓦解权重的对称结构),必须随机生成初始值

我们向一个5层神经网络(激活函数使用 s i g m o i d sigmoid sigmoid函数)传入随机生成的输入数据,首先使用标准差为1的高斯分布生成的随机数据,用直方图绘制各层激活值的数据分布:

在这里插入图片描述

各层的激活值呈偏向0和1的分布。这里使用的 s i g m o i d sigmoid sigmoid函数是S型函数,随着输出不断地靠近0(或者靠近1),它的导数的值逐渐接近0。因此,偏向0和1的数据分布会造成反向传播中梯度的值不断变小,最后消失。这个问题称为梯度消失(gradient vanishing)。层次加深的深度学习中,梯度消失的问题可能会更加严重。

下面,将权重的标准差设为0.01,进行相同的实验,结果如下:

在这里插入图片描述

这次呈集中在0.5附近的分布。因为不像刚才的例子那样偏向0和1,所以不会发生梯度消失的问题。但是,激活值的分布有所偏向,说明在表现力上会有很大问题。

如果有多个神经元都输出几乎相同的值,那它们就没有存在的意义了。比如,如果100个神经元都输出几乎相同的值,那么也可以由1个神经元来表达基本相同的事情。因此,激活值在分布上有所偏向会出现“表现力受限”的问题。

6.3 Batch Normalization

Batch Normalization(简称Batch Norm)的思想是为了使各层拥有适当的广度,“强制性”地调整激活值的分布。

使用Batch Norm层的网络结构如下:

在这里插入图片描述

Batch Norm,顾名思义,以进行学习时的mini-batch为单位,按mini-batch进行正规化。具体而言,就是进行使数据分布的均值为0、方差为1的正规化。用数学式表示的话,如下所示:

在这里插入图片描述

这里对mini-batch的 m m m个输入数据的集合 B = x 1 , x 2 , . . . , x m B = {x1, x2, ... , xm} B=x1,x2,...,xm求均值 µ B µB µB和方差 。然后,对输入数据进行均值为0、方差为1(合适的分布)的正规化。上式中的 ε ε ε是一个微小值(比如, 1 0 − 7 10^{-7} 107等),它是为了防止出现除以0的情况。

接着,Batch Norm层会对正规化后的数据进行缩放和平移的变换,用数学式可以如下表示:

在这里插入图片描述

Batch Norm的计算图如下:

在这里插入图片描述

6.4 正则化

机器学习的问题中,过拟合是一个很常见的问题。过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。

发生过拟合的原因,主要有以下两个:

  • 模型拥有大量参数、表现力强。
  • 训练数据少。

权值衰减是一直以来经常被使用的一种抑制过拟合的方法。该方法通过在学习的过程中对大的权重进行惩罚,来抑制过拟合。很多过拟合原本就是因为权重参数取值过大才发生的。

但是,如果网络的模型变得很复杂,只用权值衰减就难以应对了。在这种情况下,我们经常会使用 D r o p o u t Dropout Dropout方法。

D r o p o u t Dropout Dropout是一种在学习的过程中随机删除神经元的方法。训练时,随机选出隐藏层的神经元,然后将其删除,如下图所示:

在这里插入图片描述

实现代码如下:

class Dropout:
    def __init__(self, dropout_ratio=0.5):
        self.dropout_ratio = dropout_ratio
        self.mask = None

    def forward(self, x, train_flg=True):
        if train_flg:
            self.mask = np.random.rand(*x.shape) > self.dropout_ratio
            return x * self.mask
        else:
            return x * (1.0 - self.dropout_ratio)

    def backward(self, dout):
        return dout * self.mask

每次正向传播时,self.mask中都会以False的形式保存要删除的神经元。self.mask会随机生成和 x x x形状相同的数组,并将值比 dropout_ratio大的元素设为True。反向传播时的行为和 R e L U ReLU ReLU相同。也就是说,正向传播时传递了信号的神经元,反向传播时按原样传递信号;正向传播时没有传递信号的神经元,反向传播时信号将停在那里。

6.5 超参数的验证

神经网络中,除了权重和偏置等参数,超参数(hyper-parameter)也经常出现。这里所说的超参数是指,比如各层的神经元数量、batch大小、参数更新时的学习率或权值衰减等。

不能使用测试数据评估超参数的性能。这一点非常重要,但也容易被忽视。因为如果使用测试数据调整超参数,超参数的值会对测试数据发生过拟合。换句话说,用测试数据确认超参数的值的“好坏”,就会导致超参数的值被调整为只拟合测试数据。这样的话,可能就会得到不能拟合其他数据、泛化能力低的模型。

因此,调整超参数时,必须使用超参数专用的确认数据。用于调整超参数的数据,一般称为验证数据(validation data)。

根据不同的数据集,有的会事先分成训练数据、验证数据、测试数据三部分,有的只分成训练数据和测试数据两部分,有的则不进行分割。在这种情况下,用户需要自行进行分割。

进行超参数的最优化时,逐渐缩小超参数的“好值”的存在范围非常重要。所谓逐渐缩小范围,是指一开始先大致设定一个范围,从这个范围中随机选出一个超参数(采样),用这个采样到的值进行识别精度的评估;然后,多次重复该操作,观察识别精度的结果,根据这个结果缩小超参数的“好值”的范围。通过重复这一操作,就可以逐渐确定超参数的合适范围。

下一节:【学习笔记】深度学习入门:基于Python的理论与实现-卷积神经网络。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/50842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv7(目标检测)数据集、训练、推理过程

一、环境安装: pip install -r requirements.txt pip install torch1.8.2cu111 torchvision0.9.2cu111 torchaudio0.8.2 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html -i https://pypi.tuna.tsinghua.edu.cn/simple二、修改配置环境 直接看下面…

[附源码]SSM计算机毕业设计血库管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

JavaScript -- 03. 运算符介绍

文章目录运算符1 算数运算符1.1 基础符号1.2 自动类型转换2 赋值运算符3 一元4 自增和自减4.1 自增运算符4.2 -- 自减运算符5 逻辑运算符5.1 逻辑非5.2 逻辑与5.3 逻辑或6 关系运算符7 相等运算符7.1 7.2 7.3 !7.4 !8 条件运算符(三元表达式)9 运算符的…

专栏 | 解析“全闪对象存储”(三)

在上一节“对象存储的使用场景”中,我们介绍了对象存储在大规模非结构化数据存储、云存储、大数据和数据湖等场景的使用。 那么,优秀对象存储产品是怎样的?如何设计、实现?本节,我们来分析、探讨这些问题。 通过前两…

推荐系统-召回-概述(四):热门推荐

无论个性化多么重要,热门推荐都是推荐系统里不可或缺的一部分。其一、根据“二八定律”,电商系统中的20%的头部内容被80%的流量消费,因此,在产品早期,仅仅推荐热门内容,实施成本不高,且效果也会…

【Android App】利用腾讯地图获取地点信息和规划导航线路讲解及实战(附源码和演示视频 超详细必看)

需要源码请点赞关注收藏后评论区留言~~~ 一、获取地点信息 至于如何集成腾讯地图和调用腾讯地图接口此处不再赘述,有需要请参见我之前的博客 腾讯地图用来搜索POI地点的工具是TencentSearch,通过它查询POI主要分为下列四个步骤: &#xff0…

MySQL---基于CentOS7

在Linux上安装MySQL 本章简单阐述一下,mysq基于centos7的安装步骤 在VM上模拟安装 MySQL版本为:8.0.30 文章目录在Linux上安装MySQL1. MySQL下载卸载MariaDB查看版本卸载2.安装解压mysql压缩包重命名创建用户和组修改权限编写配置文件配置PATH变量初始化…

基于PHP+MySQL集训队员管理系统的设计与实现

ACM是国际大学生程序设计竞赛,这是一个展示大学生风采的平台,但是在ACM报名的时候可能会有很多的队员,管理员对队员的管理是一个繁琐且复杂的过程,通常的管理模式是手工进行管理,这在很大程度上有一些弊端,为了改成这一现状需要一个对应的管理系统出现。 本设计尝试用PHP开发一…

机组运行约束对机组节点边际电价的影响研究(Matlab代码实现)

目录 1 概述 2 日前市场单时段节点电价出清优化模型 2.1 目标函数 2.2 约束条件 3 算例及运行结果 4 结论 5 参考文献 6 Matlab代码及详细文章讲解 1 概述 基于节点边际电价(locational marginal priLMP)的现货巾划lm易能量价值,节点电本确定节点电价&a…

高校部署房产管理系统可实现那些目标?

随着技术的不断进步和升级,以及高校房屋建筑物数量的不断扩充,建立房屋资产管理信息系统进行信息化、数字化、图形化房屋资产管理已经是势在必行。数图互通自主研发FMCenterV5.0平台,是针对中国高校房产的管理特点和管理要求,研发…

易基因科技|单细胞甲基化测序低至2500元/样

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。12月活动来袭~ 限时特惠!单细胞甲基化测序低至2500元/样! 易基因高通量单细胞DNA甲基化测序:单细胞DNA甲基化组学研究很大程度上受制于建库…

P3 创建Tensor

前言: 这里面主要讲解一下创建一个Tensor 对象的不同方法 目录: numpy 创建 list 创建 empty 创建 set_default_type 随机数创建 torch.full arange&linespace ones|zeros|eye r…

Springboot毕业设计毕设作品,微信网上图书商城购物小程序设计与实现

功能清单 【后台管理员功能】 会员列表:查看所有注册会员信息,支持删除 录入资讯:录入资讯标题、内容等信息 管理资讯:查看已录入资讯列表,支持删除和修改 广告设置:上传图片和设置小程序首页轮播图广告地…

【Pandas数据处理100例】(八十九):Pandas使用date_range()生成date日期

前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPandas版本:1.3.5N…

Oracle 11g RAC 原地升级到 19c

作者 | JiekeXu来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看 Oracle 11g RAC 原地升级到 19c,欢迎点…

Android kotlin在实战过程问题总结与开发技巧详解

1、介绍 目前Android开发中,分为两派,Java派和Kotlin派,Java是宇宙开发第一语言,地位一直处于领先位置,但是Java会出现一个空指针的情况,所以kotlin的出现,填补了java的一些缺陷,但是…

擎创技术流 | ClickHouse实用工具—ckman教程(5)

哈喽~友友们,又到了一期一会的技术分享时刻了,本期继续以视频形式与大家分享,话不多说,我们直接上干货,建议收藏分享马住 戳↓↓↓链接,一键回看前期内容: 擎创技术流 | ClickHouse实用工具—c…

独立IP和共享IP的区别以及各自的优势有哪些

如果您在网上做生意,您可能对什么是IP地址有一个大概的了解。然而,您可能不知道的是,IP 地址分为两种类型。下面将介绍在选择独立服务器时最常遇到的两种IP的区别和联系: 简而言之,独立IP地址是标识您的网站的唯一数字…

基于云原生技术的融合通信是如何实现的?

孵化于云端,云通信成为时代的主流。01 云通信的「前世今生」 通信与每个人息息相关。 生态合作和渠道的规模上量,给传统通信模式带来巨大的挑战,由此衍生出云通信。 云通信,即基于云计算平台,将传统通信能力进行云化&a…

常用测试用例模板大全

一些常用模块的测试用例 1、登录  2、添加  3、查询  4、删除 1、登录 ①用户名和密码都符合要求(格式上的要求) ②用户名和密码都不符合要求(格式上的要求) ③用户名符合要求,密码不符合要求(格…