Mind Lab Toolkit (MinT)
CustomizeRL

Math RL

Math RL 用一个确定性 verifier 给算术或代数题打分。给定标准答案,verifier 从 model 输出里提取预测答案,返回 1.0(对)或 0.0(错)。这个简单的 reward 信号在结构化任务上特别有效。

参考实现是 demos/rl/adapters/verifiable_math.py,用精确匹配评分解决加法题。

Configuration

用标准 GRPO 循环搭 Math RL:

import mint
from mint import types

service_client = mint.ServiceClient()
training_client = service_client.create_lora_training_client(
    base_model="Qwen/Qwen3-0.6B",
    rank=16,
    train_mlp=True,
    train_attn=True,
    train_unembed=True,
)

tokenizer = training_client.get_tokenizer()
adam_params = types.AdamParams(learning_rate=2e-5)

然后从 verifiable_math.py 跑 adapter:

from demos.rl.adapters.verifiable_math import VerifiableMathAdapter
from demos.rl.rl_core import RLConfig, run_grpo

cfg = RLConfig(
    model="Qwen/Qwen3-0.6B",
    rank=16,
    steps=10,
    batch=8,
    group=4,
    lr=2e-5,
    max_tokens=16,
    temperature=0.8,
)

run_grpo(VerifiableMathAdapter(), cfg)

Prompting Guide

数学题用 few-shot 示例 + 题目本身渲染出来:

class VerifiableMathAdapter(RLAdapter):
    FEWSHOT = "Q: What is 4 + 5?\nA: 9\n\n"

    def make_prompt(self, sample: tuple[str, int], tokenizer) -> list[int]:
        question, _ = sample
        return tokenizer.encode(self.FEWSHOT + question)

对于一题 (question="What is 3 + 7?", answer=10),encode 后的 prompt 是:

Q: What is 4 + 5?
A: 9

Q: What is 3 + 7?
A:

Model 然后生成 response。Verifier 提取数字答案,和标准答案比较。

关键模式: 题目本身和 few-shot 前缀都属于 prompt(训练时 loss weight 为 0)。只有 answer token 拿到 loss weight 和 advantage 缩放。

Output Format

Verifier 从 response 里提第一个整数:

def compute_reward(self, response: str, sample: tuple[str, int]) -> float:
    _, answer = sample
    match = re.search(r"-?\d+", response)
    return 1.0 if match and int(match.group()) == answer else 0.0
  • reward = 1.0: 提取的答案与标准答案一致。
  • reward = 0.0: 提不出数字,或答案不一致。

来自同一 prompt 的 group_size 个样本组成一个 group,advantage 用中心化算:adv[i] = reward[i] - mean_reward_in_group。这会把 policy 推向高 reward 样本,压低低 reward 样本。

可选的部分 credit(参考脚本里没做,但更难的数据集上值得考虑):response 含有正确格式(比如有数字,哪怕错的)但不是确切答案,给 0.5。

All Parameters

参数类型默认值含义
stepsint5训练 step(采样 + 训练)。
batchint8每 step 题目数。
groupint4每题样本数(group_size)。
learning_ratefloat2e-5Adam 学习率。Math RL 取 1e-5 到 4e-5。
max_tokensint16最大生成长度。Math:8–32(答案短)。
temperaturefloat0.8采样温度。越高越多样。典型值 0.7–1.0。
base_modelstr"Qwen/Qwen3-0.6B"base model。
rankint16LoRA rank。
train_mlpboolTrue训练 MLP。
train_attnboolTrue训练 attention。
train_unembedboolTrue训练输出层。

环境变量(来自 rl_core.py):

export MINT_BASE_MODEL="Qwen/Qwen3-0.6B"
export MINT_LORA_RANK=16
export MINT_RL_STEPS=10
export MINT_RL_BATCH=8
export MINT_RL_GROUP=4
export MINT_RL_LR=2e-5
export MINT_RL_MAX_TOKENS=16
export MINT_RL_TEMPERATURE=0.8

用法:

cfg = RLConfig.from_env()
run_grpo(VerifiableMathAdapter(), cfg)

扩展到其它数学领域:VerifiableMathAdapter 换成你自己的 RLAdapter,实现 build_dataset()make_prompt()compute_reward()。GSM8K 这类应用题,把 max_tokens 提到 256 给 chain-of-thought 推理留余地。

本页目录