理论

什么是强化学习

  • 状态:一个向量,描述当前智能体的状态;
  • 动作:描述智能体做出的决策;
  • 策略:状态的函数,输出一个动作,满足;
  • 奖励reward:状态的函数,输出一个float奖励值,一般当前的状态是“好状态”我们就会给一个大的reward,反之亦反之;
  • 回报return:一组状态序列对应了一组奖励序列,将奖励序列的折扣加权和定义为状态序列的回报;
  • 状态-动作-值函数:状态和动作的函数。定义为处于状态时采取动作,随后到达状态,在状态下采取最优行动的return。这其实是bellman方程的定义,假设是处于状态采用最优行动后得到的状态序列:

一句话描述什么是强化学习:学习一个策略,使得当我处于状态采取动作满足满足。

所以强化学习的核心实际上是把状态-动作-值函数搞出来,也就是求解bellman方程。有了就得到了!

那如何求解bellman方程呢?列举一部分求解方法及其适用场景:

  • 状态和动作离散,空间不大的情况
    • 动态规划递推:状态转移图没有环,直接顺推、逆推求解就行,参考背包问题的动态规划解法。得到的状态-动作值函数Q是精确的
    • Q值迭代方法:状态转移图有环。当时Bellman算子是压缩映射,得到的状态-动作值函数Q是精确的
  • 状态或者动作空间非常大
    • Deep Q Network(DQN):用神经网络近似状态-动作值函数Q

技术实现

Q值迭代方法

Q值迭代方法
import copy sspace = [0,1,2,3,4,5] # 状态空间 aspace = [0,1] # 动作空间,取0表示下一个状态为当前状态-1,取1表示下一个状态为当前状态+1 reward = [100,0,0,0,0,40] # 奖励 Q = [[0 if (s!=0 and s!=5) else reward[s] for a in aspace] for s in sspace] # Q表 gamma = 0.3 # 折扣因子 delta = float('inf') while True: if delta<1e-12: break # 收敛判断 Q_copy = copy.deepcopy(Q) for s in sspace[1:-1]: for a in aspace: Q_copy[s][a] = reward[s]+gamma*max([Q_copy[s-1][aprime] if a==0 else Q_copy[s+1][aprime] for aprime in aspace]) delta = max([abs(Q[s][a]-Q_copy[s][a]) for s in sspace for a in aspace]) Q = Q_copy print('得到状态-动作——值函数') print(Q) #[[100, 100], [30.0, 2.6999999999999997], [9.0, 1.0799999999999998], [2.6999999999999997, 3.5999999999999996], [1.0799999999999998, 12.0], [40, 40]]

DQN方法

当状态空间或者动作空间特别大的时候就不能用动态规划或者值迭代方法精确求出Q了。这个时候可以适用神经网络取得到近似的Q。以gymnasium的lunar lander为例,给出其用于近似Q的DQN算法:

  1. 随机初始化网络,hint:这个网络输入输出在下各个动作对应的构成的向量,见上图。这是一种网络设计,这种多输出的网络设计的计算效率比较高,好理解的还是左侧输入右侧输出
  2. 重复。终止条件一般是设置最大回合数(gymnasium环境最大重启次数)或者agent达标分数,以下是强化学习一个回合要干的事儿:
    1. replay buffer回放缓冲区存储最近2000条agent和环境的交互信息,每局游戏可能只能拿到几百条信息。重复玩,直到replay buffer满了2000条(这是一个经验数,不一定非得设置这个)信息才进入2.2。如果已经存满2000条信息了,那新信息将覆盖旧信息
    2. 根据replay buffer放的最近2000条信息,利用的副本和bellman方程构造神经网络的输入输出,hint:构造数据集的时候不直接用,而是用它的副本(参数更加落后)可以有效缓解神经网络训练过程loss的振荡
    3. 设置batch_size比方说64,使用MSGD训练神经网络,更新
    4. 定期将的参数赋给

关于BGD,SGD和MSGD:区别在于每次前向船舶算值再反向传播更新参数的时候用多少数据。如果用全部数据就是批量梯度更新BGD;如果只用一条数据就是随机梯度更新SGD;如果是用部分数据就是小批量随机梯度更新。

思考强化学习和监督学习的区别与联系:区别在于数据不是事先准备好的,而是通过agent与环境的互动过程采集,当数据采集完后再适用监督学习方法得到近似的函数。近似效果可能不好?那就重复这个过程,慢慢逼近。

一些改进策略

  1. 贪婪策略:agent和环境交互的时候不总是采取贪婪策略选取动作,而是以一定的概率随机选择动作。这个策略的合理性在于DQN刚开始的时候对于Q的近似可能是很差的,所以贪婪策略本身并不一定好。
  2. 参数软更新策略:类似列生成算法的对偶平滑操作。这个策略可以帮助强化学习更可靠的收敛,缓解振荡。就是让每个回合都慢慢靠近,而不是当前的硬更新策略(定期把的参数赋给)

参考资料

  1. 吴恩达强化学习教程
  2. gymnasium入门博客
  3. gymnasium官方文档,强化学习的环境标准接口