Skip to content

操控机器的“记忆”

上回说到RNN受“状态转移矩阵 Ak” 谱半径的约束,导致最后回归统计平均,那么解决这个问题就显然需要摆脱 Ak 的状态转移效应,也就是说历史不能传过来。但是历史又不能完全不传过来,历史携带了信息,如果不传过来,当前的状态又没有足够的信息来更新了。

仔细想想,这不是既要求“时不时忆起从前”,又要求“珍惜眼前”吗?那么“记忆”在这个过程中就显得尤为重要。而今天的主角长短时记忆(Long-Short Term Memory,LSTM)网络,顾名思义,就是又有“长时记忆”,又有“短时记忆”的神经网络。

既然确定了有一个缓存,那么我们需要在结构上创造这个缓存。

平行的记忆与状态观测器

记忆理应也会更新,所以自然而然地,是一个动力学系统,而且是一个形如

x(t)=g(x(t1),u)

的动力学系统,考虑到之前神经网络如何处理非线性,显然这个 g() 应该是个激活函数,那么实际上记忆动力学应该是(LSTM里也确实是)

C(t)=f(t)C(t1)+i(t)C~(t)

先不管每一项叫什么,这里先回忆(或者我介绍)控制里一个重要的概念:状态观测器。

在研究动力学系统的时候,不一定所有的系统状态都完全可以测量。比如火箭发动机燃烧室的温度,燃料燃烧的温度太高了以至于没有温度计能受得了。但是这个温度可以通过其他的测量值,比如燃料消耗速率、推进加速度等等侧面反映。

为了做到这一点,需要对系统进行建模,给未知的状态量一个初值,然后和已知量一起打包成 x^ 代入系统方程计算模型预测值 y^,然后与对应物理量的测量值 y 进行对比。如果 yy^ 比较小,说明未知状态量就猜得比较准;如果 yy^ 比较大,说明还需要用增益 K(实际上就是反馈)修正状态量的猜测。

不考虑系统输入 u,上述过程就是

x^t+1=Ax^t+Kt(yy^k)

这简直就是记忆动力学!所以其实“记忆”在观测系统的隐藏状态!

实际上在我看来,这个“隐藏状态”是一个抽象的“信息对象”的状态,而神经网络本身就是在无限挖掘“信息动力学”的“信息”

  • C(t1) 是上一时刻对“真实状态”的估计

好比是猜的燃烧室温度

  • C~(t) 是根据当前输入 x(t) 和上一刻隐藏状态 h(t1) 算出来的 innovation

好比是测到的燃料消耗速率、加速度等

  • 搞学习的叫 f(t) 遗忘门,决定记住多少“旧记忆”;叫 i(t) 输入门,决定接受多少“新信息”

这就好比是对“之前猜测”的信任和对“当前观测”的信任,这其实是卡尔曼滤波了(没错,卡尔曼滤波就是最优状态观测器)!

记忆系统的自适应卡尔曼滤波

既然说到卡尔曼滤波,那就把它完整写出来

预测:x^t|t1=Ax^t1|t1+wt测量:y^t=Cx^t|t1+vt增益:Kt=Pt|t1C(CPt|t1C+R)1更新:xt|t=x^t1|t+K(yy^k)

很明显,之前构建的记忆系统实际上只是卡尔曼滤波的一半(预测和更新),另一半是测量 yt。当然,它也有个新名字叫网络输出,有个新面孔

h(t)=o(t)tanh(C(t))

o(t) 是所谓的输出门,C(t) 就是之前构造的记忆(隐藏状态),所以它确实就是观测隐藏状态的方程!

把这些合起来再看,就会发现LSTM的“门”,作用在神经网络上,结合一个“隐藏状态的观测器”,最终构成了对“记忆系统”本身的卡尔曼滤波。f(t) 是系统的非线性状态转移方程,i(t) 是反馈增益,o(t) 是测量函数。

卡尔曼滤波里,这些 A,C 都是先验得到的,K 也是根据协方差 P 算出来的。但是现在讨论的是机器学习,这几个“门”实际上是激活函数。还记得激活函数的特点吗?正是因为各级的权重和偏置变化,各个神经元的激活状态是完全学出来的!换言之,记忆系统的卡尔曼滤波是一个自适应卡尔曼滤波!

梯度不消失了

还记得最开始要解决的问题吗?梯度消失或者梯度爆炸?之前分析过这本质上是由于状态转移矩阵 Ak 的谱半径 <1>1 的问题。

回忆一下RNN的梯度,也就是状态转移矩阵 Ak 的来源

h(t)h(t1)=diag[tanh()]Wh

那经过上面一系列记忆啊门控啊的操作,LSTM的梯度变成了什么?

C(t)C(t1)=f(t)

只剩 f(t) 了,其实是怎么回事呢?RNN里,更新是包含在 Ak 里的,但是LSTM里,把它分离到 i(t) 了,也就是说,当 f(t)=1 时(事实上学到的结果如此),状态就完全传递过来了!变的只是innovation!

还记得系统矩阵 A 吗?在状态传播过程 AkAk1 中唯一不受影响的就是让 A=I

Ak 的谱半径为 1 是极其困难的,但是换个思路,直接创造一个 f(t)=1 信息就不会消失或者爆炸了!

更进一步,这个“拆开”的设计还有另一个好处:梯度回传时,不同时间步的遗忘门是独立可调的。这意味着网络可以自己决定哪些时间段的记忆需要保留、哪些需要丢弃。这不是一个全局的、被动的衰减,而是一个局部的、主动的决策。从这个意义上说,LSTM学会的不只是“记忆什么”,还有“记忆多久”。

当然,这并不是说LSTM就完全解决了梯度问题。遗忘门本身也是由权重和输入决定的,如果长期学不到有效的 f(t)f(t) 策略,梯度依然可能衰减。但关键是,LSTM把“梯度是否消失”从一个结构性的数学必然,变成了一个可以通过学习来优化的策略问题。这是一个质的改变。

一路走来,可以看到各种神经网络的结构,是不断进化的过程,从最开始的“最小二乘结构”到现在的“自适应卡尔曼滤波”,这已经是从纯粹“解方程”变成了研究“动力学系统的演化”,那么下一步,我们不禁要问:

卡尔曼滤波已经“最优”了,再优化还能怎么优化呢?

实际上,卡尔曼滤波的“最优”,是建立在一系列严格假设之上的:系统是线性的,噪声是高斯的,模型是精确已知的。当这些条件不满足的时候,又可以对基本的卡尔曼有很多的改进。比如扩展卡尔曼滤波(Extended Kalman Filter,EKF)是明确地把系统线性化,然后再处理局部最优;比如无迹卡尔曼滤波(Unscented Kalman Filter,UKF)是近似系统为分布,尤其是二阶统计量(从这个角度来看,EKF做到的是一阶统计量),然后再处理二阶下的局部最优。

上述的方法在神经网络上都有对应,确实有人也研究了UKF对应的神经网络结构。

但这始终绕不开一个问题,想知道下一步,先要算上一步,信息要一步一步输入网络,没有办法同时算两个时间步。这意味着我们引入了“时间”,现在又被“时间”束缚了。

重新捋一下,从MLP的“猜参数”,到RNN和LSTM的“猜状态”,似乎整个神经网络的发展在越来越逼近一个非常宏大的东西,猜谁的参数?猜谁的状态?我想答案是“信息”。当我们把信息作为研究对象和一个系统研究的时候,它自然而然有了“参数”和“状态”。而再回到系统的视角,似乎到这一步,已经是离散动力系统的极限了:正是因为状态的离散,才需要额外构建状态的连续关系!那么如果状态本身是连续的呢?这不正是无穷维或算子的思想吗?

是的,下一步,“信息”要从“离散状态”,变为“连续状态”了。