分享好友 最新动态首页 最新动态分类 切换频道
积神经网络的参数优化方法——调整网络结构是关键!!!你只需不停增加层,直到测试误差不再减少.
2024-12-29 20:54
 

本文为印度深度学习专家、创业者 Rishabh Shukla 在 GitHub 上发表的长博文,总结了他过去的开发经验,旨在给新入门的开发者提供指导。雷锋网做了不改变原意的编译。

积神经网络的参数优化方法——调整网络结构是关键!!!你只需不停增加层,直到测试误差不再减少.

在深度学习领域,为了高效训练深度神经网络,有些实践方法被过来人强烈推荐。

在这篇博文中,我会覆盖几种最常使用的实践方法,从高品质训练数据的重要性、超参数(hyperparameters)到更快创建 DNN(深度神经网络) 原型模型的一般性建议。这些推荐方法中的大多数,已被学术界的研究所证实,并在论文中展示了相关实验、数学证据,比如 Efficient BackProp(Yann LeCun et al.) 和 Practical Recommendations for Deep Architectures(Yoshua Bengio)。

许多 ML 开发者习惯把原始训练数据直接扔给 DNN——为什么不这么做呢?既然任何 DNN (大多数人的假设)仍然能够给出不错的结果,不是吗?但是,有句老话叫“给定恰当的数据类型,一个简单的模型能比复杂 DNN 提供更好、更快的结果”。虽然这有一些例外,但在今天,这句话仍然没有过时。因此,不管你是在计算机视觉( CV),自然语言处理(NLP)还是统计建模(Statistical Modelling)等领域,想要对原始数据预处理,有几个方法可以得到更好的训练数据:

激励函数是所有神经网络的核心部分之一。

激励函数把渴望已久的非线性(non-linearity)加入了模型。多年来,Sigmoid 函数 一直是多数人倾向的选择。但是,Sigmoid 函数不可避免地存在两个缺陷:1. 尾部  sigmoids 的饱和,进一步导致梯度消失。2. 不以 0 为中心(输出在 0 到 1 之间)。

一个更好的替代选择是 Tanh 函数。数学上来说,Tanh 只是调整、平移过的 Sigmoid 函数:tanh(x) = 2*sigmoid(x) - 1。虽然 Tanh 仍旧存在梯度消失的缺陷,但好消息是:Tanh 以 0 为中心。因此,把 Tanh 作为激励函数能更快地收敛(converge)。我发现使用 Tanh 通常比 Sigmoid 效果更好。

你还可以探索其他选择,比如 ReLU, SoftSign 等等。对于一些特定任务, 它们能够改善上述问题。

保留超出最优数量的隐藏单元,一般是比较保险的做法。这是因为任何正则化方法( regularization method)都会处理好超出的单元,至少在某种程度上是这样。在另一方面,保留比最优数量更少的隐藏单元,会导致更高的模型欠拟合(underfitting)几率。

另外,当采用无监督预训练的表示时(unsupervised pre-trained representations,下文会做进一步解释),隐藏单元的最优数目一般会变得更大。因此,预训练的表示可能会包含许多不相关信息(对于特定任务)。通过增加隐藏单元的数目,模型会得到所需的灵活性,以在预训练表示中过滤出最合适的信息。

选择隐层的最优数目比较直接。正如 Yoshua Bengio 在  Quora 中提到的:

你只需不停增加层,直到测试误差不再减少。

永远用小的随机数字初始化权重,以打破不同单元间的对称性(symmetry)。但权重应该是多小呢?推荐的上限是多少?用什么概率分布产生随机数字?

当使用 Sigmoid 激励函数时,如果权重初始化为很大的数字,那么 sigmoid 会饱和(尾部区域),导致死神经元(dead neurons)。如果权重特别小,梯度也会很小。因此,最好是在中间区域选择权重,比如说那些围绕平均值均衡分布的数值。

幸运的是,已经有许多关于初始权重合适取值的研究。这对于高效的收敛非常重要。为初始化均衡分布的权重,均匀分布(uniform distribution )或许是最好的选择之一。另外,就像论文中所展示的(Glorot and Bengio, 2010),有更多输入连接(fan_in)的单位,应该有相对更小的权重。

多亏这些十分透彻的试验,现在我们已经有了经过检验的公式,可以直接用来权重的初始化。

比如说在  ~ Uniform(-r, r) 提取的权重,对于 tanh 激励  r=sqrt(6/(fan_in+fan_out));对于 sigmoid 激励 r=4*(sqrt(6/fan_in+fan_out)) 。fan_in 是上一层的大小, 而 fan_out 是下一层的。

这或许是最重要的超参数之一,调节着学习过程。如果学习率设置得太小,你的模型很可能需要 n 年来收敛。设置得太大,再加上不多的初始训练样本,你的损失可能会极高。一般来说,0.01 的学习率比较保险

相比固定学习率,在每个周期、或每几千个样例后逐渐降低学习率是另一个选择。虽然这能更快地训练,但需要人工决定新的学习率。一般来说,学习率可以在每个周期后减半。几年前,这种策略十分普遍。

幸运的是,我们现在有了更好的、基于动能(momentum based)的方法,来调整学习率。这取决于误差函数的曲率。另外,既然有些参数有更快、或更慢的学习速率;它或许能帮助我们针对模型中的单独参数,设定不同的学习率。

最近有大量关于优化方法的研究,导致了自适应学习率(adaptive learning rates)目前我们有许多选择,从老式动能方法( Momentum Method ),到  Adagrad、Adam (个人最爱)、 RMSProp 等等。;类似于 Adagrad 或 Adam 的方法,能替我们省去人工选择初始学习率的麻烦;给定合适的时间,模型会开始平滑地收敛。当然,选择一个特别合适的初始学习率仍然能起到帮助作用。

网格搜索(Grid Search )在经典机器学习中十分普遍。但它在寻找 DNN 的最优超参数方面一点也不高效。这主要是由于 DNN 尝试不同超参数组合所耗费的时间。随着超参数不断增长,网格搜索需要的计算性能会指数级增长

有两种解决办法:

超参数组合通常在期望范围之内、从均匀分布中被选择出来。加入之前获得的知识来进一步缩小搜寻空间,也是有可能的(比如,学习率不应该太大也不应该太小)。大家发现,随机搜索比网格搜索高效地多。

随机梯度下降( Stochastic Gradient Descent )的老方法也许对于 DNN 不是那么有效率(有例外)。最近,有许多研究聚焦于开发更灵活的优化算法,比如 Adagrad、Adam,、AdaDelta,、RMSProp 等等。在提供自适应学习率之外,这些复杂的方法还对于模型的不同参数使用不同的学习率,通常能有更平滑的收敛。把这些当做超参数是件好事,你应该每次都在训练数据的子集上试试它们。

即便是运行最先进的深度学习模型,使用最新、最强大的计算硬件,内存管理仍然在字节(byte)级别上进行。所以,把参数保持在 64, 128, 512, 1024 等 2 的次方永远是件好事。这也许能帮助分割矩阵和权重,导致学习效率的提升。当用 GPU 运算,这变得更明显。

不管你进行的是 NLP(自然语言处理)、计算机视觉还是语音识别等任务,无监督预训练永远能帮助你训练监督、或其他无监督模型:NLP 中词向量就(Word Vectors)无所不在;你可以用 ImageNet 的数据库,使用无监督方式对你的模型预训练,或是对于两个类别的监督分类;或是更大频域的音频样本,来在扬声器消崎模型(speaker disambiguation model)中使用该信息。

训练一个模型的主要目的是学习合适的参数,即产生输入到输出的最优映射。这些参数利用每个训练样本进行调参,不管你决定使用 batch, mini-batch 还是随机学习。当采用随机学习方法时,学习每个训练样本后权重的梯度都会进行调参,向梯度加入噪音(随机学习中“随机”的由来)。这样做的结果十分理想,比如说,训练中加入的噪音使得模型更不容易过拟合

但是,随机学习方法也许效率不高。如今的计算设备有非常可观的运算能力,随机学习很可能会浪费其中的一大部分。如果我们能计算矩阵相乘,那么为什么要限制自己,重复单个矢量组之间的乘法呢?因此,为了更高的吞吐率和更快的学习,我推荐使用 mini-batch 而不是随机学习。

但是,选择适当的 batch 规模同样重要。所以我们能保留一些噪音(相比大规模 batch),与此同时更高效地利用计算性能。一般来说,包含  16 个到 128 个样例的 batch(2 的幂)是不错的选择。通常,一旦你发现了更重要的超参数(通过随机搜索或是人工搜索),batch 规模就会确性下来。但是,有些场景中模型得到训练数据流(比如网络学习),那么采用随机学习就是不错的选择。

这来自于信息理论(Information Theory)——“学习到一件不太可能发生的事却发生了,比学习一件很可能发生的事已经发生,包含更多的信息。”同样的,把训练样例的顺序随机化(在不同周期,或者 mini-batch),会导致更快的收敛。如果模型看到的很多样例不在同一种顺序下,运算速度会有小幅提升。

如果有数百万的参数需要学习,正则化就是避免 DNN 过拟合的必须手段。你也可以继续使用 L1/L2 正则化,但 Dropout 是检查 DNN 过拟合的更好方式(雷锋网按:Dropout 是指随机让网络某些隐层节点的权重不工作,不工作的那些节点可以暂时认为不是网络结构的一部分,但是它的权重会保留下来)。执行 Dropout 很容易,并且通常能带来更快地学习。0.5 的默认值是一个不错的选择,当然,这取决于具体任务。如果模型不太复杂,0.2 的 Dropout 值或许就够了。

在测试阶段,Dropout 应该被关闭,权重要调整到相应大小。只要对一个模型进行 Dropout 正则化,多一点训练时间,误差一定会降低。

“对深度学习模型进行多个周期的训练,会得到更好的模型”——我们经常听到这句话。但多少周期才是“多”呢?其实,这里有一个简单的策略:继续按照一个固定的样例数或者周期训练模型,比如两万个样例或者一个周期。在每批样例之后,比较测试误差(test error)和训练误差(train error),如果它们的差距在缩小,那么继续训练。另外,记得在每批训练之后,保存模型的参数,所以训练好之后你可以从多个模型中做选择。

训练深度学习模型有上千种出差错的方式。我猜大家都遇到过这样的场景:模型已经训练了几个小时或者好几天,然而在训练完成之后,才意识到某个地方出问题了。为了不让你自己神经错乱,一定要对训练过程作可视化处理。比较显而易见的措施是保存或打印损失值、训练误差、测试误差等项目的日志。

最新文章
Download Internet Download AcceleratorAward-winning Download Manager for free!
Alternative download linksGoogle Chrome plug-in adds ability to start download or a group of downloads from the Google Chrome's context menu. After you install the plug-in, the Internet Download Accelerator sub-menu with D
A1369青苹果影视系统源码/影视聚合/影视导航/影视点播网站源码下载
功能列表1、数据模块 – 一键对接市面上的影视资源站API接口、现已支持FeiFeiCms、MacCms、MaxCms、SeaCms等常用的影视CMS接口。2、自适应模板 – 系统支持一套模板自适应电脑、手机、平板、公众号等多个终端入口,也可以独立设置移动端与P
10倍的AI绘图性能提升:Stable Diffusion+Microsoft Olive性能测试
10倍的AI绘图性能提升:Stable Diffusion+Microsoft Olive性能测试 前言 Stable Diffusion是目前知名度最高的AI绘图软件,因为这是一款开源软件,任何人都可以获取并进行二次训练以及修改,所以目前网络上流传的版本和模型极多。其中流传最
AI绘画跟自己很像的人
一、AI绘画的简介AI(人工智能)绘画是一种利用计算机算法和机器学习技术让计算机自动创作绘画作品的技术。通过分析大量的艺术作品和图像,AI可以学习绘画的技巧和风格,并根据输入的指令或参数创造出新的艺术作品。与传统的绘画方式相比,
2023全国妇联国考面试名单_面试形式/时间_合格分数线_国家公务员成绩排名查询
  2023全国妇联国考面试名单_面试形式/时间_合格分数线_国家公务员成绩排名查询由国家公务员考试网国家公务员栏目由提供,更多关于全国妇联国考面试名单,全国妇联国考成绩排名,国家公务员考试国家公务员的内容,请关注国家公务员考试网/
Elasticsearch基础知识与架构概述
Elasticsearch是一个基于分布式搜索和分析引擎,它可以处理大量数据并提供实时搜索功能。在本文中,我们将深入了解Elasticsearch的基础知识和架构概述,并探讨其核心概念、算法原理、最佳实践、实际应用场景和未来发展趋
AI中如何使用图片绘画——触站AI指南
随着人工智能技术的发展,AI绘画已经成为了创意领域的一个新的突破口。AI绘画的应用不仅可以节省时间和精力,还能快速地生成众多的创作灵感。在这里,我们将为大家介绍一款非常好用的AI绘画系统——触站AI。一、什么是触站AI触站AI是触站原
2024年新版宝塔面板如何安装WordPress网站教程
宝塔面板可以通过一键部署WordPress网站插件来安装WordPress,但是它的版本较老,需要在WordPress后台进行升级。另外,你也可以选择手动部署WordPress,这样可以保证安全性并且拥有最新的安装程序。以下是手动建立WordPress站点的步骤:1.首
21种常见大数据可视化图表
为什么数据可视化如此重要? 数据可视化能把枯燥的数据变得有趣起来,不用再成千上万的数据面前焦头烂额。 这里小结了下21中常见的图表。附图有的是我从excel生成的,有的是比较懒直接百度找的。 一种描述多级数值流向的
CloudFlare使用CNAME/IP接入CDN
CloudFlare的免费CDN是最著名的,如果你的网站经常被攻击,那么CloudFlare是你很好都解决方案,但是你必须使用CloudFlare的dns,你无法分运营商解析,而且全部都是由两个ipv4和ipv6,实际体验不大好,和可以利用来实现自选IP(最后提供推荐
相关文章
推荐文章
发表评论
0评