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

多臂老虎机——入门强化学习

目录

什么是多臂老虎机?

强化学习中的多臂老虎机问题

解决多臂老虎机问题的常见方法

强化学习中的重要性

代码实现

结果与分析


        多臂老虎机(Multi-Armed Bandit,MAB)问题是强化学习的经典入门例子,也是理解探索与利用(exploration-exploitation)平衡的重要案例。

什么是多臂老虎机?

        设想你在一个赌场里,面前有一排老虎机,每台老虎机都有一个不同的中奖概率。你可以选择拉任意一个老虎机的“手臂”,但你不知道每台机器的中奖概率是多少。你的目标是在有限的操作次数内,最大化你的收益。

        每台老虎机(也称“臂”)对应一种概率分布,投币后会产生不同的奖励(例如赢得不同数量的筹码),但每台机器的奖励分布是固定的。问题的核心是如何选择拉哪台老虎机的手臂,以便在不确定每台机器的中奖概率的情况下获得最高收益。

强化学习中的多臂老虎机问题

        多臂老虎机问题在强化学习中是“探索与利用”平衡的基础案例。你面临着两个选择:

  1. 探索:选择不熟悉的手臂,以获取更多的信息。
  2. 利用:选择已知奖励较高的手臂,以获取更大的即时收益。

        探索过多会浪费资源,而利用过多则可能错过更优的选项。多臂老虎机问题提供了一个简单的框架来研究和测试不同的探索与利用策略。

解决多臂老虎机问题的常见方法

        以下是几种常见的解决策略:

  1. 贪心策略(Greedy)
    只选择当前预期奖励最高的臂。缺点是完全不探索,可能会错过最优臂。

  2. ε-贪心策略(ε-Greedy)
    在大部分时间(概率为 1−ϵ )选择当前最好的臂,但偶尔(概率为 ϵ )随机探索其他臂。通常,ϵ 会设为一个小值,比如 0.1,以平衡探索与利用。

  3. 上置信界(UCB,Upper Confidence Bound)
    基于统计学的原理,每个臂的奖励期望值上加上一个置信区间。随着臂的拉动次数增加,置信区间逐渐减小,最终可以更可靠地选择最优臂。UCB能在拉得较少的臂上探索更多次,从而加快找到最优臂的速度。

  4. 汤普森采样(Thompson Sampling)
    使用贝叶斯方法来选择臂。每次尝试时,依据历史奖励数据生成不同臂的奖励概率分布,然后从中采样选择最优臂。汤普森采样在很多情况下表现优于 ε-贪心和 UCB,尤其是分布已知的情况。

强化学习中的重要性

        多臂老虎机问题帮助我们了解如何在有不确定性和有限资源的情况下选择行动,这种探索与利用的平衡思想在更复杂的强化学习任务中非常重要。例如,在训练深度 Q 网络(DQN)或策略梯度(Policy Gradient)算法时,探索与利用的权衡直接影响收敛速度和策略的优劣。

        通过多臂老虎机问题,初学者可以更直观地理解强化学习中的策略选择与优化方式,为进一步学习复杂的环境奠定基础。

代码实现

        以下是这些策略的Python实现。首先,我们定义多臂老虎机环境,然后实现不同策略的代理。

import numpy as npclass MultiArmedBandit:def __init__(self, num_arms):# 每个老虎机臂的奖励分布是正态分布,均值在0到1之间,标准差为1self.probabilities = np.random.rand(num_arms)self.num_arms = num_armsdef pull_arm(self, arm):# 模拟拉动臂的过程,返回一个奖励return np.random.normal(self.probabilities[arm], 1)

        1. 贪心策略

class GreedyAgent:def __init__(self, num_arms):self.num_arms = num_armsself.arm_counts = np.zeros(num_arms)  # 每个臂的拉动次数self.arm_rewards = np.zeros(num_arms)  # 每个臂的累计奖励def select_arm(self):# 选择当前期望奖励最高的臂return np.argmax(self.arm_rewards / (self.arm_counts + 1e-5))def update(self, arm, reward):# 更新该臂的奖励和次数self.arm_counts[arm] += 1self.arm_rewards[arm] += reward

        2. ε-贪心策略

class EpsilonGreedyAgent:def __init__(self, num_arms, epsilon=0.1):self.num_arms = num_armsself.epsilon = epsilonself.arm_counts = np.zeros(num_arms)self.arm_rewards = np.zeros(num_arms)def select_arm(self):if np.random.rand() < self.epsilon:# 以 ε 概率随机选择一个臂return np.random.randint(self.num_arms)else:# 否则选择期望奖励最高的臂return np.argmax(self.arm_rewards / (self.arm_counts + 1e-5))def update(self, arm, reward):self.arm_counts[arm] += 1self.arm_rewards[arm] += reward

        3. 上置信界(UCB)

class UCBAgent:def __init__(self, num_arms, c=2):self.num_arms = num_armsself.arm_counts = np.zeros(num_arms)self.arm_rewards = np.zeros(num_arms)self.c = c  # 控制置信区间大小的参数def select_arm(self):total_counts = np.sum(self.arm_counts)if total_counts == 0:return np.random.randint(self.num_arms)ucb_values = self.arm_rewards / (self.arm_counts + 1e-5) + \self.c * np.sqrt(np.log(total_counts + 1) / (self.arm_counts + 1e-5))return np.argmax(ucb_values)def update(self, arm, reward):self.arm_counts[arm] += 1self.arm_rewards[arm] += reward

        4. 汤普森采样(Thompson Sampling)

class ThompsonSamplingAgent:def __init__(self, num_arms):self.num_arms = num_armsself.successes = np.zeros(num_arms)  # 记录每个臂成功的次数self.failures = np.zeros(num_arms)   # 记录每个臂失败的次数def select_arm(self):# 对每个臂从 beta 分布中采样samples = [np.random.beta(1 + self.successes[arm], 1 + self.failures[arm]) for arm in range(self.num_arms)]return np.argmax(samples)def update(self, arm, reward):# 更新成功或失败的次数if reward > 0:self.successes[arm] += 1else:self.failures[arm] += 1

        运行模拟实验

# 定义老虎机数量和步骤
num_arms = 10
num_steps = 1000
bandit = MultiArmedBandit(num_arms)# 选择一个策略,初始化相应的Agent
agent = EpsilonGreedyAgent(num_arms, epsilon=0.1)  # 可以换成其他策略# 记录奖励
rewards = []
for step in range(num_steps):arm = agent.select_arm()reward = bandit.pull_arm(arm)agent.update(arm, reward)rewards.append(reward)# 计算平均奖励
average_reward = np.mean(rewards)
print(f"平均奖励: {average_reward:.2f}")

结果与分析

        不同策略的平均奖励可能不同。一般来说:

  • ε-贪心策略在长时间内能获得较高奖励。
  • UCB 和汤普森采样往往能更快找到最优臂,尤其在前期有较明显优势。

实验可以帮助直观地理解这些策略的特点,以及如何在不确定环境中平衡探索与利用。


http://www.mrgr.cn/news/64833.html

相关文章:

  • oracle-函数-NULLIF (expr1, expr2)的妙用
  • 云原生周刊:微服务架构 2025 年的发展趋势丨2024.11.04
  • Java环境下配置环境(jar包)并连接mysql数据库
  • MySQL 的 select * 会用到事务吗?
  • 62 mysql 中 存储引擎MyISAM 中索引的使用
  • 【测试工具】Fastbot 客户端稳定性测试
  • Qt 应用开发之 MVC 架构
  • Linux入门-基础指令和权限
  • ssm044基于java和mysql的多角色学生管理系统+jsp(论文+源码)_kaic
  • 有向无环图的拓扑排序——CSP-J1真题讲解
  • 高等数学习题练习-函数的连续性
  • 支持 Mermaid 语言预览,用通义灵码画流程图
  • ERC论文阅读(04)--DialogueCRN论文阅读笔记(2024-11-03)
  • 前端学习-盒子模型(十八)
  • 【Git】如何在 Git 中高效合并分支:完整指南
  • 【学术精选】SCI期刊《Electronics》特刊“New Challenges in Remote Sensing Image Processing“
  • 手把手教你用IntelliJ IDEA 操作 DM8
  • ! [remote rejected] master -> master (pre-receive hook declined)
  • YOLOv6-4.0部分代码阅读笔记-ema.py
  • 2024年一带一路金砖技能大赛之大数据容器云开发
  • Win10 连接到 Ubuntu 黑屏无法连接 使用Rustdesk显示 No Displays 没有显示器
  • GOF的C++软件设计模式的分类和模式名称
  • 数据结构初阶排序全解
  • 力扣周赛:第422场周赛
  • roberta融合模型创新中文新闻文本标题分类
  • 优青博导团队/免费指导/一站式服务/数据分析/实验设计/论文润色/组学技术服务 、表观组分析、互作组分析、遗传转化实验、单细胞检测与生物医学