shb's blog

Almeida–Pineda Recurrent Backpropagation

Word count: 1.9kReading time: 8 min
2020/09/21 Share

由 Almeida 和 Pineda 分别提出的算法。

Model

令 $(x,y)$ 为训练集中的一个数据点, 我们通过 $x$ 和 $y$ 建立一个动态系统。 我们定义能量函数 $E_{\theta}(x,s)$ 和代价函数 $C_{\theta}(y,s)$, 其中 $s$ 为隐藏状态, $\theta$ 为我们希望训练的参数。 当 $x$ 和 $y$ 确定的时候,这两个函数的取值仅取决于 $s$ 和 $\theta$。 简略起见, 我们把这两个函数里的 $x$ 和 $y$ 忽略,写作 $E_{\theta}(s)$ 和 $C_{\theta}(s)$。 这个动态系统的运行过程如下:

类似于梯度下降, $s$ 从初始状态开始, 沿着 $E_{\theta}(s)$ 在 $s$ 处的梯度反方向下降,即:

这个过程称为松弛阶段(free phase)。 $s$ 最终会在 $E_\theta$ 的作用下达到一个极小值点, 我们将其记作 $s_{\theta}^{0}$, 称为松弛不动点。 注意到 $s$ 可能由于初值不同而收敛到不同的极值点,但简单起见,我们先不考虑这件事。

我们的目标是在给定 $x,y$ 的情况下,最小化松弛不动点处代价函数的值 $J(\theta) := C_{\theta}(s_{\theta}^{0})$。 如果我们能够求出 $J$ 关于 $\theta$ 的梯度, 那我们就可以用梯度下降的方式来优化 $\theta$。

Method

定义 $S_{\theta}^{0}(s,t)$ 为隐状态 $s$ 根据方程 $(1)$ 转移到时间 $t$ 时得到的中间状态。这个状态在动态系统理论中被称为流(flow)。

我们根据$S_{\theta}^{0}$的定义,来定义代价函数 $C_{\theta}$ 的中间状态 $L_{\theta}$:

根据定义,我们显然有 $L_{\theta}(s,0)=C_{\theta}(s)$, 以及在 $t \rightarrow +\infty$ 时, $L_\theta(s,t) \rightarrow J(\theta)$。 在 $E_{\theta}$ 和 $C_{\theta}$ 满足弱正则条件时,我们在 $t \rightarrow +\infty$ 时,有:

定义:

注意两者的定义都建立在一个以松弛不动点为初状态的动态系统的基础上。两者分别是 $t$ 时刻代价函数在状态空间 $s$ 和参数空间 $\theta$ 上的梯度。很显然,$\bar{\Theta}_{+ \infty}$ 就是我们要求的 $\frac{\partial J}{\partial \theta}$。

Theorem 1

Proof of Theorem 1

为了书写方便,下面省略一部分的 $\theta$。$(6),(7)$ 都是显然的。

首先,我们证明,对于任意的$(s,t)$:

一个错误的证明:由方程$(1)$,我们可以得到,对于任意的$(s,t)$:

事实上这里的第一个等号并不能直接由求导法则成立,而需要像后文中提取出单变量函数才能转化。

论文中的证明:根据定义,我们有:

显然,右侧对 $u$ 和 $t$ 求导得到同样的结果,因此左边也应该得到同样的结果:

将 $u=0$ 代入 $(13)$,就能得到 $(10)$ 的结果。

将 $(10)$ 两边对 $s$ 求导,可以得到:

把 $s = s_\theta^0$ 代入上式,由于不动点处有 $\frac{\partial{E}}{\partial s} (s_\theta^0) = 0$,因此可以得到:

将 $\bar{S}_{t} = \frac{\partial L_{\theta}}{\partial s}(s_{\theta}^0, t)$ 代入,就可以得到方程 $(8)$。可以看到 $(6),(8)$ 刻画了一个关于 $\bar{S}_t$ 的动态系统, 由于 $-\frac{\partial^2{E}}{\partial{s^2}}(s_\theta^0)$ 是定值,我们可以通过数值方法得到任意时刻 $\bar{S}_t$ 的值。

这里一开始理解的时候出了一点问题。由于 $s_\theta^0$ 是松弛不动点,所以 $L(s_\theta^0,t)$ 在 $t$ 改变时是一个定值,所以我误认为左边恒等于 $0$。 但 $s_\theta^0$ 的邻域并不是不动点,因此两个 $s$ 关于 $t$ 的导数是不同的。

类似之前的操作,我们将 $(10)$ 两边对 $\theta$ 求导,可以得到:

同样将 $s = s_\theta^0$ 代入,消去带有 $\frac{\partial{E}}{\partial s} (s)$ 的项,就可以得到:

即方程 $(9)$。

回过头看整个证明,重点在于方程 $10$ 把时域的导数和状态域的导数联系在了一起。在项 $
\frac{\partial{L}}{\partial{t}}(s,t)$ 对某个参数求导时,可以得到对应参数的导数在时域上的导数。 而
$\frac{\partial{L}}{\partial{s}}(s,t) \cdot \frac{\partial{E}}{\partial{s}}(s)$ 在松弛不动点处求导时,只会留下 $\bar{S}_t$ 和某个与 $t$ 无关的二阶导数乘积,进而可以直接计算。

Algorithm

  1. 从任意初始状态 $s$ 出发,用方程 $(1)$ 迭代得到松弛不动点 $s_\theta^0$。
  2. 根据 $(6)(7)(8)(9)$,得到 $\bar{\Theta}_{+ \infty}$,即所求梯度。

Q&A

Q: 为什么 $\bar{S}_t$ 一定可以收敛,也就是 $(8)$ 的左侧为什么一定可以迭代到 $0$?

A: 由于 $s_\theta^0$ 是 $E_\theta$ 的极小值点,所以此处的 Hessian 矩阵 $\frac{\partial^2{E_\theta}}{\partial{s^2}}(s_\theta^0)$ 是正定的。令 $H = \frac{\partial^2{E_\theta}}{\partial{s^2}}(s_\theta^0)$,则我们有:

 对于任意的初始$\bar{S}_t$,我们将其投影到 $H$ 的特征向量上。由于 $H$ 是正定的,每个特征向量对应的特征值都是正的,且这些特征向量彼此正交。因此 $-H \cdot \bar{S}_t$ 在每个特征向量上的投影都和 $\bar{S}_t$ 的对应投影反向,即每个分量上的投影 $p_i$ 都满足 $\frac{\mathrm{d}{p_i}}{\mathrm{d}{t}} = -\lambda_i \cdot {p_i}$。这个微分方程的解是 $p_i = e^{\ln(p_{i}^{0}) - \lambda_{i} t}$,其中 $p_i^0$ 是该方向的投影初值。可以看出每个分量上都随时间指数收敛到 $0$,因此最终 $\bar{S}_t$ 及其导数都会收敛到 $0$。回过头看 $\bar{S}_t$ 的定义,在 $t \rightarrow +\infty$ 时,初状态 $s$ 的抖动最终都会在 $E_\theta$ 的作用下修正(到达 $s_\theta^0$),即$\bar{S}_{+\infty} = 0$,因此这个结果是符合直觉的。

CATALOG
  1. 1. Model
  2. 2. Method
    1. 2.1. Theorem 1
    2. 2.2. Proof of Theorem 1
    3. 2.3. Algorithm
  3. 3. Q&A