当前位置: 首页 > news >正文

CPT 强化学习(Cumulative Prospect Theory Reinforcement Learning)代码实现

✅ CPT 强化学习(Cumulative Prospect Theory Reinforcement Learning)代码实现

以下提供实用、可运行的 Python 实现,结合Cumulative Prospect Theory (CPT)与强化学习。

1. 核心概念回顾

在传统 RL 中,目标是最大化期望回报(Expected Return)。
CPT-RL中,目标是最大化 CPT 值(考虑损失厌恶、概率扭曲、参照点),让 Agent 表现出人类-like 的风险偏好(风险规避/寻求)。

2. 完整代码实现(简单版:CPT-Q Learning)

importgymnasiumasgymimportnumpyasnpfromcollectionsimportdefaultdictimportrandom# ====================== CPT 核心函数 ======================defcpt_value(x,alpha=0.88,beta=0.88,lambda_loss=2.25):"""价值函数 v(x)"""x=np.array(x)returnnp.where(x>=0,x**alpha,-lambda_loss*(-x)**beta)defcpt_probability_weight(p,gamma_gain=0.61,gamma_loss=0.69):"""概率权重函数 w(p)"""p=np.array(p)# 简单实现:不同 gamma 用于收益和损失w_gain=p**gamma_gain/(p**gamma_gain+(1-p)**gamma_gain)**(1/gamma_gain)w_loss=p**gamma_loss/(p**gamma_loss+(1-p)**gamma_loss)**(1/gamma_loss)returnnp.where(p>=0,w_gain,w_loss)# 简化处理defestimate_cpt_value(rewards,alpha=0.88,beta=0.88,lambda_loss=2.25,gamma_gain=0.61,gamma_loss=0.69,reference=0.0):"""从多条 trajectory 的回报样本估计 CPT 值"""returns=np.array(rewards)-reference sorted_returns=np.sort(returns)n=len(sorted_returns)# 计算决策权重(累积形式简化版)probs=np.ones(n)/n weights=cpt_probability_weight(probs)# 累积权重(简化实现)cum_weights=np.cumsum(weights[::-1])[::-1]# 粗略近似values=cpt_value(sorted_returns)cpt_val=np.sum(cum_weights*values)/n# 归一化returncpt_val# ====================== CPT-Q Learning ======================classCPTQAgent:def__init__(self,state_size,action_size,alpha=0.1,gamma=0.99,epsilon=0.1,cpt_alpha=0.88,cpt_lambda=2.25):self.q_table=defaultdict(lambda:np.zeros(action_size))self.alpha=alpha# 学习率self.gamma=gamma# 折扣因子self.epsilon=epsilon# 探索率self.action_size=action_size self.cpt_alpha=cpt_alpha self.cpt_lambda=cpt_lambda self.memory=[]# 存储 trajectory returns 用于 CPT 估计defchoose_action(self,state):ifrandom.uniform(0,1)<self.epsilon:returnrandom.randint(0,self.action_size-1)returnnp.argmax(self.q_table[state])deflearn(self,state,action,reward,next_state,done):# 标准 Q-Learning 更新(可替换为 CPT 目标)old_value=self.q_table[state][action]next_max=np.max(self.q_table[next_state])# 传统 TD Targettd_target=reward+self.gamma*next_max*(1-done)self.q_table[state][action]=old_value+self.alpha*(td_target-old_value)ifdone:self.memory.append(reward)# 简化:记录 episode 回报# ====================== 训练示例 ======================deftrain_cpt_rl(env_name="CartPole-v1",episodes=500):env=gym.make(env_name)state_size=env.observation_space.shape[0]# 连续状态需离散化或用近似# 为简单起见,这里使用离散环境示例(如 FrozenLake)# 推荐使用简单离散环境演示env=gym.make("FrozenLake-v1",is_slippery=False)agent=CPTQAgent(state_size=env.observation_space.n,action_size=env.action_space.n)rewards_history=[]forepisodeinrange(episodes):state,_=env.reset()total_reward=0done=Falsewhilenotdone:action=agent.choose_action(state)next_state,reward,terminated,truncated,_=env.step(action)done=terminatedortruncated agent.learn(state,action,reward,next_state,done)state=next_state total_reward+=reward rewards_history.append(total_reward)ifepisode%100==0:print(f"Episode{episode}, Total Reward:{total_reward}")# 演示 CPT 值估计sample_returns=rewards_history[-50:]# 最近50个 episodecpt_val=estimate_cpt_value(sample_returns)print(f"\n最后50个episode的 CPT 值估计:{cpt_val:.4f}")returnagent,rewards_historyif__name__=="__main__":agent,history=train_cpt_rl(episodes=1000)

3. 进阶:Policy Gradient + CPT(概念代码)

defcpt_policy_gradient_loss(returns,baseline=0.0):"""CPT 目标下的 Policy Gradient Loss"""advantages=np.array(returns)-baseline values=cpt_value(advantages)# 在实际 PG 中,用 values 替代 advantages 进行梯度更新return-np.mean(values)# 最大化 CPT 值

4. 使用建议与扩展

  1. 离散 vs 连续:上面代码适合离散环境(如 FrozenLake、Taxi)。连续环境(如 CartPole)建议结合 Actor-Critic + CPT 价值估计。
  2. 更精确的 CPT 估计:参考 Prashanth et al. (2016) 的分位数方法或累积权重精确计算。
  3. 框架推荐
    • Stable-Baselines3 / CleanRL + 自定义 Reward Shaping
    • PyTorch/TensorFlow 实现 Policy Gradient 版本(2024 论文有最新 PG 定理)
  4. 参数调优
    • lambda_loss=2.25→ 更强的损失厌恶
    • gamma_gain < 1→ 概率扭曲

想让我继续提供

  • 完整 PyTorch Actor-Critic CPT 版本(推荐生产级)
  • 特定论文算法复现(如 CPT-SPSA 或 Policy Gradient)
  • 在 Gymnasium 连续控制任务上的实现
  • 与标准 RL 的对比实验代码
http://www.jsqmd.com/news/879901/

相关文章:

  • Claude在国内用不了?我挨个试了一遍
  • 英语 听力 重读软件app
  • 京东抢购脚本全解析:3步实现茅台秒杀自动化,告别手速烦恼
  • 为Hermes Agent配置Taotoken自定义供应商接入大模型
  • 无感定位从根源规避失联风险 新一代定位技术护航矿井安全生产
  • 英文会议翻译 app
  • 专业级GPU内存检测:MemTestCL的5个实战场景深度解析
  • 百余人员无定位标识陷搜救僵局,无感定位重塑矿山安全监测能力
  • 2026长岛民宿排名指南,长岛海东渔家民宿没白来! - 资讯纵览
  • 【Java EE】IPv6
  • 为什么91%的DeepSeek部署在第7轮后开始“失忆”?揭秘KV Cache碎片率超阈值的实时熔断策略
  • 如何利用AI工具变现:一个老程序员的真实观察
  • 使用OpenMetadata结合Great Expectations实现数据质量管理的实践
  • Windows下JMeter高并发压测端口耗尽问题排查与修复
  • CPT 强化学习完整实现(PyTorch 版 - Actor-Critic + CPT)
  • 2026年装修季必看!专业明装暖气怎么选的实用攻略来了 - 资讯纵览
  • 从救援受阻事故案例,看无感定位技术普及的迫切意义
  • m4s-converter终极指南:3步解锁B站缓存视频的离线观看自由
  • 如何免费解锁Wand专业版功能:Wand-Enhancer完整使用指南
  • 六音音源修复版:三步解决洛雪音乐播放失效问题
  • DeepSeek计费策略终极对比:RPM限制、上下文长度溢价、多模态附加费,一文讲透
  • 在Windows 10上从零开始:手把手教你安装和运行TELEMAC-MASCARET V8P4水动力模型
  • BooruDatasetTagManager:如何用AI智能标注工具将图像数据集处理效率提升10倍
  • Claude Code用户如何通过Taotoken解决API不稳定与Token不足问题
  • 2026 北京包包回收实测:上门回收估价 vs 线下实体店,哪个更划算 - 奢侈品回收测评
  • 对比直接使用原厂API,Taotoken在计费透明性上给我们的感受
  • 等保2.0三级Linux服务器合规基线重建实战指南
  • 终极指南:让老旧Mac免费升级最新macOS系统的完整方案
  • 新沂沙发翻新换皮换布面靠谱商家优选推荐|匠阁沙发翻新、御匠沙发翻新、锦修沙发翻新三大品牌、全品类沙发翻新换皮换布一站式服务 - 卓一科技
  • 纯视觉破界空间感知 自研体系领跑视频孪生领域