液体神经网络详解:原理与应用

举报
yd_288058137 发表于 2025/09/01 14:38:43 2025/09/01
【摘要】 一、液体神经网络是什么?为什么值得关注·       液体神经网络(Liquid Neural Networks, LNN)的核心思想是用连续时间的微分方程来描述神经元状态随输入而变的动态,并允许时间常数随输入自适应(“液体”)。这类模型最早以 Liquid Time-Constant (LTC) 形式提出;后续又发展出闭式解连续网络(Closed-form Continuous-time,...

一、液体神经网络是什么?为什么值得关注

·       液体神经网络(Liquid Neural Networks, LNN)的核心思想是用连续时间的微分方程来描述神经元状态随输入而变的动态,并允许时间常数随输入自适应液体)。这类模型最早以 Liquid Time-Constant (LTC) 形式提出;后续又发展出闭式解连续网络(Closed-form Continuous-time, CfC,在保持表达力的同时绕开了数值 ODE 求解的开销,推理/训练速度显著提升。代表性工作来自 MIT CSAIL/Rus 团队与合作者。

·       它们擅长的场景:时空序列建模、控制/决策与机器人导航、非均匀采样数据、长时依赖等;在无人机越域导航等任务上展现出强鲁棒性。

二、核心原理与数学公式

·       液体神经网络的核心思想是引入 连续时间动力系统 的建模方式,将神经元的状态演化建模为常微分方程(ODE)。与传统固定参数的 RNN 不同,液体神经网络的时间常数和参数可以根据输入信号自适应调整,因此具有更强的表示能力和泛化性。

神经动力学微分方程

τdh(t)/dt=−h(t)+tanh⁡(Wx(t)+Uh(t))

  • h(t):隐状态

  • x(t):输入

  • W,U:输入权重与循环权重

  • τ:时间常数(可学习)


离散化形式(Euler 近似)

ht+1=ht+Δt/τ(−ht+tanh⁡(Wxt+Uht))

其中 Δt为时间步长。


模型输出

yt=Vht+b

  • V:线性投影矩阵

  • b:偏置项

训练目标
通过反向传播更新参数 (W,U,V,τ,b), 最小化损失函数 L


三、与 Transformer 的结构与复杂度对比

  • 计算范式
    • LNNLTC/CfC):连续时间动力系统,递推式(时间线性展开),无全局 pairwise 交互。
    • Transformer自注意力对所有 token 两两交互,标准实现为 O(n2) 的时空复杂度(也有 Linformer/Performer 等降复杂度变体)。
  • 复杂度
    • CfC:对长度 n的序列,推理复杂度近似线性(与 RNN 同量级);论文表 1 还对比了 ODE-RNN/Transformer 的推理复杂度与数值误差来源。
    • Transformer:标准自注意力在 n二次复杂度;近年有诸多近似注意力工作,但普适的严格下界表明在一般设定下很难打破二次下界。
  • 表现与适用性
    • 长序列与控制/决策:基于 Liquid 思想的 Liquid-S4L-S4 Long-Range ArenaLRA)等长距依赖基准上达到 SOTA;在语音等任务上也有极具竞争力的表现。
    • 机器人/越域导航:液体网络在越域(out-of-distribution)条件下的无人机视觉导航中,显著强于多种 SOTA 基线且样本效率高。
    • 是否超过 Transformer” 取决于任务。对时序决策、非均匀采样与物理动态LNN 常具效率与鲁棒性优势;对大规模语言/多模态理解,Transformer 生态与硬件/软件栈仍更成熟。不宜一刀切地宣称全面超越,更合理的观点是互补

四、一个PyTorch 实现与例子

下面给出一个简化的液体神经网络实现,并加入预测结果与真实值的对比可视化:

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt

# ======================
# 1.
数据准备
# ======================
#
时间序列
t = np.linspace(0, 10, 50)
X = torch.tensor(np.sin(t), dtype=torch.float32).unsqueeze(0).unsqueeze(-1)  # [1, seq_len, 1]
Y = torch.tensor(np.cos(t), dtype=torch.float32).unsqueeze(0).unsqueeze(-1)  # [1, seq_len, 1]

# ======================
# 2.
液体时间常数单元
# ======================
class LiquidTimeConstantCell(nn.Module):
    def __init__(self, input_size, hidden_size):
        super().__init__()
        self.W = nn.Parameter(torch.randn(hidden_size, input_size))
        self.U = nn.Parameter(torch.randn(hidden_size, hidden_size))
        self.tau = nn.Parameter(torch.ones(hidden_size))  #
时间常数

    def forward(self, x, h):
        # dx/dt = -(h - f(x,h))/tau
        pre_act = torch.matmul(x, self.W.T) + torch.matmul(h, self.U.T)
        dh = (-h + torch.tanh(pre_act)) / self.tau
        h_next = h + dh
        return h_next

# ======================
# 3.
液体神经网络模型
# ======================
class LiquidNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super().__init__()
        self.cell = LiquidTimeConstantCell(input_size, hidden_size)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        h = torch.zeros(x.size(0), self.cell.W.size(0))
        outputs = []
        for t in range(x.size(1)):
            h = self.cell(x[:, t, :], h)
            y_t = self.fc(h)  #
每个时间步预测
            outputs.append(y_t.unsqueeze(1))
        return torch.cat(outputs, dim=1)  # [batch, seq_len, output_size]

# ======================
# 4.
训练模型
# ======================
model = LiquidNN(input_size=1, hidden_size=32, output_size=1)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

losses = []
for epoch in range(2000):
    optimizer.zero_grad()
    output = model(X)  # [1, seq_len, 1]
    loss = criterion(output.squeeze(), Y.squeeze())
    loss.backward()
    optimizer.step()
    losses.append(loss.item())

# ======================
# 5.
可视化结果
# ======================

#
损失曲线
plt.figure()
plt.plot(losses)
plt.title("Training Loss Curve")
plt.xlabel("Epoch")
plt.ylabel("MSE Loss")
plt.show()

#
预测 vs 实际
pred = model(X).detach().squeeze().numpy()  # [50]
true = Y.numpy().squeeze()                  # [50]

plt.figure()
plt.plot(t, true, label="True cos(t)", linewidth=2)
plt.plot(t, pred, label="Predicted", linestyle="--")
plt.legend()
plt.title("Prediction vs Ground Truth")
plt.xlabel("t")
plt.ylabel("Value")
plt.show()



参考与延伸阅读

  • Liquid Time-Constant Networks(AAAI 2021 / arXiv:2006.04439)。含原始 LTC 动力学与生物学动机。

  • Closed-form continuous-time neural networks(Nature Machine Intelligence, 2022)。CfC 闭式近似、复杂度分析与大量实验。

  • Liquid-S4(arXiv:2209.12951 + 开源仓库)。把 LNN 思想与结构化 SSM 融合,长序列 SOTA。

  • Robust flight navigation OOD with LNN(Science Robotics, 2023)。液体网络在无人机越域导航上的鲁棒性验证。

  • Attention Is All You Need(NeurIPS 2017)。Transformer 自注意力与复杂度背景。

  • On the Computational Complexity of Self-Attention(ICML 2023 版本/预印本)。自注意力二次复杂度的下界结果。

结语

液体神经网络把连续时间动力学带回深度学习主舞台:它们在效率、稳定性与可解释性之间取得了新平衡。无论你做的是工业控制/机器人导航,还是医学/金融时序,都值得把 CfC/L-S4 纳入你的模型备选清单;而在大规模表征学习上,它们也正与 Transformer 生态形成互补与融合的趋势(如与 SSM/S4 的结合)。希望本文的公式、代码与文献指路,能帮助你更顺畅地把“液体”用起来。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。