# PonderDNC正逆传播简析

By [zekeer.eth](https://paragraph.com/@zekeer) · 2022-05-30

---

一个标准RNN模型的正逆传播路径如下图，其中黑色表示正向传播，即根据输入信息推断输出的过程。红色表示误差逆向传播，也就是使用BPTT优化器改善权重参数的过程。

![](https://storage.googleapis.com/papyrus_images/b38ab25e2ed56a9a619bffa7331b7176a3012af9a9c053473c86ec6211f41a8c.jpg)

一个ACT包裹的RNN模型推断过程信息传播路径如下图

![](https://storage.googleapis.com/papyrus_images/ee0cb52e30cd2580094c79746996a59a26883a9d6e69ba0b07c149eb80892329.jpg)

这里假设ACT包裹的RNN模型（简称PonderRNN）在时刻 循环计算了三次，将这个计算路径图展开，如下图

![](https://storage.googleapis.com/papyrus_images/236e771e87791a26a99e82fc3589e9524342684b4e0667fbdbdda884c464a15a.jpg)

PonderRNN在时刻 循环计算3次形成3个隐藏状态，然后这3个隐藏状态使用p（参考Graves论文Adaptive Computation Time for Recurrent Neural Networks ）合成标准RNN在时刻 的隐藏状态和输出。将图3修改一下，更清晰可见，这个在时刻 自适应的循环计算次数的架构本质就是可以自动调节计算循环次数（或者是层数）的残差网络架构。图中红色表示误差逆向传播。

![](https://storage.googleapis.com/papyrus_images/4fb90872ef49c0dd60a44483ab96684fdbd20380571f1c3d6831047baffefbf7.jpg)

![](https://storage.googleapis.com/papyrus_images/caad52dfa690bd3dc83eaa54016263d1f100d77bc431247f94ff12ee9ba0ea48.jpg)

这就引出了本文要讨论的问题，也就是PonderDNC模型计算过程中外存储器循环变量access state是否也要使用残差网络加权合成的access state状态传递给下一个时刻。比如在时刻 模型PonderDNC循环计算3次，则传递给 时刻的access state具体是PonderDNC第三次循环计算产生的access state还是三次循环计算产生的三个access state加权值。如下图，DNC在时间序列上的面的信息传播有三个模块

![](https://storage.googleapis.com/papyrus_images/788627ece3452b845a1e5cb0f5eb76f4c09bbc437065b3e7bae6370e84f27352.png)

分别是表示短期记忆的控制器（如LSTM）产生的隐藏状态矩阵control state（control state就是上面RNN的隐藏状态）以及表示外存储器记忆矩阵的access state 和 表示外存储器读取记忆的read\_vector，图中实曲线。这其中control state已经在上文进行阐述，并且read\_vector也可用同以理论或者假想解释或者理解。比较复杂的是access state这个传递模块，access state模块包含表示记忆矩阵memory以及表示读写头控制5个循环张量。

首先介绍一种简单的处理方式，截断传播路径（实现见上篇博客代码链接），也就是我们将时刻 循环三次的DNC模型处理为一个重复输入循环计算的过程，可以认为是一个重复 时刻三次的过程并依照时间顺序串联的过程。如下图，截断残差网络的传播，即没有halting(p)加权处理。

![](https://storage.googleapis.com/papyrus_images/b6c971d3b4e27f948b070607cf1a936083b0ebfcd85bea3854e7432f69e80842.jpg)

也就是外存储器（记忆矩阵）完全按照时间顺序传递

![](https://storage.googleapis.com/papyrus_images/4c71203882f4faec0f92ea2814301d068193d37b4e1a44f82ea446bb68288b1a.jpg)

第二种方法是依旧使用这种自适应残差网络计算架构处理access state。为了更好的阐述，这里引入一个虚拟的计算单元SuperDNC，在每个时间步 无论PonderDNC计算单元循环计算多少次，循环计算产生的access state 与halting的加权和总是等于SuperDNC在时间步 计算一次产生的access state，也就是在时刻 SuperDNC可以完全等效的替代PonderDNC的多次循环计算。通过引入这个虚拟计算单元之后，PonderDNC的计算效果就等效替代为一个标准RNN变种计算产生的效果。如假设PonderDNC每个时间步 循环计算3次，一共计算是3t次，则SuperDNC只计算t次。如下图，这个虚拟计算单元输入输出值均可以拆解为PonderDNC计算单元多次循环计算输入输出的加权。

![](https://storage.googleapis.com/papyrus_images/6085c62244d3156eeae5bfd85718d6a112e412b86f07b0d7a0957a3ed4fd7d2f.jpg)

为了更好的理解这个过程，对SuperDNC的access state简单拆解，显式表达SuperDNC的access state与PonderDNC循环计算产生的多个access state加权和相等的关系。

首先拆解最核心的记忆矩阵传递问题。SuperDNC在时刻 接受 计算一次产生 。其中 等同于PonderDNC在 循环计算三次产生三个记忆矩阵 的加权和，即 。如下图，假设memory是一个5行一列的外存储矩阵，则在合成的外存储矩阵中，如果在 时刻循环计算的步骤中没有改变，则合成记忆矩阵依然不会改变，如果改变了取值，则合成矩阵为 时刻改变量的加权值。虽然这里比较费解，但是并不矛盾，因为memory严格对应控制器也就是RNN（LSTM）的隐藏状态，如隐藏状态是加权值，则可以拆解memory形成加权值。可以假想，PonderDNC在时刻 写了三个外存储记忆矩阵，然后再根据思考结果将这个记忆矩阵合成了一个新记忆矩阵传递到下一个时刻开始。

![](https://storage.googleapis.com/papyrus_images/1f555b29f794cd9d22c34cef295483fb7ccd35e414e6fb9707602ef49b80eca4.jpg)

关于外存储器（记忆矩阵）的拆解显示，虚拟计算单元的记忆矩阵可以拆解为DNC在时刻 多次循环计算输出的加权。

然而需要注意access state 模块不同于control state模块，该模块传递张量均为不可训练变量。所以这里的加权并不会影响access state的取值，这里时刻 的输出使用循环计算产生的多个输出的加权替代第一种方法取循环计算最后一个access state的方法并不会直接影响access state取值。这里主要影响的是控制器(如LSTM)权重参数的误差梯度计算，因为在标准DNC模型的梯度优化过程，梯度传播包括记忆矩阵和读写头控制等外存储器模块。注：DNC计算单元中只有控制器(LSTM)的权重参数可训练。

access state 包含5个模块，分别是记忆矩阵memory， 读头控制read\_weighting， 写头控制 write\_weighting，记忆矩阵位置相对使用程度usage，记忆矩阵位置时间写入顺序链表link，以及生成link的表示记忆矩阵每个存储位置写入程度的precedence\_weighting（最后一次写入时间距离选择的远近程度值）。

由于读写头控制是严格对应相应的memory，这里可以将 时刻SuperDNC从外存储器读取向量的过程拆解为PonderDNC三次循环读向量 的加权。如下图的读头控制读取外记忆矩阵过程，外记忆矩阵、读头控制、读头向量循环计算产生产生输出加权就合成了SuperDNC在 的输出。

![](https://storage.googleapis.com/papyrus_images/6beffb516dc040c5753d7c553927ff1735b988fc49ff011b486a98145035afa4.jpg)

同样的写头控制也可以压缩为一个加权写头控制，其中 和 表示对记忆矩阵的擦除向量和写入向量，这两个值均有控制器（LSTM）在循环计算中即时生成。

![](https://storage.googleapis.com/papyrus_images/04f4b302eaf58ef5a8fc9ec8c8d53a4abfd38e8f79d7e4d6dadc68ea33489bc7.jpg)

对usage 、link和precedence\_weighting在PonderDNC循环计算输出的加权值同样也可以假想为SuperDNC的输出，或者SuperDNC的access state传递模块中的usage 、link和precedence\_weighting也可以拆解为PonderDNC循环计算输出的加权。 这是因为表示记忆矩阵各个位置相对使用程度和先后写入顺序的usage和link在PonderDNC多次循环的加权值可以看作或者是加权等同于SuperDNC的usage和link。

注：可以假想SuperDNC是一个控制器比LSTM更强大而且具有很多个读写头的超级DNC计算单元。

[代码链接](https://link.zhihu.com/?target=https%3A//www.ricequant.com/community/topic/3856//5)

---

*Originally published on [zekeer.eth](https://paragraph.com/@zekeer/ponderdnc)*
