多臂强盗(n台老虎机)问题

在构建AlphaGo之前,先尝试一个简单的问题热热身,nnn 台老虎机(多臂强盗问题),把对 nnn 台老虎机操作看作是 nnn 个不同的动作,即:每个动作 aaa 对应一台特定的老虎机.在每次游戏 kkk 中,玩家可以操作任意一台老虎机,这个操作即:动作 aaa,操作后玩家会获得奖励 R(k)R(k)R(k), 每台老虎机的奖励概率是固定的.

如何在这个游戏中获得更高的奖励

靠谱的策略是:

  1. 探索阶段:

    • 尽可能的多玩几次,选择不同的机子,并观察每个机子(aaa)对应的回报 Rk(a)R_k(a)Rk​(a).
  2. 贪心阶段:
    • 每次都之选择观察到平均回报最大的 aaa.根据预期的回报来指导下一步的动作.
  3. 探索和贪心之间的权衡
    • 停止探索:仅仅利用当前的信息,选择最佳的 aaa,可能会忽略全局最优的 aaa
    • 随机探索:掌握更多的信息,避免陷入局部最优,但是要浪费更多的时间和金钱
    • 贪心和探索之间的有效权衡才能最大化回报
值函数

用 Qk(a)Q_k(a)Qk​(a)表示,QQQ函数是一个动作值函数,计算采取特定动作的价值.

Qk(a)=∑i=1kRikaQ_k(a) = \frac{ \sum_{i=1}^k R_i}{k_a} Qk​(a)=ka​∑i=1k​Ri​​

  • Qk(a)Q_k(a)Qk​(a) : 第 kkk 次游戏中对 aaa 的预期奖励 = aaa获得奖励的算数平均值
  • RiR_iRi​ : 动作 aaa 之前获得奖励
  • kak_aka​ : 动作 aaa 被执行的次数
动作选择函数

a=argmaxa([Qk(a1),Qk(a2),...Qk(an)])a = argmax_{a}([Q_k(a_1),Q_k(a_2), ...Q_k(a_n) ])a=argmaxa​([Qk​(a1​),Qk​(a2​),...Qk​(an​) ])

动作选择函数的计算仅仅考虑我们探索过的动作,如果之前没有完全探索全部的动作,每次我们都只会在有限动作空间中做选择.为了避免陷入这样的局部最优,我们需要同时考虑探索和贪心的策略,在每一次游戏中,以一定的概率随机探索一个动作,剩下的概率中,根据值函数 QQQ 和 动作选择函数选择最佳的动作.其实就是,我们需要设置一个阈值 ε\varepsilonε,每次游戏以 ε\varepsilonε概率采取一些冒险的策略,1−ε1-\varepsilon1−ε采用贪心的策略.

# 遍历之前的动作找到reward的最高的动作
def get_best_action(actions):best_action = 0max_action_value = 0for i in range(len(actions)): cur_action_value = get_action_value(actions[i]) if cur_action_value > max_action_value:best_action = imax_action_value = cur_action_valuereturn best_action# 找到奖励最多的动作
def get_best_arm(record):arm_index = np.argmax(record[:,1],axis=0)return arm_index

probs initialization

初始化每个动作 aaa 的奖励概率

n = 10                      # n 个机械臂
probs = np.random.rand(n)   # n 个机械臂概率的初始化

奖励函数

每个动作 aaa 有一个奖励概率,每个动作的最高奖励为10美元。每次如果随机数小于 aaa 的概率,它的奖励增加+1。完成10次迭代,返回最终的总奖励,奖励可能是0到10之间的任何值。如果某一动作的奖励概率为0.7,则执行尽可能多的该动作,平均奖励为7,但是在任何单次游戏中,为1~10之间的随机值。

def get_reward(prob, n=10):reward = 0;for i in range(n):if random.random() < prob:reward += 1return reward

每个动作执行2000次的奖励分布

每个动作的平均奖励

初始化record

  • count : action 重复次数
  • avg reward : 平均奖励
# 10 actions x 2 columns
# Columns: Count #, Avg Reward
# 动作奖励二维表格# 更新动作奖励二维数组
def update_record(record,action,r):new_r = (record[action,0] * record[action,1] + r) / (record[action,0] + 1)record[action,0] += 1record[action,1] = new_rreturn recordrecord = np.zeros((n,2))print(record)
[[0. 0.][0. 0.][0. 0.][0. 0.][0. 0.][0. 0.][0. 0.][0. 0.][0. 0.][0. 0.]]
600次模拟操作
  • ε\varepsilonε = 0.2, 随机值 > 0.2, 从record中找平均奖励最大的action

    • 计算奖励,更新record
  • ε\varepsilonε < 0.2, 随机操作
    • 计算奖励,更新record
  • ε\varepsilonε 值越大,随机探索的次数就越多,收敛的就越慢
def simulation_argmax(num_n, p=0.3):record = np.zeros((n, 2))rewards = [0]record_dict = {}actions = []for i in range(600):if random.random() > p:choice = get_best_arm(record)else:choice = np.random.randint(10)actions.append(choice)r = get_reward(probs[choice])record = update_record(record,choice,r)record_dict[i] = record.copy()mean_reward = ((i+1) * rewards[-1] + r)/(i+2)    # (r - reward[-1])/(i+1)+reward[-1]rewards.append(mean_reward)return rewards, record_dict, actions

Argmax : 累计平均奖励的变化

Argmax : 每个动作reward的变化

Argmax : 动作选择的变化

softmax选择策略

由上面的结果,我们可以发现,随着游戏的次数增加,累计的平均回报也在不断增加,每个动作的奖励也逐渐趋于稳定,从动作选择的变化来看,被选择次数最多的就是 a9a_9a9​ ,从累计平均回报看,在游戏500次之后,已经趋于稳定了,但是动作选择策略仍会在进行随机选择,其实这个时候已经没有必要了,因为最优的动作已经被发现了,我们只用重复执行这一个动作就行了.我们需要一个新的动作选择策略,确保每次不选择最差的动作,但仍具有探索未知动作的能力。softmax刚好就满足这个需求,softmax不是在探索过程中随机选择一个动作,而是为我们提供了各种选择的概率分布。概率最大的选项等同于上面的最佳动作.

softmax方程:

Pr(a)=eQk(a)/τ∑i=1neQk(ai)/τPr(a) = \frac{e^{Q_k(a)/ \tau}}{\sum_{i=1}^n e^{Q_k(a_i) / \tau}}Pr(a)=∑i=1n​eQk​(ai​)/τeQk​(a)/τ​

  • Pr(a)Pr(a)Pr(a) : 接受动作的值,返回动作分布概率
  • τ\tauτ : 调节参数,过大会是动作间的概率分布相似,过小会使动作之间的分布差异过大
def softmax(av, tau=1.11):softm = ( np.exp(av / tau) / np.sum( np.exp(av / tau) ) )return softm

p = softmax(record[:,1],t)     # 动作概率分布
choice = np.random.choice(np.arange(n),p=p)

softmax()选择:累计回报的变化

softmax : 每个动作的reward变化

Softmax : 动作选择的变化


从上面的结果来看,softmax()动作选择函数,收敛更快,对动作的选择更加集中.

Argmax : 不同 PPP 值的影响

  • P∈[0,1]P \in [0, 1]P∈[0,1]

Argmax : 不同 PPP 值对rewards的影响

观察上图可知:
  • PPP 在取值在两个极端的时候[0, 1]效果最差的
  • PPP 然后从0.1~0.9递减

Argmax : 不同 PPP 值对records的影响

Argmax : 不同 PPP 值对Actions的影响

Softmax : 不同 τ\tauτ 值的影响

  • τ∈[0.1,1)\tau \in [0.1, 1)τ∈[0.1,1)

Softmax : 不同 τ\tauτ 值对rewards的影响

Softmax : 不同 τ\tauτ 值对records的影响

Softmax : 不同 τ\tauτ 值对Actions的影响

Final, Softmax Vs Argmax

  • Best Argmax : P=0.1P = 0.1P=0.1
  • Best Softmax : τ=0.6\tau = 0.6τ=0.6

Accumlate rewards

Records history

Actions

总结:

  • softmax可以更快的收敛,但是 τ\tauτ 敏感,需要花时间找到最佳的 τ\tauτ 值
  • argmax收敛的相对较慢,但是 PPP 值的选择比较直观
    • P=0or1P = 0 or 1P=0or1,效果是最差的
    • p[0.1,0.9]p ~ [0.1, 0.9]p [0.1,0.9],最终的累计回报是递减的
    • 但是如果限制游戏的次数,适当的增加冒险的概率,可以更快的获得更高的奖励

DRL实战 : N-Armed Bandits问题相关推荐

  1. DRL实战:DDPG A3C | Gym环境中经典控制问题Pendulum-v0

    文章目录 (一)"Pendulum-v0" Observation & State Action Reward (二)A3C & DDPG A3C Test 1 T ...

  2. 详解GCN、GAT、凸优化、贝叶斯、MCMC、LDA

    如果你准备发AI方向的论文,或准备从事科研工作或已在企业中担任AI算法岗的工作.那么我真诚的向大家推荐,贪心学院<高阶机器学习研修班>,目前全网上应该找不到类似体系化的课程.课程精选了四大 ...

  3. 工作之后,顶会还重要嘛?

    如果你准备发AI方向的论文,或准备从事科研工作或已在企业中担任AI算法岗的工作.那么我真诚的向大家推荐,贪心学院<高阶机器学习研修班>,目前全网上应该找不到类似体系化的课程.课程精选了四大 ...

  4. 推荐几个出论文的好方向

    如果你准备发AI方向的论文,或准备从事科研工作或已在企业中担任AI算法岗的工作.那么我真诚的向大家推荐,贪心学院<高阶机器学习研修班>,目前全网上应该找不到类似体系化的课程.课程精选了四大 ...

  5. 想快速发表CV/NLP论文?试试这几个方向!

    如果你准备发AI方向的论文,或准备从事科研工作或已在企业中担任AI算法岗的工作.那么我真诚的向大家推荐,贪心学院<高阶机器学习研修班>,目前全网上应该找不到类似体系化的课程.课程精选了四大 ...

  6. 面试AI算法岗,你被要求复现顶会论文了嘛?

    如果你准备发AI方向的论文,或准备从事科研工作或已在企业中担任AI算法岗的工作.那么我真诚的向大家推荐,贪心学院<高阶机器学习研修班>,目前全网上应该找不到类似体系化的课程.课程精选了四大 ...

  7. 了解强化学习动手部分1简介

    系列的链接: (Series' Links:) Introduction 介绍 Multi-Armed Bandits | Notebook 多臂土匪 | 笔记本 Welcome! This is t ...

  8. 了解第二部分多武装匪徒的强化学习手

    系列的链接: (Series' Links:) Introduction 介绍 Multi-Armed Bandits | Notebook 多臂土匪 | 笔记本 This is the second ...

  9. 深度学习R语言 mlr3 建模,训练,预测,评估(随机森林,Logistic Regression)

    深度学习R语言 mlr3 建模,训练,预测,评估(随机森林,Logistic Regression) 本文主要通过使用mlr3包来训练German credit数据集,实现不同的深度学习模型. 1. ...

  10. DRL深度强化学习代码实战1——MountainCar-v0小车成功登顶

    如果你是刚刚接触DRL的同学,那么本文的内容就是引你入胜的第一个小实验. DRL的学习离不开理论知识,但更不能缺少实践!废话不多说我们直接开始. 0. 实验环境和包版本 ① PyCharm 2022 ...

最新文章

  1. 谁说女生不能搞IT?一名女程序员的奋斗史
  2. Linux for sougou ping yin (http://pinyin.sogou.com/linux/help.php)
  3. ​Spring事务的传播行为案例分析
  4. 视觉SLAM笔记(32) 2D-2D: 对极几何
  5. 回答一下这些游戏帧数有关的问题吗?
  6. ITester软件测试小栈长期持续在线征集
  7. Unity线程安全:CompareBaseObjectsInternal can only be called from the main thread
  8. Swift人工智能实战:从基础理论到AI驱动的应用程序开发
  9. 黑马程序员_常见的几个运行时异常
  10. 接收机灵敏度的计算公式推导和分析
  11. ADS1115的IIC通信
  12. 《深度学习之美》第1章
  13. python 逐行调试工具_常用的 Python 调试工具,Python开发必读-乾颐堂
  14. matlab 求obb,实验六MATLAB神经网络工具箱DOC
  15. android按钮美化(入门)
  16. 微信小程序在线考试系统 毕业设计(6)会员首页
  17. 三维点云到人体重建(七)
  18. C# string和ushort数组互相转换
  19. 解套方案——1.6黄金独家操作建议,纸白银价格趋势精准解析
  20. 新版 google 谷歌浏览器跨域问题

热门文章

  1. Java基础,使用switch分支实现出计算器计算机功能,简单易理解
  2. 08cms php5.6,大型房产门户08cms单城市商业版V8.4(带升级补丁),带手机独家放送,去除后门优化响应...
  3. php如何输入错误返回,php – 从函数返回“错误”的最佳做法
  4. 信息网络传播中的服务器标准,信息网络传播权的服务器标准与实质替代标准之争...
  5. php通用下载方法,PHP实现打包下载文件的方法示例
  6. you need python_Life is short, you need Python!
  7. Mybtis进行mysql数据库的修改表名操作
  8. 4-vue的生命周期(钩子函数)
  9. WPF 美化界面,样式的使用
  10. java怎么用一行代码初始化ArrayList