Files
deep2048/paper/sections/04_training.tex
2025-07-25 10:36:25 +08:00

99 lines
7.1 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\section{模型训练}
为了训练一个强大的估值决策模型我们采用蒙特卡洛树搜索MCTS生成高质量的训练数据
并设计一个轻量级的残差卷积网络RNCNN进行初步学习与迭代。
\subsection{蒙特卡洛树搜索策略}
我们采用纯蒙特卡洛树搜索Pure MCTS为初始模型生成训练数据。
MCTS的每次迭代包含四个核心步骤以当前棋盘状态为根节点不断扩展搜索树。
\begin{itemize}
\item \textbf{选择 (Selection)}:
%% 修改点将UCT公式本身与选择策略分开表述更严谨
从根节点开始根据UCTUpper 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提供基础的估值和策略指导。由于其架构中使用了填充卷积和全局池化操作
模型可以自然地适应不同尺寸的输入,无需额外的结构调整。