概要
在本次记述中,
- 我们参考了一个非常粗糙的生物神经元模型来解释计算机神经元,但两者其实有本质区别。
- 我们讨论了在实践中使用的几种类型的激活函数,其中ReLU是最常见的选择
- 我们引入了神经网络,其中神经元与完全连接的层连接,相邻层中的神经元具有完全的成对连接,但层内的神经元没有连接。
- 我们看到,这种分层架构能够基于与激活函数交织的矩阵乘法,对神经网络进行高效的评估。
- 我们看到,神经网络是通用函数逼近器,但是我们也证明了这个性质与它们无处不在的用途没什么关系的事实。它们被使用是因为它们对实践中出现的函数的功能形式做出了某些“正确”的假设。
- 我们讨论了这样一个事实:大型网络总是比小型网络工作得更好,但是它们的更高的模型容量必须用更强的正则化(比如更高的权重衰减)来适当地解决,否则它们可能会过度拟合。
何为神经元
神经网络领域最初的主要灵感来自对生物神经系统进行建模的目标,但之后已经分化并成为工程问题,并在机器学习任务中取得了良好的结果。尽管如此,我们还是从这个领域很大一部分的灵感来源,对生物系统进行了非常简短和高层次的描述,开始我们的讨论。
生物神经元和计算机神经元的联系
大脑的基本计算单位是一个神经元。在人类的神经系统中可以发现大约860亿个神经元,并且它们与大约10 ^ 14 - 10 ^ 15个突触连接。
下图显示了生物神经元的卡通图(左)和常见的数学模型(右)。每个神经元接收来自其树突的输入信号并沿着其(单个)轴突产生输出信号。轴突最终分出并通过突触连接到其他神经元的树突。
在神经元的计算模型中,沿着轴突传播的信号与在该突触基于所述突触强度的其他神经元的树突,具有激活函数 的神经元的激发速率σ
生物神经元的卡通画(左)及其数学模型(右)。
换言之,每个神经元所做的事情就是:执行输入和其权重的点积,加偏差并应用非线性(或激活功能)后传递给下一个神经元,在这种情况下,激活函数为:
sigmoid:σ(x )= 1 /(1 + e- x)
单神经元线性分类器
在神经元输出具有适当的损失函数的情况下,我们可以将单个神经元变成线性分类器:
二元Softmax分类器
二进制SVM分类器
正则化解释
常用的激活函数
左: Sigmoid非线性将实数压缩到[0,1]之间的范围 右: tanh非线性将实数压缩到[-1,1]之间的范围。
Sigmoid: 函数为:σ(x)=1/(1+e−x)
- 接近饱和时容易“杀死”梯度。Sigmoid的一个非常不受欢迎的特性是,当神经元的激活在0或1的尾部饱和时,这些区域的梯度几乎为零。想象下,在反向传播时,这个(局部的)梯度将乘以这个神经元的输出梯度,以达到最终目标。因此,如果局部梯度很小,它将有效地“杀死”梯度,几乎没有信号会通过神经元流向其权重并递归到其数据。另外,当初始化Sigmoid形神经元的权重,必须格外小心。例如,如果初始权重太大,那么大多数神经元就会饱和,网络几乎不能学习。
- Sigmoid函数的输出不是以零为中心的 。这是有隐患的,因为在其之后的处理层中的神经元将接收不是以零为中心的数据。这对梯度下降的动力学有影响。因为如果进入神经元的数据总是正的,这可能在权重的梯度更新中引入不希望的锯齿形动态。但是,请注意,一旦这些梯度被累加到一批数据中,权重的最终更新可能会有可变的符号,这有点缓解了这个问题。因此,这是一个隐患,但与上面的饱和激活问题相比,其后果不那么严重。
Tanh.
Tanh函数显示在右上方的图像上。它将一个实数值压缩到[-1,1]的范围。像Sigmoid形神经元一样,它的激活饱和,但不同的是,它的输出是以零为中心的。因此,在实践中tanh非线性始终优于Sigmoid形非线性。还要注意tanh神经元只是一个缩放的sigmoid神经元,特别是以下情况:tanh(X )= 2 σ(2 x )- 1
左:整流线性单元(RELU)激活功能,这是当零x < 0的,然后用斜率1线性当x > 0 右:与TanL单位相比,ReLU单位的收敛性提高了6倍。
RELU.在过去几年已经非常流行。函数为:f(x)=max(0,x)
- (+)发现与Sigmoid/ tanh函数相比,随机梯度下降的收敛速度显着加快(提高了6倍)。有人认为,这是由于其线性非饱和形式。
- (+)与涉及昂贵操作(指数等)的tanh / sigmoid神经元相比,ReLU可以通过简单地将激活矩阵阈值化为零来实现。
- ( - )不幸的是,ReLU在训练期间可能会变得脆弱,可能会“死亡”。例如,流经ReLU神经元的大梯度可能会导致权重更新,使得神经元不会再次在任何数据点上激活。如果发生这种情况,那么流经该单元的梯度将从此处永远为零。也就是说,ReLU单位在训练过程中可能会不可逆转地死亡,因为他们可能会从数据流形中剔除。例如,如果学习率设置得过高,您可能会发现多达40%的网络可能“死亡”(即从未在整个训练数据集中激活的神经元)。 通过设置适当的学习率,可以解决这个问题。
Leaky ReLU.
Leaky ReLU是一个尝试解决“垂死的ReLU”问题。当x < 0时,而不是函数为零,而泄漏的ReLU将会有一个小的负斜率(0.01左右)。即:f(x)=1(x < 0)(αx)+1(x>=0)(x)f(x)=1(x < 0)(αx)+1(x >= 0)(x)α
Maxout.
Maxout神经元享有ReLU单元的所有好处(线性操作状态,没有饱和),并且没有缺点(无死亡的ReLU)。然而,与ReLU神经元不同的是,它使每个神经元的参数数量加倍,导致参数总数很高。
这就是我们对最常见类型的神经元及其激活函数的讨论。最后需要注意:在同一网络中混合和匹配不同类型的神经元是非常罕见的,即使这样做没有根本的问题。
TLDR:“ 我应该使用什么神经元类型?“ 使用ReLU非线性,小心你的学习速度,并随时监测网络中”死亡“单元的比例。如果可以,请尝试Leaky ReLU或Maxout。切勿使用sigmoid。试试tanh,但别期望它比ReLU / Maxout更好。
神经网络架构
分层组织
神经网络的作用是连接在非循环图中的神经元。换句话说,一些神经元的输出可以成为其他神经元的输入。闭合的循环是不允许的,因为这意味着在网络的正向传递中有一个无限循环。
神经网络模型通常被组织成不同层次的神经元,而不是连接神经元的无定形网络。对于规则的神经网络,最常见的层类型是fully-connected layer(完全连接层),其中两个相邻层之间的神经元完全成对地连接,但是单层内的神经元不共享连接。以下是两个使用完全连接层的示例神经网络拓扑:
左: 2层神经网络(4个神经元(或单元)的一个隐藏层和2个神经元的输出层)和三个输入。右:三层神经网络,三个输入层,两个隐藏层,每层四个神经元,一个输出层。请注意,在这两种情况下,跨层之间的神经元之间都存在连接(突触),但在层内无连接。
命名约定。请注意,当我们说N层神经网络时,我们不计入输入层。
输出层。与神经网络中的所有图层不同,输出层神经元通常不具有激活功能(或者您可以将其视为具有线性身份激活功能)。这是因为最后的输出层通常被用来表示类别分数(例如在分类中),它们是任意的实数值,或者某种实值目标(例如在回归中)。
调整神经网络。人们通常用来测量神经网络大小的两个指标是神经元的数量,以及参数的数量(更普遍)。在上面的图片中使用两个示例网络:
- 第一个网络(左)具有4 + 2 = 6个神经元(不包括输入),[3×4] + [4×2] = 20个权重和4 + 2 = 6个偏差,总共26个可学习参数。
- 第二个网络(右)具有4 + 4 + 1 = 9个神经元,[3×4] + [4×4] + [4×1] = 12 + 16 + 4 = 32个权重和4 + 4 + 1 = 9偏见,总共41个可学习的参数。
现代的卷积网络包含大约1亿个参数,通常由大约10-20个层次组成(因此深度学习)。但是,由于参数共享,有效连接的数量将显着增加,卷积神经网络模块的内容更多。
正向传递计算
神经网络的计算过程可以总结为重复的矩阵乘法与激活函数的交织。神经网络组织成层的主要原因之一是这种结构使得使用矩阵向量操作来评估神经网络变得非常简单和高效。
使用上图中的示例三层神经网络,输入将是一个[3x1]向量。一个图层的所有连接强度都可以存储在一个矩阵中。
例如,第一个隐藏层的权重W1
大小为[4x3],所有单位的偏差都在矢量中b1
,大小为[4x1]。在这里,每一个单独的神经元都有它的权重W1
,所以矩阵向量乘法np.dot(W1,x)
计算该层所有神经元的激活。同样的,W2
是一个存储第二个隐藏层连接的[4x4]矩阵,以及W3
最后(输出)层的[1x4]矩阵。这个三层神经网络的完全正向传递就是三个矩阵乘法,与激活函数的应用交织在一起:
1 | # 3层神经网络的正向传递: |
在上面的代码中,W1,W2,W3,b1,b2,b3
是网络的可学习参数。还要注意,不一定是有一个单一的输入列矢量,变量x
可以保存整批的训练数据(其中每个输入的例子将是一列x
),然后所有的例子将被并行有效地评估。
代表性优势
创建具有完全连接层的神经网络的一种方法是,定义一系列由网络权重参数化的函数。一个自然而然的问题是:这个方法的代表性优势是什么?特别是有没有不能用神经网络建模的功能?
神经网络在实践中运行良好,因为它们紧凑地表达了很好的,平滑的函数,这些函数非常适合我们在实践中遇到的数据的统计特性,而且使用我们的优化算法(例如梯度下降)也很容易学习。类似地,深层网络(具有多个隐藏层)可以比单隐层网络更好地工作的事实是一个经验结论。
另外,在实践中,3层传统神经网络通常比2层网络要好,但更深层(4,5,6层)的帮助很少。这与卷积网络形成了鲜明的对比,已经发现卷积网络的深度对于识别系统(例如,按照10个可学习层的顺序)是非常重要的。这个结论的一个论据是,图像包含分层结构(例如,面部由眼睛组成,由边缘等组成),因此多层处理对于这个数据域是直观的。
参考阅读:
- 深度学习本书由Bengio,Goodfellow,Courville出版,尤其是第6.4章。
- 深网真的需要深入吗?
- FitNets:提示薄的深网
神经层的数量和大小
在面临实际问题时,我们如何决定使用哪种架构?我们应该使用没有隐藏的层?一个隐藏的层?两个隐藏层?每层应该多大?
首先,请注意,随着我们增加神经网络中的层数和层数,网络的容量会增加。也就是说,可表示函数的空间增长,因为神经元可以协作表达许多不同的功能。
例如,假设我们在二维中存在二元分类问题。我们可以训练三个独立的神经网络,每个神经网络都有一个大小不一的隐藏层,并获得以下分类器:
较大的神经网络可以代表更复杂的功能。这些数据显示为按照他们的类别进行着色的圆圈,并且由经过训练的神经网络的决策区域显示在下面。你可以在ConvNetsJS演示中观看并使用这些例子。
在上图中,我们可以看到,神经网络增加更多的神经元可以表达更复杂的功能。然而,这既是祝福(因为我们可以学习分类更复杂的数据)也是诅咒(因为它更容易过度训练数据)。当训练过度地去拟合噪声而不是(假定的)基础关系时,过拟合就会发生。
例如,具有20个隐藏的神经元的模型适合于所有的训练数据,但是以将空间分割成许多不相交的红色和绿色决策区域为代价。具有3个隐藏神经元的模型仅具有对广义笔画中的数据进行分类的代表性能力。它将数据建模为两个斑点,并将绿色群集内的少数红点解释为异常值(噪声)。在实践中,这可能会导致测试集更好的泛化。
解决过拟合
根据我们上面的讨论,为了防止过拟合,似乎较小的神经网络可能是优先选择的。然而,这是不正确的 。 在神经网络中还有许多其他的优选方法可以防止过度拟合(例如L2正则化,丢失,输入噪声)。在实践中,使用这些方法来控制过度拟合总是更好的,而不是减小神经元的数量。
这背后的一个微妙的原因是,较小的网络难以用梯度下降等局部方法进行训练:很明显,他们的损失函数具有相对较少的局部最小值,但是事实证明,许多最小值更容易收敛,他们是不好的(即高损失)。相反,更大的神经网络包含更多的局部最小值,但是这些最小值在实际损失方面要好得多。由于神经网络是非凸的,所以很难从数学上研究这些性质,但是一些试图理解这些目标函数已经被提出,例如在最近的一篇文章“多层网络的损失表面。
在实践中,你如果你训练一个小型网络,最终的损失可能会显示出很大的差异 :有时候,你很幸运地会聚到一个好的地方,但是在某些情况下,你会陷入一个糟糕的最小值。另一方面,如果你训练一个庞大的网络,你会开始找到许多不同的解决方案,但最终实现的损失的差异将小得多。换句话说,一个庞大网络的所有解决方案都是一样的好,主要是对随机初始化的运气依赖较少。
重申一下,正则化是控制神经网络过度拟合的首选方法!!!我们可以看看三种不同设置的结果:
正则化强度的影响:上述每个神经网络有20个隐藏的神经元,但是改变正则化强度使得其最终决策区域更平滑并具有更高的正则化。你可以在这个ConvNetsJS演示中使用这些例子。
总结一下就是,你不应因为害怕过度拟合就使用较小的神经网络。相反,你应该像公司做预算那样使用一个神经网络,并且使用其他正则化技术来控制过拟合。
参考阅读
- 斯坦福CS类:神经网络的架构
- 与Theano的deeplearning.net教程
- ConvNetJS直观的演示
- 迈克尔尼尔森的教程