首页
登录 | 注册

通俗易懂--循环神经网络(RNN)的网络结构!(TensorFlow实现)

1. 什么是RNN

循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)

1.1 RNN的应用

  • 文本生成(生成序列)
  • 机器翻译
  • 看图说话
  • 文本(情感)分析
  • 智能客服
  • 聊天机器人
  • 语音识别
  • 搜索引擎
  • 个性化推荐

1.2 为什么有了CNN,还要RNN?

  • 传统神经网络(包括CNN),输入和输出都是互相独立的。图像上的猫和狗是分隔开的,但有些任务,后续的输出和之前的内容是相关的。例如:我是中国人,我的母语是____。这是一道填空题,需要依赖于之前的输入。
  • 所以,RNN引入“记忆”的概念,也就是输出需要依赖于之前的输入序列,并把关键输入记住。循环2字来源于其每个元素都执行相同的任务。
  • 它并⾮刚性地记忆所有固定⻓度的序列,而是通过隐藏状态来存储之前时间步的信息。

1.3 RNN的网络结构

首先先上图,然后再解释:

通俗易懂--循环神经网络(RNN)的网络结构!(TensorFlow实现)

现在我们考虑输⼊数据存在时间相关性的情况。假设 \(X_t\in_{}\mathbb{R}^{n*d}\) 是序列中时间步t的小批量输⼊,\(H_t\in_{}\mathbb{R}^{n*h}\) 是该时间步的隐藏变量。那么根据以上结构图当前的隐藏变量的公式如下:

\[H_t=\phi(X_tW_{xh}+H_{t-1}W_{hh}+b_h)\]

从以上公式我们可以看出,这⾥我们保存上⼀时间步的隐藏变量 \(H_{t-1}\),并引⼊⼀个新的权重参数,该参数⽤来描述在当前时间步如何使⽤上⼀时间步的隐藏变量。具体来说,时间步 t 的隐藏变量的计算由当前时间步的输⼊和上⼀时间步的隐藏变量共同决定。 \(\phi\) 函数其实就是激活函数。

我们在这⾥添加了 \(H_{t-1}W_{hh}\) ⼀项。由上式中相邻时间步的隐藏变量 \(H_t 和H_{t-1}\) 之间的关系可知,这⾥的隐藏变量能够捕捉截⾄当前时间步的序列的历史信息,就像是神经⽹络当前时间步的状态或记忆⼀样。因此,该隐藏变量也称为隐藏状态。由于隐藏状态在当前时间步的定义使⽤了上⼀时间步的隐藏状态,上式的计算是循环的。使⽤循环计算的⽹络即循环神经⽹络(recurrent neural network)。

在时间步t,输出层的输出和多层感知机中的计算类似:

\[O_t=H_tW_{hq}+b_q\]

1.4 双向RNN

之前介绍的循环神经⽹络模型都是假设当前时间步是由前⾯的较早时间步的序列决定的,因此它
们都将信息通过隐藏状态从前往后传递。有时候,当前时间步也可能由后⾯时间步决定。例如,
当我们写下⼀个句⼦时,可能会根据句⼦后⾯的词来修改句⼦前⾯的⽤词。双向循环神经⽹络通过增加从后往前传递信息的隐藏层来更灵活地处理这类信息。下图演⽰了⼀个含单隐藏层的双向循环神经⽹络的架构。

通俗易懂--循环神经网络(RNN)的网络结构!(TensorFlow实现)

在双向循环神经⽹络的架构中,设该时间步正向隐藏状态为 \(\overrightarrow{H}_t\in_{}\mathbb{R}^{n*h}\)(正向隐藏单元个数为h),反向隐藏状态为 \(\overleftarrow{H}_t\in_{}\mathbb{R}^{n*h}\)(反向隐藏单元个数为h)。我们可以分别
计算正向隐藏状态和反向隐藏状态:

\[\overrightarrow{H}_t=\phi(X_tW_{xh}^{(f)}+\overrightarrow{H}_{t-1}W_{hh}^{(f)}+b_h^{(f)})\]

\[\overleftarrow{H}_t=\phi(X_tW_{xh}^{(b)}+\overleftarrow{H}_{t-1}W_{hh}^{(b)}+b_h^{(b)})\]

然后我们连结两个⽅向的隐藏状态 \(\overrightarrow{H}_t和\overleftarrow{H}_t\) 来得到隐藏状态 \(H_t\in_{}\mathbb{R}^{n*2h}\),并将其输⼊到输出层。输出层计算输出 \(O_t\in_{}\mathbb{R}^{n*q}\)(输出个数为q):

\[O_t=H_tW_{hq}+b_q\]

双向循环神经⽹络在每个时间步的隐藏状态同时取决于该时间步之前和之后的⼦序列(包
括当前时间步的输⼊)。

1.5 BPTT算法

通俗易懂--循环神经网络(RNN)的网络结构!(TensorFlow实现)

在之前你已经见过对于前向传播(上图蓝色箭头所指方向)怎样在神经网络中从左到右地计算这些激活项,直到输出所有地预测结果。而对于反向传播,我想你已经猜到了,反向传播地计算方向(上图红色箭头所指方向)与前向传播基本上是相反的。

我们先定义一个元素损失函数:

\[L^{(t)}(y^{'(t)},y^{(t)})=-y^{(t)}logy^{'(t)}-(1-y^{'(t)})log(1-y^{'(t)})\]

整个序列的损失函数:

\[L(y^{'},y)=\sum_{t=1}^{T_x}L^{(t)}(y^{'(t)},y^{(t)})\]$

在这个计算图中,通过\(y^{'(1)}\)可以计算对应的损失函数,于是计算出第一个时间步的损失函数,然后计算出第二个时间步的损失函数,然后是第三个时间步,一直到最后一个时间步,最后为了计算出总体损失函数,我们要把它们都加起来,通过等式计算出最后的


相关文章

  • TensorFlow之DNN(三):神经网络的正则化方法(Dropout、L2正则化、早停和数据增强)
    这一篇博客整理用TensorFlow实现神经网络正则化的内容. 深层神经网络往往具有数十万乃至数百万的参数,可以进行非常复杂的特征变换,具有强大的学习能力,因此容易在训练集上过拟合.缓解神经网络的过拟合问题,一般有两种思路,一种是用正则化方 ...
  • 《k8s 源码分析》- Custom Controller 之 Informer
    Custom Controller 之 Informer 概述 架构概览 reflector - List & Watch API Server Reflector 对象 ListAndWatch watchHandler - ad ...
  • ERP不规范,同事两行泪
    最近的很多次对外交流,都聊到了ERP建设的话题,并且无一例外的不那么让人省心,回想我这么多年走过的ERP坑坑路,在这里也写下经验和总结,希望能给正在或者即将走上ERP建设路的企业一些思考和帮助. 导读 1.几个瞎眼而普遍的案例 2.ERP的 ...
  • 一.前言 在日常开发中,我们经常会碰到需要在运行时才知道对象个数的情况,这种情况不能使用数组,因为数组是固定数量的,这个时候我们就会使用集合,因为集合可以存储数量不确定的对象. 集合类是特别有用的工具类,不仅可以存储数量不等的对象,还可以实 ...
  • 代码审查作业
    代码审查 我对结对同伴的代码进行了审查,他的有关括号匹配的代码 审查结果 功能模块名称 括号匹配问题 审查人 牛斌帅 审查日期 2019年4月25日 代码名称 括号匹配问题 代码作者 房旭 文件结构 重要性 审查项 结论 头文件和定义文件的 ...
  • 【TOGAF】总体认知
    TOGAF是什么 TOGAF(The Open Group Architecture Framework)是当前最为流行的企业架构框架理论之一,它为一个企业或组织对于企业架构的接受.创建.使用和维护提供了一系列辅助方法和工具.基于迭代过程模 ...

2019 cecdns.com webmaster#cecdns.com
12 q. 0.076 s.
京ICP备10005923号