展开计算图与循环神经网络

计算图是形式化一组计算结构的方式,如那些涉及将输入和参数映射到输出和损失计算。我们对展开(unfolding) 递归或循环计算得到的重复结构进行解释,这些重复结构通常对应于一个事件链。展开(unfolding) 这个图导致深度网络结构中的参数共享。

例如,考虑动态系统的经典形式:

其中称为系统的状态。

s在时刻t的定义需要参考时刻t-1时同样的定义,因此上式是循环的。

对有限时间步 τ, τ - 1 次应用这个定义可以展开这个图。例如,如果我们对公式关于 τ = 3 展开,可以得到:

以这种方式重复应用定义,展开等式,就能得到不涉及循环的表达。现在可以使用传统的有向无环计算图表示这样的表达。

将公式描述的经典动态系统表示为展开的计算图。每个节点表示在某个时间t的状态,并且函数f将t处的状态映射到t + 1处的状态。所有时间步都使用相同的参数(用于参数化f的相同 θ 值)。

作为另一个例子,让我们考虑由外部信号驱动的动态系统,

我们可以看到,当前状态包含了整个过去序列的信息。

循环神经网络可以通过许多不同的方式建立。就像几乎所有函数都可以被认为是前馈网络,基本上任何涉及循环的函数可以被认为是一个循环神经网络。

很多循环神经网络使用类似的公式定义隐藏单元的值。为了表明状态是网络的隐藏单元,我们使用变量 h代表状态:

典型RNN会增加额外的架构,如读取状态信息 h 进行预测的输出层。

没有输出的循环网络。此循环网络只处理来自输入 x 的信息,将其合并到经过时间向前传播的状态 h。(左)回路原理图。黑色方块表示单个时间步的延迟。(右)同一网络被视为展开的计算图,其中每个节点现在与一个特定的时间实例相关联。

当训练循环网络根据过去预测未来时,网络通常要学会使用作为过去序列(直到 t)与任务相关方面的有损摘要。此摘要一般而言一定是有损的,因为其映射任意长度的序列到一固定长度的向量。根据不同的训练准则,摘要可能选择性地精确保留过去序列的某些方面。例如,如果在统计语言建模中使用的RNN,通常给定前一个词预测下一个词,可能没有必要存储 t 前输入序列中的所有信息;而仅仅存储足够预测句子其余部分的信息。最苛刻的情况是我们要求足够丰富,并能大致恢复输入序列,如自编码器框架。

式可以用两种不同的方式绘制。一种方法是为可能在模型的物理实现中存在的部分赋予一个节点,如生物神经网络。在这个观点下,网络定义了实时操作的回路,如图左侧,其当前状态可以影响其未来的状态。我们使用回路图的黑色方块表明在时刻 t 的状态到时刻 t + 1 的状态单个时刻延迟中的相互作用。另一个绘制RNN的方法是展开的计算图,其中每一个组件是由许多不同的变量表示,每个时间步一个变量,表示在该时间点组件的状态。每个时间步的每个变量绘制为计算图的一个独立节点,如图右侧。我们所说的展开是将左图中的回路映射为右图中包含重复组件的计算图的操作。目前,展开图的大小取决于序列长度.

我们可以用一个函数 g(t) 代表经 t 步展开后的循环:

函数 g(t) 将全部的过去序列作为输入来生成当前状态,但是展开的循环架构允许我们将 g(t) 分解为函数 f 的重复应用。因此,展开过程引入两个主要优点:

1. 无论序列的长度,学习好的模型始终具有相同的输入大小,因为它指定的是从一种状态到另一种状态的转移,而不是在可变长度的历史状态上操作。

2. 我们可以在每个时间步使用相同参数的相同转移函数 f。

这两个因素使得学习在所有时间步和所有序列长度上操作的单一模型 f 是可能的,而不需要在所有可能时间步学习独立的模型 g(t)。学习单一的共享模型允许泛化到没有见过的序列长度(没有出现在训练集中),并且估计模型所需的训练样本远远少于不带参数共享的模型。

无论是循环图和展开图都有其用途。循环图简洁。展开图能够明确描述其中的计算流程。展开图还通过显式的信息流动路径帮助说明信息在时间上向前(计算输出和损失)和向后(计算梯度)的思想。

本文来自企鹅号 - 深度学习与神经网络媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Phoenix的Android之旅

Java 集合 Vector

List有三种实现,ArrayList, LinkedList, Vector, 它们的区别在于, ArrayList是非线程安全的, Vector则是线程安全...

692
来自专栏MelonTeam专栏

ArrayList源码完全分析

导语: 这里分析的ArrayList是使用的JDK1.8里面的类,AndroidSDK里面的ArrayList基本和这个一样。 分析的方式是逐个API进行解析 ...

4779
来自专栏项勇

笔记68 | 切换fragmengt的replace和add方法笔记

1544
来自专栏拭心的安卓进阶之路

Java 集合深入理解(6):AbstractList

今天心情比天蓝,来学学 AbstractList 吧! ? 什么是 AbstractList ? AbstractList 继承自 AbstractCollec...

20910
来自专栏开发与安全

算法:AOV网(Activity on Vextex Network)与拓扑排序

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex ...

4057
来自专栏Java Edge

AbstractList源码解析1 实现的方法2 两种内部迭代器3 两种内部类3 SubList 源码分析4 RandomAccessSubList 源码:AbstractList 作为 Lis

它实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,但不支持添加和替换

622
来自专栏desperate633

LeetCode Invert Binary Tree题目分析

Invert a binary tree. 4 / \ 2 7 / \ / \1 3 6 9 to4 / \ 7 2 / \ / \9 6 3 1 Tri...

991
来自专栏xingoo, 一个梦想做发明家的程序员

Spark踩坑——java.lang.AbstractMethodError

百度了一下说是版本不一致导致的。于是重新检查各个jar包,发现spark-sql-kafka的版本是2.2,而spark的版本是2.3,修改spark-sql-...

1290
来自专栏拭心的安卓进阶之路

Java 集合深入理解(12):古老的 Vector

今天刮台风,躲屋里看看 Vector ! 都说 Vector 是线程安全的 ArrayList,今天来根据源码看看是不是这么相...

2547
来自专栏学海无涯

Android开发之奇怪的Fragment

说起Android中的Fragment,在使用的时候稍加注意,就会发现存在以下两种: v4包中的兼容Fragment,android.support.v4.ap...

3225

扫码关注云+社区