MindSpore:强化学习基础-蒙特卡洛(Monte Carlo)
在接触强化学习过程中,大家可能在很多场合听说蒙特卡洛这个词,例如Monte Carlo Tree Search,Monte Carlo CFR。实际即便在策略梯度(Policy Gradients)算法中也使用了蒙特卡洛方法,本文将介绍Monte Carlo算法和在强化学习中的应用。
基本概念
Monte Carlo方法源于20世纪40年代,由冯.诺依曼,斯塔尼斯拉夫·乌拉姆在核武器研究过程中提出。和许多以作者名字(如拉格朗日定理,柯西定理)命名不同,Monte-Carlo其实并不是某位学者名字,实际上是一座位于摩洛哥的赌场。统计和概率学经常会将概率和博彩联系在一起,或许某天也会出现澳门葡京方法/定理
Monte Carlo本质上是一种统计学方法,这类方法通过随机抽样,根据随机事件出现的频率来估算随机变量的特征
大家小时候都学过撒豆子估算不规则图形的面积,使用一个规则图形包裹不规则图形,然后将一定数量的豆子均匀的洒向这个图形,通过计算不规则图形中豆子比例和规则形状的面积,即可以估算出不规则形状的面积。随着计算机技术产生,撒豆子被随机数替代,这一类方法也被各个领域广泛使用。
如果我们并不知道圆形面积计算公式,假设圆形半径为1,我们使用变长为2的正方形包裹这个圆形,然后均匀采样,随着样点数量的增加,圆形面积将越来越接近理论值
from math import sqrt, pi
from random import uniform
# 正方形边长和面积
side_length = 2.0
square_area = side_length * side_length
# 圆形半径
radius = side_length / 2
def in_circle(x, y):
return sqrt(x * x + y * y) < radius
num_sample = 10000000
num_in_circle = 0
for i in range(num_sample):
x = uniform(-1, 1)
y = uniform(-1, 1)
num_in_circle += in_circle(x, y)
# 落入圆形的样点个数
ratio = num_in_circle / num_sample
# 圆形面积
circle_area = ratio * square_area
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
Monte-Carlo Tree Search
蒙特卡洛树搜索包含两层含义,首先它是一种树搜索方法,和深度优先、广度优先搜索算法类似,它需要对树进行遍历。其次蒙特卡洛强调了它并不是一种确定性的搜索算法,而是通过启发式的方式,让树向着最优解方向生长,降低搜索空间,实现了类似剪枝的功能。
具体流程如下:
-
选择(Selection): 从根节点开始,通过UCT(Upper Confidence Bounds to Trees)方法向下直至选择出一个叶子节点。UCT方法对每个节点进行打分,通常包含利用-探索两个分量。利用分量源于先验知识,例如之前仿真的结果,有时也会包含神经网络给出的评分;探索分量一般和这个节点的访问次数有关,如果节点访问的越少,则探索分量的值越大。
-
扩展(Expansion):选择结束之后,我们得到一个叶子节点。当叶子节点已经被充分评估时,会在这个节点基础上拓展出一个新的叶子节点。评估是否充分一般以这个叶子节点已经被仿真过多少次来衡量。
-
仿真(Simulation):从叶子节点开始游戏,直至游戏结束。
-
反向传播(Back Propagation):仿真结束后,我们会得到本次模拟的结果,拿这个结果刷新沿途节点分值。
Monte-Carlo CFR
CFR算法需要对博弈树进行遍历,从而计算某个动作的遗憾值。当博弈树规模非常大时,遍历整棵树的成本非常高,改进的方法:
- 在单局博弈中,对动作进行剪枝。例如在某个信息集上,所有合法的动作有M个,算法人为的限制它的搜索为N,N的数值还可以随着遍历层级的加深而减少;
- 作为补充,算法需要增加博弈的次数,尽可能覆盖更多的动作