DL入门(3):循环神经网络(RNN)

  写在前面:看预测论文综述时,面临这样一个问题:很多DL的方法只是会简单运用,却不是特别了解其详细原理,故针对CNN、RNN、LSTM、AutoEncoder、RBM、DBN以及DBM分别做一些简单总结,以达到了解的目的,此篇为RNN。

目录

  • 1.引入RNN
    • 1.1 前馈神经网络
    • 1.2 RNN简介
  • 2.RNN
    • 2.1 1vN结构
    • 2.2 Nv1结构
    • 2.3 seq2seq结构
      • 2.3.1 Encoder部分
      • 2.3.2 Deconder部分

1.引入RNN

1.1 前馈神经网络

如下所示:
DL入门(3):循环神经网络(RNN)_第1张图片
其正向传播过程为:
y 1 = w 1 ∗ x + b , 其 中 w 1 为 第 一 层 的 权 重 参 数 ; a 1 = σ ( y 1 ) , 将 y 1 经 过 激 活 函 数 之 后 作 为 第 二 层 的 输 入 ; y 2 = w 2 ∗ a 1 + b , 其 中 w 2 为 第 二 层 的 权 重 参 数 ; a 2 = σ ( y 2 ) y ′ = a 2 , 即 为 预 测 值 。 y1=w1*x+b,其中w1为第一层的权重参数;\\ a1 = \sigma(y1),将y1经过激活函数之后作为第二层的输入;\\ y2 = w2*a1+b,其中w2为第二层的权重参数;\\ a2 = \sigma(y2)\\ y_{'} = a2,即为预测值。 y1=w1x+bw1;a1=σ(y1)y1;y2=w2a1+bw2;a2=σ(y2)y=a2
  通过上述计算过程我们发现,在前馈神经网络中,信息的传递是单向的, 这种限制虽然使得网络变得更容易学习,但在一定程度上也减弱了神经网络模型的能力。在生物神经网络中, 神经元之间的连接关系要复杂得多。前馈神经网络可以看作一个复杂的函数, 每次输入都是独立的, 即网络的输出只依赖于当前的输入。
  but在很多情况下,网络的输出不仅和当前时刻的输入相关, 也和其过去一段时间的输出相关。比如一个有限状态自动机, 其下一个时刻的状态(输出)不仅和当前输入相关, 也和当前状态(上一个时刻的输出)相关。此外, 前馈神经网络难以处理时序数据,比如视频、语音、文本等。时序数据的长度一般是不固定的,而前馈神经网络要求输入和输出的维数都是固定的,不能任意改变。 因此,当处理这一类和时序数据相关的问题时,就需要一种能力更强的模型。

1.2 RNN简介

  循环神经网络(Recurrent Netural Network,Rnn)是一类具有短期记忆能力的神经网络。在RNN中,神经元不但可以接受其他神经元的信息,也可以接受自身的信息,形成具有环路的网络结构,RNN由此得名。循环神经网络已经被广泛应用在语音识别、语言翻译以及图片描述等任务上。
  为了处理时序数据并利用其历史信息,我们需要让网络具有短期记忆能力。而前馈网络是一种静态网络,不具备这种记忆能力。
  RNN基本结构如下:
DL入门(3):循环神经网络(RNN)_第2张图片
其中“延迟器”为一个虚拟单元,记录神经元的最近一次或几次的活性值, h t = f ( h t − 1 , x t ) h_{t} = f(h_{t-1}, x_{t}) ht=f(ht1,xt),f为一个非线性函数。
  可以看到,当前状态 h t h_{t} ht不仅和当前输入 x t x_{t} xt有关,也与上一时刻状态 h t − 1 h_{t-1} ht1有关,这样,RNN就能够处理时序数据了。
  由于循环神经网络具有短期记忆能力,相当于存储装置,因此计算能力十分强大可以模拟任何程序(好像跟米里型时序电路差不多?)。

2.RNN

   RNN的五种结构,如下图所示:DL入门(3):循环神经网络(RNN)_第3张图片
RNN分为一对一、一对多、多对一、多对多,其中多对多分为两种。

  1. 单个神经网络,即一对一。
  2. 单一输入转为序列输出,即一对多。这类RNN可以处理图片,然后输出图片的描述信息。
  3. 序列输入转为单个输出,即多对一。多用在电影评价分析。
  4. 编码解码(Seq2Seq)结构。seq2seq的应用的范围非常广泛,语言翻译,文本摘要,阅读理解,对话生成等。
  5. 输入输出等长序列。这类限制比较大,常见的应用有作诗机器人。

一个经典的RNN如下图所示:
DL入门(3):循环神经网络(RNN)_第4张图片
其中参数关系如下所示:( h 0 = 0 h_{0} = 0 h0=0
在这里插入图片描述
  h为隐状态, h t − 1 ℎ_{t-1} ht1可以被看做一个记忆特征,提取了前t-1个时刻的输入特征。f为非线性激活函数,U,W,b,V都是网络参数。值得注意的是,无论进行到什么状态,所有的网络参数都是一样的,这也是权值共享的体现。

2.1 1vN结构

  1vN结构就是一个输入多个输出,它有如下两种常见结构:
  第一种:
DL入门(3):循环神经网络(RNN)_第5张图片
一个输入只输送给RNN第一个神经元,其表达式为:
h 1 = f ( U x + W h 0 + b ) h N = f ( W h N − 1 + b ) y t = v h t h_{1} = f(Ux+Wh_{0}+b)\\ h_{N} = f(Wh_{N-1}+b)\\ y_{t} = vh_{t} \\ h1=f(Ux+Wh0+b)hN=f(WhN1+b)yt=vht

  第二种:
DL入门(3):循环神经网络(RNN)_第6张图片
一个输入x输送给所有神经元,其表达式为:
h 1 = f ( U x + W h 0 + b ) h N = f ( U x + W h N − 1 + b ) y t = v h t h_{1} = f(Ux+Wh_{0}+b)\\ h_{N} = f(Ux+Wh_{N-1}+b)\\ y_{t} = vh_{t} \\ h1=f(Ux+Wh0+b)hN=f(Ux+WhN1+b)yt=vht

2.2 Nv1结构

  Nv1结构就是多个输入一个输出,如下所示:
DL入门(3):循环神经网络(RNN)_第7张图片
每一个神经元对应不同的输入,其表达式为:
h 1 = f ( U x 1 + W h 0 + b ) h N = f ( U x N + W h N − 1 + b ) y t = v h t h_{1} = f(Ux_{1}+Wh_{0}+b)\\ h_{N} = f(Ux_{N}+Wh_{N-1}+b)\\ y_{t} = vh_{t} \\ h1=f(Ux1+Wh0+b)hN=f(UxN+WhN1+b)yt=vht

2.3 seq2seq结构

  seq2seq结构,即输入输出不等长的多对多结构,又叫Encoder-Decoder模型。
DL入门(3):循环神经网络(RNN)_第8张图片
  如上图所示,在Seq2Seq结构中,编码器Encoder把所有的输入序列编码成一个统一的语义向量Context,然后再由解码器Decoder解码。在解码器Decoder解码的过程中,不断地将前一个时刻的输出作为后一个时刻的输入,循环解码,直到输出停止符为止。
  根据得到Context后Decoder的方式,可以将seq2seq分为以下几种常见形式:
DL入门(3):循环神经网络(RNN)_第9张图片
以及:
DL入门(3):循环神经网络(RNN)_第10张图片
以及:
DL入门(3):循环神经网络(RNN)_第11张图片
  可以看到,三种形式中前半部分Encoder是一样的,不同之处在于得到语义向量Context之后Deconder的部分。

2.3.1 Encoder部分

  Encoder部分都是一样的,Encoder的RNN接受输入x得到一个输出c,中间隐状态都没有进行输出。
DL入门(3):循环神经网络(RNN)_第12张图片
  c可以经多种方式得到:
DL入门(3):循环神经网络(RNN)_第13张图片
  Encoder结果c可以直接是最后一个神经元的隐状态 h 4 h_{4} h4;也可以在 h 4 h_{4} h4的基础上做一些变换得到,比如 q ( h 4 ) q(h_{4}) q(h4);最后当然也可以使用所有神经元的隐藏状态进行变换得到。

2.3.2 Deconder部分

  解码器是三种seq2seq的不同之处,下面依次介绍。
  第一种:
DL入门(3):循环神经网络(RNN)_第14张图片
  与传统的RNN结构相比我们可以看到,这种形式下的Decoder部分将编码结果Context当成了RNN的初始隐藏状态 h 0 h_{0} h0,接下来每一个神经元都都没有接受输入,并且每一个隐状态都进行了输出,根据上述经典RNN的公式,我们可以推出此种Decoder的表达式如下:
h 1 ′ = f ( U x 1 + W c + b ) = f ( W c + b ) h M ′ = f ( U x M + W h M − 1 + b ) = f ( W h M − 1 + b ) y t = v h t h_{1}^{'} = f(Ux_{1}+Wc+b) = f(Wc+b) \\ h_{M}^{'} = f(Ux_{M}+Wh_{M-1}+b) = f(Wh_{M-1}+b) \\ y_{t} = vh_{t} \\ h1=f(Ux1+Wc+b)=f(Wc+b)hM=f(UxM+WhM1+b)=f(WhM1+b)yt=vht
由于没有输入x,所以参数U不起作用。

  第二种:
DL入门(3):循环神经网络(RNN)_第15张图片
  这种情况下Context不再作为初始隐状态,而是作为一个输入x送到所有神经元,公式如下所示:
h 1 ′ = f ( U x 1 + W h 0 ′ + b ) = f ( U c + W h 0 ′ + b ) h M ′ = f ( U x M + W h M − 1 + b ) = f ( U c + W h M − 1 + b ) y t = v h t h_{1}^{'} = f(Ux_{1}+Wh_{0}^{'}+b) = f(Uc+Wh_{0}^{'}+b) \\ h_{M}^{'} = f(Ux_{M}+Wh_{M-1}+b) = f(Uc+Wh_{M-1}+b) \\ y_{t} = vh_{t} \\ h1=f(Ux1+Wh0+b)=f(Uc+Wh0+b)hM=f(UxM+WhM1+b)=f(Uc+WhM1+b)yt=vht

  第三种:
DL入门(3):循环神经网络(RNN)_第16张图片
  

  第三种与第二种相比,输入不再只是c,还增加了上一个神经元的输出y,所以公式如下:
h 1 ′ = f ( U c + W h 0 ′ + v y 0 ′ + b ) h M ′ = f ( U c + W h M − 1 + v y M − 1 ′ + b ) y t = v h t h_{1}^{'} = f(Uc+Wh_{0}^{'}+vy_{0}^{'}+b) \\ h_{M}^{'} = f(Uc+Wh_{M-1}+vy_{M-1}^{'}+b) \\ y_{t} = vh_{t} \\ h1=f(Uc+Wh0+vy0+b)hM=f(Uc+WhM1+vyM1+b)yt=vht

你可能感兴趣的:(DL,RNN,seq2seq)