IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Python深度学习入门笔记 3 -> 正文阅读

[人工智能]Python深度学习入门笔记 3

Python深度学习入门笔记 3

与学习相关的技巧

这一部分介绍神经网络的学习中的一些重要观点,主题涉及寻找最优权重参数的最优化方法权重参数的初始值超参数的设定方法等。为了应对过拟合,本章还将介绍权值衰减Dropout等正则化方法。

参数的更新

神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这实际上是一个最优化问题。然而,由于参数空间非常复杂,参数数量非常庞大,导致无法使用求解数学式子那种最优化方法,因此找到最优参数非常困难。

在前一步分钟,我们使用随机梯度下降法SGD,重复多次沿着梯度方向更新参数,逐渐接近最优解。SGD是一个简单的方法,但是并不是最优的方法。

SGD用数学式表示成这样:image-20220112200613015

把需要更新的权重参数记为W,把损失函数关于W的梯度记为δL/δW。η表示学习率,实际上会取0.01或0.001这些事先决定好的值。

SGD的缺点

在下面这个例子中,SGD就会显得很“笨拙”。

image-20220112183113297

它的图像个等高线如下图:

image-20220112183242520

再来看一下它的梯度

image-20220112183313284

这个梯度的特征是,y轴方向上大,x轴方向上小。换句话说,就是y轴方向的坡度大,而x轴方向的坡度小。

接着,我们尝试用SGD来寻找最优点(最小值点)

image-20220112183519487

可以看到,SGD呈“之”字形移动。这是一个相当低效的路径。

SGD的缺点是:如果函数的形状非均向(anisotropic),比如呈延伸状,搜索的路径就会非常低效。因此,我们需要比单纯朝梯度方向前进的SGD更聪明的方法。SGD低效的根本原因是,梯度的方向并没有指向最小值的方向

那有没有在这种情况下能高效地找到最优点的方法呢?下面我们将介绍MomentumAdaGradAdam这3种可以取代SGD的方法。

Momentum

用数学式表示Momentum方,如下所示:

image-20220112183945722

这里比SGD多出来的变量v对应物理上的速度,上图中第一个式子可以理解为物体在梯度方向上收到了作用力,速度发生了变化。Momentum方法给人的感觉就像是小球在碗里面滚动

image-20220112184357812

AdaGrad

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

在关于学习率的有效技巧中,有一种被称为**学习率衰减(learning rate decay)**的方法,即随着学习的进行,使学习率逐渐减小。实际上,一开始“多”学,然后逐渐“少”学的方法,在神经网络的学习中经常被使用。

逐渐减小学习率的想法,相当于将“全体”参数的学习率值一起降低。而AdaGrad进一步发展了这个想法,针对“每一个“参数,赋予其“定制”的值。AdaGrad会为参数的每个元素适当地调整学习率,与此同时进行学习。

image-20220112191440257

这里新出现了变量h,它保存了以前的所有梯度值的平方和(第一个式子中的运算符号表示对应矩阵元素的乘法)。然后,在更新参数时,通过乘以,就可以调整学习的尺度。这意味着,参数的元素中变动较大(被大幅更新)的元素的学习率将变小。也就是说,可以按参数的元素进行学习率衰减,使变动大的参数的学习率逐渐减小。

AdaGrad会记录过去所有梯度的平方和。因此,学习越深入,更新的幅度就越小。实际上,如果无止境地学习,更新量就会变为 0,完全不再更新。为了改善这个问题,可以使用 RMSProp方法。RMSProp方法并不是将过去所有的梯度一视同仁地相加,而是逐渐地遗忘过去的梯度,在做加法运算时将新梯度的信息更多地反映出来。这种操作从专业上讲,称为“指数移动平均”,呈指数函数式地减小过去的梯度的尺度。

image-20220112191640870

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

Adam

Momentum参照小球在碗中滚动的物理规则进行移动,AdaGrad为参数的每个元素适当地调整更新步伐。将这两个方法融合在一起,就是Adam方法的基本思路。

Adam是2015年提出的新方法。它的理论有些复杂,直观地讲,就是融合了Momentum和AdaGrad的方法

image-20220112191916099

四种方法比较

image-20220112191958298

这四种方法个哟一个的特点,它们都无法做到在所有的问题中都表现良好,也都有格子衫子解决和不擅自解决的问题。

权重的初始值

在神经网络的学习中,权重的初始值特别重要。实际上,设定什么样的权重初始值,经常关系到神经网络的学习能否成功。

通过减小权重参数的值可以抑制过拟合的发生。如果想减小权重的值,一开始就将初始值设为较小的值才是正途。如果我们一开始就将权重初始值全部设为0呢?事实上,将权重初始值设为0的话,将无法正确进行学习

比如,在2层神经网络中,假设第1层和第2层的权重为0。这样一来,正向传播时,因为输入层的权重为0,所以第2层的神经元全部会被传递相同的值。第2层的神经元中全部输入相同的值,这意味着反向传播时第2层的权重全部都会进行相同的更新。因此,权重被更新为相同的值,并拥有了对称的值(重复的值)。这使得神经网络拥有许多不同的权重的意义丧失了。为了防止“权重均一化”(严格地讲,是为了瓦解权重的对称结构),必须随机生成初始值。

隐藏层的激活值的分布

加下来,我们观察隐藏层的激活值A(激活函数的输出数据)的分布,可以获得很多启发。这里要做的实验是,向一个5层神经网络(激活函数使用sigmoid函数)传入随机生成的输入数据,用直方图绘制各层激活值的数据分布。

①使用标准差为1的高斯分布作为权重初始值时的各层激活值的分布

image-20220112192921834

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

image-20211231103614490

②使用标准差为0.01的高斯分布作为权重初始值时的各层激活值的分布

image-20220112193150828

这次呈集中在0.5附近的分布。因为不像刚才的例子那样偏向0和1,所以不会发生梯度消失的问题。但是,激活值的分布有所偏向,说明在表现力上会有很大问题。为什么这么说呢?因为如果有多个神经元都输出几乎相同的值,那它们就没有存在的意义了,如果100层神经元都输出几乎相同的值,那和1个神经元表达相同的值没什么差别。

通过在各层间传递多样性的数据,神经网络可以进行高效的学习。

那怎么样设置初始值才好呢?

Xavier Glorot等人的论文[9]中推荐的权重初始值(俗称**“Xavier初始值”**)。现在,在一般的深度学习框架中,Xavier初始值已被作为标准使用。

Xavier的论文中,为了使各层的激活值呈现出具有相同广度的分布,推导了合适的权重尺度。推导出的结论是,如果前一层的节点数为n,则初始值使用标准差为1/n1/2的分布。

image-20220112193557076

使用Xavier初始值后,前一层的节点数越多,要设定为目标节点的初始值的权重尺度就越小。

③使用Xavier初始值作为权重初始值时的各层激活值的分布

image-20220112193658250

可以看到,越是后面的层,图像变得越歪斜,但是呈现了比之前更有广度的分布。

ReLU的权重初始值

Xavier 初始值是以激活函数是线性函数为前提而推导出来的。因为sigmoid函数和tanh函数左右对称,且中央附近可以视作线性函数,所以适合使用Xavier初始值。但当激活函数使用ReLU时,一般推荐使用ReLU专用的初始值,也称为“He初始值”。当前一层的节点数为n时,He初始值使用标准差为(2/n)1/2的高斯分布

我们看一下激活函数使用ReLU时,不同权重初始值的激活值分布的变化:

image-20220112194036980

观察实验结果可知:

  1. 权重初始值设置为标准差为0.01的高斯分布时,各层的激活值非常小。神经网络上传递的是非常小的值,说明逆向传播时权重的梯度也同样很小。这是很严重的问题,实际上学习基本上没有进展。
  2. 初始值为Xavier初始值时,随着层的加深,偏向一点点变大。实际上,层加深后,激活值的偏向变大,学习时会出现梯度消失的问题。
  3. 而当初始值为He初始值时,各层中分布的广度相同。由于即便层加深,数据的广度也能保持不变,因此逆向传播时,也会传递合适的值。

Batch Normalization

再上一部分中,我们了解到如果设定了合适的权重初始值,则各层的激活值分布会有适当的广度,从而可以顺利地进行学习。那么,为了使各层拥有适当的广度,“强制性”地调整激活值的分布会怎样呢?

Batch Norm的思路是调整各层的激活值分布使其拥有适当的广度。为此,要向神经网络中插入对数据分布进行正规化的层,即Batch Normalization层(下文简称Batch Norm层)。

image-20220112194546987

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

image-20220112194649559

第一第二个式子对mini-batch 的 m 个输入数据的集合 B = {x1, x2, . . . , xm}求均值和方差。

然后第三个式子将mini-batch的输入数据{x1, x2, . . . , xm}变换为均值为0、方差为1的数据。

接着,Batch Norm层会对正规化后的数据进行缩放和平移的变换。

image-20220112194933173

这里,γ和β是参数。一开始γ=1,β=0,然后再通过学习调整到合适的值。

正则化

过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态

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

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

权值衰减

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

例如,为损失函数加上权重的平方范数(L2范数,相当于各个元素的平方和)。这样一来,就可以抑制权重变大。该方法可以简单地实现,在某种程度上能够抑制过拟合。但是,如果网络的模型变得很复杂,只用权值衰减就难以应对了。

Dropout

Dropout是一种在学习的过程中随机删除神经元的方法。训练时,随机选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递

测试时,虽然会传递所有的神经元信号,但是对于各个神经元的输出,要乘上训练时的删除比例后再输出。

image-20220112195430137

通过使用Dropout,即便是表现力强的网络,也可以抑制过拟合。

超参数的验证

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

如果这些超参数没有设置合适的值,模型的性能就会很差。虽然超参数的取值非常重要,但是在决定超参数的过程中一般会伴随很多的试错。

验证数据

之前我们使用的数据集分成了训练数据和测试数据,训练数据用于学习,测试数据用于评估泛化能力。下面我们要对超参数设置各种各样的值以进行验证。这里要注意的是,不能使用测试数据评估超参数的性能。这是因为如果使用测试数据调整超参数,超参数的值会对测试数据发生过拟合。因此,调整超参数时,必须使用超参数专用的确认数据。用于调整超参数的数据,一般称为验证数据(validation data)

超参数的最优化

进行超参数的最优化时,逐渐缩小超参数的“好值”的存在范围非常重要。所谓逐渐缩小范围,是指:

  1. 一开始先大致设定一个范围,从这个范围中随机选出一个超参数(采样),用这个采样到的值进行识别精度的评估;
  2. 然后,多次重复该操作,观察识别精度的结果,根据这个结果缩小超参数的“好值”的范围。
  3. 重复这一操作,就可以逐渐确定超参数的合适范围。

小结

这一部分介绍了神经网络的学习中的几个重要技巧,说实话,没有实际的实践经验很容易看得头晕目眩。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 01:58:30  更:2022-01-14 01:59:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 22:32:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码