\section{模型训练}
为了训练一个强大的估值决策模型，我们采用蒙特卡洛树搜索（MCTS）生成高质量的训练数据，
并设计一个轻量级的残差卷积网络（RNCNN）进行初步学习与迭代。

\subsection{蒙特卡洛树搜索策略}
我们采用纯蒙特卡洛树搜索（Pure MCTS）为初始模型生成训练数据。
MCTS的每次迭代包含四个核心步骤，以当前棋盘状态为根节点，不断扩展搜索树。

\begin{itemize}
    \item \textbf{选择 (Selection)}: 
    %% 修改点：将UCT公式本身与选择策略分开，表述更严谨
    从根节点开始，根据UCT（Upper Confidence bounds applied to Trees）选择策略递归选择子节点，
    直到达到一个未完全扩展的叶子节点。该策略会选择具有最大UCT值的子节点 $i$。节点 $i$ 的UCT值计算公式为：
    \[ \text{UCT}_i = \bar{v}_i + C \cdot \sqrt{\frac{\ln(N)}{n_i}} \]
    其中，$\bar{v}_i$ 是子节点 $i$ 的平均回报（mean return），$N$ 是其父节点的访问次数，$n_i$ 是子节点 $i$ 的访问次数，
    $C$ 是平衡探索与利用的常数。$i$ 遍历当前节点所有已发现的子节点。

    \item \textbf{扩展 (Expansion)}: 当选择过程到达一个叶子节点 $L$ 时，若该节点所代表的局面非终局，
    则为其创建一个或多个子节点，对应于从状态 $L$ 出发的所有合法走法。

    \item \textbf{模拟 (Simulation)}: 
    从新扩展的子节点中选择一个，开始进行快速走子（Rollout）。在此阶段，我们采用一个快速的默认策略
    （例如，在所有合法移动中均匀随机选择）进行游戏，直至达到终局状态。终局的收益（如 胜/负/平 对应 +1/-1/0，或游戏得分）
    被记录为本次模拟的回报 $z$。

    \item \textbf{反向传播 (Backpropagation)}: 
    将模拟得到的回报 $z$ 从该叶子节点开始，沿选择路径反向传播至根节点。
    路径上的每个节点 $j$ 都会更新其统计量：访问次数 $n_j \leftarrow n_j + 1$，
    总回报 $V_j \leftarrow V_j + z$。其平均回报也相应更新为 $\bar{v}_j = V_j / n_j$。
\end{itemize}

\subsection{数据结构}
通过大量的MCTS模拟，我们将每个访问过的状态及其MCTS分析结果转化为神经网络可学习的训练样本。

我们为每个经过充分模拟的状态 $S$ 生成一个训练目标。
该目标是一个动作价值向量 $\mathbf{\pi}(S) \in \mathbb{R}^{|\mathcal{A}|}$，
其中 $\mathcal{A} = \{\text{上, 下, 左, 右}\}$ 是动作空间。
向量的每个分量 $\pi_a(S)$ 代表在状态 $S$ 下，
执行动作 $a$ 后，MCTS估算出的期望回报。

\begin{itemize}
    \item 对于不合法的移动或在MCTS中未被探索到的动作 $a$，
    我们将其价值设为一个特殊的掩码值$\pi_a = -1$，并在计算损失函数时忽略这些项。
    \item 所有状态 $S$ 及其对应的动作价值向量 $\mathbf{\pi}(S)$ 被存储在一个持久化的缓存中。
    该缓存结构为 $\text{Cache}: \mathcal{S} \rightarrow \mathbb{R}^{|\mathcal{A}|}$，
    其中 $\mathcal{S}$ 是所有遇到过的状态集合。为了高效检索，我们使用状态的哈希值作为键。
\end{itemize}

缓存的更新策略如下：
\begin{itemize}
    \item \textbf{初始写入：} 若状态 $S$ 不在缓存中，则在完成对 $S$ 的MCTS模拟后，将映射 $S \mapsto \mathbf{\pi}(S)$ 添加到缓存中。
    \item \textbf{缓存更新：} 
    我们定义状态 $S$ 的（估计）价值为其最优动作的价值，即 $v_{\text{state}}(S) = \max_{a \in \mathcal{A}} \pi_a(S)$。
    若状态 $S$ 已在缓存中，但在新一轮MCTS模拟后得到了新的价值向量 $\mathbf{\pi}'(S)$，且其状态价值 $v'_{\text{state}}(S) > v_{\text{state}}(S)$，则我们将缓存中的条目更新为 $S \mapsto \mathbf{\pi}'(S)$。此策略旨在保留能导向更优结果的搜索信息。
\end{itemize}

最终，我们将缓存中的数据转换为一个训练集 $\mathcal{D}$。对于缓存中的每一个 $(S, \mathbf{\pi}(S))$ 对，
我们将其展开为多个独立的样本，形成训练集 $\mathcal{D} = \{(S, a, \pi_a(S)) \mid \forall S \in \text{Cache}, \forall a \in \text{valid\_actions}(S)\}$。

\subsection{残差卷积网络L0}
RNCNN\_L0 是一个为快速推理和迭代设计的轻量级估值决策模型。其结构如下：

\begin{itemize}
    \item \textbf{输入层 (Input Layer)}:
    棋盘状态 $S \in \mathbb{R}^{H \times W}$ 首先经过特征化处理。
    将每个非空格子的值 $V$ 通过对数函数（如 $k = \log_2(V)$）映射为整数索引，
    再进行独热编码，形成 $C$ 个特征平面（channel）。最终的输入张量维度为 $(H, W, C)$，其中 $C$ 是编码后的特征总数。

    \item \textbf{卷积主干 (Convolutional Body)}:
    输入张量经过以下处理：
    \begin{itemize}
        \item \textbf{初始卷积层}: 一个 $3 \times 3$ 的填充卷积层，保持空间维度不变，后接批量归一化（Batch Normalization）和ReLU激活函数。
        \item \textbf{残差块序列}: 两个连续的残差块，每个残差块包含两个卷积层。输入首先通过一个 $3 \times 3$ 卷积层（BN+ReLU），
        再通过第二个 $3 \times 3$ 卷积层（BN），然后将结果与块的输入进行逐元素相加（残差连接），最后通过一个ReLU激活函数。
    \end{itemize}

    \item \textbf{输出头 (Output Head)}:
    卷积主干输出的特征图被送入一个专门设计的输出模块：
    \begin{itemize}
        \item 四个并行的 $1 \times 1$ 卷积层，每个对应一个方向（上、下、左、右），将特征图扩展为 $(H, W, 4)$ 的张量。
        \item 对每个方向通道分别应用全局最大池化（Global Max Pooling），得到四个标量值，分别对应四个方向的动作价值。
    \end{itemize}
\end{itemize}
模型的损失函数采用均方误差（Mean Squared Error, MSE）。
对于训练集中的每个样本 $(S, a, \pi_a(S))$，损失函数计算网络对状态 $S$ 预测的动作 $a$ 的价值与MCTS提供的目标价值 $\pi_a(S)$ 之间的差距。

\subsection{模型初始化}
我们在 $3 \times 3$ 的小棋盘上，依靠纯MCTS的快速搜索能力，生成大量的初始训练数据。
通过约200,000次完整的self-play对局（每局平均约50步），我们累积了约1000万个棋盘状态对作为训练样本。
由于小棋盘的状态空间有限，MCTS能够更快地收敛到高质量的策略，从而为模型提供优质的初始训练样本。

\subsection{L0迭代与迁移}
RNCNN\_L0模型在纯MCTS生成的初始数据上进行监督学习训练。
训练完成的L0模型可以反过来指导MCTS的选择与模拟阶段，以替代纯随机的Rollout策略，
从而形成一个自我对弈（self-play）的强化学习回路，持续迭代并提升模型性能。

L0模型的轻量级设计使其能够直接迁移到 $4 \times 4$ 和 $5 \times 5$ 的棋盘上运行，
为更大规模棋盘上的MCTS提供基础的估值和策略指导。由于其架构中使用了填充卷积和全局池化操作，
模型可以自然地适应不同尺寸的输入，无需额外的结构调整。