考虑以下分类问题:
▲ 图1
显然,这个分类问题有一个非线性决策边界。如果不增加特征,使用线性核 SVM(以下简称线性 SVM)不能与逻辑回归拟合,因为它们只能得到形如线性边界。
一种可行的方法是增加高级方项作为特征输入,例如作为线性 SVM 或者逻辑回归输入,可以拟合对图的决策边界(实际上可以拟合圆或椭圆) 1 这可能是一个很好的模型。
然而,在实际情况下,我们通常无法猜测决策边界的形状。首先,由于样本的大量特征,它们无法可视化,其次,它们可能有许多特征组合。
对于上述非线性模型拟合问题,我们之前介绍了使用核函数的问题 SVM,本文将介绍神经网络更常用的方法。
考虑以下矩阵操作:
即:
可以看到每一个元素都是线性变换。一般来说,权重矩阵、输入向量、偏置向量,可以得到 x 的线性变换。
这里我们用表示 k 行 n 列的矩阵,表示 n 维向量。当我们谈论一些传统原因时 n 一般指维向量 n 维列向量,即 n 行 1 列的矩阵。
我们可以对 x 通过多次线性变换获得最终输出 y,如:
其中,我们用上标来区分不同变换的参数。
图表为(假设向量)维数分别是 2,3,2,1)。
▲ 图2
我们称之为上述连续变更为上述连续变换 3 层神经网络模型,它有 2 个隐藏层(hidden layer)、1 个输出层(output layer),并且输入 x 注意输入层不计入层数有两个特征。一般来说,如果输入 x 经过 L 二次连续变换输出 y,然后,应该改变相应的神经网络模型 L 并且有 L-1 个隐藏层。
如图 1,隐藏层 1 有 3 神经元(注意不包括偏置项),可视为关于 x 我们也称之为神经元的函数(neuron)或单元(unit),它接收上一层发出的信号 x,操作完成后,将结果信号传输到与下一层相连的神经元。若某一层的任何神经元分别连接到上一层的所有神经元,则该层称为全连接层(full connected layer,FC)。
作为个人建议,您可以将一层理解为一个转换(或映射),其输出将作为下一层(如果有)的输入。事实上,我不认为我完全知道层的定义,但我通常用矩阵操作或函数来看待神经网络的问题,所以如果你理解原理,这些术语并不重要。
关于神经网络的同义名词。由于部分人不喜欢神经网络与人脑机制的类比,所以他们更倾向于将神经元称为单元,此外,神经网络也被称为多层感知机(multilayer perceptron)。说实话,我不喜欢,但为了尽量减少信息差异,本文将使用利用率较高的术语。
现在,我们将分析如何使用神经网络模型来解决本文开头的非线性分类问题。
仔细分析可以发现,x 经过多次线性变换的结果仍然是关于 x 的线性变换,显然,为了拟合非线性的模型我们需要加一些“非线性的运算”。具体的操作如下:
其中,??(·)操作矩阵或向量点(elementwise),即:
??称为激活函数(activation function),activation 这个词来自神经科学,稍后我们将进一步讨论。考虑以下激活函数:
对于只有一个隐藏层的神经网络模型, Sigmoid 即:
假设隐藏层有 N 神经元和输出 y 为实数,则 y 以下形式可表示:
可以证明??()通用近似器(universal approximator),能够接近任何函数。
从某种意义上说,可以认为神经网络自动结合了特征。我们需要做的是找到合适的模型架构,并通过优化算法获得拟合数据样本的模型参数。
对于本文开头的分类问题,我们只需要一个两层的神经网络模型,即一个隐藏层和一个输出层藏层单元的数量一般可以取输入特征维数 n 比如 2n。矩阵操作可以表示模型:
其中:
您可以检查上述操作是否符合矩阵乘法规则。
关于隐藏层单元的数量。一般来说,隐藏层单元的数量越多越好。一种直觉的理解是,如果我们将待拟合的目标函数视为具有无限项和任何系数的多项函数,则更多的隐藏层单元意味着更多的独立参数。它将具有更强的拟合能力,但需要更大的计算量。当然,较强的拟合能力也意味着更容易过度拟合,因此,我们还将在误差函数中添加正则项,并将在后续文章中进行深入讨论。
此外,隐藏层单元的数量一般不小于输入特征维数,特别是当您的模型使用时 ReLU 当这种激活函数时,它可能无法拟合目标函数。
注意我们的使用 Sigmoid 模型输出函数 y 映射到(0,1)区间,但这里 Sigmoid 通常不认为是激活函数,只是作为分类问题的归一化。表示第一 i 训练样本,M(x) 表示模型的输出,其误差函数(小写) θ 表示所有模型参数)。
接下来,我们可以利用梯度下降(将在下一篇文章中讨论)来最小化误差的模型参数,因此,对于给定的测试样本,我们给出的预测是:
我们的模型可以是:
此时,误差函数应为最小平方误差函数(mean squared error):
总结神经网络算法的基本步骤:
1) 设计模型架构(假设)
2) 设置误差函数
3) 最小化误差(求极值点)
关于模型架构。虽然具有隐藏层的神经网络可以模拟大多数函数,但实践证明,深度神经网络(即更多的隐藏层)在图像识别和自然语言处理任务中具有更好的性能,因此设计了各种复杂的模型,并在相应的任务中取得了良好的效果。
一些典型的模型架构,如 CNN(常用于图像类任务),RNN(常用于序列任务),Autoencoders(常用于特征学习),GAN(常用于生成类任务)。
关于最小误差。在实际任务中,误差函数通常无法分析,因此我们通常使用梯度下降等迭代算法来获得近似值,但需要考虑各种函数形状带来的问题,我们将在后续文章中介绍这些问题及其解决方案。
▲ 图3.1 Sigmoid
▲ 图3.2 Tanh
Sigmoid 函数。最古老的激活函数,表达式,据说选择它的原因是它的函数特征与生物学中的全或无定律非常相似(all or none law)——神经元以最大脉冲振幅反应超过阈值的刺激强度,而不反应低于阈值的刺激。
如图 3.1,Sigmoid 在x大的时候,函数趋于接近 1 而在 x 小时接近 0, 然而,Sigmoid 函数的梯度也在两端迅速接近零,这可能导致梯度消失(这是后传输算法和计算机精度的问题,我们将在后续文章中讨论),进一步导致参数无法更新(模型停止学习)。
Tanh 函数。Tanh 与 Sigmoid 有类似的特征,可以由 Sigmoid 缩放平移得到,即???????(??)=2???????????????(??)–1。其优点是值域为(-1,1),对于零对称,零平均输入将获得零平均输出,这将有利于更有效的训练(类似于 batch normalization 的作用)。需要注意的是,Tanh 仍然有梯度消失的问题。
ReLU 函数。表达式为????????(??)=??????(0,??),一般来说,与之相比 Sigmoid 和 Tanh 它可以加速收敛,这可能是因为它在正半轴有恒为 1 另外,由于梯度只需要一次比较,ReLU 需要较小的计算量。注意到 ReLU 负半轴恒为零,这将导致神经元在训练过程中永久死亡(即上一层的任何输入,其输出为 从而降低模型的拟合能力,其实这也是梯度消失的表现。
关于 ReLU 死亡。考虑以 ReLU 以任何神经元为例,将其视为激活函数的神经网络模型(通常同一模型只使用一个激活函数)θ,其中 x 上层输出向量。假设梯度更新后的梯度更新θ,进一步假设任何东西考虑到上一层的输出,这是一个非常大的负值 x≥0.后续输入容易找到,f(x) 值可能一直是 0。同样适合上述分析思路 Sigmoid 当然,这进一步解释了函数 Tanh 零均值输出的优点。如果你对于 batch normalization 如果你知道一些事情,你应该会发现它将有助于改Dying ReLU”问题。
类 ReLU 函数。实践证明 ReLU 它在大多数任务中表现更好,尤其是在深度神经网络中。 ReLU 有许多改进版本的缺陷 ReLU 设计并取得了良好的效果。主要改进的地方有点,一是 ReLU 在零点不可导,二是其在负半轴取值为零。其中比较典型的有:
Leaky ReLU:
GELU:
Swish:
▲ 图4.1 ReLU
▲ 图4.2 Leaky ReLU
▲ 图4.3 GELU
▲ 图4.4 Swish
Leaky ReLU 给 ReLU 的负半轴增加了一个微小的梯度,改善了“Dying ReLU”的问题。GELU 用了高斯累计分布来构造 ReLU,著名的 NLP 模型 BERT 用的是 GELU,参考[1]。Swish 是通过自动化技术搜索得到的激活函数,作者做了大量的对比实验表明 Swish 在不同的任务中均有超出其他类 ReLU 函数的表现(包括 GELU),参考 [2]。
Swish 和 GELU都属于“光滑 ReLU”(smooth ReLU),因为处处连续可导,一篇最近的论文展现了用光滑 ReLU 进行“对抗训练”(adversarial training)的良好表现,参考[3]。
关于激活函数的选择。没有人任何科学家会 100% 确定地告诉你哪个函数更好用,但是如果按照实验结果,我们可以说类 ReLU 函数目前在多数任务中有更优的表现,就个人的建议,Swish 和 GELU 会是不错的选择,Swish 的论文虽然以实验表明其优于 GELU,但 Google 在 BERT 中使用了 GELU。其他激活函数,可参考[4]。
上文我们提到了通用近似器的概念,事实上这就是神经网络之所以有效的原因,而其关键的部分则是激活函数。
在“通用近似理论”(universal approximation theorem)领域,可以分为两类近似理论,一类研究任意宽度(arbitrary width)和有界深度(bounded depth)的情况,另一类是任意深度和有界宽度。
比如上文的 G(x) 属于任意宽度和有界深度,即 depth >= 1,width 根据近似的目标函数可以任意调整。在深度学习领域,有很多关于神经网络隐藏层的宽度(width,平均单层神经元数量)和深度(depth,模型层数)如何影响神经网络模型性能的研究,比如,是单层具有 1000 个神经元的隐藏层,还是 10 层具有 100 个神经元的隐藏层表现更好。
值得注意的是,对于某些激活函数,宽度如果小于等于某个数值(对于 ReLU,这个数值是输入特征维数 n),无论其模型深度多大,都存在一些其无法模拟的函数。详情请参考 [5],以及关于深度神经网络的研究[6]。
以下一个简单的例子展示了以 ReLU 为激活函数的单隐藏层神经网络模型,其拟合效果与隐藏层单元数量的关系,为了方便可视化,拟合的目标是一元二次函数(x>0)。图 3.1 为随机采样的 50 个样本,图 3.2、3.3、3.4 分别为隐藏层单元数量取 1、2、5 时的拟合曲线。
▲ 图5.1
▲ 图5.2
▲ 图5.3
▲ 图5.4
可以看到随着隐藏层神经元数量的增多,模型的拟合能力逐步增大,如果神经元数量太小,则有可能无法在允许的误差范围内拟合目标函数。
一个有趣的事情是,当我们不用激活函数时,相当于我们用了一个恒等函数 f(x)=x 作为激活函数,这将导致我们的模型只能拟合线性函数。但是,ReLU 仅仅简单地“舍去”负值就取得了通用近似器的效果,有点类似于二极管对交流电的整流作用,这也是 ReLU 名称的由来(Rectified Linear Unit)。
事实上,计算机的运算就是基于开关控制的逻辑电路,所以从这个角度,ReLU 似乎有一种二进制的美感。
[1] Gaussian Error Linear Units (GELUs). Dan Hendrycks. University of California, Berkeley. 2016.
[2] Searching for Activation Functions. Prajit Ramachandran. Google Brain. 2017.
[3] Smooth Adversarial Training. Cihang Xie. Google. 2020.
[4] Activation function. Wikipedia.
[5] Universal approximation theorem. Wikipedia.
[6] Learning Functions: When Is Deep Better Than Shallow. Hrushikesh Mhaskar. California Institute of Technology. 2016
• 稿件确系个人 ,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)