深入浅出强化学习编程实战(第一章) 一个极其简单的强化学习案例
1、图1.3中算法的理解:
前文提到,每个手臂对应了一个金币的分布概率,有概率就会有均值,这个算法的核心在于找到一个均值最大的手臂,所以我们只需要通过采样得到每个手臂的均值,然后每次通过策略以
的概率挑均值大的手笔,以
的概率挑选剩下的动作。随着采样的进行,对每个手臂的均值的估计逐渐逼近真实均值,最后返回总的奖励R(a)。
当训练足够多的次数之后,三条手臂的均值约等于真实的均值,此时训练的最终结果就是以较大概率摇动均值最大的手臂,以较小概率摇动均值较小的手臂。(我认为最优策略到最后应该没有探索的功能,因为到最后已经找到了最优手臂,这其实也是后面RL算法中涉及到的off-policy,这里不做展开讨论)
这里的难点在与求解均值的时候采用了增量式求解方法,如下面公式所述。
2、策略将除去最优动作之外的其他动作看作是相等的动作,没有好坏之分,所以其他动作被选择的概率都是
,而最优动作的概率为
。
怎么得到的?因为动作总数是|A|,所以其他动作的个数是|A|-1,所以,这就是各个动作概率的来历。
3、玻尔兹曼策略将除去最优动作之外的其他动作看成有好坏之分,所以其他动作的概率不一样,详见课本公式(1.2)
4、UCB策略,略
5、强化学习问题的代码实现主要涉及两部分:
第一部分是学习环境的搭建,因为强化学习的数据来自于Agent与环境的交互过程,所以正确合理的环境才可以得到正确的样本;
第二部分是强化学习的算法主体,根据与环境交互产生的数据,Agent进行不断的学习,最后找到最优策略。
6、编程思路
(1) 创建环境的类,首先定义一些属性,def __init__ 必须有,里面的变量在整个类里面可以看成是全局变量
(2)一个环境必须要有的是step()函数和reset()函数
(3)choose_action()函数和train()函数是RL算法的主体
(4)最后创建主函数,运行整个代码。
tips:创建主函数时,尝试使用 if __name__ == '__main__':的形式,规范化代码
(5)整体流程:主函数->训练->选择动作->进入环境,获得奖励->返回到训练函数主体->训练完毕,返回主函数输出