开源项目 · Apache-2.0 License

Symbolic Regression

从一组数据点 DeepSets + LSTM(符号回归)模型,直接生成数学表达式字符串,而非只给出拟合系数。66K 参数量,自包含目录可本地运行,与 HuggingFace Hub 完全兼容。

这个模型解决什么问题?

给定 N 个数据点(每个含 D 个自变量 x 与一个因变量 y),模型反推出隐藏在数据背后的函数解析式 f(x),满足 y ≈ f(x)。

经验公式逆推

物理 / 工程实验数据 → 自动恢复可解释的经验公式。

黑盒关系解释

好奇某个黑盒函数的关系 → 得到可解释的数学表达式。

公式检测与化简

异常表达式检测、公式简化等符号层面任务。

核心优势

区别于普通回归(只给系数)的关键能力

直接生成表达式

输出 sin(x0)*x1 + exp(x0) 这类表达式字符串,而非仅拟合系数。

置换不变编码

DeepSets φ→池化→ρ 路径保证点集排列不变性,处理无序可变长点集。

极致轻量

约 6.6 万参数,可在 CPU 上快速推理,普通设备即可部署。

关键指标

模型拟合优度以训练子集 R² 作为自我评估奖励

65,853
总参数量(约 66K)
29
表达式词表 token 数
50
最大生成步数(自回归)
64
编码向量 z 维度

整体架构

DeepSets 编码器 + LSTM 解码器,输入点集编码为条件向量,条件化生成表达式

┌────────────────── DeepSets Encoder ──────────────────┐
│  X [B,N,4] · y [B,N]  ──concat──▶  v [B,N,5]        │
│       │                                              │
│     φ network (shared per point):                    │
│       Linear 5→128  ReLU  Linear 128→128  ReLU       │
│       Linear 128→64  ReLU  → h [B,N,64]              │
│       │                                              │
│     pooling: mean + max  → [B,128]                   │
│       │                                              │
│     ρ network (set-level):                           │
│       Linear 128→64  ReLU  Linear 64→64  → z [B,64]  │
└───────────────────────┬──────────────────────────────┘
                        │  h0 = z, c0 = z
┌───────────────────────▼──────────────────────────────┐
│  LSTM Decoder:                                       │
│   → Embedding(29→32)                            │
│        → LSTM(hidden=64)                            │
│        → Linear(64→29) → logits                     │
│        → argmax / temperature sample                │
│        → decode  ▶  sin(x0)*x1 + exp(x0)            │
└──────────────────────────────────────────────────────┘

DeepSets 编码器

  • 拼接输入与目标为 [x|y] 五维向量
  • 逐点共享权重 MLP φ(排列不变关键)
  • mean + max 双池化混合
  • 面集级 MLP ρ 输出条件向量 z

LSTM 解码器

  • 以 z 初始化隐状态 h₀ 与记忆 c₀
  • 29 → 32 维 token 嵌入
  • 单层 LSTM 步步推进,64 维隐状态
  • 线性投影至词表,贪心 / 温度采样生成

LSTM 门控机制

PyTorch 中 LSTM 权重打包成两个大矩阵(4 门拼接),每个时间步按门控更新内存与隐状态

门控 公式 作用
输入门 i it = σ(Wiiet + bii + Whiht-1 + bhi) 决定新信息写入多少
遗忘门 f ft = σ(Wifet + bif + Whfht-1 + bhf) 决定旧记忆保留多少
候选记忆 c̃ c̃t = tanh(Wiget + big + Whght-1 + bhg) 生成新的候选值
输出门 o ot = σ(Wioet + bio + Whoht-1 + bho) 决定最终输出多少
记忆更新 c ct = ft ⊙ ct-1 + it ⊙ c̃t 新旧记忆融合
隐状态 h ht = ot ⊙ tanh(ct) 最终隐状态输出

解码策略(生成时)

自回归循环:Embedding → LSTM → Linear,直到生成 <EOS> 或达到 T_max=50 步

贪心解码

x*t = arg maxk ℓt,k

每步取概率最大的 token,确定性强、可复现。

温度采样

p(k) = softmax(ℓt / τ)k

按 softmax(logits/τ) 采样,探索更丰富的表达式,适合生成多样化候选。

温度 τ 的影响

τ < 1 → 更确定 τ > 1 → 更随机 / 更探索

低温更确定、更重复;高温更随机、更探索,利于多样性。

参数规模拆解

编码器 37,952 + 解码器 27,901 = 总 65,853 参数(约 66K)

编码器合计 解码器合计 模型总计
φ networkEmbedding 29×3265,853
pooling (mean+max)LSTM (input & hidden gates)(约 66K)
ρ networkoutput projection

表达式词表(29 token)

数字按位展开,变量统一映射为 <VAR>,含括号 / 运算符 / 单目函数 / 常量 / 数字

( ) { parens } <PAD> <SOS> <EOS> <VAR> + - * / ^ sin cos tan exp log sqrt pi e 0 1 2 3 4 5 6 7 8 9

自包含包结构

拿到整个文件夹即可运行推理与自我训练,无需任何父工程文件

HuggingFace 风格文件

huggingface/
├── configuration_symbolic_regression.py  配置类
├── tokenization_symbolic_regression.py   分词器
├── modeling_symbolic_regression.py       模型
├── hf_symbolic_regression/               内置权重(约270KB)
│   ├── config.json
│   ├── pytorch_model.bin
│   └── tokenizer.json
├── data_generator.py                     随机表达式生成器
├── self_train.py                         自我训练算法
└── run_hf_self_train.py                  demo + selftrain 入口

仅需 PyTorch 即可运行

  • 内置本地 HF 权重(约 270KB),离线可直接加载
  • 随机表达式生成器 + 自我训练算法脚本齐全
  • demo(推理)+ selftrain(自我训练)双入口
  • 与发布到 HuggingFace Hub 结构完全兼容
  • 可在任意工作目录运行(sys.path 自引导)

Python API 示例

与 transformers 风格一致:from_pretrained + generate 即可从点集生成表达式

from modeling_symbolic_regression import SymbolicRegressionModel
from tokenization_symbolic_regression import SymbolicRegressionTokenizer

tok = SymbolicRegressionTokenizer()
model = SymbolicRegressionModel.from_pretrained(
    "hf_symbolic_regression", tokenizer=tok)

X = torch.randn(1, N, D_MAX)    # 自变量点集 [B,N,4]
y = torch.randn(1, N)           # 因变量    [B,N]
exprs = model.generate(X, y, n_samples)
print(tok.decode(exprs[0].tolist()))
# ▶ 输出 sin(x0)*x1 + exp(x0)

快速上手

自包含目录,无外部父工程依赖,仅需 PyTorch 即可推理与自我训练

运行推理 demo

$ cd huggingface
$ python run_hf_self_train.py demo

对用户数据自我训练

$ cd huggingface
$ python run_hf_self_train.py selftrain \
    --x "0.1,0.6,1.1,1.6,2.1,2.6,3.0" \
    --y "0.60,1.07,1.34,1.40,1.27,0.96,0.64" \
    --rounds 15 --candidates 96

面向用户数据的自我训练

只需提供自己的 (X, y),无需表达式真值,程序自动完成全流程

拆分为训练 / 测试子集(默认 7:3)

温度 + 初态扰动采样生成候选表达式

以训练子集 R² 作为自我评估奖励

高 R² 候选作伪标签微调 + REINFORCE 更新

精英保留与回滚,历史最优跨轮保留

测试 R² > 0.995 或连续无改善即提前停止

已知限制

预训练偏向深表达式,对简单目标覆盖不完整,由自我训练补齐

极个别情况可能输出括号不闭合或越界表达式,自我评估过滤

支持变量数 ≤ 4(D_MAX),更多变量需扩展配置并重训

许可证与使用授权

Apache License 2.0,允许研究、学习、商业使用(含闭源商业使用),可自由修改与再发布。

Apache-2.0

立即体验符号回归

前往 Hugging Face 获取完整模型与代码,或联系我们获取技术咨询。