神经网络训练中的Tricks之高效BP(反向传播算法)

神经网络训练中的Tricks之高效BP(反向传播算法)

zouxy09@qq.com

Tricks!这是一个让人听了充满神秘和好奇的词。对于我们这些所谓的尝试应用机器学习技术解决某些问题的人,更是如此。曾记得,我们绞尽脑汁,搓手顿足,大喊“为什么我跑的模型不work?”,“为什么我实现的效果那么差?”,“为什么我复现的结果没有他论文里面说的那么好?”。有人会和你说“你不懂调参!里面有很多Tricks的!”,“可能作者没有完全描述实现过程的Tricks,你发邮件去问问原作者!”我的天呀,Tricks!你为何那么神秘,却又离我那么远?我该如何才能靠近你?这来源于前人历经积累的Tricks,如何才能被我等初出茅庐的稚嫩书生所略知一二。我苦苦追寻,无人指引,天涯海角,何处以寻。

Tricks已经被幻化成了机器学习中的武林秘籍了?很多大牛都藏之掖之,生怕江湖获知?不!真正的大牛是亲近我们老百姓的。是他们,对机器学习社区做出了无比突出的贡献。在此,感谢大牛们,初学者的“灵魂”导师。

哈哈,可能有点哗众了。下面带来的是LeCun等人著的“Neural Networks: Tricks of the Trade”一书第二版中的第一章Efficient BackProp。感谢该书的作者们。本博文并非对原著的直接翻译,而是经过了一定程度上的增删,同时大部分的地方都增加了个人理解(口水话多,老毛病),如有理解不对的地方,还望大家不吝指正。

人工神经网络的能力大家都是有目共睹的,在机器学习领域可是占据了一定的地位。这点应该毋庸置疑。它可以建模任意复杂的函数。虽然能力大了有时候也不是好事,因为容易过拟合。但能力小了,就没办法建模复杂的函数,也就是给你数据,你也消化不了。关于神经网络的介绍,这里就不说了,发展了那么久,介绍神经网络的书籍或者资料太多了。还记得我们要干嘛吗?我们想要知道训练神经网络的Tricks!众所周知(如果你不知道,就先不要往下看了),训练神经网络的方法就是经典的BP算法!理解BP算法的工作原理很重要,因为在实践过程中,你遇到的一些现象是可以通过分析BP算法的收敛性获得的。同时,BP算法也存在弱点和一些不好的特性,如何能对这些不好的特性退而避之对模型的成功就非常重要。这就是Tricks登场的时刻了,这些Tricks很少有文章提及,因此,下面我们就来介绍下这些Tricks,并解析他们的工作原理。

一、介绍

BP算法是训练神经网络的一个非常流行的算法,因为它不仅概念上简单,而且实现也简单,当然了,它也是有效的。不过,对它的使用,更像一种艺术,而不仅是科学。设计或者使用BP算法训练一个神经网络看似简单,同时做了很多看似简单的选择,例如神经元节点的类型、数量、层数、学习率、训练和测试集等等。实际上,对他们的选择非常关键!不过,也很遗憾的告诉你,现实中并不存在关于如何选择他们的有力指南。因为这是一个非常大的问题,而且和具体的任务和数据有关。不过,也很高兴的告诉你,实际上,还是存在很多启发式和潜在的理论可以指导实践者对他们做出更好的选择的。下面我们先介绍下有关的基础,再对其中的Tricks娓娓道来。

二、学习和泛化

机器学习的方法非常多,但大多数成功的方法都可以将其统一为基于梯度的学习方法。学习框架如下图所示。我们的模型实际上就是学习一个从输入到输出的函数,这里表示为M(Zp, W),其中输入就是Zp,表示第p个输入样本。W就是模型可以学习的参数。在神经网络里面就是两层之间的连接权重了。那通过什么原则来调整模型或者学习参数W呢?我们是希望模型能学习我们的训练数据,也就是拟合我们的训练数据,所以我们就需要一个衡量这种拟合度的度量。也就是代价函数了,这里表示为Ep=C(Dp, M(Zp, W)),它度量的就是当第p的样本输入网络的时候,网络的输出M(Zp, W)和我们期待的“正确”输出Dp(也就是我们平时说的训练样本的标签了)的差异。假设我们的训练集包含P个样本{(Z1, D1),…, (ZP, DP)},我们在训练集中的代价函数就是在整个样本集中取平均。

机器学习的问题总的来说,就是调整模型参数W使得代价函数或者模型拟合数据的误差最小。实际上,大家是不太关心模型在训练集上的误差的,更关心的是模型在这个任务上的误差,因为这个模型是要在实际中使用的,换句话说,我们训练好的模型是为了以后能正确地预测新的样本。这个性能通过一个和训练集不重叠的测试集来估计。最常用的代价函数就是均方函数了:

那如何才能调整模型的参数W让这个代价函数最小呢?这就是这一章我们要讨论的。这里面涉及到一些策略,不过,这些策略必须结合最大化网络的泛化能力一起使用,这样才可以让学习的模型能更好的预测未知的样本。

为了更好的理解泛化,我们来分析下BP的工作原理。实际上,对训练样本的采集是有噪声的,所以例如你采集了很多个集合的样本,可以认为因为在不同的采样点进行采样,所以不同集合的样本存在噪声,从而导致差别。因此,每个集合在用以训练网络时,都会让网络倾向于自己,从而学的网络和其他集合的不太一样。

存在很多分析在训练集上的最小化误差的理论,叫经验风险最小化。这里面有一些理论将泛化误差分解为两部分:bias and variance,偏置和方差。偏置衡量的是网络的输出与目标输出的差别,是在所有样本中的误差平均。方差衡量的是网络的输出在不同的数据中有多大的不同。在网络训练开始的时候,偏置很大,因为网络还没学习,网络的输出和目标的输出一般差别很大。但方差很小,因为数据对网络的影响还很小。随着训练的进行,偏置会慢慢变小,因为网络慢慢的开始学习到了潜在的函数,也就是开始拟合数据了。然而,如果训练的太久,那么网络也会学习到特定数据库的噪声,这就训练过度了。这时候,方差就会变得很大,因为不同的数据库中存在不同的噪声。然而,当偏置和方差的和最小的时候,就是全部误差最小的时候。

目前存在很多技术来获得最小化网络的泛化能力,例如常用的early stopping(提前停止训练)、规则化等。

海内存知已,天涯若比邻。

神经网络训练中的Tricks之高效BP(反向传播算法)

相关文章:

你感兴趣的文章:

标签云: