RNN(recurrent neural network)(一)——基础知识

RNN(recurrent neural network)(一)——基础知识

RNN系列博客:

这篇博客主要介绍一下RNN的基础知识,如果你对RNN已经很了解了,想动手自己撸个RNN加深下理解,那么直接转到 RNN(recurrent neural network)(二)——动手实现一个RNN。RNN主要用于处理序列数据,因此在NLP领域发挥了巨大的影响,被广泛用于语言模型、语音识别、机器翻译等领域。RNN的基础主要包括以下几个部分:

  1. RNN基本结构
  2. RNN公式原理
  3. 常见的几种RNN结构

一、RNN基本结构

RNN的基本架构如下图所示:

图一:RNN展开后的结构
图二:RNN未展开的结构

从图一能够看出RNN是个序列模型, a &lt; 0 &gt; a^{&lt;0&gt;} a<0>一般初始化为全0的向量。其实RNN模型对于初学者来说可能会比较疑惑,因此这里我想尽量的描述细致一点,让路过的同学看的轻松些。首先,第一个要注意的点:上面的图也显示了RNN在每一个时间戳 t t t 它的参数是相同的,也就是大家通常所说的参数共享,因此RNN实际上只有三个参数,即 W a x 、 W a a 、 W y a W_{ax}、W_{aa}、W_{ya} WaxWaaWya,因此RNN的结构又可以华成图二的形式。这一点和我们熟知的MLP、CNN每一层的参数都不一样是不同的。每一个时间戳 t t t的输入、输出构成一个cell,图一忽略省略的部分,共有4个cell,一般cell的个数输入的序列长度相同。
下面来看看单独一个cell的内部构成,这个图就直接盗用ng deep learning课的图了(图片出处:Andrew ng 《sequence model》):

图三:RNN cell

两个输入分别是:当前时刻的输入样本 x &lt; t &gt; x^{&lt;t&gt;} x<t>和上一个cell激活函数的输出 a &lt; t − 1 &gt; a^{&lt;t-1&gt;} a<t1>,两个输出是 y ^ &lt; t &gt; \widehat{y}^{&lt;t&gt;} y <t>(也就是当前时刻的输出)和 a &lt; t &gt; a^{&lt;t&gt;} a<t>(同样也是下一个cell(下一时刻)的输入)。因此RNN实际上在 t t t时刻得到的结果是基于前 t t t个输入的,最原始的RNN也就是这种单向的只能够利用前面的信息,但是有时候单向的RNN很难解决问题,比如下面这个例子(例子来自ng 《sequence model》):

He said, “Teddy Roosevelt was a great president”.
He said, " Teddy bears are on sale".

如果需要判断 Teddy 是人还是动物,这个例子如果仅仅用单向的RNN(只利用前面的信息)是很难判断出来的,但如果用到后面的信息,比如 president 则很容易判断出第一句话里的Teddy是人。扯远了,关于双向RNN暂时不在这篇文章的讨论范围之内。

RNN结构更加细致的描述

看了上面的介绍,应该对RNN的结构有个基本的了解了,但是对于初学者,仅仅看上面的结构还是会很懵逼,会产生很多疑问,比如:1、如果你在用TensorFlow/Keras等框架时发现RNN cell要设置隐藏单元的数量,是不是会很懵逼?2、如果要处理一句话,RNN的输入 x &lt; 1 &gt; 、 x &lt; 2 &gt; 、 . . . 、 x &lt; T &gt; x^{&lt;1&gt;}、x^{&lt;2&gt;}、...、x^{&lt;T&gt;} x<1>x<2>...x<T>到底是什么?
先回答第二个问题,假如我们的输入一个句子,这个每个输入实际上是个单词,但是要先把单词转化为词向量(比如one-hot或者embedding),因此RNN的输入 x &lt; t &gt; x^{&lt;t&gt;} x<t>是个向量,而输入 X X X则是个三维矩阵 [ n x , m , T x ] [n_x, m, T_x] [nx,m,Tx],其中 n x n_x nx是词向量的维度, m m m是样本数量, T x T_x Tx是句子长度(句子单词的个数)。再回到第一个问题,我们都知道MLP和CNN每一层都有一定数量的隐藏单元,那么RNN的隐藏单元是什么鬼?直接看下面这个图吧:

图四:RNN细节

因此一点RNN cell中的隐藏单元数量确定后,每个cell里的隐藏单元数目都是相等的,因为它们共享权重矩阵 W a x 、 W a a 、 W y a W_{ax}、W_{aa}、W_{ya} WaxWaaWya。因此,你完全可以把RNN的每个cell理解为一个复制过程。知乎上Scofield(用户id)对RNN结构讲的也很好,大家可以参考一下:Scofield对RNN结构的讲解

二、RNN公式原理

讲到RNN的公式原理,这里只讲前向传播和损失函数,后向传播留在《RNN(recurrent neural network)(二)——动手实现一个RNN》里讲解。
还是在看下这个图吧:

RNN的前向传播公式为:
a &lt; t &gt; = t a n h ( W a x x &lt; t &gt; + W a a a &lt; t − 1 &gt; + b a ) a^{&lt;t&gt;} = tanh(W_{ax}x^{&lt;t&gt;} + W_{aa}a^{&lt;t-1&gt;} + b_a) a<t>=tanh(Waxx<t>+Waaa<t1>+ba)
y ^ &lt; t &gt; = s o f t m a x ( W y a a &lt; t &gt; + b y ) \widehat{y}^{&lt;t&gt;} = softmax(W_{ya}a^{&lt;t&gt;} + b_y) y <t>=softmax(Wyaa<t>+by)

上面全都是矩阵乘法(不是点乘),下面来看看每个矩阵的维度,假设cell里hidden unit的个数为 n a n_a na,词向量的维度为 n x n_x nx,softmax输出个数为 n y n_y ny,则各个矩阵的维度如下:

以上就是对RNN基础知识的介绍,

RNN有一个非常大的缺点:就是会存在梯度消失梯度爆炸的问题,因此LSTM就是为了解决RNN的梯度消失而提出的,RNN之所以存在梯度消失问题是因为bp时链式法则导致的,如果偏导小于1,如果网络很深连乘后会使得梯度无限趋向于0,因而导致梯度消失。而梯度爆炸问题则可以用梯度裁剪来实现(clipping gradient),关于梯度裁剪会在下一篇博客中《RNN(recurrent neural network)(二)——动手实现一个RNN》详细的介绍以及实现。

三、常见的RNN结构

常见的RNN结构有:多对多结构(常用于机器翻译)、多对一结构(常用与情感分析)、一对一结构、一对多结构(音乐生成)。下面是这几种结构的示意图:

关于RNN的综述可参考论文《Recent Advances in Recurrent Neural Networks》,机器之心对这篇论文做了翻译,参见:从90年代的SRNN开始,纵览循环神经网络27年的研究进展




  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值