15 类数据原型已能生成架构选择题

从 token、图像到图与空间场,每类都已有实际训练过的候选选项,并用少量标签保留可组合的结构。

每行都定义了可执行的数据生成与验收

Meta 标签描述数据的结构和需要完成的操作。token、vector、image、graph、field 分别表示符号、向量、图像、图、空间场。time_series 表示随序列预测,hidden_state 表示只观测到部分状态,long_memory 表示必须保留远处信息。teacher 表示冻结神经模型提供监督,generative 表示验收实际生成样本,conditional 表示生成须符合条件。

交叉熵评价 token 概率。相对 L2 是预测误差的欧氏范数除以真实场的欧氏范数。OPD(on-policy distillation)让学生在自己生成的前缀上学习 teacher。GRU 是带门控的循环网络。

数据集/题型当前输入 → 输出数据怎么生成如何验收Meta 标签
随机小模型 next-token随机 8 token 前缀 → 16 token 续写冻结随机 GRU,64 token 词表续写位置交叉熵token · time_series · teacher
混合阶数 token 预测63 token 前缀 → 逐位置下一 token混合 1、2、4 阶概率表,16 token 词表逐 token 交叉熵token · time_series
带干扰的延迟复制4 token 源串+8 token 干扰+查询 → 源串独立随机 token 与固定分隔符自由生成后整串错误率token · long_memory
小型语言模型从头预训练128 token 语法序列 → 下一 token递归语法,独立解析器检查合法性有效位置交叉熵token · time_series
从头 on-policy 蒸馏学生自己生成的前缀 → teacher 概率冻结随机 GRU,训练时在线查询固定测试前缀上的前向 KLtoken · time_series · teacher
隐状态时间序列预测16 步、4 维历史 → 后续 4 步观测稳定隐状态递推、机制切换和观测噪声未来观测均方误差vector · time_series · hidden_state
延迟动力系统预测64 步、4 维历史 → 后续 16 步向量稳定递推引用 32 步前状态未来向量均方误差vector · time_series · long_memory
合成图像关系分类两个 32×32 形状通道 → 四类空间关系按几何规则采样位置与大小,再绘制独立几何标签上的错误率image
条件图像 diffusion几何条件+噪声 → 16×16 图像渲染形状,加噪后学习去噪实际采样的条件不满足率image · generative · conditional
移动形状视频预测4 帧、16×16、单物体 → 后续 2 帧匀速运动并在边界反弹两帧直接预测均方误差image · time_series
图上的最短路32 节点图+源节点 → 节点距离连通无权图,按层遍历计算距离取整距离的节点错误率graph
图上的动态扩散32 节点图+初始值 → 后续 16 步节点值归一化图上的稳定扩散递推16 步直接预测均方误差graph · time_series
Poisson 解映射32×32 源项、系数 → 解场零边界有限差分求解,检查方程残差相对 L2 解误差field
热方程时间推进32×32 初始温度、系数 → 后续 16 个场周期边界 Fourier 解,检查质量与能量16 个场直接预测均方误差field · time_series
稀疏传感器场重建8 步稀疏读数、观测位置 → 完整场热方程演化,每步观测固定 10% 网格完整场相对 L2 误差field · time_series · hidden_state

每类题型都能打开一个真实例题

数据图展示冻结测试集中的输入和真实目标。token 数字是合成符号编号,语法题的 v0…v24 也是符号名。点击上表题型名或切换下拉框查看例题,每类有三个真实数据样本。选择题比较完整训练方案,不要求从单个样本猜出胜者。

随机小模型 next-token

在同一数据与明确预算下训练,A、B、C 哪个方案的token 交叉熵最低?图展示一个数据样本;答案按完整测试集、三个训练 seed 的成绩确定。

随机小模型 next-token例题:前缀 [17, 19, 46, 27, 35, 0, 63, 42] 的下一 token 是 47,同时展示真实监督概率输入:随机前缀;此前位置不计入监督171946273506342下一个 token:这条样本的真实采样结果47同一位置的监督分布:概率最高的 5 个 tokentoken 4717.8%token 247.0%token 614.9%token 04.8%token 114.8%这次采样得到 token 47;它的概率为 17.8%。
真实 test 样本第 0 条的第一个监督位置。8 个前缀 token 随机采样;冻结的随机初始化 GRU 给出下一 token 分布。预测目标是采样结果,概率条展示同一位置的教师分布。
选项实际候选与训练配置
ATransformer · 宽 16 · 深 1 · 残差开启
Adam,学习率=0.003;交叉熵;300 步 × 16 样本
候选模型源码
from __future__ import annotations
import math
from typing import Any
import torch
from torch import nn
from torch.nn import functional as F

class CausalTransformerLM(nn.Module):
    def __init__(
        self,
        vocab_size: int,
        context_length: int,
        d_model: int,
        num_layers: int,
        num_heads: int,
        d_ff: int,
    ) -> None:
        super().__init__()
        self.context_length = context_length
        self.token_embed = nn.Embedding(vocab_size, d_model)
        self.pos_embed = nn.Embedding(context_length, d_model)
        layer = nn.TransformerEncoderLayer(
            d_model=d_model,
            nhead=num_heads,
            dim_feedforward=d_ff,
            dropout=0.0,
            batch_first=True,
            activation="gelu",
        )
        self.encoder = nn.TransformerEncoder(layer, num_layers=num_layers)
        self.head = nn.Linear(d_model, vocab_size)

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        b, seq_len = x.shape
        positions = torch.arange(seq_len, device=x.device).unsqueeze(0).expand(b, -1)
        h = self.token_embed(x) + self.pos_embed(positions)
        mask = torch.triu(torch.ones(seq_len, seq_len, device=x.device), diagonal=1).bool()
        h = self.encoder(h, mask=mask)
        return self.head(h)


class TokenModel(nn.Module):
    def __init__(self, model: nn.Module) -> None:
        super().__init__()
        self.model = model

    def forward(self, x: torch.Tensor, **_: Any) -> torch.Tensor:
        return self.model(x)

def _build_module(spec: dict[str, Any]) -> nn.Module:
    kind = spec['mode']
    ins, outs = tuple(spec['input_shape']), tuple(spec['output_shape'])
    width, depth = int(spec['width']), int(spec['depth'])
    if spec['output_kind'] == 'token':
        vocab = int(spec['vocab_size'])
        if kind in {'bigram', 'ngram'}:
            return NgramLM(vocab, width, 1 if kind == 'bigram' else int(spec.get('order', 4)), depth, bool(spec['residual']))
        if kind in {'gru', 'gru_lm'}:
            return TokenModel(CausalGruLM(vocab, int(spec['context_length']), width, depth, bool(spec['residual'])))
        if kind in {'transformer', 'transformer_lm'}:
            return TokenModel(CausalTransformerLM(vocab, int(spec['context_length']), width, depth, 4, width * 2))
        raise ValueError(f'Unknown token architecture: {kind}')
    if kind == 'mlp':
        return FlatMLP(ins, outs, width, depth, bool(spec['residual']))
    if kind == 'coordinate_cnn':
        return CoordinateCNN(ins, outs, width, depth, bool(spec['residual']))
    if kind == 'clean_image_denoiser':
        return CleanImageDenoiser(ins, outs, width, depth, int(spec['noise_steps']))
    if kind in {'gnn', 'graph_transformer'}:
        return PackedGraphModel(ins, outs, width, depth, 'graph_attention' if kind == 'graph_transformer' else 'message_passing')
    if kind in {'gru', 'tcn', 'transformer'}:
        sequence_kind = ('gru_forecaster' if kind == 'gru' else
                         'tcn_forecaster' if kind == 'tcn' else 'transformer_forecaster')
        return SequenceForecaster(ins, outs, width, sequence_kind, depth)
    if kind in {'cnn', 'residual_cnn', 'fno', 'spectral_conv'}:
        spatial_kind = 'spectral_conv' if kind in {'fno', 'spectral_conv'} else 'residual_cnn' if kind == 'residual_cnn' else 'cnn'
        return SpatialModel(ins, outs, width, depth, spatial_kind, residual=bool(spec['residual']))
    if kind in {'vit', 'patch_transformer', 'field_transformer'}:
        return PatchTransformer(ins, outs, width, depth, int(spec.get('patch_size', 4)))
    raise ValueError(f'Unknown expansion architecture: {kind}')

def build_module(spec: dict[str, Any]) -> nn.Module:
    model = _build_module(spec)
    parameters = sum(p.numel() for p in model.parameters())
    cap = int(spec.get('max_parameters', 2_000_000))
    if parameters > cap:
        raise ValueError(f'Candidate exceeds parameter cap: {parameters} > {cap}')
    return model

SPEC = {'type': 'expansion_model', 'mode': 'transformer', 'width': 16, 'depth': 1, 'residual': True, 'max_parameters': 2000000, 'input_shape': [23], 'output_shape': [23], 'output_kind': 'token', 'vocab_size': 64, 'noise_steps': 100, 'context_length': 40}
class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = build_module(SPEC)

    def forward(self, x):
        return self.net(x)
BTransformer · 宽 48 · 深 3 · 残差开启
Adam,学习率=0.003;交叉熵;300 步 × 16 样本
候选模型源码
from __future__ import annotations
import math
from typing import Any
import torch
from torch import nn
from torch.nn import functional as F

class CausalTransformerLM(nn.Module):
    def __init__(
        self,
        vocab_size: int,
        context_length: int,
        d_model: int,
        num_layers: int,
        num_heads: int,
        d_ff: int,
    ) -> None:
        super().__init__()
        self.context_length = context_length
        self.token_embed = nn.Embedding(vocab_size, d_model)
        self.pos_embed = nn.Embedding(context_length, d_model)
        layer = nn.TransformerEncoderLayer(
            d_model=d_model,
            nhead=num_heads,
            dim_feedforward=d_ff,
            dropout=0.0,
            batch_first=True,
            activation="gelu",
        )
        self.encoder = nn.TransformerEncoder(layer, num_layers=num_layers)
        self.head = nn.Linear(d_model, vocab_size)

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        b, seq_len = x.shape
        positions = torch.arange(seq_len, device=x.device).unsqueeze(0).expand(b, -1)
        h = self.token_embed(x) + self.pos_embed(positions)
        mask = torch.triu(torch.ones(seq_len, seq_len, device=x.device), diagonal=1).bool()
        h = self.encoder(h, mask=mask)
        return self.head(h)


class TokenModel(nn.Module):
    def __init__(self, model: nn.Module) -> None:
        super().__init__()
        self.model = model

    def forward(self, x: torch.Tensor, **_: Any) -> torch.Tensor:
        return self.model(x)

def _build_module(spec: dict[str, Any]) -> nn.Module:
    kind = spec['mode']
    ins, outs = tuple(spec['input_shape']), tuple(spec['output_shape'])
    width, depth = int(spec['width']), int(spec['depth'])
    if spec['output_kind'] == 'token':
        vocab = int(spec['vocab_size'])
        if kind in {'bigram', 'ngram'}:
            return NgramLM(vocab, width, 1 if kind == 'bigram' else int(spec.get('order', 4)), depth, bool(spec['residual']))
        if kind in {'gru', 'gru_lm'}:
            return TokenModel(CausalGruLM(vocab, int(spec['context_length']), width, depth, bool(spec['residual'])))
        if kind in {'transformer', 'transformer_lm'}:
            return TokenModel(CausalTransformerLM(vocab, int(spec['context_length']), width, depth, 4, width * 2))
        raise ValueError(f'Unknown token architecture: {kind}')
    if kind == 'mlp':
        return FlatMLP(ins, outs, width, depth, bool(spec['residual']))
    if kind == 'coordinate_cnn':
        return CoordinateCNN(ins, outs, width, depth, bool(spec['residual']))
    if kind == 'clean_image_denoiser':
        return CleanImageDenoiser(ins, outs, width, depth, int(spec['noise_steps']))
    if kind in {'gnn', 'graph_transformer'}:
        return PackedGraphModel(ins, outs, width, depth, 'graph_attention' if kind == 'graph_transformer' else 'message_passing')
    if kind in {'gru', 'tcn', 'transformer'}:
        sequence_kind = ('gru_forecaster' if kind == 'gru' else
                         'tcn_forecaster' if kind == 'tcn' else 'transformer_forecaster')
        return SequenceForecaster(ins, outs, width, sequence_kind, depth)
    if kind in {'cnn', 'residual_cnn', 'fno', 'spectral_conv'}:
        spatial_kind = 'spectral_conv' if kind in {'fno', 'spectral_conv'} else 'residual_cnn' if kind == 'residual_cnn' else 'cnn'
        return SpatialModel(ins, outs, width, depth, spatial_kind, residual=bool(spec['residual']))
    if kind in {'vit', 'patch_transformer', 'field_transformer'}:
        return PatchTransformer(ins, outs, width, depth, int(spec.get('patch_size', 4)))
    raise ValueError(f'Unknown expansion architecture: {kind}')

def build_module(spec: dict[str, Any]) -> nn.Module:
    model = _build_module(spec)
    parameters = sum(p.numel() for p in model.parameters())
    cap = int(spec.get('max_parameters', 2_000_000))
    if parameters > cap:
        raise ValueError(f'Candidate exceeds parameter cap: {parameters} > {cap}')
    return model

SPEC = {'type': 'expansion_model', 'mode': 'transformer', 'width': 48, 'depth': 3, 'residual': True, 'max_parameters': 2000000, 'input_shape': [23], 'output_shape': [23], 'output_kind': 'token', 'vocab_size': 64, 'noise_steps': 100, 'context_length': 40}
class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = build_module(SPEC)

    def forward(self, x):
        return self.net(x)
Cngram · 宽 32 · 深 3 · 残差关闭
Adam,学习率=0.003;交叉熵;300 步 × 16 样本
候选模型源码
from __future__ import annotations
import math
from typing import Any
import torch
from torch import nn
from torch.nn import functional as F

class NgramLM(nn.Module):
    def __init__(self, vocab: int, width: int, order: int, depth: int = 1,
                 residual: bool = False) -> None:
        super().__init__()
        self.embedding = nn.Embedding(vocab, width)
        self.mix = nn.ModuleList(nn.Conv1d(width, width, order) for _ in range(depth))
        self.head = nn.Linear(width, vocab)
        self.order = order
        self.residual = residual

    def forward(self, x: torch.Tensor, **_: Any) -> torch.Tensor:
        h = self.embedding(x).transpose(1, 2)
        for layer in self.mix:
            z = F.gelu(layer(F.pad(h, (self.order - 1, 0))))
            h = h + z if self.residual else z
        return self.head(h.transpose(1, 2))

def _build_module(spec: dict[str, Any]) -> nn.Module:
    kind = spec['mode']
    ins, outs = tuple(spec['input_shape']), tuple(spec['output_shape'])
    width, depth = int(spec['width']), int(spec['depth'])
    if spec['output_kind'] == 'token':
        vocab = int(spec['vocab_size'])
        if kind in {'bigram', 'ngram'}:
            return NgramLM(vocab, width, 1 if kind == 'bigram' else int(spec.get('order', 4)), depth, bool(spec['residual']))
        if kind in {'gru', 'gru_lm'}:
            return TokenModel(CausalGruLM(vocab, int(spec['context_length']), width, depth, bool(spec['residual'])))
        if kind in {'transformer', 'transformer_lm'}:
            return TokenModel(CausalTransformerLM(vocab, int(spec['context_length']), width, depth, 4, width * 2))
        raise ValueError(f'Unknown token architecture: {kind}')
    if kind == 'mlp':
        return FlatMLP(ins, outs, width, depth, bool(spec['residual']))
    if kind == 'coordinate_cnn':
        return CoordinateCNN(ins, outs, width, depth, bool(spec['residual']))
    if kind == 'clean_image_denoiser':
        return CleanImageDenoiser(ins, outs, width, depth, int(spec['noise_steps']))
    if kind in {'gnn', 'graph_transformer'}:
        return PackedGraphModel(ins, outs, width, depth, 'graph_attention' if kind == 'graph_transformer' else 'message_passing')
    if kind in {'gru', 'tcn', 'transformer'}:
        sequence_kind = ('gru_forecaster' if kind == 'gru' else
                         'tcn_forecaster' if kind == 'tcn' else 'transformer_forecaster')
        return SequenceForecaster(ins, outs, width, sequence_kind, depth)
    if kind in {'cnn', 'residual_cnn', 'fno', 'spectral_conv'}:
        spatial_kind = 'spectral_conv' if kind in {'fno', 'spectral_conv'} else 'residual_cnn' if kind == 'residual_cnn' else 'cnn'
        return SpatialModel(ins, outs, width, depth, spatial_kind, residual=bool(spec['residual']))
    if kind in {'vit', 'patch_transformer', 'field_transformer'}:
        return PatchTransformer(ins, outs, width, depth, int(spec.get('patch_size', 4)))
    raise ValueError(f'Unknown expansion architecture: {kind}')

def build_module(spec: dict[str, Any]) -> nn.Module:
    model = _build_module(spec)
    parameters = sum(p.numel() for p in model.parameters())
    cap = int(spec.get('max_parameters', 2_000_000))
    if parameters > cap:
        raise ValueError(f'Candidate exceeds parameter cap: {parameters} > {cap}')
    return model

SPEC = {'type': 'expansion_model', 'mode': 'ngram', 'width': 32, 'depth': 3, 'residual': False, 'max_parameters': 2000000, 'input_shape': [23], 'output_shape': [23], 'output_kind': 'token', 'vocab_size': 64, 'noise_steps': 100, 'context_length': 40}
class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = build_module(SPEC)

    def forward(self, x):
        return self.net(x)
揭晓答案与实测依据

正确答案:A。按 test_ce 比较,越低越好。以下是整体测试成绩,不是图中单个样本的误差。

选项三 seed 均值各 seed 成绩
A3.484573.48056,3.48245,3.4907
B4.02263.95094,4.12905,3.98782
C3.647243.61735,3.69692,3.62744
完整冻结题面
You are taking the ArchitectureIQ benchmark.

Each question describes one **dataset instance** and several **choices** (each choice is one **candidate**: model, optimizer, loss, and training budget). All choices train on the same dataset instance. Each choice's training budget (`total_samples_seen`) is stated in the prompt — either shared across all choices or specified per choice in the Sample budget section. Your task is to identify which choice will achieve the **best test metric** on the held-out test set after its stated training budget — using architecture and learning-mechanics reasoning only (no training results are provided).

The reply format is defined once, in the final "Your answer" section.

## Dataset
Random frozen GRU language modeling: independent random token prefixes are continued by a single frozen, calibrated neural teacher. Predict next-token distributions only at supervised continuation positions. The teacher is shared across all splits; token targets of -100 are ignored.

### Synthesis (PyTorch)
```python
from __future__ import annotations
import hashlib
import math
from typing import Any
import torch
import torch.nn.functional as F

def _seed(seed: int, task: str, stream: str) -> int:
    return int.from_bytes(hashlib.sha256(f'{seed}|{task}|{stream}'.encode()).digest()[:8], 'little') % (2 ** 63 - 1)

class FrozenTeacher(torch.nn.Module):

    def __init__(self, config: dict, state: dict | None=None):
        super().__init__()
        self.net = TeacherNet(config['vocab_size'], config['teacher_width'], config['teacher_layers'])
        if state is not None:
            self.net.load_state_dict(state)
        self.scale = float(config['logit_scale']) / float(config['temperature'])
        self.requires_grad_(False)
        self.eval()

    def forward(self, x):
        return self.net(x) * self.scale

class TeacherNet(torch.nn.Module):

    def __init__(self, vocab, width, layers):
        super().__init__()
        self.token_embed = torch.nn.Embedding(vocab, width)
        self.gru = torch.nn.GRU(width, width, layers, batch_first=True)
        self.head = torch.nn.Linear(width, vocab)

    def forward(self, x):
        (h, _) = self.gru(self.token_embed(x))
        return self.head(h)

def _teacher_split(teacher, config, n, rng, prefix_length, continuation):
    seq = torch.randint(config['vocab_size'], (n, prefix_length), generator=rng)
    for _ in range(continuation):
        with torch.no_grad():
            probs = teacher(seq)[:, -1].softmax(-1)
        seq = torch.cat([seq, torch.multinomial(probs, 1, generator=rng)], 1)
    (x, y) = (seq[:, :-1], seq[:, 1:])
    with torch.no_grad():
        p = teacher(x).softmax(-1)
    mask = torch.zeros_like(x, dtype=torch.bool)
    mask[:, prefix_length - 1:] = True
    return {'x': x, 'y': y, 'mask': mask, 'teacher_probs': p}

def build(task_id: str, parameters: dict[str, Any], split_counts: dict[str, int], seed: int, data_seed: int | None=None):
    cfg = {'task_id': 'random_teacher_ntp'}
    (artifacts, metadata) = ({}, {})
    generator = torch.Generator().manual_seed(_seed(seed, 'random_teacher_ntp', 'generator'))
    teacher_cfg = parameters.get('teacher', {})
    prefix = int(parameters.get('prefix_length', min(parameters.get('prefix_lengths', [8]))))
    continuation = int(parameters.get('continuation_length', parameters.get('rollout_length', min(parameters.get('continuation_lengths', [16])))))
    cfg.update(vocab_size=int(parameters.get('vocab', 64)), prefix_length=prefix, continuation_length=continuation, rollout_length=continuation, context_length=prefix + 2 * continuation, teacher_width=int(teacher_cfg.get('width', 64)), teacher_layers=int(teacher_cfg.get('layers', 2)), temperature=float(teacher_cfg.get('temperature', 1.0)), logit_scale=float(teacher_cfg.get('logit_scale', parameters.get('logit_scale', 8.0))))
    with torch.random.fork_rng():
        torch.manual_seed(_seed(seed, 'random_teacher_ntp', 'teacher_weights'))
        teacher = FrozenTeacher(cfg)
    probe = torch.randint(cfg['vocab_size'], (128, int(parameters.get('teacher_probe_context', 8))), generator=generator)
    with torch.no_grad():
        for _ in range(12):
            p = teacher(probe).softmax(-1)[:, -1]
            entropy = float(-(p * p.clamp_min(1e-12).log()).sum(-1).mean())
            ratio = entropy / math.log(cfg['vocab_size'])
            if 0.35 <= ratio <= 0.88:
                break
            teacher.scale *= 1.5 if ratio > 0.88 else 0.7
        reset_p = teacher(probe[:, -1:]).softmax(-1)[:, -1]
        context_gap = float((p * (p.clamp_min(1e-12).log() - reset_p.clamp_min(1e-12).log())).sum(-1).mean())
    if not 0.35 <= ratio <= 0.88 or context_gap < 0.001:
        raise ValueError('Random teacher has insufficient entropy or context dependence')
    cfg['logit_scale'] = teacher.scale * cfg['temperature']
    artifacts['teacher_state'] = {k: v.detach().clone() for (k, v) in teacher.net.state_dict().items()}
    metadata.update(teacher_probe_entropy=entropy, teacher_context_kl_gap=context_gap, teacher_architecture='frozen_random_causal_gru', teacher_seed=_seed(seed, 'random_teacher_ntp', 'teacher_weights'), teacher_probe_scope='generator_only_not_test_selection')
    cfg.update(selection_metric='token_ce', higher_is_better=False)
    splits = {}
    seen_grammar = set()
    for (split, count) in split_counts.items():
        rng = torch.Generator().manual_seed(_seed(seed, 'random_teacher_ntp', split) if data_seed is None else data_seed)
        ood = split == 'ood'
        splits[split] = _teacher_split(teacher, cfg, count, rng, prefix, continuation * (2 if ood else 1))
    metadata.update(split_unit='whole_independently_sampled_sequence', seed_streams={s: _seed(seed, 'random_teacher_ntp', s) for s in ['generator', *split_counts]}, ood_axis={'random_teacher_ntp': 'continuation_length_x2', 'on_policy_distillation': 'continuation_length_x2', 'variable_order_markov': 'sequence_length_x2', 'copy_recall': 'distractor_length_x2', 'grammar_pretrain': 'terminal_frequency_shift', 'switching_state_space': 'switch_probability_x2', 'delay_dynamics': 'noise_scale_x1.8'}['random_teacher_ntp'])
    cfg['input_shape'] = list(splits['train']['x'].shape[1:])
    cfg['output_shape'] = list(splits['train']['y'].shape[1:])
    if 'vocab_size' in cfg:
        cfg['max_sequence_length'] = max((int(b['x'].shape[1]) for b in splits.values()))
    metadata['split_sizes'] = {s: len(b['x']) for (s, b) in splits.items()}
    return {'config': cfg, 'splits': splits, 'metadata': metadata, 'artifacts': artifacts}

def _canonical_parameters(params):
    p = dict(params)
    p['vocab'] = p.get('vocab_size', 64)
    p['sequence_length'] = p.get('context_length', 128) + (0 if p.get('task_id') == 'grammar_pretrain' else 1)
    p['teacher'] = {'width': p.get('teacher_width', 64), 'layers': p.get('teacher_layers', 2), 'temperature': p.get('temperature', 1.0), 'logit_scale': p.get('logit_scale', 8.0)}
    return p

def synthesize_task(name, params, seed, count):
    parameters = _canonical_parameters(dict(params, task_id='random_teacher_ntp'))
    dataset = build('random_teacher_ntp', parameters, {'train': count}, int(params['structure_seed']), data_seed=seed)
    batch = dataset['splits']['train']
    batch['y'] = batch['y'].clone()
    batch['y'][~batch['mask']] = -100
    return batch
TASK = 'random_teacher_ntp'
PARAMS = {'vocab_size': 64, 'prefix_length': 8, 'continuation_length': 16, 'context_length': 40, 'teacher_width': 64, 'teacher_layers': 2, 'temperature': 1.0, 'logit_scale': 8.0, 'train_size': 512, 'test_size': 128, 'validation_size': 128, 'ood_size': 128, 'instance_seed': 11, 'structure_seed': 10011, 'teacher_seed': 10011, 'ood_shift': {'prefix_length': 16, 'continuation_length': 8}, 'input_shape': [23], 'output_shape': [23], 'model_modes': ['bigram', 'ngram', 'gru', 'transformer'], 'objective': 'token_ce', 'output_kind': 'token'}

def synthesize_split(seed, count, overrides=None):
    global PARAMS
    original = PARAMS
    PARAMS = dict(PARAMS, **overrides or {})
    try:
        return synthesize_task(TASK, PARAMS, seed, count)
    finally:
        PARAMS = original

def synthesize():
    tr = synthesize_split(PARAMS['instance_seed'] + 20000, PARAMS['train_size'])
    te = synthesize_split(PARAMS['instance_seed'] + 40000, PARAMS['test_size'])
    return (tr['x'], tr['y'], te['x'], te['y'])
```

### Data splits and training protocol
- Train / validation / test size: 512 / 128 / 128
- Split by complete sequences, trajectories, graphs or initial conditions; no overlapping split windows.
- Objective: token_ce; model input/output shapes: [23] → [23].
- Curves use validation. Final ranking uses held-out test without selecting checkpoints.
- Execution device: cpu.

## Sample budget (same for all choices)
- training_steps: 300
- batch_size: 16
- total_samples_seen: 4800 (= training_steps × batch_size)

## Evaluation metric
- Ground-truth ranking uses **test_ce** on the held-out test split.
- Each choice is trained independently for **3** seeds (`0`..`2`), one `torch.manual_seed(seed)` per run.
- Execution device: cpu.
- The correct choice has the lowest **mean** test_ce across seeds.

## Choices

### Choice A

**Model (natural language)**
- type: expansion_model
- mode: transformer
- width: 16
- depth: 1
- residual: True
- max_parameters: 2000000
- input_shape: [23]
- output_shape: [23]
- output_kind: token
- vocab_size: 64
- noise_steps: 100
- context_length: 40

**Model code**
```python
SPEC = {'type': 'expansion_model', 'mode': 'transformer', 'width': 16, 'depth': 1, 'residual': True, 'max_parameters': 2000000, 'input_shape': [23], 'output_shape': [23], 'output_kind': 'token', 'vocab_size': 64, 'noise_steps': 100, 'context_length': 40}


def _build_module(spec: dict[str, Any]) -> nn.Module:
    kind = spec['mode']
    ins, outs = tuple(spec['input_shape']), tuple(spec['output_shape'])
    width, depth = int(spec['width']), int(spec['depth'])
    if spec['output_kind'] == 'token':
        vocab = int(spec['vocab_size'])
        if kind in {'bigram', 'ngram'}:
            return NgramLM(vocab, width, 1 if kind == 'bigram' else int(spec.get('order', 4)), depth, bool(spec['residual']))
        if kind in {'gru', 'gru_lm'}:
            return TokenModel(CausalGruLM(vocab, int(spec['context_length']), width, depth, bool(spec['residual'])))
        if kind in {'transformer', 'transformer_lm'}:
            return TokenModel(CausalTransformerLM(vocab, int(spec['context_length']), width, depth, 4, width * 2))
        raise ValueError(f'Unknown token architecture: {kind}')
    if kind == 'mlp':
        return FlatMLP(ins, outs, width, depth, bool(spec['residual']))
    if kind == 'coordinate_cnn':
        return CoordinateCNN(ins, outs, width, depth, bool(spec['residual']))
    if kind == 'clean_image_denoiser':
        return CleanImageDenoiser(ins, outs, width, depth, int(spec['noise_steps']))
    if kind in {'gnn', 'graph_transformer'}:
        return PackedGraphModel(ins, outs, width, depth, 'graph_attention' if kind == 'graph_transformer' else 'message_passing')
    if kind in {'gru', 'tcn', 'transformer'}:
        sequence_kind = ('gru_forecaster' if kind == 'gru' else
                         'tcn_forecaster' if kind == 'tcn' else 'transformer_forecaster')
        return SequenceForecaster(ins, outs, width, sequence_kind, depth)
    if kind in {'cnn', 'residual_cnn', 'fno', 'spectral_conv'}:
        spatial_kind = 'spectral_conv' if kind in {'fno', 'spectral_conv'} else 'residual_cnn' if kind == 'residual_cnn' else 'cnn'
        return SpatialModel(ins, outs, width, depth, spatial_kind, residual=bool(spec['residual']))
    if kind in {'vit', 'patch_transformer', 'field_transformer'}:
        return PatchTransformer(ins, outs, width, depth, int(spec.get('patch_size', 4)))
    raise ValueError(f'Unknown expansion architecture: {kind}')


def build_module(spec: dict[str, Any]) -> nn.Module:
    model = _build_module(spec)
    parameters = sum(p.numel() for p in model.parameters())
    cap = int(spec.get('max_parameters', 2_000_000))
    if parameters > cap:
        raise ValueError(f'Candidate exceeds parameter cap: {parameters} > {cap}')
    return model


class CausalTransformerLM(nn.Module):
    def __init__(
        self,
        vocab_size: int,
        context_length: int,
        d_model: int,
        num_layers: int,
        num_heads: int,
        d_ff: int,
    ) -> None:
        super().__init__()
        self.context_length = context_length
        self.token_embed = nn.Embedding(vocab_size, d_model)
        self.pos_embed = nn.Embedding(context_length, d_model)
        layer = nn.TransformerEncoderLayer(
            d_model=d_model,
            nhead=num_heads,
            dim_feedforward=d_ff,
            dropout=0.0,
            batch_first=True,
            activation="gelu",
        )
        self.encoder = nn.TransformerEncoder(layer, num_layers=num_layers)
        self.head = nn.Linear(d_model, vocab_size)

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        b, seq_len = x.shape
        positions = torch.arange(seq_len, device=x.device).unsqueeze(0).expand(b, -1)
        h = self.token_embed(x) + self.pos_embed(positions)
        mask = torch.triu(torch.ones(seq_len, seq_len, device=x.device), diagonal=1).bool()
        h = self.encoder(h, mask=mask)
        return self.head(h)


class TokenModel(nn.Module):
    def __init__(self, model: nn.Module) -> None:
        super().__init__()
        self.model = model

    def forward(self, x: torch.Tensor, **_: Any) -> torch.Tensor:
        return self.model(x)


class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = build_module(SPEC)

    def forward(self, x):
        return self.net(x)
```

**Optimizer**
- Optimizer: Adam
- Learning rate: 0.003
- Weight decay: 0.0
- Betas: [0.9, 0.999]

```python
def build_optimizer(model: nn.Module) -> torch.optim.Optimizer:
    params = model.parameters()
    return torch.optim.Adam(params, lr=0.003, betas=(0.9, 0.999), weight_decay=0.0)
```

**Loss**
- Loss: cross-entropy on minibatch target labels

```python
def loss_fn(model: nn.Module, pred: torch.Tensor, target: torch.Tensor) -> torch.Tensor:
    if pred.ndim == 3:
        vocab = pred.shape[-1]
        return torch.nn.functional.cross_entropy(pred.reshape(-1, vocab), target.reshape(-1))
    return torch.nn.functional.cross_entropy(pred, target.reshape(-1))
```

### Choice B

**Model (natural language)**
- type: expansion_model
- mode: transformer
- width: 48
- depth: 3
- residual: True
- max_parameters: 2000000
- input_shape: [23]
- output_shape: [23]
- output_kind: token
- vocab_size: 64
- noise_steps: 100
- context_length: 40

**Model code**
```python
SPEC = {'type': 'expansion_model', 'mode': 'transformer', 'width': 48, 'depth': 3, 'residual': True, 'max_parameters': 2000000, 'input_shape': [23], 'output_shape': [23], 'output_kind': 'token', 'vocab_size': 64, 'noise_steps': 100, 'context_length': 40}


def _build_module(spec: dict[str, Any]) -> nn.Module:
    kind = spec['mode']
    ins, outs = tuple(spec['input_shape']), tuple(spec['output_shape'])
    width, depth = int(spec['width']), int(spec['depth'])
    if spec['output_kind'] == 'token':
        vocab = int(spec['vocab_size'])
        if kind in {'bigram', 'ngram'}:
            return NgramLM(vocab, width, 1 if kind == 'bigram' else int(spec.get('order', 4)), depth, bool(spec['residual']))
        if kind in {'gru', 'gru_lm'}:
            return TokenModel(CausalGruLM(vocab, int(spec['context_length']), width, depth, bool(spec['residual'])))
        if kind in {'transformer', 'transformer_lm'}:
            return TokenModel(CausalTransformerLM(vocab, int(spec['context_length']), width, depth, 4, width * 2))
        raise ValueError(f'Unknown token architecture: {kind}')
    if kind == 'mlp':
        return FlatMLP(ins, outs, width, depth, bool(spec['residual']))
    if kind == 'coordinate_cnn':
        return CoordinateCNN(ins, outs, width, depth, bool(spec['residual']))
    if kind == 'clean_image_denoiser':
        return CleanImageDenoiser(ins, outs, width, depth, int(spec['noise_steps']))
    if kind in {'gnn', 'graph_transformer'}:
        return PackedGraphModel(ins, outs, width, depth, 'graph_attention' if kind == 'graph_transformer' else 'message_passing')
    if kind in {'gru', 'tcn', 'transformer'}:
        sequence_kind = ('gru_forecaster' if kind == 'gru' else
                         'tcn_forecaster' if kind == 'tcn' else 'transformer_forecaster')
        return SequenceForecaster(ins, outs, width, sequence_kind, depth)
    if kind in {'cnn', 'residual_cnn', 'fno', 'spectral_conv'}:
        spatial_kind = 'spectral_conv' if kind in {'fno', 'spectral_conv'} else 'residual_cnn' if kind == 'residual_cnn' else 'cnn'
        return SpatialModel(ins, outs, width, depth, spatial_kind, residual=bool(spec['residual']))
    if kind in {'vit', 'patch_transformer', 'field_transformer'}:
        return PatchTransformer(ins, outs, width, depth, int(spec.get('patch_size', 4)))
    raise ValueError(f'Unknown expansion architecture: {kind}')


def build_module(spec: dict[str, Any]) -> nn.Module:
    model = _build_module(spec)
    parameters = sum(p.numel() for p in model.parameters())
    cap = int(spec.get('max_parameters', 2_000_000))
    if parameters > cap:
        raise ValueError(f'Candidate exceeds parameter cap: {parameters} > {cap}')
    return model


class CausalTransformerLM(nn.Module):
    def __init__(
        self,
        vocab_size: int,
        context_length: int,
        d_model: int,
        num_layers: int,
        num_heads: int,
        d_ff: int,
    ) -> None:
        super().__init__()
        self.context_length = context_length
        self.token_embed = nn.Embedding(vocab_size, d_model)
        self.pos_embed = nn.Embedding(context_length, d_model)
        layer = nn.TransformerEncoderLayer(
            d_model=d_model,
            nhead=num_heads,
            dim_feedforward=d_ff,
            dropout=0.0,
            batch_first=True,
            activation="gelu",
        )
        self.encoder = nn.TransformerEncoder(layer, num_layers=num_layers)
        self.head = nn.Linear(d_model, vocab_size)

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        b, seq_len = x.shape
        positions = torch.arange(seq_len, device=x.device).unsqueeze(0).expand(b, -1)
        h = self.token_embed(x) + self.pos_embed(positions)
        mask = torch.triu(torch.ones(seq_len, seq_len, device=x.device), diagonal=1).bool()
        h = self.encoder(h, mask=mask)
        return self.head(h)


class TokenModel(nn.Module):
    def __init__(self, model: nn.Module) -> None:
        super().__init__()
        self.model = model

    def forward(self, x: torch.Tensor, **_: Any) -> torch.Tensor:
        return self.model(x)


class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = build_module(SPEC)

    def forward(self, x):
        return self.net(x)
```

**Optimizer**
- Optimizer: Adam
- Learning rate: 0.003
- Weight decay: 0.0
- Betas: [0.9, 0.999]

```python
def build_optimizer(model: nn.Module) -> torch.optim.Optimizer:
    params = model.parameters()
    return torch.optim.Adam(params, lr=0.003, betas=(0.9, 0.999), weight_decay=0.0)
```

**Loss**
- Loss: cross-entropy on minibatch target labels

```python
def loss_fn(model: nn.Module, pred: torch.Tensor, target: torch.Tensor) -> torch.Tensor:
    if pred.ndim == 3:
        vocab = pred.shape[-1]
        return torch.nn.functional.cross_entropy(pred.reshape(-1, vocab), target.reshape(-1))
    return torch.nn.functional.cross_entropy(pred, target.reshape(-1))
```

### Choice C

**Model (natural language)**
- type: expansion_model
- mode: ngram
- width: 32
- depth: 3
- residual: False
- max_parameters: 2000000
- input_shape: [23]
- output_shape: [23]
- output_kind: token
- vocab_size: 64
- noise_steps: 100
- context_length: 40

**Model code**
```python
SPEC = {'type': 'expansion_model', 'mode': 'ngram', 'width': 32, 'depth': 3, 'residual': False, 'max_parameters': 2000000, 'input_shape': [23], 'output_shape': [23], 'output_kind': 'token', 'vocab_size': 64, 'noise_steps': 100, 'context_length': 40}


def _build_module(spec: dict[str, Any]) -> nn.Module:
    kind = spec['mode']
    ins, outs = tuple(spec['input_shape']), tuple(spec['output_shape'])
    width, depth = int(spec['width']), int(spec['depth'])
    if spec['output_kind'] == 'token':
        vocab = int(spec['vocab_size'])
        if kind in {'bigram', 'ngram'}:
            return NgramLM(vocab, width, 1 if kind == 'bigram' else int(spec.get('order', 4)), depth, bool(spec['residual']))
        if kind in {'gru', 'gru_lm'}:
            return TokenModel(CausalGruLM(vocab, int(spec['context_length']), width, depth, bool(spec['residual'])))
        if kind in {'transformer', 'transformer_lm'}:
            return TokenModel(CausalTransformerLM(vocab, int(spec['context_length']), width, depth, 4, width * 2))
        raise ValueError(f'Unknown token architecture: {kind}')
    if kind == 'mlp':
        return FlatMLP(ins, outs, width, depth, bool(spec['residual']))
    if kind == 'coordinate_cnn':
        return CoordinateCNN(ins, outs, width, depth, bool(spec['residual']))
    if kind == 'clean_image_denoiser':
        return CleanImageDenoiser(ins, outs, width, depth, int(spec['noise_steps']))
    if kind in {'gnn', 'graph_transformer'}:
        return PackedGraphModel(ins, outs, width, depth, 'graph_attention' if kind == 'graph_transformer' else 'message_passing')
    if kind in {'gru', 'tcn', 'transformer'}:
        sequence_kind = ('gru_forecaster' if kind == 'gru' else
                         'tcn_forecaster' if kind == 'tcn' else 'transformer_forecaster')
        return SequenceForecaster(ins, outs, width, sequence_kind, depth)
    if kind in {'cnn', 'residual_cnn', 'fno', 'spectral_conv'}:
        spatial_kind = 'spectral_conv' if kind in {'fno', 'spectral_conv'} else 'residual_cnn' if kind == 'residual_cnn' else 'cnn'
        return SpatialModel(ins, outs, width, depth, spatial_kind, residual=bool(spec['residual']))
    if kind in {'vit', 'patch_transformer', 'field_transformer'}:
        return PatchTransformer(ins, outs, width, depth, int(spec.get('patch_size', 4)))
    raise ValueError(f'Unknown expansion architecture: {kind}')


def build_module(spec: dict[str, Any]) -> nn.Module:
    model = _build_module(spec)
    parameters = sum(p.numel() for p in model.parameters())
    cap = int(spec.get('max_parameters', 2_000_000))
    if parameters > cap:
        raise ValueError(f'Candidate exceeds parameter cap: {parameters} > {cap}')
    return model


class NgramLM(nn.Module):
    def __init__(self, vocab: int, width: int, order: int, depth: int = 1,
                 residual: bool = False) -> None:
        super().__init__()
        self.embedding = nn.Embedding(vocab, width)
        self.mix = nn.ModuleList(nn.Conv1d(width, width, order) for _ in range(depth))
        self.head = nn.Linear(width, vocab)
        self.order = order
        self.residual = residual

    def forward(self, x: torch.Tensor, **_: Any) -> torch.Tensor:
        h = self.embedding(x).transpose(1, 2)
        for layer in self.mix:
            z = F.gelu(layer(F.pad(h, (self.order - 1, 0))))
            h = h + z if self.residual else z
        return self.head(h.transpose(1, 2))


class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = build_module(SPEC)

    def forward(self, x):
        return self.net(x)
```

**Optimizer**
- Optimizer: Adam
- Learning rate: 0.003
- Weight decay: 0.0
- Betas: [0.9, 0.999]

```python
def build_optimizer(model: nn.Module) -> torch.optim.Optimizer:
    params = model.parameters()
    return torch.optim.Adam(params, lr=0.003, betas=(0.9, 0.999), weight_decay=0.0)
```

**Loss**
- Loss: cross-entropy on minibatch target labels

```python
def loss_fn(model: nn.Module, pred: torch.Tensor, target: torch.Tensor) -> torch.Tensor:
    if pred.ndim == 3:
        vocab = pred.shape[-1]
        return torch.nn.functional.cross_entropy(pred.reshape(-1, vocab), target.reshape(-1))
    return torch.nn.functional.cross_entropy(pred, target.reshape(-1))
```

## Your answer
Choose exactly one of A, B, C. End your reply with exactly one tagged field, with nothing after it:

<answer>the letter of your chosen option</answer>

Rules: `<answer>` must contain exactly one letter from {A, B, C}. The grader reads only the **final** `<answer>` tag in your reply.

时间、观测与生成操作能跨数据结构组合

算子是对数据或训练过程执行的操作。架构的 residual、attention、ngram 另存于候选 spec。

组合操作已实现的具体题型可延伸的题型
时间推进 → 稀疏观测 → 重建稀疏传感器热场重建图扩散的稀疏节点重建
时间推进 → 绘制 → 预测移动形状视频预测隐状态动力系统的视频预测
学生生成 → teacher 查询 → 概率匹配从头 OPD语法模型的在线蒸馏
条件生成 → 加噪 → 去噪采样条件几何图像 diffusion带条件的场生成

答案来自相同数据和预算下的实际训练

候选包含模型、loss、优化器与训练预算。当前架构候选支持 ngram、GRU、Transformer、卷积、频域卷积和图消息传递,也能比较残差连接。15 类各有至少一个三选一题目,其三个训练 seed 的测试误差区间完整分离。选择题要求评测模型预测哪个训练方案效果最好。

冻结一个数据实例训练候选架构生成三选一题目生成器+四份数据相同数据与预算,三个 seed测试误差区间完整分离

训练、验证、测试和参数变化后的测试按完整样本划分。预算写成训练过程中累计看到的样本数。候选源码和数据都冻结保存,可以重新执行。语法解析、图距离、方程残差和图像几何分别由独立规则检查。

各类胜者、预算与三个 seed 的实测误差

这些数值评价被训练的候选,不是答题模型准确率。跨类指标不能直接比较。test_ce 是交叉熵,test_error 是错误率,test_kl 是前向 KL,test_mse 是均方误差,test_relative_l2 是相对 L2,test_distance_error 是节点距离错误率,test_condition_error 是条件不满足率。FNO 用频域卷积拟合场映射,TCN 是时间卷积网络,GNN 是图消息传递网络。

数据集胜者架构看到的样本数指标三个 seed
随机小模型 next-tokentransformer,宽 16,深 14,800test_ce3.4806, 3.4825, 3.4907
混合阶数 token 预测bigram,宽 32,深 34,800test_ce2.5912, 2.5922, 2.592
带干扰的延迟复制gru,宽 64,深 216,000test_error0, 0, 0
小型语言模型从头预训练transformer,宽 16,深 24,800test_ce1.3659, 1.3815, 1.3417
从头 on-policy 蒸馏gru,宽 32,深 34,800test_kl0.14121, 0.15678, 0.16431
隐状态时间序列预测tcn,宽 48,深 116,000test_mse0.015961, 0.015591, 0.015329
延迟动力系统预测mlp,宽 32,深 34,800test_mse0.0071463, 0.0072147, 0.0071111
合成图像关系分类mlp,宽 32,深 34,800test_error0, 0, 0
条件图像 diffusion预测干净图像的去噪网络,宽 32,深 316,000test_condition_error0.125, 0.27344, 0.14844
移动形状视频预测cnn,宽 32,深 316,000test_mse0.0056797, 0.0056961, 0.0055838
图上的最短路gnn,宽 32,深 24,800test_distance_error0.20801, 0.22461, 0.27856
图上的动态扩散gnn,宽 32,深 24,800test_mse0.0044069, 0.0042068, 0.0044835
Poisson 解映射fno,宽 16,深 24,800test_relative_l20.55345, 0.51068, 0.50748
热方程时间推进fno,宽 32,深 24,800test_mse0.0042548, 0.0047314, 0.0051049
稀疏传感器场重建fno,宽 32,深 24,800test_relative_l20.14762, 0.15549, 0.15601

生成图像已通过独立新条件检查,长序列仍有边界

条件图像 diffusion(从噪声反复去噪生成图像)学习确定的几何条件映射。按前景交并比至少 0.7 且图像非空验收。源码冻结后另采 256 个未重复条件,三个训练 seed 的满足率为 90.63%、76.17%、91.80%,平均 86.20%。位置变化后的平均满足率为 83.33%。

条件图像生成真实样本,上行生成,下行目标
八个真实条件,上行为生成结果,下行为目标。

短复制验证了 4 token 源串、8 token 干扰,三个 seed 的整串错误率均为零。长复制参数变化后的测试失败。视频只验证了 16×16 单物体的 4 帧到 2 帧预测。原始 4 帧到 8 帧尚未解决。多步向量、图和场原型直接输出未来多个时刻,尚未验证预测结果递归回填的长期稳定性。

三组真实视频预测样本
三组真实样本,各组两列为未来两帧。四行依次为目标、卷积网络预测、全零预测、重复最后输入帧。

这些实例和候选经过探索筛选,当前结果证明原型可运行和生成题目。跨数据生成 seed 的稳定难度尚未验证,也不能代表自然图像或真实语言建模。

同一组题目上的答对率可与平衡选项基线比较

每类取一道冻结的三选一题目。模型只读题目和选项,预测相同预算下哪个候选效果最好。所有模型读相同题目,不调用工具。GPT 使用聊天接口,最多输出 8192 token,medium reasoning effort,temperature 使用服务默认值。Claude 使用 CLI,显式指定系统提示并禁用工具。

两类模型的请求路径不同。耗时包含接口传输与服务等待,不能据此比较模型架构的推理效率。token 按各服务返回口径统计。

评测前仅重排选项位置,候选和训练结果不变。正确答案分布为 A 5 道、B 5 道、C 5 道。随机选项基线为 33.3%,始终选同一字母的最佳基线为 33.3%。每类只有一道题,结果只能描述这组样本,不能证明整个题型的难度。

部分模型未取得全部 15 道题的有效回答。图中准确率的分母不同,当前不能对四个模型做完整排名。

四个模型都取得有效回答的题目中,7 道全对,0 道结果分歧,2 道全错。全对例子包括带干扰的延迟复制、小型语言模型从头预训练、条件图像 diffusion。全错例子包括随机小模型 next-token、混合阶数 token 预测。这只描述当前候选组合下的单道题表现,架构与预算变化会改变难度。

2026-10-12T18:31:21.318777 image/svg+xml Matplotlib v3.10.9, https://matplotlib.org/ 0% 33.3% 66.7% 100% 有效回答准确率 6-luna〔15/15 有效〕 6.1 sol〔15/15 有效〕 opus 5.5〔11/15 有效〕 haiku 5.5〔12/15 有效〕 66.7% 73.3% 72.7% 75.0% 随机/固定字母基线
橙条只统计有效回答,请求失败不视为能力错误。

6-luna 首轮接口配额不足后,在另一接口重测整组题。Claude 只对传输失败的请求恢复一次,保留已有有效回答。恢复过程只处理请求失败,不按答题对错重试。

答题准确率、请求失败与推理开销

答对数以全部 15 道题为分母单独列出。有效回答列按成功解析且模型身份相符的回答计算准确率。请求失败/格式失败分别计数。耗时是有效回答的请求耗时中位数,单位秒。token 是有效回答累计的输入/输出数。Claude 输入数包含普通输入、写入缓存与读取缓存,GPT 使用服务返回的总输入数。

模型答对/题目有效回答,准确率请求/格式失败耗时中位数输入/输出 token
6-luna
gpt-6-luna
10/1515,66.7%0 / 036.093,440 / 7,898
6.1 sol
gpt-6.1-sol
11/1515,73.3%0 / 08.793,440 / 3,029
opus 5.5
claude-opus-5-5
8/1511,72.7%4 / 022.2110,454 / 12,641
haiku 5.5
claude-haiku-5-5
9/1512,75.0%3 / 015.4120,060 / 12,215
每道题的结果
题型6-luna6.1 solopus 5.5haiku 5.5
随机小模型 next-token错错错错
混合阶数 token 预测错错错错
带干扰的延迟复制对对对对
小型语言模型从头预训练对对对对
从头 on-policy 蒸馏对对错请求失败
隐状态时间序列预测错对对请求失败
延迟动力系统预测错对请求失败对
合成图像关系分类对对请求失败对
条件图像 diffusion对对对对
移动形状视频预测错错请求失败错
图上的最短路对对对对
图上的动态扩散对对对对
Poisson 解映射对错请求失败请求失败
热方程时间推进对对对对
稀疏传感器场重建对对对对

任务和可执行验收必须一起保存

MiMo 的固定版本 README把领域、题型与验收方式一起组织。这里借用这一结构,没有在此核验整个语料的质量。可复用经验记录保存任务 spec、候选对照、相同预算、seed 波动、适用范围与失败案例。