自己下着学

我们放弃了背顺序,让模型自己下盘面。模型给出一手后,服务器会与正确答案核对,如果错了,就由神谕(oracle,知道正确答案的代码)代替它下出正确的一手。用这样积累下来的记录,每3局接着训练一次LoRA。

三天里跑了34个周期。模型给出的着法中正确的比例,每个周期在2.0~3.6%之间,整体是62,842次中的1,695次(2.7%)。无论怎么反复训练都没有提高。

一次找出确定的格子

接下来,我们让模型直接从整个盘面中选出一个100%确定的格子(lora_cell)。把答错的题收集起来重新放进去,跑了7个周期,但50道测试题的正确率只有6~16%。让它在实际盘面上下15手,结果是0~33%。

我们还尝试了把数字和格子分开、从简单的部分开始教的课程学习。猜数字从34%降到了26%,猜格子则一直停在0%不动。

试错训练34个周期和寻找确定格子7个周期的正确率
试错训练34个周期和寻找确定格子7个周期的正确率

神谕教了什么

大约在这个时候,我把人解数独的方法另外写进了solve.md。在那份文档里,我这样写下了失败的原因。

概率不到20%的值神谕是知道的,并且把这个值训练给vlm,所以训练出来的结果之间没有差别,因此vlm看起来完全没有“为什么这个正确答案会是这样”的规律性。

神谕总是知道正确答案。它不关心那个格子在当前盘面上能否通过推理确定。混入了在盘面上找不到依据的正确答案,模型也就没有可以学习的规则。这和第1篇中的答案表是同一个问题。

这一步的实际代码

这是下3局再训练的循环中的一个周期。下完盘面,从积累的记录中提取训练数据,然后接着训练LoRA。

vlm_play_train_loop.pypython · 38 行
results, play_accuracy = run_games(
    session,
    games=args.games_per_cycle,
    difficulty=args.difficulty,
    max_steps=args.max_steps,
    verbose=args.verbose,
    save_images=None,
    game_id_start=state.game_id_next,
    accuracy=play_accuracy,
    human=args.human,
)
state.game_id_next += args.games_per_cycle
print_summary(results, play_accuracy)
print(f"\n사이클 {cycle} 시도정답률(리젝 포함): {play_accuracy.fmt()}")

# ...

total_lines = count_replay_lines(replay_path)
cycle_jsonl = cycle_sft_dir / f"cycle_{cycle:04d}.jsonl"
kept, new_total, by_outcome = export_trainable(
    replay_path,
    cycle_jsonl,
    since_line=state.replay_line_offset,
)

# ...

t0 = time.monotonic()
exit_code = run_training(
    dataset_jsonl=cycle_jsonl,
    base_model=args.base_model,
    adapter_dir=adapter_in,
    output_dir=args.output_dir,
    device=args.device,
    epochs=args.train_epochs,
    batch_size=args.batch_size,
    grad_accum=args.grad_accum,
)

下一篇是“3. 把人的解法变成规则”。