ANN, RNN和LSTM的通俗理解

Agenda

  • 1. 人工神经网络ANN
    • 1.1 神经元模型/感知机
    • 1.2 激活函数
    • 1.3 多层功能神经元/多层感知机
  • 2 递归神经网络RNN
    • 2.1 标准的RNN
    • 2.2 长短程记忆LSTM
  • 3. 画图理解ANN, RNN, LSTM

1. 人工神经网络ANN

以下都是以分类任务为例来理解神经网络的相关内容。

Version 1.0: 对于一系列的输入数据input data,如果目标是线性地分成两类。

  • 最简单的情况也是大家比较熟悉的情况:对于二维数据(x1,x2)而言,就是找到一条直线把他们分隔开(如下图所示)。这条直线可以用 w 1 ∗ x 1 + w 2 ∗ x 2 + b = 0 w1*x1+w2*x2+b=0 w1x1+w2x2+b=0来表示。
    ANN, RNN和LSTM的通俗理解_第1张图片
    这个时候如果用神经网络的角度来看的话就是
    ANN, RNN和LSTM的通俗理解_第2张图片

1.1 神经元模型/感知机

神经元模型就是如上图所示的对输入数据进行加权的一个模型(不太严谨,暂时先这样理解)。另外经常遇到的还有一个概念是感知机。感知机其实就是如上图所示的过程,有输入层,有神经元,最后经过激活函数得到输出。所以当提到神经元模型/感知机的时候,大家可以想一下上图这个比较形象的示意图。

1.2 激活函数

注意这里涉及到一个比较新的概念是激活函数(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函数是

  • 一个增函数;
  • 并且在0处的值是0.5;
  • 当f趋近于正无穷大的时候,它的值趋近于1;
  • 当f趋近于负无穷大的时候,它的值趋近于0;
    那么当 f > = 0 f>=0 f>=0 0.5 ≤ s i g m o i d ( f ) < 1 0.5\leq sigmoid(f)< 1 0.5sigmoid(f)<1; 当 f < 0 f<0 f<0, 0 < s i g m o i d ( f ) < 0.5 00<sigmoid(f)<0.5.

上述Version 1.0的情况可以推广到多维,这个时候分割这些数据的就不是一条线了,而是一个超平面,但还是线性的。

Version 2.0 :对于更复杂的情况,或者在很多真实的例子中,仅仅用线性的模型是不能很好地把数据分成两类,这个时候需要用到非线性的模型。

1.3 多层功能神经元/多层感知机

要解决非线性可分的问题,就要用到多层功能神经元,对应地,输入+多层功能神经元+输出,我们又称这样的过程是多层感知机。为了比较形象的理解这个过程,我们可以看一下下面的示意图。
ANN, RNN和LSTM的通俗理解_第3张图片

上图依然是以两维的数据举例,加了一层隐藏层。注意隐藏层和输出层都可以是拥有激活函数的功能神经元。这里的激活函数我暂时以sigmoid函数举例。

2 递归神经网络RNN

上述的简单例子可以认为是我们对一组拥有不同特征的数据,根据它的特征数据进行分组的过程。当然,这是最简单的场景。接下来我们考虑时间序列数据。这个时候其实相当于升了一个维度。可以这样理解,对于每一个时间 t t t, 我们都有一系列的特征,就像之前最简单的例子那样。

用数学符号来表示的话就是,假设我们感兴趣的是随机变量 X ∈ R T × P \textbf{X}\in \mathbb{R}^{T\times P} XRT×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 所讲的简单多层感知机去做分类任务。这样做的话,有两个缺点:

  • 复杂度很大: 有 T T T个时刻,就是重复了 T T T次;
  • 没有考虑时间维度上的依赖性。

这个时候需要构建更加复杂的神经网络了。

2.1 标准的RNN

Version 3.0: 对于时序数据,并且是时序相关的数据,我们可以构造如下的神经网络:
ANN, RNN和LSTM的通俗理解_第4张图片

大致上看,对于每个时间 t t t,我们分别去用了两层感知机去做分类。但是我们发现有一个区别是这里的隐藏层,考虑的不仅仅是时刻 t t t下的所有特征,而且考虑了前一时刻 t − 1 t-1 t1的隐藏层输出结果,其实 t − 1 t-1 t1的隐藏层输出结果应该也包括了 t − 2 t-2 t2的隐藏层输出结果,以此类推,时刻 t t t的隐藏层输出结果考虑了当前时刻的所有特征,并且考虑了前面所有时刻的隐藏层的输出结果。用这样的方式,时间上的这种依赖性就被考虑了进去。

前面我们讲了两个缺点,第二个时间上的依赖性我们已经解决了。但是对于第一个复杂度的问题,按照上图的做法复杂度更大了,针对这一问题,其实RNN采用的是所有的时间点共用一套权重矩阵的方式,所以复杂度并不会那么大。这个以后再讨论。

上面就是RNN的核心思想。但是RNN也有一些问题,其中一个就是梯度消失,这个有详细的数学推导,以后再补上。可以先这样理解,RNN想要把前面时刻所有的信息都记住,但一般时间间隔大于10的都记不住了。为了解决这一个问题,需要对RNN再进行改进,就是下面的LSTM模型。

2.2 长短程记忆LSTM

Version 4.0 : 之前我们说过RNN总是会忘记长期的信息,所以之前常用的隐藏层我们可以记作 S S S,你可以把它理解成这是神经网络的短期记忆,为了能够记录长期的记忆,我们需要增加一层神经元,可以理解为神经网络的长期记忆,记作 C C C, 注意这里的长期记忆神经元和短期记忆神经元是并行,不是串联。下面用示意图来帮助大家理解LSTM的运行机制:
ANN, RNN和LSTM的通俗理解_第5张图片
具体的数学表达如下(从Temporal Relational Ranking for Stock Prediction论文中截取)
ANN, RNN和LSTM的通俗理解_第6张图片

要理解这些公式,可以记住这样几个规则:

  • 输入门:和之前介绍RNN一样,都是根据当前时刻的特征和上一个时刻的短期记忆神经元输出的结果进行加权,当然最后还要用激活函数进行非线性变换。
  • 忘记门:这个和上面的输入门的公式很相似,不过这个判断的是哪些信息不需要的,可以删除的。
  • 输出门:和之前介绍RNN一样。
  • 长期记忆神经元和短期记忆神经元相互更新,比如短期记忆神经元是基于长期记忆神经元。长期记忆神经元的更新也与短期记忆神经元有关。

3. 画图理解ANN, RNN, LSTM

ANN, RNN和LSTM的通俗理解_第7张图片

最后关于lstm的更新过程的理解:

  • 首先是黑色的线,代表主线
    – 第一条主线是关于 c t c_t ct,这是cell state,也可以理解为长记忆状态。它由两部分组成,第一个是上一时刻的 c t − 1 c_{t-1} ct1,第二个是当前时刻的信息转化由 z t z_t zt代表。
    – 第二条主线是隐藏层 h t h_t ht的输出,主要是通过 t a n h ( c t ) tanh(c_t) tanh(ct)得到
  • 其次是三条副线,也就是三个门gates
    – 最重要的是forget gate: 这个门主要是控制 c t − 1 c_{t-1} ct1中的信息转移到 c t c_t ct;
    – 其次是input gate:这个门控制着输入的信息有多少被传递到 c t c_t ct
    – 最后是output gate: 这个门控制着 c t c_t ct的信息传递到 h t h_t ht.

未完待续。。。

Notes: 由于笔者刚接触深度学习,先追求的是大致理解深度学习的框架,忽略了很多细节还有数学推导,后面会慢慢补上,敬请期待。另欢迎批评指正。

你可能感兴趣的:(深度学习,rnn,lstm,深度学习)