论文完成蓝图初步定义

This commit is contained in:
hisatri
2025-07-22 22:53:20 +08:00
parent a1e81ad870
commit 88bed2a1ef
6 changed files with 293 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
\begin{abstract}
本文拟设计一种新的2048游戏训练流程最终目的是使用大参数的2D相对位置编码自注意力神经网络
完成对游戏局面的精确估值和决策并尝试将模型能力由基本的4×4扩展到3~10之间任意边长、任意长宽比的棋盘尺寸。
本文拟设计一种从小参数残差卷积网络ResNet-style CNN结合蒙特卡洛树搜索
迁移到中等规模的2D相对位置编码自注意力网络的训练流程利用CNN+MCTS多次迭代后生成的低噪声高质量数据
指导Transformer模型的高效训练
\end{abstract}
\textbf{关键词:} 2048游戏、深度强化学习、相对位置编码、self-attention、估值策略网络

View File

@@ -0,0 +1,29 @@
\section{引言}
\subsection{研究背景}
2048游戏自2014年发布以来因其简单的规则和复杂的策略性而广受欢迎。
作为一个完全信息的确定性游戏除了新数字的随机生成2048为研究自监督人工智能算法提供了一个理想的测试平台。
\subsection{研究动机}
传统的卷积神经网络(CNN)在处理2048游戏时存在以下局限性
\begin{itemize}
\item 固定的感受野限制了对全局信息的捕获
\item 缺乏对位置关系的显式建模
\item 难以处理不同位置间的长距离依赖关系
\end{itemize}
Self-attention机制的出现为解决这些问题提供了新的思路。通过引入2D相对位置编码我们可以
\begin{itemize}
\item 显式建模网格中任意两个位置间的关系
\item 捕获全局的状态信息
\item 学习位置无关的特征表示
\end{itemize}
\subsection{符号定义}
\begin{itemize}
\item 棋盘矩阵 $K$
\item 矩阵元素 $K_{i,j}$
\item 方块数字 $N$
\item 对数变化后的方块数字 $N' = \log_2(N)$
\item 对数变化后的矩阵 $K'$
\end{itemize}

View File

@@ -0,0 +1,122 @@
\section{问题分析}
\subsection{2048游戏特点}
2048游戏是一个基于网格的数字合并游戏具有以下特点
\begin{itemize}
\item 4×4的网格状态空间
\item 四个基本动作:上、下、左、右
\item 确定性的游戏规则和随机的数字生成
\item 指数级增长的状态复杂度
\item 决策时可以认为全局无状态性
\item 对棋盘进行对称变换对游戏无影响
\end{itemize}
\subsection{问题及解决思路}
\subsubsection{棋盘上的数字表示}
在2048游戏中方块上的数字呈指数增长$2^1, 2^2, \dots$)。理论上,在一个 $4 \times 4$ 的棋盘上,可能出现的最大数字为 $2^{17}$
这种巨大的范围和稀疏的分布,显然不利于神经网络进行有效学习和泛化。
为了解决此问题,我们可以对棋盘状态进行对数变换。
令棋盘状态为一个矩阵 $K \in \mathbb{N}$
其中 $K_{i,j}$ 表示在 $(i,j)$ 位置的数字,空位记为 $0$
我们定义一个新的状态表示矩阵 $K'$,其元素 $K'_{i,j}$ 通过以下映射获得:
\begin{equation}
K'_{i,j} =
\begin{cases}
\log_2(K_{i,j}) & \text{if } K_{i,j} > 0 \\
0 & \text{if } K_{i,j} = 0
\end{cases}
\end{equation}
通过这种对数变换,我们可以将指数增长的数值尺度压缩到一个线性、紧凑的整数范围。
这种方法同样适用于任意边长的矩形棋盘。
\subsubsection{棋盘压缩}
2048棋盘可以看做是一个平面图像这个图像的8个旋转和镜像结果
对于游戏而言是完全等价的。我们将每个图像的二面体群$D_4$的所有等价类进行合并,
即可显著压缩棋盘表示的空间,避免对等价局面进行重复搜索。
我们使用以下步骤,将二面体群的所有等价类压缩到同一哈希桶:
\begin{itemize}
\item 对于给定的局面输入获得其8种变换覆盖$D_4$的所有元素:
\begin{itemize}
\item 原始图像 (R0): matrix
\item 旋转90° (R90): \texttt{rotate\_90(matrix)}
\item 旋转180° (R180): \texttt{rotate\_90(rotate\_90(matrix))}
\item 旋转270° (R270): \texttt{rotate\_90(rotate\_90(rotate\_90(matrix)))}
\item 水平翻转 (F): \texttt{flip\_horizontal(matrix)}
\item 翻转后旋转90° (F+R90): \texttt{rotate\_90(flip\_horizontal(matrix))}
\item 翻转后旋转180° (F+R180): \texttt{rotate\_90(rotate\_90(flip\_horizontal(matrix)))}
\item 翻转后旋转270° (F+R270): \texttt{rotate\_90(rotate\_90(rotate\_90(flip\_horizontal(matrix))))}
\end{itemize}
\item 采用行优先方式将矩阵拉平为1D向量
\item 比较这些向量的字典序,将字典序最小的向量作为该图的范式
\item 计算哈希,存储到哈希表或者搜索缓存
\end{itemize}
这种方案亦可推广到任意矩形棋盘。
\subsubsection{棋盘分数计算}
对于估值网络而言,一个准确的、有代表性的最终得分,是模型学习的重要依据,也是训练效果的关键因素。
然而由于2048可能随机生成2或者4这使得某一局面的最终分数存在不确定性。但是这不妨碍我们在计算得分时排除掉随机因素。
在计算盘面得分时我们假设只会随机生成2但在蒙特卡洛树搜索时我们考虑2和4随机出现的概率。
这样既能够保证模型学习到随机数字情况下的决策,又能显著降低噪声,同时提高缓存命中率。
2048游戏的计分规则为当两个较小的数字合并为一个较大数字时增加等值于较大数字的分数 $\Delta S$
合成一个数字,其奖励分数存在以下对应关系:
\begin{itemize}
\item $\Delta S_4 = 4$
\item $\Delta S_8 = 8$
\item $\dots$
\item $\Delta S_{2^n} = 2^n$
\end{itemize}
假设游戏仅随机生成数字2则每个数字的累积分数价值为
\begin{itemize}
\item $V(2) = 0$ 2不能通过合成得到其累积分数价值为0
\item $V(4) = 4$
\item $V(8) = 4 + 4 + 8 = 16$ 涵盖了合成8用到的2个4的分数价值以及合成8本身增加的分数价值
\item $V(16) = 16 + 16 + 16 = 48$
\item $V(32) = 48 + 48 + 32 = 128$
\item $V(64) = 128 + 128 + 64 = 320$
\end{itemize}
显然对于一个大于2的数字 $N$,其累积分数价值 $V(N)$ 可以递归地表示为:
\begin{equation}
V(N) = V\left(\frac{N}{2}\right) + V\left(\frac{N}{2}\right) + N
\end{equation}
同时,我们有基础情况:
\begin{equation}
V(2) = 0
\end{equation}
将数值迁移到对数变化后的矩阵,令 $f(N') = V(2^{N'})$,则有:
\begin{equation}
f(N') = 2 \cdot f(N'-1) + 2^{N'}
\end{equation}
将递推关系式 $f(N') = 2 \cdot f(N'-1) + 2^{N'}$ 展开:
\begin{align}
f(N') &= 2 \cdot f(N'-1) + 2^{N'} \\
&= 2 \cdot [2 \cdot f(N'-2) + 2^{N'-1}] + 2^{N'} \\
&= 2^2 \cdot f(N'-2) + 2 \cdot 2^{N'-1} + 2^{N'} \\
&= 2^2 \cdot f(N'-2) + 2^{N'} + 2^{N'} \\
&= 2^2 \cdot f(N'-2) + 2 \cdot 2^{N'} \\
&= \cdots \\
&= 2^{N'-1} \cdot f(1) + (N'-1) \cdot 2^{N'} \\
&= 2^{N'-1} \cdot 0 + (N'-1) \cdot 2^{N'} \\
&= (N'-1) \cdot 2^{N'}
\end{align}
检查,当$N'=1$,即$N=2$时,有:
\begin{equation}
f(1) = (1-1) \cdot 2^1 = 0
\end{equation}
该结果符合定义 $V(2) = 0$
因此上述通项公式涵盖所有情况,数字 $N = 2^{N'}$ 的累积分数价值为:
\begin{equation}
V(N) = (\log_2(N) - 1) \cdot N
\end{equation}

View File

@@ -0,0 +1,60 @@
\section{模型训练}
为了训练一个强大的估值决策模型我们采用蒙特卡洛树搜索MCTS生成高质量的训练数据并设计一个轻量级的残差卷积网络RNCNN进行初步学习与迭代。
\subsection{蒙特卡洛树搜索策略}
采用纯MCTSPure MCTS为初始模型生成训练数据。MCTS的每次迭代包含四个核心步骤以当前棋盘状态为根节点不断扩展搜索树。
\begin{itemize}
\item \textbf{选择 (Selection)}: 从根节点开始根据UCTUpper Confidence bounds applied to Trees公式递归选择子节点直到达到一个未完全扩展的叶子节点。UCT公式平衡了节点的探索Exploration与利用Exploitation
\[ \text{UCT} = \underset{i}{\arg\max} \left( \bar{v}_i + C \cdot \sqrt{\frac{\ln(N)}{n_i}} \right) \]
其中 $\bar{v}_i$ 是子节点 $i$ 的平均价值,$N$ 是父节点访问次数,$n_i$ 是子节点 $i$ 访问次数,$C$ 是探索常数。
\item \textbf{扩展 (Expansion)}: 当选择过程到达一个叶子节点 $L$ 时,如果该节点代表的局面不是终局,则为其创建一个或多个子节点,对应于从 $L$ 出发所有合法的移动。
\item \textbf{模拟 (Simulation)}: 从新扩展的子节点中选择一个开始进行模拟也称Rollout。在此阶段我们采用快速的随机策略例如在所有合法移动中随机选择一个持续进行游戏直到达到终局状态。终局的分数将作为本次模拟的价值。
\item \textbf{反向传播 (Backpropagation)}: 将模拟得到的终局分数 $v$ 从该叶子节点开始,沿着选择路径反向传播回根节点。路径上的每一个节点都会更新其访问次数 $n$ 和累积价值 $V$,并重新计算其平均价值 $\bar{v} = V/n$
\end{itemize}
\subsection{数据结构}
通过大量的MCTS模拟我们将叶子节点的信息转换为神经网络可学习的训练样本。每个样本包含
\begin{itemize}
\item 棋盘状态 $S$:一个 $H \times W$ 的矩阵,代表游戏局面。
\item 策略-价值对 $(\pi, v)$:其中 $\pi$ 是从状态 $S$ 出发的一个合法移动(例如:上、下、左、右),$v$ 是在该分支下通过后续模拟所能达到的最高分。
\end{itemize}
我们将 $(S, \pi)$ 作为键key当一次完整的MCTS模拟结束后解析所有扩展出的叶子节点。对于每个叶子节点 $(S, \pi)$,其价值 $v$ 等于它后续所有模拟游戏中的最高分。
\begin{itemize}
\item 如果一个键 $(S, \pi)$ 没有命中缓存,则写入 $(S, \pi) \rightarrow v$
\item 如果一个叶子节点的新分数大于缓存中的值,则更新 $(S, \pi) \rightarrow v$
\end{itemize}
在进行指定次数的MCTS模拟后导出所有缓存的 $(S, \pi) \rightarrow v$ 对,作为最终的训练数据集。
\subsection{残差卷积网络L0}
RNCNN\_L0 是一个极小的、用于快速推理和迭代的估值决策模型。其设计目标是在有限的计算资源下,学习到基本的局面评估能力。其结构定义如下:
\begin{itemize}
\item \textbf{输入层 (Input Layer)}:
棋盘状态 $S$(一个 $H \times W$ 的矩阵)首先进行特征化处理。我们将每个格子的值 $V$ 转换为 $C$ 个特征平面channel每个平面代表一个特定的瓦片值例如$V \rightarrow \log_2(V)$,然后进行独热编码)。输入张量的维度为 $(H, W, C)$
\item \textbf{卷积主干 (Convolutional Body)}:
输入张量首先通过一个卷积层,然后送入一个由 $N$ 个残差块Residual Block组成的序列。
\begin{itemize}
\item \textbf{初始卷积层}: 一个$3 \times 3$的卷积核输出64个特征图进行批量归一化Batch Normalization和ReLU激活。
\item \textbf{残差块}: 每个残差块包含两个卷积层。输入通过第一个 $3 \times 3$ 卷积层BN+ReLU再通过第二个 $3 \times 3$ 卷积层BN然后将结果与块的输入相加残差连接最后通过一个ReLU激活函数。所有卷积层保持64个通道数。
\end{itemize}
\item \textbf{输出头 (Output Head)}:
残差主干的输出特征图被送入一个最终的输出模块,该模块直接预测四个动作的价值。
\begin{itemize}
\item 一个 $1 \times 1$ 的卷积层将通道数从64降至16进行BN和ReLU激活。
\item 将特征图展平Flatten成一维向量。
\item 一个全连接层Fully Connected Layer将向量映射到4个输出神经元分别对应四个移动方向上、下、左、右的预测价值。
\end{itemize}
\end{itemize}
模型的损失函数采用均方误差Mean Squared Error计算网络预测的四通道价值与MCTS生成数据中对应动作的价值 $v$ 之间的差距。
\subsection{模型初始化}
我们计划在3$\times$3的小棋盘上依靠纯蒙特卡洛树的快速搜索能力生成大量的初始数据。小棋盘状态空间较小MCTS能更快地收敛到有意义的策略为模型提供高质量的初始训练样本。
\subsection{L0迭代}
在纯蒙特卡洛生成的数据上学习到的大量初始数据将提供给RNCNN\_L0进行监督学习训练。训练完成的L0模型可以反过来指导MCTS中的选择和模拟阶段形成一个自我博弈self-play的增强回路不断迭代优化模型性能。