深度学习之神经网络11大常见陷阱及对策
本文作者列举了搭建神经网络时可能遇到的11个常见问题,包括预处理数据、正则化、学习率、激活函数、网络权重设置等,并提供解决方法和原因解释,是深度学习实践的有用资料。
问题描述
在使用神经网络时,思考如何正确地规范化数据是非常重要的。这是一个无法改变的步骤——假如这一步骤没有小心、正确地做,你的网络就几乎不可能工作。由于这个步骤非常重要,在深度学习社区中也是众所周知的,所以它很少在论文中被提及,因此初学者常常在这一步出错。
怎样解决?
一般来说,规范化(normalizaTIon)的意思是:将数据减去均值,再除以其方差。通常这是对每个输入和输出特征单独做的,但你可能经常会希望对特征组做或特别主翼处理某些特征的规范化。
为什么?
我们需要对数据进行规范化的主要原因是大部分的神经网络流程假设输入和输出数据都以一个约是1的标准差和约是0的均值分布。这些假设在深度学习文献中到处都是,从权重初始化、激活函数到训练网络的优化算法。
还需要注意
未训练的神经网络通常会输出约在-1到1范围之间的值。如果你希望输出其他范围的值(例如RBG图像以0-255范围的字节存储)会出现一些问题。在开始训练时,网络会非常不稳定,因为比如说预期值是255,网络产生的值是-1或1——这会被大多数用于训练神经网络的优化算法认为是严重的错误。这会产生过大的梯度,可能导致梯度爆炸。如果不爆炸,那么训练的前几个阶段就是浪费的,因为网络首先学习的是将输出值缩小到大致是预期的范围。如果规范化了数据(在这种情况下,你可以简单地将数值除以128再减去1),就不会发生这些问题。
一般来说,神经网络中特征的规模也决定了其重要性。如果输出中的有一个特征规模很大,那么与其他特征相比它会产生更大的错误。类似地,输入中的大规模特征将主导网络并导致下游发生更大的变化。因此,使用神经网络库的自动规范化往往是不够的,这些神经网络库会在每个特征的基础上盲目地减去平均值并除以方差。你可能有一个输入特征,通常范围在0.0到0.001之间——这个特征的范围如此之小,因为它是一个不重要的特征(在这种情况下,你可能不想重新scale),或者因为与其他特征相比它有一些小的单元(在这种情况下,你可能想重新scale)?类似地,要小心具有这样一个较小范围的特征,它们的方差接近或等于0,如果将它们规范化,则会导致NaN不稳定。仔细考虑这些问题很重要——考虑你的每个特征真正代表什么,并将所有输入特征的"units"相等,将这一过程视为规范化。这是我认为深度学习中人在这个loop中真正需要的几个方面之一。
你忘记检查结果了
问题描述
你已经训练了几个epochs的网络,也看到错误在减少。这是否意味着已经完成了?不幸地告诉你,几乎可以肯定你的代码中还有某些问题。在数据预处理、训练代码、甚至inference中都可能有bug。只是因为错误率下降了并不意味着你的网络在学习有用的东西。
怎样解决?
在流程的每个阶段都检查数据是否正确是非常重要的。通常,你需要找到一些可视化结果的方法。如果是图像数据,那么这很简单,动画数据也不需要很麻烦就能可视化。但如果是其他类型的数据,你必须找到能够检查结果的方法,以确保在预处理、训练和推断的每个流程都正确,并将结果与ground truth数据进行比较。
为什么?
与传统的编程不同,机器学习系统几乎在所有情况下都会悄悄地发生失败。传统编程过程中,我们习惯了计算机在发生错误时抛出错误,并将其作为信号返回去检查bug。不幸的是,这个过程不适用于机器学习,因此,我们应该非常小心,在每个阶段用人眼去检查流程,以便知道何时出现bug,何时需要返回并更彻底地检查代码。
还需要注意
有很多方法可以检查网络是否正常工作。一部分方法是为了确切地说明所报告的训练错误是什么意思。可视化应用于训练集的网络的结果——你的网络的结果与实践中的ground truth 相比较如何?你可能会在训练期间将错误从100降到1,但是如果1的错误仍然是不可接受的结果,那结果仍然无法使用。如果网络在训练集上工作,那就检查验证集——它仍然适用于以前没有见过的数据吗?我的建议是从一开始就习惯于可视化所有内容——不要只在网络不工作时才可视化——要确保在开始尝试使用不同的神经网络结构之前,你已经检查过完整的流程。这是准确评估一些潜在的不同方法的唯一方法。
- 机器学习算法盘点:人工神经网络、深度学习(07-02)
- 2016年人工智能与深度学习领域的十大收购(07-26)
- AI/机器学习/深度学习三者的区别是什么?(09-10)
- 深度学习的硬件架构解析(10-18)
- 麻省理工科技评论评选的14大医疗领域突破科技(上)(10-14)
- 探秘机器人是如何进行深度学习的(09-18)