一 On-policy和Off-policy概念
策略更新方法可以分为两类:On-policy(在线策略)和Off-policy(离线策略)。
它们之间的主要区别在于如何使用经验(状态、动作、奖励和下一个状态)来更新智能体的策略。
on-policy: 行动策略和目标策略是同一个策略
off-policy: 行动策略和目标策略不是同一个策略
什么是行动策略和目标策略?
行动策略:就是每一步怎么选动作的方法,它产生经验样本
目标策略:我们选什么样更新方式,去寻找最好的Q表
1.1 On-policy方法
On-policy方法:仅使用当前策略生成的经验数据更新策略。这意味着智能体在每次更新策略后,必须使用新策略收集新的经验数据。想象一下,你在学习打篮球,每次学到新技能后,你必须重新练习,以便更好地掌握新技能。
On-policy方法的典型例子是:REINFORCE算法,Actor-Critic算法,PPO(Proximal Policy Optimization,近端策略优化)算法等。
On-policy方法通常需要更多的样本才能学习有效的策略,因为它们在每次策略更新后必须重新采样新数据。
1.2 Off-policy方法
Off-policy方法:可以使用任何策略(包括非当前策略)生成的经验数据来更新当前策略。这使得离线策略方法可以有效地重用之前收集的经验数据,从而降低数据采样的要求。这就像你在学习打篮球时,可以观察别人的比赛,从他们的经验中学习和提高。
Off-policy方法的典型例子是:Q-learning,DQN(Deep Q-Networks),DDPG(Deep Deterministic Policy Gradient),SAC(Soft Actor-Critic)等。
样本效率:
Off-policy方法由于可以利用历史经验数据,通常具有更高的样本效率。
为何要引入 Off-policy:
为了避免不停地sample(这会很耗时间)
如果我们使用
来收集数据,那么参数θ被更新后,我们需要重新对训练数据进行采样,这样会造成巨大的时间消耗。
引入Off-policy后,可以利用 π θ ′来进行采样,将采集的样本拿来训练 θ , θ ′是固定的,采集的样本可以被重复使用,就避免了反复采样。
重要性采样:
我们假设x来自于p分布,但是现在我们要用q分布来进行学习,那么可以将期望公式进行如下修正
什么时候需要重要性采样:
到底需不需要重要性采样,需要判断在更新目标策略(Target Policy)的时候,是否涉及到不同分布的计算。拿贝尔曼方程进行策略更新的算法为例子,如果更新时使用的动作是行为策略 产生的,那么需要重要性采样;如果更新时使用的动作是目标策略 产生的,那么不需要重要性采样。
所以Q-Learning、DQN、DDPG不用重要性采样
注意事项
两个分布p,q之间的差别不能太大,否则方差会出现较大的差别。
原因如下:
先基于原始的分布p计算函数的方差,然后计算引入不同分布q之后得到的函数方差,可以发现两者得出的方差表达式后面一项相同,主要差别在于前面那一项,如果分布p和q之间差别太大,会导致第一项的值较大或较小,于是造成两者较大的差别。
θ和θ ′是不能差太多的,不然结果会不好,那么怎么避免它们差太多呢?
这就是PPO所在做的事情。
1.3 探索-利用权衡:
On-policy方法中,智能体在每次更新策略后都会按照新策略探索环境。这使得智能体在学习过程中自然地进行探索和利用。在学习过程中,智能体需要平衡尝试新行为(探索)与利用已知优势(利用)之间的权衡。
Off-policy方法则需要额外的机制来确保探索,例如使用ε-greedy策略或其他随机策略进行行动选择。这些策略可以与当前策略分开,在学习过程中独立地进行探索。
总之,On-policy和Off-policy方法之间的最大区别在于它们如何使用经验数据来更新策略。On-policy方法仅使用当前
1.4 off-policy,on-policy各自优缺点
① off-policy学习的优点是:
它可以从任何来源的数据中学习,不需要每次都使用最新的策略来收集数据,这样可以提高数据利用率和学习效率。
它可以同时探索和利用,因为它有两个策略:一个用于探索,一个用于利用。这样可以避免陷入局部最优解。
它可以更容易地实现函数逼近和经验回放,因为它不依赖于当前执行的策略。
② Off-policy学习的缺点是:
它可能需要更多的计算资源和内存空间,因为它需要维护一个数据缓冲区和两个策略。
它可能需要使用重要性采样或其他技术来纠正不同策略之间的偏差,这可能增加了复杂度和方差。
它可能难以保证收敛性和稳定性,特别是在非静态环境中。
③ On-policy学习的优点是:
它比较简单和直观,因为它只有一个策略,并且只从当前执行的策略中学习。
它可以保证收敛到最优策略或接近最优策略的结果,如果满足一定的条件(如足够多的探索)。
它可以适应动态变化的环境,因为它总是使用最新的数据来更新策略。
④ On-policy学习的缺点是:
它可能浪费了很多有价值的数据,因为它只从当前执行的策略中学习,并且每次都需要使用最新的策略来收集数据。
它可能难以平衡探索和利用之间的权衡,因为它只有一个策略,并且需要在每个状态下都进行一定程度的探索。
它可能容易陷入局部最优解,特别是当初始状态或动作选择不合理时。
1.5 区别汇总:
1.5.1 学习方式上的区别:
若agent与环境互动,则为On-policy(此时因为agent亲身参与,所以互动时的policy和目标的policy一致);
若agent看别的agent与环境互动,自己不参与互动,则为Off-policy(此时因为互动的和目标优化的是两个agent,所以他们的policy不一致)
1.5.2 采样数据利用上的区别:
On-policy:样所用的policy和目标policy一致,采样后进行学习,学习后目标policy更新,此时需要把采样的policy同步更新以保持和目标policy一致,这也就导致了需要重新采样。
Off-policy:采样的policy和目标的policy不一样,所以你目标的policy随便更新,采样后的数据可以用很多次
二. 典型算法:On-policy(SARSA)和Off-policy(Q-learning)对比
典型的 On-Policy 强化学习算法包括 SARSA(State-Action-Reward-State-Action)算法。
SARSA 算法是一种基于值函数的强化学习算法,
它通过学习动作值函数 Q(s, a) 来确定最优策略。
SARSA 使用贝尔曼方程进行迭代更新,通过不断探索和更新 Q 值,最终收敛到最优策略。
典型的 Off-Policy 强化学习算法包括 Q-Learning 算法。
Q-Learning 算法也是一种基于值函数的强化学习算法,
它通过学习动作值函数 Q(s, a) 来确定最优策略。
Q-Learning 使用贝尔曼方程进行迭代更新,通过不断探索和更新 Q 值,最终收敛到最优策略。
目标:更新S环境下,做出a动作后的Q(s,a)
① Q-learning算法和Sarsa算法都是从状态s开始,根据当前的Q表使用一定的策略( Epsilon gready)选择一个动作a。
② 然后观测到下一个状态s’,此时这个状态下有个奖励r。
③ 并再次根据Q表选择动作a’。只不过两者选取a’的方法不同:
Q-learning: 使用贪心策略(gready),即选取值最大的a’,此时只是计算出哪个a‘可以使Q(s,a)取到最大值,并没有真正采用这个动作a‘;
Sarsa : 仍使用策略策略(Epsilon gready),并真正采用了这个动作a‘ 。
④ 然后带入式子进行更新
Q-learning: 行动策略是E-gready,但是目标策略,是gready,所以是off-policy
Sarsa: 行动策略是E-gready,但是目标策略,是E-gready,所以是on-policy
三. Q-learning详解【off-policy, 无模型,时间差分TD】
- 初始化环境状态S
- 将当前环境状态S输入到Q网络(即策略网络,保存了action和value对应关系的table),然后输出当前状态的动作A
- 更新Q网络
Qtarget = R + γ maxaQ(s’, a)表示Q真实值,简单理解就是我在S状态下采取了action,从环境中获得了R的奖励,然后对下一时刻的Q值应该也是有影响的,这个影响因子就是γ。另外这次是是一个递归的表达式,所以也可以看出离当前时刻越远,我所采取动作的影响力就越低。
Qtarget - Q(S, A)就是常说的TD(temporal difference) error,这个error在后面的DQN中会作为损失函数。- 更新当前状态为S’
- 返回第二步重复执行,直到满足限定条件
3.1 基本Q-learning
Q学习(Q-learning)是一种==无模型(model-free)==学习。
这个算法核心就是两个矩阵:Q表和R表。
Q表包含了用于实现策略的环境累积知识,R表每一行代表一个状态,每一列代表这一行状态向另一行状态迁移的奖励。
不知道大家有没有感觉,Q表就是地图,R表就是世界……
用这种算法,agent的每个action都能看到R表发现这个iteration能采取的动作,但是依然是短视的。
这就是Q表存在的理由。Q表是agent在探索过程中不断画完整的地图,所以它也就是机器要学习的东西。
基本Q学习用到了epsilon-greedy算法。
我们对Q学习的目标是,由于经过了大量iteration,Q表的质量会越来越好,最后agent直接用Q表就行。
为了实现这个目标,我们希望Q算法利用Q表的信息少于探索的信息(不然就没有信息进入Q表)。
这就是著名的**探索 (Exploration) v.s. 利用(Exploitation)**折中问题。由于我们用epsilon控制这个权衡,所以叫做epsilon-greedy。
这里有一个非常好的比喻,假如你是餐馆经营者,要让客户吃菜:
- Exploration的代价是要不停的拿用户去试菜,影响客户的体验,但有助于更加准确的估计每道菜好吃的概率
- Exploitation会基于目前的估计拿出“最好的”菜来服务客户,但目前的估计可能是不准的(因为试吃的人还不够多)
epsilon-greedy算法用参数epsilon确定什么时候探索,什么时候利用:
算法认为,每当客人到来时:
- 以epsilon的概率选择探索 (Exploration) ,从N道菜中随机选择(概率为 )一个让客人试吃,根据客人的反馈更新菜的做的好吃的概率 { }
- 以1-epsilon的概率选择利用 (Exploitation),从N道菜{ }中选择好吃的概率最高的菜推荐给用户
3.2 深度Q-learning
深度Q学习(Deep Q-Learning,DQL)近似处理Q表的值,而不尝试手动填充Q表。
换句话说,DQL希望寻找到无限逼近最优解的次优解。
也可以理解为,DQL(DQN)就是自动学习Q表。
DQL依然要用到epsilon-greedy算法,这是用来权衡探索和利用的。
不同的是,DQL希望将“达到目标”和“采取动作”间的损失最小化,而这可以用梯度下降完成。
从DNN角度来看就是这幅图:
四. Sarsa(on-policy,时间差分TD)
和Q-learning的区别
其实可以看到Q-learning和Sarsa的最大区别就是对Q网络的更新策略,Sarsa使用的是使用下次状态所采取的的动作所对应的Q值来更新Q值,而Q-learning使用下次状态S2的最大Q值用于更新。
感性的理解就是Sarsa会探索更多的可能性,而Q-learning会铁定心地选择最大可能性的选择。因此,Q-learning虽然具有学习到全局最优的能力,但是其收敛慢;而Sarsa虽然学习效果不如Q-learning,但是其收敛快,直观简单。因此,对于不同的问题,我们需要有所斟酌。