(翻译)深度学习:对深度学习神经网络从业人员的建议

作者:Jason Brownlee 2019年8月6日

​ 鉴于开源库的广泛采用,深度学习神经网络的建立和训练相对简单。

​ 然而,神经网络仍然难以配置和训练。

​ Yoshua Bengio在其2012年的论文《深度结构的基于梯度的训练的实用建议》中提到作为预印本的2012年《神经网络:贸易的技巧》一书中的一章出版。 为深度学习中配置和调整神经网络模型提供了实用建议。

​ 在这篇文章中,您将浏览这篇冗长而有趣的论文,并为现代深度学习从业者挑选最合适的技巧和窍门。

​ 阅读这篇文章后,您将知道:

  • 深度学习复兴的早期基础包括预训练和自动编码器。
  • 有关神经网络超参数范围的初始配置的建议。
  • 如何有效地调整神经网络超参数和策略以更有效地调整模型。

​ 在我的新书中,通过26个循序渐进的教程和完整的源代码,探索如何通过深度学习模型更快地训练,减少过度拟合并做出更好的预测。

​ 让我们开始吧。
(翻译)深度学习:对深度学习神经网络从业人员的建议

深度学习神经网络从业者实用建议 Susanne Nilsson摄,保留部分权利。

总览

​ 本教程分为五个部分。 他们是:

  1. 从业者必读
  2. 论文概述
  3. 深度学习的起点
  4. 通过梯度下降法学习
  5. 超参数建议

给从业者的建议

​ 2012年,发行了第二版流行的实用书籍“神经网络:交易技巧”。

第一版于1999年出版,包含17个章节(每个章节由不同的学者和专家撰写),内容涉及如何充分利用神经网络模型。 更新的第二版又增加了13章,其中包括Yoshua Bengio撰写的重要一章(第19章),标题为“基于梯度的深度体系结构培训的实践建议”。

​ 第二版出版的时间是人们对神经网络重新产生兴趣并开始出现“深度学习”的重要时期。 Yoshua Bengio的这一章很重要,因为它为开发神经网络模型提供了建议,包括当时非常先进的深度学习方法的详细信息。

​ 尽管本文可以作为第二版的一部分来阅读,但Bengio还在arXiv网站上发布了该章的预印本,可在此处访问:

​ 本章也很重要,因为它为四年后深度学习的教科书(后来被Bengio共同称为“深度学习”)提供了宝贵的基础。

​ 所有神经网络从业人员都必须阅读本章(从现在开始将其称为论文)。

​ 在这篇文章中,我们将逐步浏览论文的每个部分,并指出一些重要的地方。

论文概述

​ 论文的目的是为从业人员提供开发神经网络模型的实用建议。

​ 神经网络模型的类型很多,从业者的类型也很多,因此目标是广泛的,论文中的建议并不针对给定类型的神经网络或预测建模问题。 这样做的好处是,我们可以将建议自由地应用到我们的项目中,但是比较遗憾的是没有提供文献或案例研究中的具体示例。

​ 这些建议的重点是模型超参数的配置,特别是那些与随机梯度下降学习算法有关的参数。

论文旨在作为实用指南,为一些最常用的超参数提供建议,尤其是在基于反向传播梯度和基于梯度优化的学习算法的背景下。

​ 正值深度学习的曙光期。深度学习过程中,现代方法和GPU硬件促进了网络开发的深度,从而提供了比以前更大的功能。 Bengio将这种复兴追溯到2006年(在撰写论文之前的六年),并且开发了贪婪逐层预训练方法,后来(在撰写论文之后)被ReLU,Dropout,BatchNorm等广泛使用。有助于开发非常深入的模型。

​ 2006年深度学习的突破集中在使用无监督学习来通过在隐藏层提供本地训练信号来帮助学习内部参数。

​ 论文分为六个主要部分,第三部分主要提供有关配置超参数的建议。 下面提供了论文的完整目录。
(翻译)深度学习:对深度学习神经网络从业人员的建议
​ 我们不会深入探索每个部分,而是专注于论文的开头,尤其是针对超参数和模型调整的建议。

深度学习的起点

​ 简介部分在深度学习的开始上花费了一些时间,可以将其视为该领域的有趣的历史快照。

​ 当时,深度学习的复兴是由神经网络模型的发展所推动的,新模型具有比以前基于贪婪的逐层预训练和通过自动编码器进行表示学习等技术所使用的层数更多。

训练深度神经网络的最常用方法之一是基于贪婪的逐层预训练。

​ 这种方法很重要,不仅因为它允许开发更深的模型,而且无监督的形式也允许它使用没有标记的数据,例如半监督学习,这也是一个突破。

特征学习和深度学习的另一个重要动机是可以通过未标记的示例来完成……

​ 因此,重用(reuse)是一个主要主题。

表示分布式能力的重用概念也是深度学习背后理论优势的核心。

​ 尽管理论上具有足够容量的单层或两层神经网络可以近似于任何函数,但他提醒人们深层网络为近似复杂函数提供了计算捷径。 这是一个重要的提醒,并有助于激励深度模型的开发。

理论结果清楚地确定了功能系列,在这些功能系列中,深度神经网络的效率比深度不够的高出几倍。

​ 主要花费时间的地方在于两项“深度学习”突破:贪婪的逐层预训练(有监督和无监督)和自动编码器(既有降噪又有对比)。

​ 第三个突破是RBM,该方法的开发者Hinton在该书的另一章中讨论了RBM。

  • 受限玻尔兹曼机(RBM)。
  • Greedy Layer-Wise Pretraining (Unsupervised and Supervised).
  • 自动编码器(去噪和对比)。

​ 尽管具有里程碑意义,但是在深度学习的发展中,今天(六年后)没有一种技术被广泛使用,除了自动编码器外,没有任何一种技术能像从前那样得到大力研究。

通过梯度下降学习

​ 第二部分提供了梯度和梯度学习算法的基础,梯度学习和梯度学习算法是用于使神经网络权重适合于训练数据集的主要优化技术。

​ 这类算法包括批处理和随机梯度下降之间的重要区别,以及通过小批量梯度下降的近似值,在今天都简单地称为随机梯度下降。

  • 批次梯度下降(Batch Gradient Descent). 使用训练数据集中的所有示例估计梯度。
  • 小批量梯度下降(Mini-Batch Gradient Descent). 使用训练数据集中的样本子集估计梯度。
  • 随机(在线)梯度下降(Stochastic (Online) Gradient Descent). 使用训练数据集中的每个单个模式估计梯度。

​ 迷你批处理变量是一种通过随机梯度下降提供的收敛速度的方法,其中改进了对批梯度下降提供的误差梯度的估计。

​ 较大的批次大小会降低收敛速度。

随着B [批处理大小]的增加,每次计算完成的更新次数会减少,这会降低收敛速度(就错误与执行的乘加运算次数而言),因为在同一时间可以完成的更新次数更少。

​ 由于在梯度估计中引入了统计噪声,因此较小的批次大小可提供正则化效果。

…较小的B [批大小]值可能会受益于对参数空间的更多探索和某种形式的规范化,这两者都是由于在梯度估计器中注入了“噪声”,这可以解释有时用较小的B观察到的更好的测试结果。

​ 这次也是在神经网络模型开发中引入和广泛采用自动微分的方法。

可以手动或通过自动微分计算梯度。

​ Bengio对此尤其感兴趣,因为他参与了Theano Python数学库和pylearn2深度学习库的开发,这两种方法现已不复存在,可能分别由TensorFlowKeras继承。

​ 手动实现神经网络的微分计算很容易搞砸,错误可能难以调试并且导致次优性能。

当使用手动微分实现梯度下降算法时,结果往往是冗长,易碎的代码,缺乏模块化-在软件工程方面,这都是不好的事情。

​ 自动微分被描述为一种更强大的方法,可以将神经网络开发为数学运算的图形,每个图形都知道如何进行微分,可以通过符号进行定义。

​ 更好的方法是用对象表示流程图,这些对象将对如何计算输入的输出以及如何计算梯度下降所需的偏导数进行模块化。

​ 基于图的方法定义模型的灵活性以及在计算误差导数时减少误差的可能性意味着,至少在底层数学库中,该方法已成为现代开源神经网络库的标准。

超参数建议

​ 论文的主要重点是在随机梯度下降下控制模型的收敛和泛化的超参数的配置。

使用验证集

​ 本节从使用训练集和测试集中的单独验证数据集调整模型超参数的重要性开始。

对于任何会影响学习有效能力的超参数,其对挑选样本外数据(训练集之外)例如,验证集性能,在线错误, 或交叉验证错误等会更有效。

​ 关于在模型性能评估中不包括验证数据集的重要性。

一旦一些样本外数据用于选择超参数值,就无法再使用它来获得泛化性能的无偏差估计量,因此通常使用测试集(或双交叉验证,如果使用小数据集)来估算学习算法的泛化误差(其中隐藏了超参数选择)。

​ 交叉验证通常不与神经网络模型一起使用,因为它们需要花费数天,数周甚至数月的时间来训练。 不过,在可以使用交叉验证的较小数据集上,建议使用双重交叉验证技术,该技术在每个交叉验证折叠内执行超参数调整。

双重交叉验证递归地应用交叉验证的思想,即使用外部循环交叉验证来评估泛化错误,然后在每个外部循环拆分的训练子集内应用内部循环交叉验证(即,将其再次拆分为训练和验证并折叠)以选择该拆分的超参数。

深度学习的超参数

​ 之后引入了一套深度学习的超参数,并附有一些建议。

​ 超参数如下:

  • 初始学习率(Initial Learning Rate). 权重的比例已更新; 0.01是一个好的开始。
  • Learning Sate Schedule. 随着时间的流逝学习率下降; 1 / T是一个好的开始。
  • Mini-batch Size. 用于估计梯度的样本数; 32是一个好的开始。
  • Training Iterations. 权重的更新次数; 设置大并尽早停止。
  • Momentum. 使用先前权重更新的历史记录; 设置较大(例如0.9)。
  • Layer-Specific Hyperparameters. 可能有,但很少使用。

​ 学习率是最重要的参数。 尽管建议以0.01为起点,但需要考虑特定数据集和模型。

这通常是最重要的单个超参数,应始终确保已对其进行调整[…]默认值0.01通常适用于标准的多层神经网络,但是仅依赖于该默认值是愚蠢的。

​ 到目前为止他还说过,如果只能调整一个参数,那就是学习率。

如果只有时间优化一个超参数并且使用随机梯度下降,那么这是值得调整的超参数。

​ 批处理大小是对学习速度的控制,而不是调整测试集的性能(泛化误差)。

从理论上讲,此超参数应该影响训练时间,而不会影响测试性能,因此可以在其他超参数之后比较训练曲线(训练和验证误差与训练时间量)来与其他超参数分开进行优化。

模型超参数

​ 引入模型超参数,并再次提供建议。

​ 它们是:

  • 节点数. 控制模型的容量; 使用带有正则化的更大的模型。
  • **权重调整 **对权重较大的模型进行惩罚; 通常尝试使用L2,对稀疏网络使用L1。
  • Activity Regularization. 惩罚大型**模型; 尝试使用L1进行稀疏表示。
  • **函数. 用作隐藏层中节点的输出; 使用S形函数(逻辑和正切)或整流器(现标准)。
  • 权重初始化. 优化过程的起点; 受**功能和先前层大小的影响。
  • 随机种子. 优化过程的随机性; 多次运行的平均模型。
  • 预处理. 在建模之前准备数据; 至少标准化并消除相关性。

​ 配置层中节点的数量具有挑战性,这可能是初学者最常提出的问题之一。 他建议在每个隐藏层中使用相同数量的节点,这可能是一个不错的起点。

在一项大型的比较研究中,我们发现对所有图层使用相同的节点数量大小通常效果更好,与使用减小的大小(类似金字塔形)或增加的大小(上下金字塔形)效果相同,但当然这可能与数据相关 。

​ 他还建议对第一个隐藏层使用超完备的配置。

对于我们处理的大多数任务,我们发现超完备(节点数大于输入向量)的第一隐藏层比欠完备的更好。

​ 考虑到注重分层训练和自动编码器,表示的稀疏性(隐藏层的输出)在当时是一个重点。 因此,建议在较大的编码器-解码器模型中使用活动正则化,这可能仍然有用。

​ 当时,线性整流器**功能才刚刚开始使用,尚未得到广泛采用。 如今,使用整流器(ReLU)已成为一种标准,因为使用整流器的模型很容易胜过使用逻辑或双曲线正切非线性的模型。

调整超参数

​ 对于大多数问题,默认配置对大多数神经网络都适用。

​ 但是,需要进行超参数调整才能充分利用给定数据集上的给定模型。

​ 调整超参数可能具有挑战性,因为需要计算资源,而且因为它很容易在验证集上过拟合,从而导致误导性发现。

人们必须将超参数选择视为学习的一种困难形式:既存在优化问题(寻找产生低验证误差的超参数配置)又存在泛化问题:优化验证性能后,预期泛化存在不确定性, 比较许多超参数配置时,可能会过度拟合验证误差并获得乐观的性能估计器。

​ 调整模型的一个超参数并绘制结果通常会导致形成U形曲线,该曲线显示了性能不佳,性能良好以及恢复到性能较差的模式(例如,将损失或错误最小化)。 目的是找到“ U”的底部。

​ 问题是,在许多超参数相互作用下,“ U”的底部可能很吵。

尽管对于一阶近似而言,我们期望一种U形曲线(当仅考虑单个超参数时,其他曲线是固定的),但该曲线也可能具有噪声变化,部分原因是使用了有限的数据集。

​ 为了帮助进行此搜索,他随后提供了三个有价值的技巧,这些条件在调整模型超参数时通常需要考虑:

  • 边界上的最佳价值. 如果在搜索间隔的边缘找到了一个不错的值,请考虑扩大搜索范围。
  • 考虑的价值规模. 考虑至少在对数标度上进行搜索(例如0.1、0.01、0.001等)。
  • 计算注意事项。. 考虑放弃结果保真度以加快搜索速度。

​ 建议了三种系统的超参数搜索策略:

  • 坐标下降. 一次改变一个超参数。
  • 多分辨率搜索. 反复放大搜索间隔。
  • 网格搜索. 定义一个n维值网格并依次测试每个值。

​ 这些策略可以单独使用,也可以组合使用。

​ 网格搜索可能是调整模型超参数的最普遍理解和广泛使用的方法。 它是详尽的但可并行化的,可以使用廉价的云计算基础结构来利用。

与许多其他优化策略(例如坐标下降)相比,网格搜索的优势在于它是完全可并行化的。

​ 通常,通过将多分辨率和网格搜索相结合的迭代网格搜索来重复此过程。

通常,仅进行一次网格搜索是不够的,并且从业者往往会进行一系列的网格搜索,每次都根据先前获得的结果调整考虑的值范围。

​ 他还建议让人员参与其中,以留意错误,并使用模式识别来识别趋势并更改搜索空间的形状。

人类可以很好地执行超参数搜索,并且使人类参与还具有可以帮助检测错误或学习算法的不良行为或意外行为的优势。

​ 但是,重要的是要尽可能地自动化,以确保该过程对于将来的新问题和新模型可重复。

​ 网格搜索是详尽且缓慢的。

网格搜索方法用于查找良好的超参数配置的一个严重问题是,它与考虑的超参数数量呈指数比例缩放。

​ 他建议使用随机抽样策略,该策略已被证明是有效的。 每个超参数的间隔可以统一搜索。 通过包括先验(例如明智的违约选择)可以使这种分布产生偏差。

随机采样的思想是用随机(通常是均匀的)采样代替常规网格。 通过从先前的分布中独立地对每个超参数进行采样(通常在对数域中,在感兴趣的区间内是均匀的)来选择每个已测试的超参数配置。

​ 论文以更一般的建议结尾,包括调试学习过程的技术,使用GPU硬件加快培训的速度以及尚待解决的问题。

概要

​ 在本文中,您发现了Yoshua Bengio在2012年发表的论文“针对基于梯度的深度架构培训的实用建议”中的重要建议,技巧和窍门。

​ 您读过这篇文章吗? 您有什么想法?请在下面的评论中发表自己的看法。

​ 您有任何问题吗?
​ 在下面的评论中提出您的问题,我会尽力回答。

原文链接:https://machinelearningmastery.com/recommendations-for-deep-learning-neural-network-practitioners/