在上一篇文章里,小编给大家概括地介绍了下神经网络的历史和应用。这次,小编要给大家细细讲解下神经网络的组成,和几种常见神经网络的模型及其适用领域。
顾名思义,神经网络算法有两大最主要的组成部分:神经元和神经元之间的网络连接。
我们知道,人类大脑的思考是依靠多个神经元之间神经冲动的传导来实现的。每个神经元可以接受多个神经元输入的神经冲动,并转化为自己的神经冲动并传播给多个其它的神经元。
在模拟神经网络的过程中,我们也可以建立以下的数学模型:
我们将每个神经元看成是一个具有多个输入的函数 G(x), x 代表输入向量。自然这个函数的输入向量是由多个其他神经元函数的输出组成的;而这个函数的结果也将成为其他某些神经元函数输入向量的一部分。为了简单区分,我们将当前神经元记为 Gn+1, 而所有为它提供输入的神经元组成的向量我们记 Gn.
如下面图中所示,每个神经元函数输入向量通线性组合汇聚进入神经元,也就是将其输入向量中的值分别乘以当前神经元的输入权重 Wn 之后求和。在数学上我们将此过程记为 Wn·Gn, · 在这里代表点积。
在得到了这个输入加权和之后,我们还要减去一个阈值向量,并将结果归一化至[0, 1]的范围,作为当前神经元的结果输出。
我们把这个归一化的映射函数称之为激活函数,在这里我们用 K(x) 表示,其作用域是 [-Inf, Inf], 值域为[0, 1].
下面我们使用一个公式来概括了以上所述的每一个神经元函数。
其实之前我已经讲过,能达到一个映射作用即可,具体的性质由具体算法决定。在这里,我们列出一个比较常见的激活函数, sigmoid 函数:
他的映射曲线由下图所示:
至此,我们已经完全讲述了单一神经元的数学模型。总结一下,定义每一个神经元的参数有三部分组成:
对于这些参数的正确设定,正式对训练神经网络学习的主要目标。实际中,我们往往事先通过经验预定好了网络连接方式以及激活函数;然后再通过对大量样本进行学习来调整每个神经元的权重向量和激活阈值。
下面,我们进一步来关注下,整个神经网络的构成中,另外一个重要影响因素 -- 神经元之间的连接,也就是神经网络的结构。
宏观来看,神经网络的连接可以划分为最前端的输入神经元,最末端的输出神经元,以及在中间的隐藏神经元。输入神经元的输出代表输入数据,输出神经元的结果便是结果向量。而中间隐藏神经元的不同的连接方式决定了神经网络的特质,也会适用于不同的领域。在这里小编要简单地介绍几种常见的不同结构的神经网络,并说说他们的适用方向。
顾名思义,向前神经网络的特征就是所有神经元的连接不构成一个有向环。换句话说,神经元之间可以偏序排列出先后,也就是可以把他们分成很多层,每一层的神经元将神经冲动传导给下一层。
下面我们来看一下两种类型的向前神经网络。
第一种是特殊情况,这类网络只有两层神经元: 输入层和输出层。结构如下图所示。
这种网络数学上就是将输入进行线性组合,并将结果减去阈值后得到分类信息。由于是纯线性的关系,他能做的分类非常有限;而且不像 SVM 能够通过找到 support vector 来进行优化,此类网络的训练也不是非常高效。
另外一种便是一般意义上的前向神经网络,也就是多层的感知网络。由于在输入和输出之间加入了很多层隐藏的神经元以及非线性的激发函数,这种网络可以做一些比较复杂的分类。
我们在下一篇文章中将具体介绍如何有效地对这种网络进行训练 (backward propagation). 对于这类神经网络进行训练时,我们往往只能得到局部最优结果,而且有时过多次的训练反而会因为 overfitting(过度训练) 而导致在新样本中的识别效果变差。对于这种问题,我们常用 early stop 的方法来提前结束训练。
总的来说,前向神经网络对于静态输入信息的的理解和分类还是比较有价值的,虽然 SVM 在这个领域也是一个有力的竞争对手。而对于时序上面动态的输入信息来说,这种神经网络不能很好地利用先后的时序关系信息,所以实用性不大。
举个例子,如果你想识别一个手写字母。如果你拥有的数据仅仅是已经写好的字母,那么通过前向神经网络可以较好地分类;但是如果用户想要对实时动态的手写输入来进行分类,那么这种神经网络将不能很有效地利用书写笔顺等信息,导致其分类效果比不上其他的一些算法。
之前我们讲到了前向网络,这里我们再来看看与之相对的循环神经网络。循环神经网络中允许出现神经元之间的有向环。由于环的存在,对于已经训练好的网络以及一个特定的输入,每个神经元的输出不再是一个定值;相反的,他们会随着输入时序的变化而变化。
下面我们来关注下几种常见类型的循环网络。
完全循环网络(Fully recurrent network)
完全循环神经网络就好比完全连通图一般,每一神经元都有可能连接到每一个另外的神经元。一般来说循环网络都是用来处理时序相关的数据分类,完全循环网络自然也不例外。但为了训练更加有效,我们会根据特定的应用场景选择使用一些已知的特化的模型。
Hopfield 网络算是一个比较特殊的完全循环网络。它具有的特点是所有神经元之间的链接是对称的,也就是说如果神经元 A 有一个有向连接到神经元 B,那么神经元 B 也必然会有一个反向的连接到 A. 这种特殊组成的网络在时序上不断迭代后会达到某种平衡,产生一个稳定的输出(对于一个稳定的输入)。这种特性使得 Hopfield 网络成了一个很好的随机访问记忆体。下图便是 Hopfield 网络的示意图。
简单循环网络(Simple recurrent network)
下面我们来看看一些连接稍微简单一些的循环网络。不同于完全循环网络,过于复杂的模型会导致训练难度大大提高,简单随机网络往往只对一层神经元进行简单的状态记忆。比如著名的 Elman 网络(如下图所示),就是由普通的前向神经网络改造而来。Elman 网络在普通前向网络里的某些中层隐藏神经元(下图中的H1,H)上加入了一个通向状态记忆节点(下图中的C1,C2) 的双向连接。
这些状态节点的主要作用就是把隐藏神经元在时序上的上一个状态给记录下来,然后再在时序的下一个状态重新 feedback 到那些隐藏神经元里面去。这就好比给了那些隐藏神经元一个状态,使得他们在处理新的输入数据时更加有效(因为知道了前一个输入数据所产生的状态)。
长短记忆神经网络是1997 年 Sepp Hochreiter 对循环神经网络提出的一个十分重要的改进。我们从上面的介绍知道循环神经网络的用途十分广泛,功能远强于简单的前向网络。
但是这个美好的系统有一个致命的缺点:在训练的时候,前向神经网络中常规的「梯度向下方法」(比如 Backward propagation through time)并不能很好地训练循环网络,因为「梯度向下方法」在训练循环网络时,须要将误差从输出神经元不断地逆向穿过时序传播到先前状态的神经元上。由于误差在长距离的传播过程中消减过快,从而无法达到时序上先前状态的神经元,于是训练往往以失败告终。
长短记忆神经网络的改进克服了一般循环神经网络的缺陷,它通过引入一个「长期记忆」,使得训练时的误差的传播不至于迅速衰减,所以产生了很好的效果。
长短期网络自然也是保留了一般循环网络的优势,可以对时域上的输入做出一个很好的分类和预测。他容易训练的特点,使得我们几乎可以将其对等于一个完整的图灵机程序。也就是说,任何现有计算机程序可以做到的事情,它也可以做到。
下面我们来仔细看一下长短记忆网络的具体构造。其实长短期记忆神经网络和一般的循环神经网络结构非常相似,唯一的区别是其将一般的神经网络中间的普通隐藏神经元节点们替换成了「记忆神经元」。下图便展示了一个最简化的长短期记忆网络,它只有一个输入神经元,一个输出神经元,和一个中间隐藏神经元。中间的那个神经元已经被替换成了「记忆神经元」。
「记忆神经元」和普通神经元最大的区别在于其带有的长期记忆效应。下图我们对「记忆神经元」做了一个详细的分解。
首先和普通神经元一样,记忆神经元也有输入和输出(图片下方和上方的连接),但不同的是,记忆神经元还有额外的侧面门输入。上图中右上方的连接时记忆神经元的输出门输入,而右下方是输入门输入。这两个记忆门输入控制着记忆神经元内部状态的输入和输出。也就是说,这个记忆神经元可以通过关闭输入门来保持内部的长期记忆。
这种记忆神经元使得循环神经网络的可靠性和有效性有了极大的提高。