From 88bed2a1ef3d5d113c0cff210aae6c63daaa6c9f Mon Sep 17 00:00:00 2001 From: hisatri Date: Tue, 22 Jul 2025 22:53:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BA=E6=96=87=E5=AE=8C=E6=88=90=E8=93=9D?= =?UTF-8?q?=E5=9B=BE=E5=88=9D=E6=AD=A5=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- paper/main.tex | 23 +++++ paper/preamble.tex | 49 +++++++++++ paper/sections/00_abstract.tex | 10 +++ paper/sections/01_introduction.tex | 29 ++++++ paper/sections/02_problem_analyze.tex | 122 ++++++++++++++++++++++++++ paper/sections/03_training.tex | 60 +++++++++++++ 6 files changed, 293 insertions(+) create mode 100644 paper/main.tex create mode 100644 paper/preamble.tex create mode 100644 paper/sections/00_abstract.tex create mode 100644 paper/sections/01_introduction.tex create mode 100644 paper/sections/02_problem_analyze.tex create mode 100644 paper/sections/03_training.tex diff --git a/paper/main.tex b/paper/main.tex new file mode 100644 index 0000000..1b03a71 --- /dev/null +++ b/paper/main.tex @@ -0,0 +1,23 @@ +\documentclass[12pt, a4paper]{article} + +% 引入导言区设置 +\input{preamble} + +% --- 文档信息 --- +\title{一种2D相对位置编码self-attention估值策略网络在2048游戏中的应用} +\author{-} +\date{\today} + +\begin{document} + +\maketitle +\tableofcontents +\newpage + +% 引入各章节内容 +\input{sections/00_abstract} +\input{sections/01_introduction.tex} +\input{sections/02_problem_analyze.tex} +\input{sections/03_training.tex} + +\end{document} diff --git a/paper/preamble.tex b/paper/preamble.tex new file mode 100644 index 0000000..1944c1f --- /dev/null +++ b/paper/preamble.tex @@ -0,0 +1,49 @@ +% 中文支持 +\usepackage{ctex} + +% 基本包 +\usepackage{amsmath,amssymb,amsfonts} % 数学公式支持 +\usepackage{graphicx} % 图片支持 +\usepackage{booktabs} % 表格美化 +\usepackage{hyperref} % 超链接支持 +\usepackage{cite} % 引用支持 +\usepackage{listings} % 代码块支持 +\usepackage{algorithm} % 算法环境 +\usepackage{algpseudocode} % 算法伪代码 +\usepackage{float} % 控制浮动体 +\usepackage{caption} % 标题控制 +\usepackage{subcaption} % 子图标题 + +% 页面设置 +\usepackage{geometry} +\geometry{left=2.5cm,right=2.5cm,top=2.5cm,bottom=2.5cm} + +% 超链接设置 +\hypersetup{ + colorlinks=true, + linkcolor=blue, + filecolor=magenta, + urlcolor=cyan, + citecolor=green +} + +% 代码块设置 +\lstset{ + basicstyle=\small\ttfamily, + keywordstyle=\color{blue}, + commentstyle=\color{green!60!black}, + stringstyle=\color{red}, + numbers=left, + numberstyle=\tiny, + numbersep=5pt, + frame=single, + breaklines=true, + breakatwhitespace=true +} + +% 图表设置 +\graphicspath{{figures/}} % 图片路径 + +% 其他设置 +\setcounter{tocdepth}{3} % 目录深度 +\setcounter{secnumdepth}{3} % 章节编号深度 diff --git a/paper/sections/00_abstract.tex b/paper/sections/00_abstract.tex new file mode 100644 index 0000000..9b125c5 --- /dev/null +++ b/paper/sections/00_abstract.tex @@ -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、估值策略网络 diff --git a/paper/sections/01_introduction.tex b/paper/sections/01_introduction.tex new file mode 100644 index 0000000..4c780ca --- /dev/null +++ b/paper/sections/01_introduction.tex @@ -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} diff --git a/paper/sections/02_problem_analyze.tex b/paper/sections/02_problem_analyze.tex new file mode 100644 index 0000000..00cb44c --- /dev/null +++ b/paper/sections/02_problem_analyze.tex @@ -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} + diff --git a/paper/sections/03_training.tex b/paper/sections/03_training.tex new file mode 100644 index 0000000..8d59024 --- /dev/null +++ b/paper/sections/03_training.tex @@ -0,0 +1,60 @@ +\section{模型训练} +为了训练一个强大的估值决策模型,我们采用蒙特卡洛树搜索(MCTS)生成高质量的训练数据,并设计一个轻量级的残差卷积网络(RNCNN)进行初步学习与迭代。 + +\subsection{蒙特卡洛树搜索策略} +采用纯MCTS(Pure MCTS)为初始模型生成训练数据。MCTS的每次迭代包含四个核心步骤,以当前棋盘状态为根节点,不断扩展搜索树。 + +\begin{itemize} + \item \textbf{选择 (Selection)}: 从根节点开始,根据UCT(Upper 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)的增强回路,不断迭代优化模型性能。