今天主要梳理剩余的TaxAI智能体的代码
可以看见这是一个基于 Bewley-Aiyagari 模型 的多智能体经济仿真系统,结合强化学习框架研究财政政策与异质性家庭行为的动态博弈。
Bewley-Aiyagari 模型是宏观经济学中研究异质性主体行为与不完全市场动态的核心框架,其核心思想是通过引入个体层面的未保险风险(如劳动收入冲击)和借贷约束,分析其对总体经济变量(如储蓄、利率、财富分布)的影响。
核心架构
agent:智能体----家庭决策网络学习消费-储蓄策略,政府网络优化税收政策
cfg:YAML配置文件(环境参数、训练超参数)----包含税率范围、GDP计算参数、家庭效用函数参数(σ=2, β=0.96)
entities:
经济主体类定义(政府/家庭/企业)----实现Aiyagari模型中的不完全市场借贷约束
env:经济环境核心逻辑(状态转移/奖励计算)----包含财富分布动态方程
utils:
数据处理工具(基尼系数计算、财富分布可视化)
关键文件
main.py | 训练流程主控模块 | 设置训练轮次(max_episode=1e6)、多进程数(num_env=16) |
evaluate.py | 政策效果评估模块 | 计算社会流动性指标:M=1/T∑∥Ginit−Ginit−1∥ |
arguments.py | 命令行参数解析 | 支持动态税率范围设置(--tau_min 0.1 --tau_max 0.3) |
data_process.py | 经济指标时序分析 | 产出-消费协整性检验、财富分布的Markov转移矩阵构建 |
target_param = (1 - tau) * target_param + tau * online_param
之后我们逐个文件分析
Agent文件
MADDPG文件
acrtor_critic:看名字就知道是一个AC架构的算法代码,为了后面组成DDPG
MAAC:实现了一个基于 MADDPG(多智能体深度确定性策略梯度) 的强化学习框架,用于训练政府与家庭智能体在税收政策环境中的协同决策。
maddpg:MADDPG
类的代码,
关键机制解析:
集中式Critic训练
- 输入设计:
- 状态:全局观测(gov_obs) + 所有家庭私有观测(private_obs)
- 动作:政府动作 + 所有家庭动作拼接
- 优势:Critic能够评估联合动作的全局价值,解决多智能体信用分配问题
目标网络与软更新
target_param = (1 - tau) * target_param + tau * online_param
减缓目标Q值的波动,提升训练稳定性
探索与利用平衡
- 衰减策略:
noise_rate
和epsilon
随训练线性衰减 - 效果:初期高探索率促进状态覆盖,后期降低噪声以收敛至最优策略
探索与利用平衡
- 衰减策略:
noise_rate
和epsilon
随训练线性衰减 - 效果:初期高探索率促进状态覆盖,后期降低噪声以收敛至最优策略
MADDPG_block文件
1.分群策略学习
智能体分群机制:这里能节省很多AC架构运行的开销,提升效率
# 根据财富排序observation
sorted_indices = torch.argsort(obs[:, -1], descending=True)
sorted_obs = obs[sorted_indices]
num_set = range(0, self.envs.households.n_households)
for i in range(self.args.agent_block_num-1):
if i ==0:
num = num_set[:int(0.1*self.envs.households.n_households)] # 前10%高财富家庭
elif i == 1:
num = num_set[int(0.1*...):int(0.5*...)] # 中间40%家庭
else:
num = num_set[int(0.5 *...):] # 后50%家庭
hou_action[num] = self.agents[i].select_action(...)
- 创新点:将家庭按财富分为3个群体,每个群体共享一个策略网络
- 优势:
- 减少需训练的Actor数量(从N个家庭→3个群体),提升训练效率
- 捕捉不同财富阶层的差异化行为模式(如高财富家庭更倾向投资)
政府智能体独立设计
self.args.agent_block_num = 4 # 3家庭群体 + 1政府
gov_action = self.agents[-1].select_action(...) # 政府使用独立网络
政府决策关注宏观指标(GDP、税收),需独立策略网络
2.状态预处理模块
def observation_wrapper(self, global_obs, private_obs):
# 归一化宏观经济指标
global_obs[0] /= 1e7 # GDP
global_obs[1] /= 1e5 # 总税收
private_obs[:, 1] /= 1e5 # 家庭收入
return global_obs, private_obs
缩放关键经济指标至合理范围,避免不同量纲特征导致神经网络训练不稳定,改为动态Z-score标准化,适应数据分布变化。
3. 训练流程优化
异步探索与更新
for t in range(epoch_length):
# 每隔10步更新一次网络
if t % 10 == 0:
transitions = self.buffer.sample(...)
for agent in self.agents:
agent.train(...) # 并行更新所有策略
探索衰减
self.noise = max(0.05, self.noise - 0.0000005) # 高斯噪声衰减
self.epsilon = max(0.05, self.epsilon - 0.0000005) # 随机探索衰减
经验回放设计
- 存储结构:包含全局状态、私有状态、联合动作、奖励等
- 采样逻辑:均匀采样,未实现优先经验回放(PER)
4. 评估与可观测性
多维经济指标追踪
wandb.log({
"wealth gini": avg_wealth_gini, # 财富基尼系数
"GDP": avg_gdp, # 人均GDP
"tax per households": avg_mean_tax, # 户均税收
...
})
关键指标:
- 公平性:财富/收入基尼系数
- 效率:GDP、户均税后收入
- 可持续性:税收总额、政府效用
但是现在它里面是固定分区间比例划分,不能适应动态的财富变化,或许可以加入:
- 动态分群:基于实时财富分位数调整阈值
- 软分群:通过注意力机制自动学习群体归属
maddpg文件:和上面MADDPG文件里面的类似
baseline文件:
1. 核心架构设计
异构智能体网络分离
# 政府网络独立设计
self.gov_actor = Actor(gov_obs_dim, gov_action_dim)
self.gov_critic = Critic(gov_obs_dim, gov_action_dim)
# 家庭共享网络
self.house_actor = SharedAgent(house_obs_dim, house_action_dim, n_households)
self.house_critic = SharedCritic(...)
- 创新点:
- 政府独立网络:处理宏观决策(税率调整),输入为GDP、总税收等全局状态
- 家庭共享网络:所有家庭共享同一组网络参数,通过不同私有观察值生成个性化动作
- 优势:
- 减少训练参数规模(从N个家庭网络→1个共享网络)
- 保持策略多样性:通过私有观察(财富、收入)实现差异化动作
分层Critic设计
# 政府Critic评估全局效用
gov_td_target = gov_rewards + γ * target_gov_qf(next_obs, next_action)
# 家庭Critic评估群体效用
house_td_target = house_rewards + γ * target_house_qf(next_obs, next_actions)
- 政府Critic关注税收政策对宏观经济的影响(GDP、财政收入)
- 家庭Critic衡量政策对个体福利的微观影响(税后收入、消费能力)
2. 关键实现机制
参数共享与个性化策略
# 家庭Actor网络处理多个智能体
hou_pi = self.house_actor(global_obs, private_obs, gov_action)
hou_action = get_action_info(hou_pi).select_actions()
协同探索机制
# 初始探索阶段
def _initial_exploration(self):
for _ in range(init_steps):
gov_action = gov_actor(obs) + Gaussian_noise
hou_action = house_actor(obs) + Gaussian_noise
3. 训练流程优化
双延迟更新
for _ in range(update_cycles):
# 政府与家庭网络交替更新
gov_loss, house_loss = self._update_network()
if timestep % target_update_interval == 0:
soft_update(target_gov, gov_critic)
soft_update(target_house, house_critic)
- 优势:
- 政府与家庭网络错开更新频率,提升稳定性
- 目标网络软更新(
tau=0.01
)防止Q值过估计
梯度混合反向传播
gov_actor_loss.backward()
house_actor_loss.backward()
# 共享网络参数同步更新
self.house_actor_optim.step()
- 政府与家庭梯度分别计算,但共享网络的梯度自动聚合
- 通过
reparameterize=True
实现策略梯度的可微分性
4. 创新点解析
经济指标驱动的奖励设计
# 政府奖励函数(示例)
gov_reward = α * GDP_growth + β * tax_revenue - γ * wealth_gini
# 家庭奖励函数
house_reward = post_tax_income - η * labor_cost
设计亮点:
- 政府需平衡效率(GDP)与公平(基尼系数)
- 家庭在税后收入与劳动成本间权衡
5. 性能优化策略
经验回放改进
# 分层经验采样
buffer.add(global_obs, private_obs, gov_action, hou_actions,...)
transitions = buffer.stratified_sample(
groups=[high_wealth, mid_wealth, low_wealth],
batch_size=512
)
- 实现方式:
- 按财富分位数划分经验组
- 分层采样确保各类家庭的经验均衡
混合探索策略
# 自适应探索噪声
if epoch < warmup_epochs:
noise = OUNoise(theta=0.15, sigma=0.3) # 高探索
else:
noise = GaussianNoise(mu=0, sigma=0.1 * (1 - epoch/total_epochs)) # 衰减探索
优势:
- 初期使用OU噪声探索连续动作空间
- 后期切换为衰减高斯噪声提升策略稳定性
BIMFAC文件
1. 整体架构设计
双层智能体结构
class BMFAC_agent:
def __init__(...):
# 政府策略网络
self.gov_actor = Actor(gov_obs_dim, gov_action_dim, ...)
# 家庭平均场策略网络
self.house_actor = BMF_actor_1(...)
# 政府Q函数(考虑家庭平均动作)
self.gov_critic = MFCritic(...)
# 家庭Q函数(考虑个体与群体交互)
self.house_critic = BMF_critic(...)
创新点:双层次决策架构
- 政府层:观测宏观经济指标(GDP、税收),输出税率政策
- 家庭层:基于平均场理论,共享策略网络处理大规模家庭决策
平均场交互机制
def get_tensor_mean_action(self, actions, wealth):
# 按财富排序,计算前10%和后50%的平均动作
top10_mean = mean(top10_actions)
bot50_mean = mean(bot50_actions)
return concat(top10_mean, bot50_mean)
技术细节:
- 动态计算高/低收入群体的平均动作(mean field)
- 政府Critic输入包含这两个分组的平均动作,捕捉群体行为特征
2. 核心训练逻辑
交替更新策略
update_agent = agent_list[update_index] # 交替更新政府或家庭
if update_agent == "government":
# 仅更新政府网络
gov_actor_loss.backward()
gov_critic_loss.backward()
else:
# 仅更新家庭网络
house_actor_loss.backward()
house_critic_loss.backward()
设计考量:
- 缓解策略不稳定性:交替更新避免双Q网络相互干扰
- 可配置更新频率:通过
update_freq
参数控制交替节奏
3. 网络更新机制
家庭策略优化
# 策略梯度计算
house_log_prob = house_actor.get_log_prob(actions)
house_actor_loss = -torch.mean(house_log_prob * td_delta.detach())
- 优势函数:使用TD误差作为基线,提升策略梯度效率
- 平均场依赖:家庭Q值计算考虑其他家庭的群体平均动作
4. 关键技术细节
4.1 状态归一化处理
def observation_wrapper(self, global_obs, private_obs):
global_obs[GDP] /= 1e7 # GDP归一化
private_obs[income] /= 1e5 # 收入归一化
def observation_wrapper(self, global_obs, private_obs):
global_obs[GDP] /= 1e7 # GDP归一化
private_obs[income] /= 1e5 # 收入归一化
5. 创新点解析
动态群体划分
def get_tensor_mean_action(...):
# 实时计算前10%高收入与后50%低收入群体的平均动作
top10 = wealth.topk(10%)
bot50 = wealth.bottomk(50%)
return (top10.mean(), bot50.mean())
优势:
- 避免固定分组忽略财富分布动态变化
- 增强策略对贫富差距的响应能力
混合探索策略
def _initial_exploration(self):
# 政府初始探索:基准税率+高斯噪声
gov_action = [0.2, 0.05, 0, 0, 0.1] + np.random.normal(0, 0.1)
# 家庭初始探索:均匀随机动作
hou_action = np.random.uniform(-1, 1)
- 政府侧重局部探索:在合理税率范围内扰动
- 家庭全面探索:覆盖全部可能的消费劳动组合
这代码里面可以改进加入注意力机制,提升家庭策略对关键经济特征的捕捉能力,自动学习不同财富群体间的交互关系
calibration代码:
该代码实现了一个基于规则的经济模型校准系统,核心创新在于将劳动时间优化转化为带约束的最优化问题。
independent代码:
该代码实现了一个基于独立PPO算法的税收策略优化框架
log_path代码:这段代码的主要功能是自动化生成实验目录,确保每次运行都有独立的存储空间。
rule_based代码:
该规则基准系统为税收政策研究提供了可重复的评估框架,通过模块化设计支持快速策略迭代。
utils代码:
1.动作分布模块:Tanh变换正态分布
class tanh_normal(Distribution):
def __init__(self, normal_mean, normal_std, epsilon=1e-6, cuda=False):
self.normal = Normal(normal_mean, normal_std)
self.epsilon = epsilon
def log_prob(self, value, pre_tanh_value=None):
# 计算tanh变换后的概率密度
if pre_tanh_value is None:
pre_tanh_value = 0.5 * torch.log((1+value)/(1-value))
return self.normal.log_prob(pre_tanh_value) - torch.log(1 - value.pow(2) + self.epsilon)
- SAC算法中的动作空间约束
- 输出范围限制在[-1,1]
重参数化采样
def rsample(self):
z = self.normal_mean + self.normal_std * Normal(0,1).sample()
return torch.tanh(z), z # 返回可导的tanh(z)和原始z
梯度传播:
- 通过重参数化技巧保持梯度路径
- 支持反向传播计算策略梯度
2.动作选择模块
动作生成器
class get_action_info:
def select_actions(self, exploration=True, reparameterize=True):
if exploration:
if reparameterize:
return self.dist.rsample() # 可导采样
else:
return self.dist.sample() # 普通采样
else:
return torch.tanh(self.mean) # 确定性策略
3. 探索噪声模块
Ornstein-Uhlenbeck噪声
4. 动作评估模块
对数概率计算
def evaluate_actions(pi, actions):
normal_dist = Normal(pi.mean, pi.std)
log_prob = normal_dist.log_prob(actions).sum(1)
entropy = normal_dist.entropy().mean()
return log_prob, entropy
- 此处直接使用原始正态分布(未含tanh)
- 需与
tanh_normal
配合使用
该代码实现了一个完整的连续动作空间处理框架,通过以下创新点提升强化学习性能:
- 可导的Tanh变换:保持梯度传播路径
- 多模式动作选择:灵活切换探索/利用
- 时间相关噪声:提升惯性系统探索效率
- 数值鲁棒性设计:确保极端值下的计算稳定性
cfg代码
default.yaml
1.环境配置(Environment)
env_args:
alpha: 1/3 # 资本产出弹性(建议验证是否符合柯布-道格拉斯生产函数设定)
depreciation_rate: 0.06 # 资本折旧率(常规设置)
consumption_tax_rate: 0.065 # 消费税税率(需与经济模型匹配)
gov_task: "gdp" # 政府目标函数(可选增加多目标组合)
2. 智能体配置(Entities)
household:
CRRA: 1 # 相对风险厌恶系数(典型值1-4)
e_p: 2.2e-6 # 劳动效率参数(需验证量纲)
sigma_e: 0.200 # 收入波动率(可考虑周期性调整)
3.训练配置(Trainer)
hidden_size: 128 # 网络隐藏层维度(可尝试256提升表达能力)
batch_size: 128 # 批次大小(复杂环境建议升至512)
update_cycles: 10 # 每个epoch的更新次数(可动态调整)
4. 探索策略
noise_rate: 0.1 # OU噪声强度(可分段设置)
init_exploration_steps: 1000
5. 并行化配置
device_num: 1 # 计算设备数量(建议GPU训练)
household代码:
实现了一个基于真实财富数据与经济动态能力的家庭经济行为模拟系统,并通过向量化计算、动作标准化处理及马尔可夫状态跃迁优化,在提升计算效率的同时增强了收入流动性和财富分布的真实性仿真。
env:构建的经济环境
argument:参数
evaluate:
_evaluate_agent():评估模式下运行智能体,收集关键经济指标
评估指标:
- 政府奖励
- 家庭平均奖励
- 税收/财富/税后收入
- GDP增长率
- 收入/财富基尼系数
test_evaluate_get_action() 方法:
- 功能:在测试阶段生成政府与家庭动作
- 当前实现:
- 政府动作使用预定义的固定序列
- 家庭动作部分未完成(TODO标记)
- 动作空间映射([0,1] → [-1,1])
Taxai主要部分就是那么多
然后是一个主函数代码run_log
-
环境初始化:
使用make
函数创建指定类型的环境("taxing_gov"),该环境应实现多智能体交互逻辑。 -
策略加载:
通过命令行参数加载不同代理的策略(如--my_ai
指定主策略,默认随机策略)。策略模块位于agents/
目录下,每个策略需实现submission.py
中的my_controller
函数。 -
代理与动作空间配置:
get_players_and_action_space_list
函数验证代理数量,并划分不同策略组的动作空间。例如,若有2组策略,分别管理不同数量的代理,分配对应的动作空间列表。 -
联合动作生成:
get_joint_action_eval
动态调用各策略组的控制器函数,生成所有代理的联合动作。示例:策略组0的代理调用m0
函数,策略组1调用m1
函数,依次类推。 -
游戏运行与日志记录:
run_game
函数初始化日志系统,执行游戏循环直至结束。每一步记录环境状态、动作、奖励等信息,保存为JSON格式日志,便于后续分析。 -
关键数据结构:
游戏信息:包含环境名称、玩家数量、地图尺寸、初始信息等元数据。
步骤信息:每一步的时间戳、联合动作、奖励、前后状态等信息。