TensorFlow与自然语言处理应用
上QQ阅读APP看书,第一时间看更新

2.4 神经网络的基本结构

神经网络背后的原理源自于一些基本元素组成的集合,如人工神经元或感知器(Perceptron),这些元素最早是由弗兰克·罗森布拉特(Frank Rosenblatt)在20世纪50年代开发的。它们有几个二进制输入(0或1),x1,x2,…,xn,如果这些输入的总和大于激活电位(等同于偏差),则产生单个二进制的输出。每当超过激活电位时,神经元被称为“激活”,并表现为一个阶跃函数(step function)。发射信号的神经元将信号传递给与其树突相连的其他神经元,如果超过激活电位,树突就会激活信号,从而产生级联效应,如图2-4所示,其实这也是早期的单层神经网络(感知器)。

图2-4 神经元样例示意图

由于并非所有输入都具有相同的重要性,因此每个输入xi都被分配了自己的权重值,允许模型为某些输入指定更高的权重值。因此,若加权和大于激活电位或偏差,则输出为1,即可以给出输出的结果,具体如下:

实际上,阶跃函数的跳跃性质使得它具有不连续、不光滑、不可导等特点,如果利用这种简单形式的函数,我们很难达到理想的效果,如图2-5所示。因此,在实际应用中,我们通常不会直接采用阶跃函数来作为激活函数,我们需要对其进行两处修改,以使其表现得更可预测,即权重值和偏差的微小变化仅导致输出的微小变化,这两处具体如下:

图2-5 阶跃函数示意图

(1)输入可以取0~1之间的任何值,而不是二进制(0或1);

(2)为了使输出在给定的输入x1,x2,...,xN、权重值w1,w2,...,wN和偏差b下更平稳地工作,我们使用以下Sigmoid函数(见图2-6):

图2-6 Sigmoid函数

指数函数(或σ)的平滑度意味着权重值和偏差的微小变化将引起神经元输出的微小变化(变化可能是权重值和偏差变化的线性函数)。

除了通常的Sigmoid函数外,更常用的其他非线性函数还包括以下几个函数,它们中的每一个都可能具有类似或不同的输出范围,因此可以相应地使用。

ReLU:线性整流函数(Rectified Linear Unit,ReLU),又称修正线性单元,是一种人工神经网络中常用的激活函数(Activation Function),通常指代以斜坡函数及其变种为代表的非线性函数。这将使激活保持在0位,使用以下函数计算:

其中,xj是第j个输入值,zj是经过ReLU函数f处理过的相应输出值。ReLU函数的图形如图2-7所示,对于所有x≤0,函数值为0;对于所有x> 0,函数线性斜率为1。

图2-7 ReLU函数

ReLU经常面临着“死亡”的问题,特别是当学习率被设置为更高的数值时,因为这会触发不允许激活特定神经元的权重值更新,从而使该神经元的梯度永远为零。ReLU提供的另一个风险是激活函数的爆炸,因为输入值xj本身就是输出。ReLU也存在不少优点,例如在xj低于0的情况下引入稀疏性,引起稀疏表示,并且当ReLU不变时返回梯度,它会导致更快的学习,伴随着梯度消失的可能性会降低。

下面给出其他几个常见的函数,这些函数能够使我们很容易对梯度下降进行训练,具体如下:

  • LReLU(Leaky ReLU):通过为x小于0的值引入略微减小的斜率(约0.01)来减轻ReLU死亡的问题,LReLU确实提供了很多成功的场景,尽管有时也会出错。
  • ELU(指数线性单位):它们提供负值,通过将附近的梯度移动到单位自然梯度,将平均单位激活推至接近零,从而加快学习过程。有关ELU更详细的解释,请参阅Djork-ArnéClevert的原始论文,网址为https://arxiv.org/abs/1511.07289。
  • softmax:也被称为归一化指数函数,它转换(0,1)范围内的一组给定实值,使得组合和为1。softmax函数表示如下:

这里,j=1,2,...,K

与哺乳动物大脑一样,单个神经元也是分层组织的,在一层内与下一层相连,形成一个ANN或者说人工神经网络或多层感知器(MLP)。这样,整个网络的复杂性就是基于这些元素和连接相邻层的数量情况。

输入和输出之间的层称为隐藏层,层之间的连接密度和类型是结构(也叫配置)。例如,一个完全连接的结构将L层的所有神经元连接到L+1层的所有神经元。若要具有更明显的结构,我们只能将一个局部邻域连接到下一层。图2-8显示了两个具有密集连接的隐藏层。

图2-8 神经网络架构示例图