15 KiB
液态神经网络
连续时间递归神经网络(CT-RNN)
举例说明
-
以下以第 $i$个隐藏神经元为例,给出一个典型的 连续时间 动力学方程(微分方程形式):
\frac{d h_i(t)}{dt} \;=\; -\alpha \, h_i(t) \;+\; \sum_{j} W_{ij} \,\sigma\bigl(h_j(t)\bigr) \;+\; V_i\, x(t).
\displaystyle h_i(t)
表示第i
个神经元的 内部状态(或称膜电位、液体状态等)。\displaystyle -\alpha\,h_i(t)
表示自然衰减项,\alpha>0
是衰减系数。\displaystyle \sum_{j} W_{ij}\,\sigma\bigl(h_j(t)\bigr)
表示对第i
个输出神经元,计算所有输入神经元$j$的加权和。\displaystyle \sigma(\cdot)
是一个非线性激活函数,例如 $\tanh$、ReLU 等;\displaystyle W_{ij}
是从神经元j
到神经元i
的 连接权重;- 这里的求和 $\sum_{j}$意味着 第
i
个神经元 会「收集」当前层所有神经元(含自己)的输出信号。
\displaystyle V_i\, x(t)
外部输入x(t)
对神经元i
的直接驱动作用。
因此,这个公式表示:第 $i$个隐藏神经元 的状态变化率,依赖:
- 自身的衰减;
- 其他神经元的输出(相互耦合);
- 来自上一层(或外部)的输入刺激。
使用欧拉法 (Forward Euler) 离散近似
这是最简单、最直接的数值积分方法。给定一个小的时间步长$\Delta t$,将连续时间 t
离散化为 $t_0,, t_1,, \dots$,其中 $t_{n+1} = t_n + \Delta t$。
则第 i
个神经元的状态 h_i(t)
在离散时刻 t_n
的值可以表示为 $h_i^{(n)}$,其中 h_i^{(n)}
表示在时间 t_n
时刻的状态。
微分方程:
\frac{d h_i(t)}{dt}
= f_i\bigl(h_1(t), \dots, h_N(t), x(t)\bigr),
在这里,
f_i(\mathbf{h}(t),\, x(t)) \;=\;
-\alpha\, h_i(t)
\;+\;
\sum_j W_{ij}\,\sigma\bigl(h_j(t)\bigr)
\;+\;
V_i\,x(t).
欧拉更新公式:
h_i^{(n+1)}
\;=\;
h_i^{(n)}
\;+\;
\Delta t \,\Bigl[
f_i\bigl(\mathbf{h}^{(n)},\, x^{(n)}\bigr)
\Bigr],
其中:
\mathbf{h}^{(n)} = [h_1^{(n)}, \dots, h_N^{(n)}]^\top
表示所有神经元在时刻t_n
的状态向量。x^{(n)}
表示输入信号在时刻$ t_n$的值(或小区间平均值)。
这可以并行对 所有 i
同时更新。
优点:简单易实现
缺点:稳定性、精度较低,需要选小一些的$\Delta t$才能获得良好数值表现。
神经ODE的基本形式
神经ODE(Neural ODE)的状态 x(t)
由以下微分方程定义:
\frac{dx(t)}{dt} = f(x(t), I(t), t, \theta)
-
其中,
f
是一个由参数\theta
定义的神经网络,I(t)
是输入,t
是时间。 -
通过数值ODE求解器可以计算状态 $x(t)$,并通过反向模式自动微分(reverse-mode automatic differentiation)来训练网络。
-
使用伴随敏感度 (adjoint) 方法 来节省显存,但这会带来一定的数值不稳定与反向误差
连续时间递归神经网络(CT-RNN)的稳定性
\frac{dx(t)}{dt} = -\frac{x(t)}{\tau} + f(x(t), I(t), t, \theta)
其中,-\frac{x(t)}{\tau}
是一个阻尼项,帮助系统达到平衡状态,\tau
是时间常数。
$τ$ 越大,系统的响应越慢;$τ$ 越小,系统的响应越快
小型生物(如线虫)的神经动力学模型
在生物学中,非脉冲神经元的电位动态可以通过以下线性微分方程描述:
\frac{d\mathbf{v}(t)}{dt} = -g_l \mathbf{v}(t) + \mathbf{S}(t)
其中:
\mathbf{v}(t)
是神经元的电位。g_l
是泄漏电导(leakage conductance),表示神经元电位的自然衰减速度。\mathbf{S}(t)
是突触输入的总和,表示来自其他神经元的输入信号。
突触输入 \mathbf{S}(t)
可以通过以下非线性函数近似:
\mathbf{S}(t) = f(\mathbf{v}(t), \mathbf{I}(t))(A - \mathbf{v}(t))
其中:
f(\mathbf{v}(t), \mathbf{I}(t))
是一个非线性函数(通常是 sigmoid 函数),表示突触前神经元的电位\mathbf{v}(t)
和外部输入\mathbf{I}(t)
对突触输入的影响。A
是一个偏置项,表示突触输入的最大值。($A$ 可以理解为突触输入的平衡电位。当神经元的电位 **$v(t)$*接近 $A$ 时,突触输入$S(t)$*会减小,从而防止电位无限增长。)
例子
为了具体化,我们设定以下参数:
-
泄漏电导:$g_l = 0.1$(表示电位以每秒 0.1 的速度自然衰减)。
-
突触输入的最大值:$A = 1$。
-
非线性函数:假设
f(\mathbf{v}(t), \mathbf{I}(t))
是一个简单的 sigmoid 函数:f(\mathbf{v}(t), \mathbf{I}(t)) = \frac{1}{1 + e^{-\mathbf{I}(t)}}
其中,
\mathbf{I}(t)
是外部输入。
假设在 t = 0
时,神经元的电位为:
\mathbf{v}(0) = 0.5
假设在 t = 0
到 t = 10
秒内,外部输入 \mathbf{I}(t)
为:
\mathbf{I}(t) = 1
计算突触输入
根据设定的非线性函数,突触输入为:
f(\mathbf{v}(t), \mathbf{I}(t)) = \frac{1}{1 + e^{-\mathbf{I}(t)}} = \frac{1}{1 + e^{-1}} \approx 0.731
这里为了简化,突触输入仅由外部驱动,不随自身电位变化。
因此,突触输入项为:
f(\mathbf{v}(t), \mathbf{I}(t))(A - \mathbf{v}(t)) = 0.731 \times (1 - \mathbf{v}(t))
动态方程
将参数代入动态方程,得到:
\frac{d\mathbf{v}(t)}{dt} = -0.1 \mathbf{v}(t) + 0.731 (1 - \mathbf{v}(t))
数值模拟
我们可以通过数值方法(如显示欧拉法)来模拟神经元的电位变化。假设时间步长 \Delta t = 0.1
秒,初始电位 $\mathbf{v}(0) = 0.5$。
第一次迭代(t = 0
到 t = 0.1
秒)
-
计算电位变化率:
\frac{d\mathbf{v}(0)}{dt} = -0.1 \times 0.5 + 0.731 \times (1 - 0.5) = -0.05 + 0.3655 = 0.3155
-
更新电位:
\mathbf{v}(0.1) = \mathbf{v}(0) + \frac{d\mathbf{v}(0)}{dt} \times \Delta t = 0.5 + 0.3155 \times 0.1 = 0.53155
-
重复上述过程,直至t=10秒
由于泄漏电导和偏置项$A$的作用,电位的上升速度逐渐减慢,最终趋于稳定值。
稳定状态
在稳定状态下,电位变化率为 0,即:
\frac{d\mathbf{v}(t)}{dt} = 0
代入动态方程:
0 = -0.1 \mathbf{v}_{\text{stable}} + 0.731 (1 - \mathbf{v}_{\text{stable}})
解得:
\mathbf{v}_{\text{stable}} = \frac{0.731}{0.1 + 0.731} \approx 0.88
液态时间常数网络(LTCs)
\frac{dx(t)}{dt} = -\frac{x(t)}{\tau} + S(t)
其中,S(t)
是一个非线性项,定义为:
S(t) = f(x(t), I(t), t, \theta)(A - x(t))
这里,f
是一个神经网络,A
是一个偏置项。
将 S(t)
代入隐藏状态方程后,得到LTCs的动态方程:
\frac{dx(t)}{dt} = -\left[\frac{1}{\tau} + f(x(t), I(t), t, \theta)\right] x(t) + f(x(t), I(t), t, \theta) A
LTCs 的核心创新在于其可变的时间常数 $\tau_{sys}$,它由以下公式定义:
\tau_{sys} = \frac{\tau}{1 + \tau f(x(t), I(t), t, \theta)}
这意味着时间常数 \tau_{sys}
会根据输入 I(t)
和隐藏状态 x(t)
的变化而动态调整。从而在处理复杂时间序列数据时表现出更强的适应性和表达能力。
这个方程展示了LTCs的核心特性:可变的时间常数。
显式欧拉 vs 隐式欧拉
方法 | 公式 | 特点 |
---|---|---|
显式欧拉 | x_{k+1} = x_k + \Delta t \cdot f(x_k, t_k) |
用当前时刻的导数计算下一步,计算快但稳定性差(步长受限) |
隐式欧拉 | x_{k+1} = x_k + \Delta t \cdot f(x_{k+1}, t_{k+1}) |
用未来时刻的导数计算下一步,稳定性好但需解方程(适合刚性系统) |
融合求解器
\frac{dx(t)}{dt} = -\left[\frac{1}{\tau} + f(x(t), I(t), t, \theta)\right] x(t) + f(x(t), I(t), t, \theta) A
\frac{dx}{dt} = -\alpha(t)x(t) + \beta(t) \quad \text{其中}\ \alpha(t) = \frac{1}{\tau} + f, \ \beta(t) = f \odot A
应用隐式欧拉法离散化:
x_{k+1} = x_k + \Delta t \cdot \left[ -\alpha_{k+1} x_{k+1} + \beta_{k+1} \right]
关键点:右侧的$\alpha_{k+1}$和$\beta_{k+1}$都依赖于未来状态$x_{k+1}$。
显示近似非线性项:
论文假设非线性项$f$在时间步内近似不变(即$f_{k+1} \approx f_k$),从而:
\alpha_{k+1} \approx \alpha_k = \frac{1}{\tau} + f_k, \quad \beta_{k+1} \approx \beta_k = f_k \odot A
代入后方程变为:
x_{k+1} = x_k + \Delta t \cdot \left[ -\left( \frac{1}{\tau} + f_k \right) x_{k+1} + f_k \odot A \right]
求解:
将含$x_{k+1}$的项移到左边:
x_{k+1} + \Delta t \left( \frac{1}{\tau} + f_k \right) x_{k+1} = x_k + \Delta t \cdot f_k \odot A
提取公因子$x_{k+1}$:
x_{k+1} \left[ 1 + \Delta t \left( \frac{1}{\tau} + f_k \right) \right] = x_k + \Delta t \cdot f_k \odot A
最终显式解:
x_{k+1} = \frac{x_k + \Delta t \cdot f_k \odot A}{1 + \Delta t \left( \frac{1}{\tau} + f_k \right)}
x_k \in \mathbb{R}^N
是第k
个时间步的隐藏状态向量。I_k
是输入。f(\cdot)
是包含可学习权重的非线性映射,f_k
表示在第k
步时刻对\bigl(x_k,I_k\bigr)
的运算结果。
可以假设\tau
是时间常数(若每个神经元各有一套,可以是一个向量 $\tau \in \mathbb{R}^N$)。A \in \mathbb{R}^N
是可学习的偏置向量。\odot
表示逐元素相乘。
示例
参数与初始数据设定
为便于演示,这里只做 一次 更新(从 x_k
到 $x_{k+1}$),并给出具体数值。
-
隐藏层维度 $N=2$。
-
时间步长 $\Delta t = 1$(只是示例;实际中可更小或可自适应)。
-
初始隐藏状态和输入(随意设定):
x_k = \begin{bmatrix}0 \\[4pt] 1\end{bmatrix}, \quad I_k = 2.
-
令时间常数 $\tau = \begin{bmatrix}1 \[4pt] 1\end{bmatrix}$(即 2 维,都为 1)。
-
令 $A = \begin{bmatrix}2 \[4pt] -1\end{bmatrix}$。
非线性 f
的定义
-
我们假设
f(x,I) \;=\; \mathrm{ReLU}\!\bigl(W_r\,x \;+\; W_i\,I \;+\; b\bigr),
其中
W_r
是隐藏层的“自连接”或“循环”权重,尺寸 $2\times 2$;W_i
是输入到隐藏层的权重,尺寸 $2\times 1$;b
是偏置向量(2 维);\mathrm{ReLU}(z)
对每个分量做 $\max(z,0)$。
这里举例设:
W_r = \begin{bmatrix} 0.5 & -0.3\\ 0.1 & \;\,0.2 \end{bmatrix}, \quad W_i = \begin{bmatrix} 1\\ 2 \end{bmatrix}, \quad b = \begin{bmatrix} -1\\ 0.5 \end{bmatrix}.
计算 $f_k$
- 先算 $W_r,x_k$:
W_r\,x_k
=
\begin{bmatrix}
0.5 & -0.3\\
0.1 & \;\,0.2
\end{bmatrix}
\begin{bmatrix}
0\\[3pt]
1
\end{bmatrix}
=
\begin{bmatrix}
0.5 \times 0 \;+\; (-0.3)\times 1\\[5pt]
0.1 \times 0 \;+\; 0.2 \times 1
\end{bmatrix}
=
\begin{bmatrix}
-0.3\\[3pt]
0.2
\end{bmatrix}.
- 再算 $W_i , I_k$:
W_i \, I_k
=
\begin{bmatrix}
1\\
2
\end{bmatrix}
\cdot 2
=
\begin{bmatrix}
2\\
4
\end{bmatrix}.
- 加上偏置 $b$:
\begin{bmatrix}
-0.3\\[3pt]
0.2
\end{bmatrix}
+
\begin{bmatrix}
2\\[3pt]
4
\end{bmatrix}
+
\begin{bmatrix}
-1\\[3pt]
0.5
\end{bmatrix}
=
\begin{bmatrix}
-0.3 + 2 \;-\; 1\\[3pt]
0.2 + 4 \;+\; 0.5
\end{bmatrix}
=
\begin{bmatrix}
0.7\\[3pt]
4.7
\end{bmatrix}.
- 通过 $\mathrm{ReLU}$,得到
f_k
=
\mathrm{ReLU}\!\Bigl(\begin{bmatrix}0.7\\[4pt]4.7\end{bmatrix}\Bigr)
=
\begin{bmatrix}0.7\\[4pt]4.7\end{bmatrix}.
更新 $x_{k+1}$
x_{k+1}
=
\frac{
x_k + \Delta t\,\bigl[f_k \odot A\bigr]
}{
1 + \Delta t\,\Bigl(\frac{1}{\tau} + f_k\Bigr)
}
\quad\longrightarrow\quad
\text{都是逐元素算}.
-
先算分子:
- $f_k \odot A = [,0.7 \times 2,;;4.7 \times(-1),] = [,1.4,;-4.7]$。
- $x_k + \Delta t,\bigl[f_k \odot A\bigr] = [,0,,1,] + [,1.4,;-4.7,] = [,1.4,;-3.7,]$。
-
分母也要逐元素:
1 + \Delta t \Bigl(\frac{1}{\tau} + f_k\Bigr)
=
1 + 1 \cdot
\bigl([\,1,\,1\,] + [\,0.7,\,4.7\,]\bigr)
=
1 + [\,1.7,\,5.7\,]
=
[\,2.7,\;\,6.7\,].
- 逐元素相除:
x_{k+1}
=
\bigl[\,1.4,\;-3.7\bigr]
\;\Big/\;
\bigl[\,2.7,\;6.7\bigr]
=
\Bigl[\;\frac{1.4}{2.7},\;\;\frac{-3.7}{6.7}\Bigr]
\approx
[\,0.5185,\;-0.5522\,].
因此,我们最终得到
x_{k+1} \approx [\,0.5185,\;-0.5522\,].
训练方法
论文采用 BPTT(通过时间反向传播) 进行训练:
-
前向传播:
使用数值求解器(融合显式-隐式欧拉法)沿时间步迭代计算状态 $x(t)$,公式为:x_{k+1} = \frac{x_k + \Delta t \cdot f_k \odot A}{1 + \Delta t \left( \frac{1}{\tau} + f_k \right)}
其中 $f_k = f(x_k, I_k, t_k, \theta)$,所有中间状态
\{x_0, x_1, ..., x_T\}
被缓存。 -
反向传播:
从最终损失L
出发,沿时间步逆向计算梯度:- 通过链式法则逐层传递梯度 $\frac{\partial L}{\partial x_k}$;
- 更新参数
\tau
,A
,\theta
的梯度:\nabla_{\tau} L
,\nabla_{A} L
, $\nabla_{\theta} L$; - 显式利用缓存的中间状态,避免伴随方法的重积分误差。
-
优势:
- 精度高:直接计算梯度,无近似误差累积;
- 稳定性强:适用于刚性(Stiff)动力学系统;
- 代价:内存复杂度为 $O(T)$(
T
为时间步数),需权衡序列长度。
代码训练:python har.py --model ltc --size 32 --epochs 50 --log 1
液态时间常数的直观作用
对快/慢时间尺度的自适应: 当网络检测到输入信号变化非常快或幅度很大时,可动态增大衰减、加速更新;反之信号较稳定时,则让衰减变小、记忆更久。
增强模型的非线性表征能力: 因为衰减系数也会因网络状态而变,所以整体微分方程更具表达力,理论上能更好地逼近复杂的非线性时变系统。
优势
- 参数数量减少:每个神经元本身通过内置的动态机制承担了更多的功能,网络在捕捉时间依赖性时不需要额外堆叠大量的隐藏层或者引入复杂的循环结构(LSTM、GRU)。这大大减少了模型参数数量,从而降低了计算资源和能耗。
- 稀疏激活:动态更新机制意味着并非所有神经元在每个时刻都需要全量参与计算,只有部分神经元在关键时刻激活处理,从而提升整体计算效率。
应用场景
无人机和自动驾驶
- 由于液态神经网络能够在新环境下实时适应,其在无人机导航和自动驾驶系统中表现出色。研究表明,即使在复杂、未见过的场景中,它也能做出精准决策,从而实现高效导航。
金融和医疗预测
- 在处理连续的时间序列数据(如股票价格、气候数据或生命体征监控)时,液态神经网络能够捕捉细微的动态变化,帮助进行更准确的预测与预警。