• MindSpore:强化学习基础-蒙特卡洛(Monte Carlo)


    在接触强化学习过程中,大家可能在很多场合听说蒙特卡洛这个词,例如Monte Carlo Tree Search,Monte Carlo CFR。实际即便在策略梯度(Policy Gradients)算法中也使用了蒙特卡洛方法,本文将介绍Monte Carlo算法和在强化学习中的应用。

    基本概念

    Monte Carlo方法源于20世纪40年代,由冯.诺依曼,斯塔尼斯拉夫·乌拉姆在核武器研究过程中提出。和许多以作者名字(如拉格朗日定理,柯西定理)命名不同,Monte-Carlo其实并不是某位学者名字,实际上是一座位于摩洛哥的赌场。统计和概率学经常会将概率和博彩联系在一起,或许某天也会出现澳门葡京方法/定理

    Monte Carlo本质上是一种统计学方法,这类方法通过随机抽样,根据随机事件出现的频率来估算随机变量的特征

    大家小时候都学过撒豆子估算不规则图形的面积,使用一个规则图形包裹不规则图形,然后将一定数量的豆子均匀的洒向这个图形,通过计算不规则图形中豆子比例和规则形状的面积,即可以估算出不规则形状的面积。随着计算机技术产生,撒豆子被随机数替代,这一类方法也被各个领域广泛使用。

    如果我们并不知道圆形面积计算公式,假设圆形半径为1,我们使用变长为2的正方形包裹这个圆形,然后均匀采样,随着样点数量的增加,圆形面积将越来越接近理论值

    1. from math import sqrt, pi
    2. from random import uniform
    3. # 正方形边长和面积
    4. side_length = 2.0
    5. square_area = side_length * side_length
    6. # 圆形半径
    7. radius = side_length / 2
    8. def in_circle(x, y):
    9. return sqrt(x * x + y * y) < radius
    10. num_sample = 10000000
    11. num_in_circle = 0
    12. for i in range(num_sample):
    13. x = uniform(-1, 1)
    14. y = uniform(-1, 1)
    15. num_in_circle += in_circle(x, y)
    16. # 落入圆形的样点个数
    17. ratio = num_in_circle / num_sample
    18. # 圆形面积
    19. circle_area = ratio * square_area
    20. print('circle area: {}, theory area: {}'.format(circle_area, pi * radius * radius))

    执行结果

    circle area: 3.1413452, theory area: 3.141592653589793
    

    强化学习中的应用

    基础应用

    在深度学习和强化学习领域中,许多算法实际上使用了Monte-Carlo方法,并没有给它冠名。这些算法如此基础,我们经常会忽略它的存在。

    例如由于计算资源受限,深度学习把一个批次样本的梯度作为整体梯度的估计,来更新模型的权重,同时通过多次采样(迭代次数,或者step数)修正偏差。

    经典的强化学习算法中,无论Q-Learning还是Policy Gradient算法中,都需要估算累计收益,例如多步TD Target

    蒙特卡洛树搜索包含两层含义,首先它是一种树搜索方法,和深度优先、广度优先搜索算法类似,它需要对树进行遍历。其次蒙特卡洛强调了它并不是一种确定性的搜索算法,而是通过启发式的方式,让树向着最优解方向生长,降低搜索空间,实现了类似剪枝的功能。

    具体流程如下:

    • 选择(Selection): 从根节点开始,通过UCT(Upper Confidence Bounds to Trees)方法向下直至选择出一个叶子节点。UCT方法对每个节点进行打分,通常包含利用-探索两个分量。利用分量源于先验知识,例如之前仿真的结果,有时也会包含神经网络给出的评分;探索分量一般和这个节点的访问次数有关,如果节点访问的越少,则探索分量的值越大。

    • 扩展(Expansion):选择结束之后,我们得到一个叶子节点。当叶子节点已经被充分评估时,会在这个节点基础上拓展出一个新的叶子节点。评估是否充分一般以这个叶子节点已经被仿真过多少次来衡量。

    • 仿真(Simulation):从叶子节点开始游戏,直至游戏结束。

    • 反向传播(Back Propagation):仿真结束后,我们会得到本次模拟的结果,拿这个结果刷新沿途节点分值。

    Monte-Carlo CFR

    CFR算法需要对博弈树进行遍历,从而计算某个动作的遗憾值。当博弈树规模非常大时,遍历整棵树的成本非常高,改进的方法:

    • 在单局博弈中,对动作进行剪枝。例如在某个信息集上,所有合法的动作有M个,算法人为的限制它的搜索为N,N的数值还可以随着遍历层级的加深而减少;
    • 作为补充,算法需要增加博弈的次数,尽可能覆盖更多的动作

  • 相关阅读:
    天空飞鸟 数据集
    基于虚拟同步发电机控制的双机并联Simulink仿真模型
    C++项目实战-多进程(一篇文章)
    Java运算符总结一览
    k8s敏感数据存储:Secret
    C# 一周入门高级编程之《C#-接口》Day Two
    vue 实现前台用户登录
    二分查找的经典样例
    【Java 进阶篇】JavaScript BOM History 详解
    使用Java实现汉诺塔问题~
  • 原文地址:https://blog.csdn.net/skytttttt9394/article/details/126290114