从全连接神经网络FCN到LSTM

深度学习的发展是从最开始的感知机开始的,但是感知机只能解决0,1分类的问题;对于输出概率或者具体的值的问题该怎么办,于是就出现了线性判别分析;但是,我们往往处理的数据是维度比较高的,这个时候怎么处理维度较高的数据怎么办呢?同时,我们也知道,当维度较高的时候,我们基本上是不能找到一条直线来分类数据的,这时候你会想到用曲线去拟合,同时你也知道当曲线进行微分的时候,实际上就是一条条很短的直线组成的,为了拟合这条曲线,于是就出现了全连接网络;为了更好地拟合数据,这时候就出现了BP神经网络,有了反馈机制,使得曲线可以更好地拟合数据,同时也可以尽快收敛;但是这个时候,如果我们想处理图像、语音识别领域的数据,你会发现这个时候它的参数是爆炸性的,我们必须必须进行一定的trick来减少这些参数,于是CNN孕育而生;CNN固然是好的,但是它却没有记忆,也就是说,当处理时序性的问题时,CNN的效果很不好,把CNN引入时序的概念,就产生了RNN;随着NLP的发展,科学家发现,RNN虽然有时序但是,但很难处理长距离的依赖,同时RNN也面临着梯度消失和梯度爆炸的问题,为了解决这两个问题,便引入了SLTM,它巧妙的引入了门的概念;SLTM固然很好,但是它的结果过于复杂,为了简化结构就出现了GRU…

(一)神经网络和反向传播算法:

《从全连接神经网络FCN到LSTM》
神经网络其实就是按照一定规则连接起来的多个神经元。上图展示了一个全连接(full connected, FC)神经网络,通过观察上面的图,我们可以发现它的规则包括:
 神经元按照层来布局。最左边的层叫做输入层,负责接收输入数据;最右边的层叫输出层,我们可以从这层获取神经网络输出数据。输入层和输出层之间的层叫做隐藏层,因为它们对于外部来说是不可见的。
 同一层的神经元之间没有连接。
 第N层的每个神经元和第N-1层的所有神经元相连(这就是full connected的含义),第N-1层神经元的输出就是第N层神经元的输入。
 每个连接都有一个权值。
上面这些规则定义了全连接神经网络的结构。事实上还存在很多其它结构的神经网络,比如卷积神经网络(CNN)、循环神经网络(RNN),他们都具有不同的连接规则。

(二)卷积神经网络(Convolutional Neural Network, CNN):

我们知道,说卷积神经网络是最重要的一种神经网络也不为过,它在最近几年大放异彩,几乎所有图像、语音识别领域的重要突破都是卷积神经网络取得的,比如谷歌的GoogleNet、微软的ResNet等,打败李世石的AlphaGo也用到了这种网络。
全连接网络 VS 卷积网络
全连接神经网络之所以不太适合图像识别任务,主要有以下几个方面的问题:
 参数数量太多 考虑一个输入10001000像素的图片(一百万像素,现在已经不能算大图了),输入层有10001000=100万节点。假设第一个隐藏层有100个节点(这个数量并不多),那么仅这一层就有(1000*1000+1)*100=1亿参数,这实在是太多了!我们看到图像只扩大一点,参数数量就会多很多,因此它的扩展性很差。
 没有利用像素之间的位置信息 对于图像识别任务来说,每个像素和其周围像素的联系是比较紧密的,和离得很远的像素的联系可能就很小了。如果一个神经元和上一层所有神经元相连,那么就相当于对于一个像素来说,把图像的所有像素都等同看待,这不符合前面的假设。当我们完成每个连接权重的学习之后,最终可能会发现,有大量的权重,它们的值都是很小的(也就是这些连接其实无关紧要)。努力学习大量并不重要的权重,这样的学习必将是非常低效的。
 网络层数限制 我们知道网络层数越多其表达能力越强,但是通过梯度下降方法训练深度全连接神经网络很困难,因为全连接神经网络的梯度很难传递超过3层。因此,我们不可能得到一个很深的全连接神经网络,也就限制了它的能力。
那么,卷积神经网络又是怎样解决这个问题的呢?主要有三个思路:
 局部连接(卷积的目的) 这个是最容易想到的,每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。
 权值共享 一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。
 下采样 可以使用Pooling来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。
对于图像识别任务来说,卷积神经网络通过尽可能保留重要的参数,去掉大量不重要的参数,来达到更好的学习效果。
《从全连接神经网络FCN到LSTM》

(三)循环神经网络(Recurrent Neural Network):

全连接神经网络和卷积神经网络。他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列;当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。这时,就需要用到深度学习领域中另一类非常重要神经网络:循环神经网络(Recurrent Neural Network)。
(1)循环神经网络
《从全连接神经网络FCN到LSTM》
《从全连接神经网络FCN到LSTM》
上图是一个简单的循环神经网络如,它由输入层、一个隐藏层和一个输出层组成:
如果把上面有W的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络。x是一个向量,它表示输入层的值(这里面没有画出来表示神经元节点的圆圈);s是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同);U是输入层到隐藏层的权重矩阵,看看我们是怎样用矩阵来表示全连接神经网络的计算的);o也是一个向量,它表示输出层的值;V是隐藏层到输出层的权重矩阵。那么,现在我们来看看W是什么。循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。
如果我们把上面的图展开,循环神经网络也可以画成下面这个样子:
《从全连接神经网络FCN到LSTM》

现在看上去就比较清楚了,这个网络在t时刻接收到输入xt之后,隐藏层的值是st,输出值是ot。关键一点是,st的值不仅仅取决于xt,还取决于st−1。我们可以用下面的公式来表示循环神经网络的计算方法,通过迭代就可以获得最初时刻的隐藏层的s值:
《从全连接神经网络FCN到LSTM》
(2)双向循环神经网络:
《从全连接神经网络FCN到LSTM》
基本循环神经网络是无法对此进行建模的,因此,我们需要双向循环神经网络,如下图所示:
《从全连接神经网络FCN到LSTM》
从上图可以看出,双向卷积神经网络的隐藏层要保存两个值,一个A参与正向计算,另一个值A’参与反向计算。最终的输出值y2取决于A2和A′2。其计算方法为:
《从全连接神经网络FCN到LSTM》
A2和A′2则分别计算:
《从全连接神经网络FCN到LSTM》
现在,我们已经可以看出一般的规律:正向计算时,隐藏层的值st与st−1有关;反向计算时,隐藏层的值s′t与s′t+1有关;最终的输出取决于正向和反向计算的加和。现在,我们仿照式1和式2,写出双向循环神经网络的计算方法:
《从全连接神经网络FCN到LSTM》
从上面三个公式我们可以看到,正向计算和反向计算不共享权重,也就是说U和U’、W和W’、V和V’都是不同的权重矩阵。
(3)深度循环神经网络
前面我们介绍的循环神经网络只有一个隐藏层,我们当然也可以堆叠两个以上的隐藏层,这样就得到了深度循环神经网络。如下图所示:
《从全连接神经网络FCN到LSTM》
我们把第i个隐藏层的值表示为s(i)t和s′(i)t,则深度循环神经网络的计算方式可以表示为:
《从全连接神经网络FCN到LSTM》

(四)长短时记忆网络(Long Short Term Memory Network, LSTM):

循环神经网络很难训练的原因,这导致了它在实际应用中,很难处理长距离的依赖。同时循环神经网络依然面临着梯度消失和梯度爆炸的问题。长短时记忆网络(Long Short Term Memory Network, LSTM),它成功的解决了原始循环神经网络的缺陷,成为当前最流行的RNN,在语音识别、图片描述、自然语言处理等许多领域中成功应用。
为什么RNN会产生梯度爆炸和消失问题呢?我们接下来将详细分析一下原因。我们根据误差值可得:
《从全连接神经网络FCN到LSTM》
上式的β定义为矩阵的模的上界。因为上式是一个指数函数,如果t-k很大的话(也就是向前看很远的时候),会导致对应的误差项的值增长或缩小的非常快,这样就会导致相应的梯度爆炸和梯度消失问题(取决于β大于1还是小于1)。
通常来说,梯度爆炸更容易处理一些。因为梯度爆炸的时候,我们的程序会收到NaN错误。我们也可以设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。
梯度消失更难检测,而且也更难处理一些。总的来说,我们有三种方法应对梯度消失问题:

  1. 合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。
  2. 使用relu代替sigmoid和tanh作为激活函数。原理请参考上一篇文章深度学习实战教程(四):卷积神经网络的激活函数一节。
  3. 使用其他结构的RNNs,比如长短时记忆网络(LTSM)和Gated Recurrent Unit(GRU),这是最流行的做法。我们将在以后的文章中介绍这两种网络。

为了解决RNN梯度消失和梯度爆炸的问题,其实,长短时记忆网络的思路比较简单。原始RNN的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。那么,假如我们再增加一个状态,即c,让它来保存长期的状态,那么问题不就解决了么?如下图所示:
《从全连接神经网络FCN到LSTM》
LSTM用两个门来控制单元状态c的内容,一个是遗忘门(forget gate),它决定了上一时刻的单元状态ct−1有多少保留到当前时刻ct;另一个是输入门(input gate),它决定了当前时刻网络的输入xt有多少保存到单元状态ct。LSTM用输出门(output gate)来控制单元状态ct有多少输出到LSTM的当前输出值ht。
《从全连接神经网络FCN到LSTM》

(五)GRU (Gated Recurrent Unit):

它的结构比LSTM简单,而效果却和LSTM一样好,因此,它正在逐渐流行起来。GRU摆脱了细胞状态并使用隐藏状态来传输信息。它也只有两个门,一个复位门和一个更新门。
更新门:更新门的作用类似于LSTM的遗忘门和输入门。它决定了要丢弃哪些信息以及要添加的新信息。
重置门:重置门是另一个门,它决定忘记过去的信息量。
这就是一个GRU,GRU的张量操作较少;因此,它比LSTM更快一点,但没有一个明显的赢家。研究人员和工程师通常会尝试两者来确定哪一个更适合他们的用例。

《从全连接神经网络FCN到LSTM》

(六)递归神经网络 (Recursive Neural Network, RNN):

循环神经网络,它可以用来处理包含序列结构的信息。然而,除此之外,信息往往还存在着诸如树结构、图结构等更复杂的结构。对于这种复杂的结构,循环神经网络就无能为力了。RNN是一种更为强大、复杂的神经网络:递归神经网络 (Recursive Neural Network, RNN),以及它的训练算法BPTS (Back Propagation Through Structure)。顾名思义,递归神经网络(巧合的是,它的缩写和循环神经网络一样,也是RNN)可以处理诸如树、图这样的递归结构。
A: 神经网络的输入层单元个数是固定的,因此必须用循环或者递归的方式来处理长度可变的输入。
B: 循环神经网络实现了前者,通过将长度不定的输入分割为等长度的小块,然后再依次的输入到网络中,从而实现了神经网络对变长输入的处理。一个典型的例子是,当我们处理一句话的时候,我们可以把一句话看作是词组成的序列,然后,每次向循环神经网络输入一个词,如此循环直至整句话输入完毕,循环神经网络将产生对应的输出。
C: 有时候把句子看做是词的序列是不够的,比如下面这句话『两个外语学院的学生』:
《从全连接神经网络FCN到LSTM》
递归神经网络可以把一个树/图结构信息编码为一个向量,也就是把信息映射到一个语义向量空间中。这个语义向量空间满足某类性质,比如语义相似的向量距离更近。也就是说,如果两句话(尽管内容不同)它的意思是相似的,那么把它们分别编码后的两个向量的距离也相近;反之,如果两句话的意思截然不同,那么编码后向量的距离则很远。

参考内容:

@ https://cuijiahua.com/
《从全连接神经网络FCN到LSTM》

    原文作者:Blessy_Zhu
    原文地址: https://blog.csdn.net/weixin_42555080/article/details/101385045
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞