修正的线性激活函数(Relu)如何避免梯度消失

    2019年的第一篇博客。主要译自Machine Learning Mastery,加上了一点点自己的想法。如有问题,欢迎批评指正~ 

    消失梯度问题是在训练深度神经网络时可能遇到的不稳定问题之一。它描述了深度多层前馈网络或循环神经网络无法将有用的梯度信息从模型的输出端传播回模型输入端附近的层的情况。其结果是,具有许多层的模型通常无法在给定的数据集上学习或过早地收敛到较差的解决方案。

    目前,已经提出和研究了许多解决方案和变通方法,如改变权值初始化方案、提前使用无监督、分层训练和梯度下降变体等。也许最常见的方法是使用修正的线性激活函数,它已经替代了自90年代末至21世纪初这十年一直被使用的双曲正切激活函数,成为新的默认值。

    在本教程中,您将了解如何在训练神经网络模型时诊断消失梯度问题,以及如何使用其他激活函数和权重初始化方案来修复它。

    完成本教程后,您将知道:

  1. 梯度消失问题限制了具有双曲正切等经典激活函数的神经网络的发展。
  2. 如何利用ReLU和He权值初始化修正深度神经网络多层感知器的分类问题。
  3. 如何利用TensorBoard对消失梯度问题进行诊断,确定ReLU对模型中梯度流动的影响。

    让我们开始吧。

教程概述

    本教程分为五个部分;它们是:

  1. 梯度消失问题(总体介绍)
  2. 二圆二分类问题(构建数据集)
  3. 两圆问题的多层感知器模型(构建MLP模型)
  4. 基于ReLU的两圆问题的更深层次的MLP模型(加深模型及引入Relu激活函数)
  5. 在训练中回顾平均梯度大小(使用Tensorboard对梯度进行可视化)

 梯度消失问题

    采用随机梯度下降方法对神经网络进行训练,这包括首先计算模型的预测误差,然后利用误差来评估用于更新网络中每个权重的梯度,从而减少下一次的误差。这个误差梯度通过网络从输出层向后传播到输入层。

    对多层神经网络进行训练是可取的,因为多层神经网络的加入增加了网络的容量,使其能够学习大量的训练数据集,并能有效地表示从输入到输出的更复杂的映射函数。

    多层训练网络(如深度神经网络)的一个问题是,当梯度在网络中向后传播时,梯度会急剧减小。当它到达接近模型输入的层时,误差可能非常小,以至于影响很小。因此,这个问题被称为“消失梯度”问题。

    消失的梯度让我们很难知道参数应该向哪个方向移动以改善损失函数......

                                                                                                                                         — Page 290, Deep Learning, 2016.

     事实上,误差梯度在深度神经网络中是不稳定的,不仅会消失,而且会爆炸,梯度在网络中向后传播时呈指数增长。这就是所谓的“爆炸梯度”问题。

     消失梯度一词指的是,在前馈网络(FFN)中,反向传播的误差信号通常会随着距离最后一层的距离呈指数形式减少(或增加)。

                                                              — Random Walk Initialization for Training Very Deep Feedforward Networks, 2014.

 

    在循环神经网络中,梯度消失是一个特别的问题,因为网络的更新涉及到为每个输入时间步长展开网络,实际上创建了一个非常深的网络,需要更新权重。一个适度的循环神经网络可能有200到400个输入时间步长,在概念上产生一个非常深的网络。

    梯度消失问题可能在多层感知机中表现为训练过程中模型的改进速度较慢,可能是过早收敛,例如,继续训练不会导致进一步的改进。检查训练过程中权重的变化,我们会发现在靠近输出层的层中发生了更多的变化(即更多的学习),而在靠近输入层的层中发生的变化更少。 

    有许多技术可以用来减少前馈神经网络的梯度消失问题的影响,最著名的是替代权值初始化方案和使用替代激活函数。

     针对消失梯度问题,研究并应用了不同的深度网络训练方法(前馈和循环),如预处理、更好的随机初始缩放、更好的优化方法、特定的体系结构、正交初始化等。

                                                              — Random Walk Initialization for Training Very Deep Feedforward Networks, 2014.

     在本教程中,我们将进一步研究如何使用其他的权值初始化方案和激活函数来训练更深层次的神经网络模型。

 二圆二分类问题

    作为我们探索的基础,我们将使用一个非常简单的两类或二元分类问题。

    scikit-learn类提供了make_circles()函数,该函数可用于创建具有指定样本数量和统计噪声的二进制分类问题。

    每个示例都有两个输入变量,用于定义二维平面上该点的x和y坐标。这两个类的点被排成两个同心圆(它们有相同的中心)。

    数据集中点的数量由一个参数指定,其中一半将从每个圆中绘制。通过定义噪声标准差的“噪声”参数对采样点进行采样时,可以加入高斯噪声,其中0.0表示没有噪声,或者从圆中准确地画出点。伪随机数生成器的种子可以通过“random_state”参数指定,该参数允许每次调用函数时采样相同的点。

    下面的示例从两个带有噪声和值1的循环中生成1,000个示例,用于生成伪随机数生成器。

# generate circles
X, y = make_circles(n_samples=1000, noise=0.1, random_state=1)

     我们可以创建数据集的图形,绘制输入变量(x)的x和y坐标,并用类值(0或1)为每个点着色。下面列出了完整的示例。

# scatter plot of the circles dataset with points colored by class
from sklearn.datasets import make_circles
from numpy import where
from matplotlib import pyplot
# generate circles
X, y = make_circles(n_samples=1000, noise=0.1, random_state=1)
# select indices of points with each class label
for i in range(2):
	samples_ix = where(y == i)
	pyplot.scatter(X[samples_ix, 0], X[samples_ix, 1], label=str(i))
pyplot.legend()
pyplot.show()

    运行该示例将创建一个绘图,显示生成的1000个数据点,每个点的类值用于为每个点着色。我们可以看到0类的点是蓝色的,代表外圆,1类的点是橙色的,代表内圆。

    生成的样本的统计噪声意味着两个圆之间存在一些点的重叠,增加了问题的模糊性,使其非平凡性。这是可取的,因为神经网络可能会从许多可能的解决方案中选择一个来分类两个圆之间的点,并且总是会犯一些错误。

     现在我们已经定义了一个问题作为我们探索的基础,我们可以考虑开发一个模型来解决它。

 两圆问题的多层感知器模型

    我们可以开发一个多层感知器模型来解决这两个圆的问题。这将是一个简单的前馈神经网络模型,就像我们在20世纪90年代末和21世纪初学到的那样。

    首先,我们将从两个圆问题中生成1000个数据点,并将输入重新缩放到范围[- 1,1](数据几乎已经在这个范围内了,做这一步仅仅是确保万无一失)。

    通常,我们将使用训练数据集准备数据缩放,并将其应用于测试数据集。为了在本教程中简化流程,我们将在将所有数据

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值