从一组数据点 DeepSets + LSTM(符号回归)模型,直接生成数学表达式字符串,而非只给出拟合系数。66K 参数量,自包含目录可本地运行,与 HuggingFace Hub 完全兼容。
给定 N 个数据点(每个含 D 个自变量 x 与一个因变量 y),模型反推出隐藏在数据背后的函数解析式 f(x),满足 y ≈ f(x)。
物理 / 工程实验数据 → 自动恢复可解释的经验公式。
好奇某个黑盒函数的关系 → 得到可解释的数学表达式。
异常表达式检测、公式简化等符号层面任务。
区别于普通回归(只给系数)的关键能力
输出 sin(x0)*x1 + exp(x0) 这类表达式字符串,而非仅拟合系数。
DeepSets φ→池化→ρ 路径保证点集排列不变性,处理无序可变长点集。
约 6.6 万参数,可在 CPU 上快速推理,普通设备即可部署。
模型拟合优度以训练子集 R² 作为自我评估奖励
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) │
└──────────────────────────────────────────────────────┘
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/τ) 采样,探索更丰富的表达式,适合生成多样化候选。
低温更确定、更重复;高温更随机、更探索,利于多样性。
编码器 37,952 + 解码器 27,901 = 总 65,853 参数(约 66K)
| 编码器合计 | 解码器合计 | 模型总计 |
|---|---|---|
| φ network | Embedding 29×32 | 65,853 |
| pooling (mean+max) | LSTM (input & hidden gates) | (约 66K) |
| ρ network | output projection |
数字按位展开,变量统一映射为 <VAR>,含括号 / 运算符 / 单目函数 / 常量 / 数字
拿到整个文件夹即可运行推理与自我训练,无需任何父工程文件
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 入口
与 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 即可推理与自我训练
$ 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),无需表达式真值,程序自动完成全流程
预训练偏向深表达式,对简单目标覆盖不完整,由自我训练补齐
极个别情况可能输出括号不闭合或越界表达式,自我评估过滤
支持变量数 ≤ 4(D_MAX),更多变量需扩展配置并重训
Apache License 2.0,允许研究、学习、商业使用(含闭源商业使用),可自由修改与再发布。