如何训练深度神经网络?

1. 训练数据

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

获取越大的数据库越好。DNN 对数据很饥渴,越多越好。

去除所有包含损坏数据的训练样本,比如短文字,高度扭曲的图像,假输出标签,包含许多虚值(null values)的属性。

Data Augmentation(数据扩张)——生成新样例。以图像为例,重新调节,增加噪声等等。

2. 选择恰当的激励函数(activation function)

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

激励函数把渴望已久的非线性(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 等等。对于一些特定任务, 它们能够改善上述问题。

3. 隐藏单元和隐层(Hidden Units and Layers)的数量

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

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

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

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

4. 权重初始化 (Weight Initialization)

永远用小的随机数字初始化权重,以打破不同单元间的对称性(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 是下一层的。

5. 学习率

这或许是最重要的超参数之一,调节着学习过程。如果学习率设置得太小,你的模型很可能需要 n 年来收敛。设置得太大,再加上不多的初始训练样本,你的损失可能会极高。一般来说,0.01 的学习率比较保险。但AI科技评论提醒各位读者,这不是一个严格的标准。最优学习率与特定任务的属性息息相关。

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

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

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

6. 超参数调参:扔掉网格搜索,拥抱随机搜索

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

有两种解决办法:

1. 取决于你之前的经验,你可以人工对部分常见超参数调参,比如学习率、隐层数目。

2. 采用随机搜索(random search),或者随机采样代替网格搜索,来选择最优超参数。

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

7. 学习方法

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

8. 权重的维度保持为 2 的幂

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

9. 无监督预训练(Unsupervised Pretraining )

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

10. Mini-Batch(小批量) 对比随机学习(Stochastic Learning)

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

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

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

11. 打乱训练样本

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

12. 使用 Dropout 正则化

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

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

13. 周期 / 训练迭代次数

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

14. 可视化

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

在此之外,一个很好的措施是采用可视化库(visualization library ),在几个训练样例之后、或者周期之间,生成权重柱状图。这或许能帮助我们追踪深度学习模型中的一些常见问题,比如梯度消失与梯度爆发(Exploding Gradient)。

15. 使用支持 GPU 和自动微分法 (Automatic Differentiation)的库

谢天谢地,对于快速创建原型模型,我们已经有了相当不错的库,比如 Theano, Tensorflow, Keras 等等。几乎所有这些深度学习库支持 GPU 计算和自动微分法。所以,你不需要深入研究核心 GPU 编程技术(除非你想——这绝对很有意思)。你也不需要写自己的微分代码——在非常复杂的模型上这相当费劲(但若需要,你应该有能力去做)。 Tensorflow还提供了分布式计算的支持——如果你是土豪的话。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容