cckchina 2019-05-05
我们很多人都试图理解机器学习算法,但有时我们也会遇到一些bug,那么这时候就需要进行调试神经网络了,这篇文章虽然比较短,但是很好的记录了关于调试的过程。
在读文章之前,我希望大家都是明白神经网络是什么以及它是如何工作的。但在文章中我还是会涉及一些关于神经网络的事情,如果您已经很熟悉了,那么您可以跳过这一部分了。
什么是神经网络
神经网络是一系列算法的集合,是模拟人类大脑的一种建模,旨在识别模式。他们通过各种机器感知、标记或聚类原始输入来解释感官数据。他们理解的模型是数字的,包含在向量中。
神经网络有益于我们进行聚类和分类。您可以将它们视为您存储和管理的数据之上的集群和分类层。它们根据示例输入之间的关系对未标记的数据进行分组,并在需要训练的标记数据集时对数据进行分类。
在许多事件中,研究人员都将面临这样一个问题:使用机器学习框架实现的神经网络可能与理论模型相去甚远。要检查模型是否可靠,直接的方法是不断纠正和调整。例如,在2018年8月,谷歌Brain的Ian Goodfellow和其他人引入了TensorFuzz,他们添加了一个开源库,通过提交覆盖率引导的fuzzing (CGF)来帮助自动调试神经网络。
调试机器学习模型并不简单,因为发现错误的成本太高。即使对于几乎简单的前馈神经网络,研究人员也需要讨论诸如网络架构、权重初始化和网络优化等问题。
调试神经网络的五种方法:
具有复杂的归一化和学习速率调度体系结构的神经网络使得单个神经网络更难以调试。首先,构建一个相对简单的模型:创建一个带有单个隐藏层的小模型,并对其进行测试;然后慢慢添加模型的复杂性,并证明模型结构的每个级别(附加层、参数等)都是真实的。
其次,在单个数据节点上训练模型:可以应用一个或两个训练数据点来确认模型是否过度拟合。神经网络应该快速过度拟合,训练精度为100%,这表明模型是兼容的;如果模型不能过度拟合这些数据点,则表明它太小或有存在bug。
模型损失是评估模型性能的主要方式,也是模型为评估设置基本参数的基础,因此您需要确保:模型损失是指任务(使用多熵的交叉熵损失);
正确估计损失函数的重要性。如果您应用多种类型的损失函数,例如MSE、Antagonistic、L1、功能丢失,那么请确保以正确的方式分发所有损失。
要调试神经网络,您需要了解神经网络内部的动态,不同中间层的作用以及层的连接方式。但是,您可能会遇到以下问题:
如果梯度值为0,则表示优化器中的学习速率可能太小,并且梯度更新的表达式不准确。
除了专注于梯度的绝对值,一定要控制每层匹配的激活和权重。例如,参数更新的量(权重和偏差)应为1-e3。应该指出的是,在一种称为“死亡ReLU”或“梯度消失”的现象中,ReLU神经元在得知其权值的负偏差项后将输出0。这些神经元不会在任何数据点启动。
你可以做一个梯度测试来近似梯度通过数值技术来测试这些误差。如果距离计算梯度较近,则正确地实现了反向传播。
对于可视化神经网络的主要方法,有三个例子:
初始过程:呈现训练模型的整体结构,包括展示神经网络各层的形状或过滤器以及每个段的参数;
基于激活的方法:破译个体神经元的激活功能初始过程:呈现训练模型的整体结构,包括展示神经网络各层的形状或过滤器以及每个段的参数;
基于激活的方法:破译个体神经元或神经元集合的激活功能;
基于梯度的方法:训练模型时,由前向或后向通道形成的梯度进行处理。
还有许多工具可用于可视化各种层的激活和连接,例如ConX和Tensor-board。
神经网络具有大量相互交互的设置,使得优化也非常棘手。
批量大小:您希望批量足够长以准确评估误差梯度,小到足以提供随机梯度下降(SGD)来管理网络。批量大小将导致学习方法在整个训练过程中立刻面临噪声的代价,并且可能开始出现优化困难。
学习率:太低会导致收敛缓慢或陷入局部最小值的风险。太高将导致优化的分散。
梯度剪切:用于在反向传播中剪切参数梯度的最大值或最大值范数。
批量归一化:对每一层的输入进行归一化,解决内部协变量移位问题。
随机梯度下降(SGD):SGD使用动量、自适应学习率、Nesterov更新。
正规化:构建可扩展模型至关重要,因为它会增加模型复杂性或极端参数值的代价。同时,它显著地减小了模型的方差,并没有显著加偏差。
Dropout:一种不同的技术,可以调节网络以防止过度拟合。在训练期间,通过以一定概率p(超参数)维持神经元活动而达到的损失。否则,它被设置为零。总之,网络必须在每个训练批次中使用单独的参数子集,这减少了特定参数的变化并且变得优于其他设置。
通过更好地跟踪您的工作,您可以轻松查看和重现以前的实验,以减少重复工作。
但是,手动记录信息可能是很困难的,需要进行多次实验,而像comet.ml这样的工具可以帮助自动跟踪数据集、代码更改、实验历史和生产模型,包括关于模型的关键知识,例如超参数:模型性能指标和环境细节。
神经网络容易受到数据、参数甚至包的微小变化的影响,这会导致性能下降。工作跟踪是归一化环境和建模工作流程的第一步。
编译出品