---
title: "概念-AlphaGPT-公式生成器与合法性掩码"
date: 2026-07-21
tags: [AlphaGPT, 择时, Transformer, 强化学习, 概念]
source: "AlphaGPT择时框架"
---

## 一句话

模型像玩接龙一样,看着已写的部分预测下一个零件,按概率抽签往外吐;`action_mask` 是个
实时纠错的裁判,在每次抽签前把会导致病句的零件全部禁掉,保证吐出的每条都是合法公式。

对应代码:`timing_adapter/dynamic_vm.py` 的 `FormulaPolicy` / `build_action_mask`,
采样循环在 `run_timing.py`。

---

## 自回归采样:一个字一个字接龙

模型写公式和手机输入法"猜下一个词"一样——看着已写的部分,预测下一个该写什么,写完再
接着看。这叫**自回归(autoregressive)**。公式最多 12 个 token:

```
  初始:  inp=[起始符]                depth(栈深)=0
  第1步: 模型看inp→吐logits(26个零件倾向分)→抽中close(3) → depth=1
  第2步: 模型看[起始,3]→抽中high(2)                      → depth=2
  第3步: 模型看[起始,3,2]→抽中SUB(8),吃2吐1              → depth=1
  ...接龙到第12步
```

关键代码对应:
- `logits = model(inp)`:Transformer 看已写序列,输出 26 个零件的倾向分
- `Categorical(logits=...).sample()`:**不是选最高分,而是按分数当概率抽签**——高分常中,
  低分偶尔试,这是 RL 探索的关键 ^按概率抽签
- `log_probs.append(...)`:记下"这步抽中的概率对数",训练更新参数要用(策略梯度)
- `inp = cat([inp, action])`:把新 token 拼回,下一步接着看

`batch_size` 条公式**同时并行接龙**(`depth` 是向量)。

---

## FormulaPolicy 网络本身

很轻的 Transformer:token 查嵌入表变向量 + 位置编码 → 2 层带**因果掩码**的
TransformerEncoder(因果掩码保证"只能看前面写过的,不能偷看后面")→ 线性头映射成
26 个零件分数。比 model_core 那个花哨的 `AlphaGPT` 干净得多,不含那些没生效的实验组件
(value头/QKNorm/LoRD)。 ^轻量网络

---

## action_mask:防止写出"病句"(最精妙的部分)

模型随机抽,万一抽出 `[SUB]`(栈里没数拿什么减)或写完剩一堆数没收拢,都是**非法公式**,
虚拟机没法执行。放任乱写则大部分采样都是废的,训练效率极低。

`build_action_mask` 在**每步抽签之前**算清"哪些零件现在能选",把不能选的倾向分砸成
`-∞`,抽签时绝不可能抽中。代码:`Categorical(logits=logits + mask)`,合法零件加0,
非法零件加-∞(概率变0)。 ^裁判

### 两条铁律

**铁律1:栈里的数得够算子吃**
每个算子有"元数"(arity):close 不吃吐1(栈深+1),SUB 吃2吐1(栈深-1),NEG 吃1吐1(不变)。
想选吃 N 个数的算子,栈里至少得有 N 个数(`depth >= arity`)。

**铁律2:剩下的步数得刚好能收拢成1个数**
公式写完时栈里必须**恰好剩1个数**。每步都要"往前看":照现在栈深,剩余步数够不够收拢?
```
rp = steps_left - 1
feasible = (new_depth <= 1 + 2*rp)   # 别涨太高,收不回来
         & (new_depth >= 1 - rp)      # 也别有富余
if rp == 0: feasible = (new_depth == 1)  # 最后一步必须正好落地
```
像下山,每步保证"剩下的步数刚好够走到山脚"。 ^两条铁律

有了这两条,**模型每次采样吐出的公式 100% 合法、可执行、能收敛**。代码注释那句
"保证栈平衡、不套娃"就是这个意思。

> 副作用:因为采样强制跑满 12 步、末尾强制收敛,**每条公式 token 数固定**,长度没有
> 区分度。这直接影响了复杂度惩罚的设计——见 [[概念-AlphaGPT-因子可解释性#^惩罚深度非长度]]。

---

## 相关笔记
- [[MOC-AlphaGPT择时框架]] — 架构入口
- [[概念-AlphaGPT-后缀表达式与栈式虚拟机]] — 生成的公式如何被执行
- [[概念-AlphaGPT-REINFORCE训练闭环]] — log_prob 如何用于更新模型
- [[概念-AlphaGPT-因子可解释性]] — 为什么惩罚深度而非长度

