深入解析DouZero斗地主AI中的神经网络模型设计
2025-07-08 07:42:50作者:卓艾滢Kingsley
模型架构概述
DouZero项目中的神经网络模型采用了LSTM与多层感知机(MLP)相结合的架构,专门为斗地主游戏设计。该模型包含三个主要角色:地主(landlord)和两个农民(landlord_up和landlord_down),每个角色都有独立的模型结构,但农民模型结构相同。
核心模型类解析
LandlordLstmModel(地主模型)
地主模型是专门为地主角色设计的神经网络,主要结构包括:
- LSTM层:输入维度162,隐藏层维度128,用于处理序列信息
- 全连接层:6层512维的MLP,每层后接ReLU激活函数
- 输入处理:将LSTM输出(128维)与原始特征(373维)拼接,形成501维的输入
class LandlordLstmModel(nn.Module):
def __init__(self):
super().__init__()
self.lstm = nn.LSTM(162, 128, batch_first=True)
self.dense1 = nn.Linear(373 + 128, 512)
# ... 其他dense层
FarmerLstmModel(农民模型)
农民模型结构与地主模型类似,但输入维度有所不同:
- LSTM层:同样162输入,128隐藏层
- 全连接层:6层512维MLP
- 输入处理:LSTM输出(128维)与更大维度的原始特征(484维)拼接,形成612维输入
class FarmerLstmModel(nn.Module):
def __init__(self):
super().__init__()
self.lstm = nn.LSTM(162, 128, batch_first=True)
self.dense1 = nn.Linear(484 + 128, 512)
# ... 其他dense层
模型统一接口类
Model
类提供了三个模型的统一接口,主要功能包括:
- 模型初始化:根据设备(CPU/GPU)初始化三个模型
- 前向传播:根据角色(position)选择对应模型进行前向计算
- 模型管理:共享内存、切换评估模式、获取参数等
class Model:
def __init__(self, device=0):
self.models = {}
# 初始化三个模型并移动到指定设备
self.models['landlord'] = LandlordLstmModel().to(torch.device(device))
self.models['landlord_up'] = FarmerLstmModel().to(torch.device(device))
self.models['landlord_down'] = FarmerLstmModel().to(torch.device(device))
关键技术点解析
1. 输入特征处理
模型接收两种输入:
z
:162维的序列数据,由LSTM处理x
:静态特征(地主373维,农民484维)
两者在LSTM处理后拼接,形成完整的输入特征。这种设计可以同时捕捉序列信息和静态特征。
2. 探索与利用平衡
在前向传播时,模型支持ε-greedy策略,通过flags.exp_epsilon
控制探索概率:
if flags is not None and flags.exp_epsilon > 0 and np.random.rand() < flags.exp_epsilon:
action = torch.randint(x.shape[0], (1,))[0] # 随机探索
else:
action = torch.argmax(x,dim=0)[0] # 利用最优动作
3. 深度网络设计
两个模型都采用了6层512维的全连接网络,这种深度设计能够学习复杂的非线性关系,适合斗地主这种策略复杂的游戏。
模型应用场景
- 训练阶段:使用
return_value=True
获取所有动作的价值估计 - 评估/测试阶段:使用
return_value=False
直接输出最优动作或随机探索动作 - 多设备支持:可通过device参数指定CPU或GPU运行
设计优势分析
- 角色专用模型:地主和农民采用不同模型,可以更好地学习各自策略
- 序列+静态特征:LSTM处理序列信息,MLP处理静态特征,全面捕捉游戏状态
- 统一接口:Model类封装了三个模型,便于管理和使用
- 灵活的运行模式:支持训练和评估两种模式,并内置探索机制
总结
DouZero的模型设计充分考虑了斗地主游戏的特性,通过LSTM与深度MLP的结合,能够有效处理游戏中的序列决策问题。地主与农民模型的差异化设计,以及统一的接口封装,使得整个系统既灵活又高效。这种设计思路对于类似的非完美信息策略游戏AI开发具有很好的参考价值。