以下都是以分类任务为例来理解神经网络的相关内容。
Version 1.0: 对于一系列的输入数据input data,如果目标是线性地分成两类。
神经元模型就是如上图所示的对输入数据进行加权的一个模型(不太严谨,暂时先这样理解)。另外经常遇到的还有一个概念是感知机。感知机其实就是如上图所示的过程,有输入层,有神经元,最后经过激活函数得到输出。所以当提到神经元模型/感知机的时候,大家可以想一下上图这个比较形象的示意图。
注意这里涉及到一个比较新的概念是激活函数(activation function)。主要是因为我们要做的是一个分类的任务,最后的输出希望得到的是一个类别,用数学的表示就是输出1还是0。经过神经元模型的处理以后得到的f并不是最终我们想要得到的结果,所以最后需要一个激活函数来处理一下得到最终想要的结果。对于这个简单的例子,我们可以设定说 f > = 0 f>=0 f>=0, 输出类别1; f < 0 f<0 f<0,输出类别0。看起来好像用一个step function就可以解决。但是考虑到step function 具有并不连续,不光滑这些不太好的性质,因为常常用sigmoid函数这个连续且光滑的函数来作为常用的激活函数。sigmoid函数的定义如下
s i g m o i d ( f ) = 1 1 + exp ( − f ) sigmoid(f)=\frac{1}{1+\exp(-f)} sigmoid(f)=1+exp(−f)1
很明显,sigmoid函数是
上述Version 1.0的情况可以推广到多维,这个时候分割这些数据的就不是一条线了,而是一个超平面,但还是线性的。
Version 2.0 :对于更复杂的情况,或者在很多真实的例子中,仅仅用线性的模型是不能很好地把数据分成两类,这个时候需要用到非线性的模型。
要解决非线性可分的问题,就要用到多层功能神经元,对应地,输入+多层功能神经元+输出,我们又称这样的过程是多层感知机。为了比较形象的理解这个过程,我们可以看一下下面的示意图。
上图依然是以两维的数据举例,加了一层隐藏层。注意隐藏层和输出层都可以是拥有激活函数的功能神经元。这里的激活函数我暂时以sigmoid函数举例。
上述的简单例子可以认为是我们对一组拥有不同特征的数据,根据它的特征数据进行分组的过程。当然,这是最简单的场景。接下来我们考虑时间序列数据。这个时候其实相当于升了一个维度。可以这样理解,对于每一个时间 t t t, 我们都有一系列的特征,就像之前最简单的例子那样。
用数学符号来表示的话就是,假设我们感兴趣的是随机变量 X ∈ R T × P \textbf{X}\in \mathbb{R}^{T\times P} X∈RT×P, 其中T表示时间的长度, P P P表示特征的个数,用 X t = { x t 1 , x t 2 , … , x t P } \textbf{X}_t=\{x_t^1,x_t^2,\dots,x_t^P\} Xt={xt1,xt2,…,xtP}表示时刻 t t t掌握的所有的信息。目标:在不同的时刻下对数据进行二分类。
对于上述的问题,最直接的想法,对于每个时间 t t t,我们可以用1.3 所讲的简单多层感知机去做分类任务。这样做的话,有两个缺点:
这个时候需要构建更加复杂的神经网络了。
Version 3.0: 对于时序数据,并且是时序相关的数据,我们可以构造如下的神经网络:
大致上看,对于每个时间 t t t,我们分别去用了两层感知机去做分类。但是我们发现有一个区别是这里的隐藏层,考虑的不仅仅是时刻 t t t下的所有特征,而且考虑了前一时刻 t − 1 t-1 t−1的隐藏层输出结果,其实 t − 1 t-1 t−1的隐藏层输出结果应该也包括了 t − 2 t-2 t−2的隐藏层输出结果,以此类推,时刻 t t t的隐藏层输出结果考虑了当前时刻的所有特征,并且考虑了前面所有时刻的隐藏层的输出结果。用这样的方式,时间上的这种依赖性就被考虑了进去。
前面我们讲了两个缺点,第二个时间上的依赖性我们已经解决了。但是对于第一个复杂度的问题,按照上图的做法复杂度更大了,针对这一问题,其实RNN采用的是所有的时间点共用一套权重矩阵的方式,所以复杂度并不会那么大。这个以后再讨论。
上面就是RNN的核心思想。但是RNN也有一些问题,其中一个就是梯度消失,这个有详细的数学推导,以后再补上。可以先这样理解,RNN想要把前面时刻所有的信息都记住,但一般时间间隔大于10的都记不住了。为了解决这一个问题,需要对RNN再进行改进,就是下面的LSTM模型。
Version 4.0 : 之前我们说过RNN总是会忘记长期的信息,所以之前常用的隐藏层我们可以记作 S S S,你可以把它理解成这是神经网络的短期记忆,为了能够记录长期的记忆,我们需要增加一层神经元,可以理解为神经网络的长期记忆,记作 C C C, 注意这里的长期记忆神经元和短期记忆神经元是并行,不是串联。下面用示意图来帮助大家理解LSTM的运行机制:
具体的数学表达如下(从Temporal Relational Ranking for Stock Prediction论文中截取)
要理解这些公式,可以记住这样几个规则:
最后关于lstm的更新过程的理解:
未完待续。。。
Notes: 由于笔者刚接触深度学习,先追求的是大致理解深度学习的框架,忽略了很多细节还有数学推导,后面会慢慢补上,敬请期待。另欢迎批评指正。