EasyRL笔记

强化学习从入门到入土

  • RL基础(Task 1)
    • 定义:
    • 序列决策过程
      • 状态和观测
      • 动作空间
    • 智能体的组成成分和类型
      • 策略
      • 价值函数
      • 模型
    • 强化学习智能体的类型
      • 基于价值的智能体与基于策略的智能体
      • 有模型强化学习智能体与免模型强化学习智能体
    • 代码实验
  • 马尔可夫决策过程及表格性方法(Task 2)
      • 从MP到MDP
        • 马尔可夫过程(MP)
        • 马尔可夫奖励过程(MRP)
          • 蒙特卡罗方法
          • 动态规划方法
        • 马尔可夫决策过程(MDP)
          • Policy in MDP
          • 价值函数
        • Bellman Expectation Equation
            • policy iteration
            • Value Iteration
      • 表格型方法
        • 免模型预测
          • 蒙特卡洛策略评估
          • 动态规划
          • 时序差分 TD
        • 免模型控制
          • 广义策略迭代
          • Sarsa:同策略时序差分控制
        • Q学习:异策略时序差分控制
  • Policy Gradient & PPO(Task 3)
    • Policy Gradient
    • PPO
  • DDPG (Deep Deterministic Policy Gradient)

RL基础(Task 1)

定义:

借用维基百科对于强化学习的定义:
Reinforcement learning (RL) is an area of machine learning concerned with how intelligent agents ought to take actions in an environment in order to maximize the notion of cumulative reward.

即强化学习是机器学习的一个领域其主要关注的目标是如何使 智能体(agents)在 特定的环境下 做出能使 reward最大的action。从归属上来看,强化学习与控制论有更密切的关联。

强化学习包含 智能体环境 这两个部分,其训练过程即为智能体与环境反复交互的过程。智能体对其观测到的环境的某个状态做出的一个反馈被称为 action or decision (动作\决策)

为了区分强化学习、有监督学习和无监督学习,这里引用了维基百科对强化学习地位的说明 "Reinforcement learning is one of three basic machine learning paradigms, alongside supervised learning and unsupervised learning. " 强化学习、有监督学习和无监督学习三家在机器学习领域形成三足鼎立的格局。至于后来的半监督学习、演化学习、元学习等等学习方法都来源于这三类学习。

强化学习区别于监督学习在于:

  • 强化学习输入的样本是序列数据,而监督学习里面样本都满足独立分布特性
  • 强化学习通过探索和利用的方法不断提升自身的能力
  • 对于监督学习里的监督信号(label + criterion),强化学习的方向指引信号为奖励信号 ( reward )。

序列决策过程

来自维基百科的定义:
In artificial intelligence, sequential decision making refers to algorithms that take the dynamics of the world into consideration, thus delaying parts of the problem until it must be solved. It can be described as a procedural approach to decision-making, or as a step by step decision theory. Sequential decision making has as a consequence the intertemporal choice problem, where earlier decisions influences the later available choices.
简单来说,序列决策过程是智能算法对环境的一系列反馈做出的与之一一对应的一系列决策的过程。

环境反馈给智能算法的评价信号被称为奖励,奖励通常为标量,有时候也会出现矢量的情况 (演化学习中评价两个多目标的agents时常常使用矢量作为评价标准,最后评价结果取决于模型的指标向量是否位于帕累托前沿)。

状态和观测

当智能体与环境进行交互的时候会获取环境的部分信息,这部分信息被称为观测,而关于环境的全部信息被称为状态。简而言之,状态是观测的全貌,观测是状态的一个部分。

动作空间

动作空间是指智能体能够采取的所有动作的集合。这个集合包含的动作的数量常常是有限(在部分极端情况下也可能出现无限但是无论如何动作数量是可数的)

智能体的组成成分和类型

智能体包含策略、价值函数和模型三个部分。策略是指智能体下一步采取的动作;价值函数是指对智能体得到的反馈的评价;模型是指智能体认知环境的过程。

策略

策略是智能体的动作模型,它决定了智能体的动作,用于把输入的状态变成动作的映射关系。策略可分为两种:随机性策略和确定性策略。

随机性策略 是指智能体对观测结果以某种概率选择下一步的动作 (能更多探索环境)

确定性策略是指智能体对特定的观察结果以特定的方式选择下一步的动作(收敛较快但是动作相对比较死板)

价值函数

价值函数的值是对未来奖励的预测,被用来来评估状态的好坏。强化学习智能体的训练过程就是针对价值函数的最大和值链的获取和逼近过程。

模型

智能体的模型决定了下一步的状态。而下一步的状态取决于当前的状态以及当前采取的动作。它由状态转移概率和奖励函数两个部分组成。转移函数为动作间的转化概率,奖励函数为智能体在当前状态采取了某个动作得到奖励的期盼。

强化学习智能体的类型

基于价值的智能体与基于策略的智能体

基于价值的智能体显式地学习价值函数,隐式地学习策略。策略是其从学到的价值函数里面推算出来的。
基于策略的智能体直接学习策略,该模型获得一个状态就会输出对应动作的概率。

有模型强化学习智能体与免模型强化学习智能体

有模型强化学习智能体通过学习状态的转移来采取动作。

免模型强化学习智能体没有去直接估计状态的转移,也没有得到环境的具体转移变量,通过学习价值函数和策略函数进行决策。免模型强化学习智能体的模型里面没有环境转移的模型。

代码实验

强化学习依赖于Gym库及其他深度学习库。

马尔可夫决策过程及表格性方法(Task 2)

从MP到MDP

马尔可夫过程(MP)

定义:如果一个状态转移是符合马尔可夫的,那就是说一个状态的下一个状态只取决于它当前状态,而跟它当前状态之前的状态都没有关系。

其数学定义为针对状态的历史为 h t = { s 1 , s 2 , s 3 , … , s t } h_{t}=\left\{s_{1}, s_{2}, s_{3}, \ldots, s_{t}\right\} ht={s1,s2,s3,,st}则对符合马尔可夫的状态转移满足:
p ( s t + 1 ​ ∣ s t ​ ) = p ( s t + 1 ​ ∣ h t ​ ) p ( s t + 1 ​ ∣ s t ​ , a t ​ ) = p ( s t + 1 ​ ∣ h t ​ , a t ​ ) p(s_{t+1}​∣s_t​)=p(s_{t+1​}∣h_t​) \\ p(s_{t+1}​∣s_t​,a_t​)=p(s_{t+1​}∣h_t​,a_t​) p(st+1st)=p(st+1​ht)p(st+1st,at)=p(st+1​ht,at)

马尔可夫奖励过程(MRP)

马尔可夫奖励过程(Markov Reward Process, MRP) 是在马尔可夫链的基础上加上了一个奖励函数,其表现形式通常为数学期望的格式。并在此基础上定义discount factor γ \gamma γ,用来对未来可以获得的奖励进行相应的折扣(到手的钱才算钱,拒绝画饼,应该可以这么理解叭)。

在MRP中,用 state value function 定义了一个状态的价值用 V t ​ ( s ) V_t​(s) Vt(s)来表示,其代表 G t G_t Gt​ (discounted return)在状态 s s s下的期望值,可以看成是对未来可能获得奖励的当前价值的一个表现。​

价值函数 V t ( s ) V_{t}(s) Vt(s)可以用Bellman Equation(贝尔曼等式)重写为:
V ( s ) = R ( s ) ​​ + γ ∑ s ′ ∈ S P ( s ′ ∣ s ) V ( s ′ ) ​​ V(s)=R(s)​​+\gamma \sum_{s^′\in S}^{} P(s^′∣s)V(s^′)​​ V(s)=R(s)​​+γsSP(ss)V(s)​​

  • s ′ s^′ s 可以看成未来的所有状态。
  • 转移概率 P ( s ′ ∣ s ) P(s^′∣s) P(ss) 是指从当前状态转移到未来状态的概率。
  • V ( s ′ ) V( s' ) V(s) 代表的是未来某一个状态的价值。

Bellman Equation 定义了当前状态跟未来状态之间的关系.

通过这个等式,可以求解得到 V V V 的解析解即 V = ( I − γ P ) − 1 R V=(I−\gamma P)^{−1}R V=(IγP)1R。但是由于需要求矩阵的逆其时间复杂度过大,在实际大规模应用中不可能采用这种方法计算得到价值函数的值。
为了获取 V V V 的数值解,往往采用动态规划、蒙特卡罗和时序差分学习等办法进行求解。

蒙特卡罗方法

EasyRL笔记_第1张图片蒙特卡洛方法是指放入环境计算 N N N 次这一次的价值函数 G G G ,并将这 N N N 次获得的价值函数 { G 1 , G 2 , G 3 … G N } \left\{G_1, G_2 , G_3 \dots G_N \right\} {G1,G2,G3GN} 求均值得到最终的价值函数 G ^ \hat{G} G^。即 G ^ = 1 N ∑ i = 1 N G i \hat{G} = \frac{1}{N}\sum_{i=1}^{N} G_i G^=N1i=1NGi

动态规划方法

EasyRL笔记_第2张图片动态规划方法一直用公式 V ( s ) = R ( s ) ​​ + γ ∑ s ′ ∈ S P ( s ′ ∣ s ) V ( s ′ ) ​​ V(s)=R(s)​​+\gamma \sum_{s^′\in S}^{} P(s^′∣s)V(s^′)​​ V(s)=R(s)​​+γsSP(ss)V(s)​​进行迭代直至 V V V 的数值收敛 ∥ V − V ′ ∥ ≤ ϵ \lVert V - V' \rVert \le \epsilon VVϵ

马尔可夫决策过程(MDP)

相较之前的MRP

  • MDP添加了决策(动作)的成分
  • 状态转移也多了 a t = a a_t = a at=a(action)作为条件,变成了 P ( s t + 1 = s ′ ∣ s t = s , a t = a ) P(s_{t+1}=s^′∣s_t=s,a_t=a) P(st+1=sst=s,at=a)
  • 价值函数也多了 a t = a a_t = a at=a(action)作为价值触发条件,变为了 R ( s t ​ = s , a t ​ = a ) = E [ r t ​ ∣ s t ​ = s , a t ​ = a ] R(s_t​=s,a_t​=a)=E[r_t​∣s_t​=s, a_t​=a] R(st=s,at=a)=E[rtst=s,at=a], 即当前的状态和采取的动作都会成为当前可能得到的奖励数量的影响因素。
Policy in MDP

Policy: 某一个状态( S S S)应该采取什么样的动作( a a a)。
π ( a ∣ s ) = P ( a t ​ = a ∣ s t ​ = s ) π(a∣s)=P(a_t​=a∣s_t​=s) π(as)=P(at=ast=s)

价值函数

状态-价值函数(state-value function) v π ( s ) = E π ​ [ G t ​ ∣ s t ​ = s ] v^π(s)=E_π​[G_t​∣s_t​=s] vπ(s)=Eπ[Gtst=s]

Q 函数 action-value function: 某一个状态采取某一个动作,有可能得到的这个 return 的一个期望 q π ( s , a ) = E π ​ [ G t ​ ∣ s t ​ = s , a t ​ = a ] q^π(s,a)=E_π​[G_t​∣s_t​=s,a_t​=a] qπ(s,a)=Eπ[Gtst=s,at=a]

这两个价值函数的关联如下式所示:
v π ( s ) = ∑ a ∈ A ​ π ( a ∣ s ) q π ( s , a ) v^π(s)=\underset{a \in A}{\sum} ​π(a∣s)q^π(s,a) vπ(s)=aAπ(as)qπ(s,a)
其中 π \pi π是一个概率, q π q^\pi qπ代表 a a a 对应的决策的值。

Q函数也可以写成Bellman Equation的形式:
q ( s , a ) ​ = R ( s , a ) + γ ∑ s ′ ∈ S ​ P ( s ′ ∣ s , a ) V ( s ′ ) ​ q(s,a)​ = R(s,a) + \gamma \underset{s' \in S}{\sum}​P(s′∣s,a)V(s′)​ q(s,a)=R(s,a)+γsSP(ss,a)V(s)

Bellman Expectation Equation

价值函数和Q函数的Bellman Expectation Equation可以写成下式:
v π ( s ) = E π ​ [ R t + 1 ​ + γ v π ( s t + 1 ​ ) ∣ s t ​ = s ] q π ( s , a ) = E π ​ [ R t + 1 ​ + γ q π ( s t + 1 ​ , a t + 1 ​ ) ∣ s t ​ = s , a t ​ = a ] v^π(s)=E^π​[R_{t+1}​+γv^π(s_{t+1}​)∣s_t​=s] \\ q^π(s,a)=E^π​[R_{t+1}​+γq^π(s_{t+1}​,a_{t+1}​)∣s_t​=s,a_t​=a] vπ(s)=Eπ[Rt+1+γvπ(st+1)st=s]qπ(s,a)=Eπ[Rt+1+γqπ(st+1,at+1)st=s,at=a]

这两个价值函数也能写成,通过相互带入能够实现有效的消元。
v π ( s ) = ∑ a ∈ A ​ π ( a ∣ s ) q π ( s , a ) q π ( s , a ) = R s a ​ + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) v π ( s ′ ) ⇓ v π ( s ) = ∑ a ′ ∈ A ​ π ( a ∣ s ) ( R ( s , a ) + γ ∑ s ′ ∈ S ​ P ( s ′ ∣ s , a ) v π ( s ′ ) ) q π ( s , a ) = R ( s , a ) + γ ∑ s ′ ∈ S ​ P ( s ′ ∣ s , a ) ∑ a ′ ∈ A ​ π ( a ′ ∣ s ′ ) q π ( s ′ , a ′ ) v^π(s)=\underset{a \in A}{\sum}​\pi(a∣s)q^\pi(s,a) \\ q^\pi(s,a)=R_s^a​+\gamma \underset{s' \in S}{\sum}P(s^′∣s,a)v^\pi(s^′)\\ \Downarrow \\ v^\pi(s)=\underset{a' \in A}{\sum}​\pi(a∣s)\biggl(R(s,a)+γ\underset{s' \in S}{\sum}​P(s^′∣s,a)v^\pi(s^′)\biggr)\\ q^\pi(s,a)=R(s,a)+γ\underset{s' \in S}{\sum}​P(s^′∣s,a)\underset{a' \in A}{\sum}​π(a^′∣s^′)q^π(s^′,a^′) vπ(s)=aAπ(as)qπ(s,a)qπ(s,a)=Rsa+γsSP(ss,a)vπ(s)vπ(s)=aAπ(as)(R(s,a)+γsSP(ss,a)vπ(s))qπ(s,a)=R(s,a)+γsSP(ss,a)aAπ(as)qπ(s,a)
而强化学习的目标就是寻找到
v ∗ ( s ) = max ⁡ π v π ( s ) o r π ∗ ( s ) = a r g max ⁡ π ​ v π ( s ) v^∗(s)=\underset{\pi}{\max} v^\pi(s) \\ or \\ \pi^∗(s)=\underset{\pi}{arg \max}​ v^π(s) v(s)=πmaxvπ(s)orπ(s)=πargmaxvπ(s)
而搜索这种策略的方式有两种常用的方法:policy iteration 和 value iteration

policy iteration

Policy iteration 由两个步骤组成:policy evaluation 和 policy improvement
EasyRL笔记_第3张图片

policy iteration
获取 V V V
通过reward function以及状态转移计算Q-function
取使它得到最大值的 action

q π i ​ ( s , a ) = R ( s , a ) + γ ∑ s ′ ∈ S ​ P ( s ′ ∣ s , a ) v π i ​ ( s ′ ) ⇓ ⇑ π i + 1 ​ ( s ) = a r g max ⁡ a ​ q π i ​ ( s , a ) q^{\pi i}​(s,a)=R(s,a)+γ\underset{s' \in S}{\sum}​P(s'∣s,a)v^{\pi i}​(s')\\ \Downarrow \Uparrow \\ π_{i+1}​(s)=\underset{a}{arg\max}​ q^{πi}​(s,a) qπi(s,a)=R(s,a)+γsSP(ss,a)vπi(s)⇓⇑πi+1(s)=aargmaxqπi(s,a)

Value Iteration

Value iteration 就是把 Bellman Optimality Equation 当成一个 update rule 来进行
v ( s ) ← max ⁡ a ∈ A ​ ( R ( s , a ) + γ ∑ s ′ ∈ S ​ P ( s ′ ∣ s , a ) v ( s ′ ) ) v(s)\leftarrow \underset{a \in A}{\max}​\Bigl(R(s,a)+γ\underset{s' \in S}{\sum}​P(s'∣s,a)v(s')\Bigr) v(s)aAmax(R(s,a)+γsSP(ss,a)v(s))

表格型方法

表格型方法: 使用查找表的强化学习方法

免模型预测

上一时刻平均值与现在时刻的平均值之间的联系为:
μ t ​ = μ t − 1 ​ + 1 t ​ ( x t ​ − μ t − 1 ​ ) μ_t​=μ_{t−1}​+\frac{1}{t}​(x_t​−μ_{t−1}​) μt=μt1+t1(xtμt1)
其中的 1 t \frac{1}{t} t1 可以被理解为学习率

蒙特卡洛策略评估

蒙特卡洛方法是基于采样的方法,给定策略 π \pi π让智能体与环境进行交互可以得到很多轨迹。每个轨迹都有对应的回报 G t G_t Gt。求出所有轨迹的回报的平均值,就可以知道某一个策略对应状态的价值,即:
V π ​ ( s ) = E τ ∼ π ​ [ G t ​ ∣ s t ​ = s ] V_π​(s)=E_{τ∼π}​[G_t​∣s_t​=s] Vπ(s)=Eτπ[Gtst=s]
蒙特卡洛方法的具体操作流程如下:

  • Step 1:循环执行下面两个公式
    N ( s ) ← N ( s ) + 1 S ( s ) ← S ( s ) + G t N(s)←N(s)+1 \\ S(s)←S(s)+G_t \\ N(s)N(s)+1S(s)S(s)+Gt
    其中 G t ​ = r t + 1 ​ + γ r t + 2 ​ + γ 2 r t + 3 ​ + … G_t​=r_{t+1}​+γr_{t+2}​+γ^2r_{t+3}​ + \dots Gt=rt+1+γrt+2+γ2rt+3+
  • Step 2:跳出循环
    V ( s ) = S ( s ) / N ( s ) V(s)=S(s)/N(s) V(s)=S(s)/N(s)
动态规划

V i ​ ( s ) ← ∑ a ∈ A π ( a ∣ s ) ( R ( s , a ) + γ ∑ s ′ ∈ S ​ P ( s ′ ∣ s , a ) V i − 1 ​ ( s ′ ) ) V_i​(s)←\underset{a \in A}{\sum}\pi(a∣s)\Bigl( R(s,a)+γ\underset{s' \in S}{\sum}​P(s^′∣s,a)V_{i−1}​(s^′)\Bigr) Vi(s)aAπ(as)(R(s,a)+γsSP(ss,a)Vi1(s))
这个公式来源于 V V V的Bellman Expectation Equation

时序差分 TD

时序差分是介于蒙特卡洛和动态规划之间的方法,是一种免模型的方法。在训练过程中不需要使用到马尔可夫决策过程的转移矩阵和奖励函数。 此外,时序差分方法可以从不完整的回合中学习,并且结合了自举的思想。

时序差分方法的目的是对于某个给定的策略 π \pi π,在线(online)step-by-step 地算出它的价值函数 V π V_π Vπ

一步时序差分每往前走一步,就做一步自举,用得到的估计回报(estimated return) r t + 1 + γ V ( s t + 1 ) r_{t+1}+γV(s_{t+1}) rt+1+γV(st+1) 来更新上一时刻的值 V ( s t ) V(s_t) V(st)
V ( s t ​ ) ← V ( s t ​ ) + α ( r t + 1 ​ + γ V ( s t + 1 ​ ) − V ( s t ​ ) ) V(s_t​)←V(s_t​)+α\Bigl(r_{t+1}​+γV(s_{t+1}​)−V(s_t​)\Bigr) V(st)V(st)+α(rt+1+γV(st+1)V(st))

时序差分目标(TD target)in TD(0) :带衰减的未来奖励的总和 r t + 1 + γ V ( s t + 1 ) r_{t+1}+γV(s_{t+1}) rt+1+γV(st+1)其包含两个部分,分别为:

  • 实际奖励 r t + 1 r_{t+1} rt+1
  • 用了自举的方法估计得到的乘以折扣因子 γ \gamma γ V ( s t + 1 ) V(s_{t+1}) V(st+1) , 表现为 γ V ( s t + 1 ) \gamma V(s_{t+1}) γV(st+1)

时序差分误差(TD error)in TD(0) δ = r t + 1 ​ + γ V ( s t + 1 ​ ) − V ( s t ​ ) \delta =r_{t+1}​+\gamma V(s_{t+1}​)−V(s_t​) δ=rt+1+γV(st+1)V(st) 为每一步变化的内容 δ \delta δ乘学习率 α \alpha α 就是 V ( s t ) V(s_t) V(st) 的更新量

对于更一般的TD(n) 其与TD(0)区别在于执行几步更新一次,公式基本一致。

免模型控制

在不知道马尔可夫决策过程模型的情况下对价值函数进行优化的方法。

广义策略迭代

(generalized policy iteration,GPI)

策略迭代
STEP 1 : 根据当前策略 π \pi π 来估计价值函数 V V V
对价值函数 V V V 运用贪心的方法来改进策略 π ′ \pi' π

上述策略用数学公式可以写成
π i + 1 ​ ( s ) = a r g max ⁡ ​ a Q π i ​​ ( s , a ) π_{i+1}​(s)=\underset{a}{arg \max​}Q_{π_i}​​(s,a) πi+1(s)=aargmaxQπi​​(s,a),但这种方法在得到状态价值函数 V V V 后,由于并不知道奖励函数 R ( s , a ) R(s,a) R(s,a) 和状态转移 P ( s ′ ∣ s , a ) P(s'∣s,a) P(ss,a),无法被用来估计 Q 函数。
Q π i ​​ ( s , a ) = R ( s , a ) + γ ∑ s ′ ∈ S ​ P ( s ′ ∣ s , a ) V π i ​​ ( s ′ ) Q_{π_i}​​(s,a)=R(s,a)+γ\underset{s' \in S}{\sum}​P(s'∣s,a)V_{\pi_i}​​(s') Qπi​​(s,a)=R(s,a)+γsSP(ss,a)Vπi​​(s)
由于上述原因,提出了广义策略迭代方法

广义策略迭代
使用蒙特卡洛方法来估计策略 Q = Q π Q=Q_π Q=Qπ
可以通过贪心的方法去更新策略 π ( s ) = a r g max ⁡ ​ a Q ( s , a ) π(s)=\underset{a}{arg\max​}Q(s,a) π(s)=aargmaxQ(s,a)

EasyRL笔记_第4张图片

其中,使用蒙特卡洛方法来估计策略 Q = Q π Q=Q_π Q=Qπ的方法如下图所示。
EasyRL笔记_第5张图片为了确保蒙特卡洛方法能够有足够的探索,可以使用了 ε \varepsilon ε - 贪心( ε \varepsilon ε-greedy)探索。 ε \varepsilon ε - 贪心是指有 1 − ε 1 - \varepsilon 1ε的概率会按照 Q函数来决定动作。

基于 ε \varepsilon ε - 贪心探索的蒙特卡洛方法如图所示。
EasyRL笔记_第6张图片

Sarsa:同策略时序差分控制

Sarsa 算法:使用时序差分来估计Q函数的方法,将原本时序差分方法更新 V 的过程,变成了更新 Q,Sarsa 通过直接估计 Q 表格,完成策略的更新。
Q ( s t ​ , a t ​ ) ← Q ( s t ​ , a t ​ ) + α [ r t + 1 ​ + γ Q ( s t + 1 ​ , a t + 1 ​ ) − Q ( s t ​ , a t ​ ) ] Q(s_t​,a_t​)←Q(s_t​,a_t​)+α[r_{t+1}​+γQ(s_{t+1​},a_{t+1}​)−Q(s_t​,a_t​)] Q(st,at)Q(st,at)+α[rt+1+γQ(st+1​,at+1)Q(st,at)]

n 步 Sarsa算法
EasyRL笔记_第7张图片n 步Sarsa的更新公式如下:
n 步 Q 回报为: Q t n ​ = r t + 1 ​ + γ r t + 2 ​ + ⋯ + γ n − 1 r t + n ​ + γ n Q ( s t + n ​ , a t + n ​ ) 加上资格迹衰减参数 λ 进行求和: Q t λ ​ = ( 1 − λ ) ∑ n = 1 ∞ ​ λ n − 1 Q t n ​ 更新策略: Q ( s t ​ , a t ​ ) ← Q ( s t ​ , a t ​ ) + α ( Q t λ ​ − Q ( s t ​ , a t ​ ) ) n步 Q 回报为:Q_t^n​=r_{t+1​}+γr_{t+2}​+\dots+γ^{n−1}r_{t+n}​+γ^nQ(s_{t+n}​,a_{t+n​}) \\ 加上资格迹衰减参数\lambda进行求和:Q_t^λ​=(1−λ)\sum_{n=1}^{\infty}​\lambda^{n−1}Q_t^n​ \\ 更新策略:Q(s_t​,a_t​)←Q(s_t​,a_t​)+α(Q_t^λ​−Q(s_t​,a_t​)) nQ回报为:Qtn=rt+1​+γrt+2++γn1rt+n+γnQ(st+n,at+n)加上资格迹衰减参数λ进行求和:Qtλ=(1λ)n=1λn1Qtn更新策略:Q(st,at)Q(st,at)+α(QtλQ(st,at))

Q学习:异策略时序差分控制

同策略算法:同策略算法在学习的过程中只存在一种策略。
异策略算法:训练过程中包含**目标策略(target policy)行为策略(behavior policy)**两种策略。目标策略是算法需要去学习的策略,一般用 π \pi π 来表示。行为策略是探索环境的策略,一般用 μ \mu μ 来表示。行为策略肆意探索环境,并把采集到的数据交给目标策略学习。
其更新公式为
Q ( s t ​ , a t ​ ) ← Q ( s t ​ , a t ​ ) + α [ r t + 1 ​ + γ max ⁡ a ​ Q ( s t + 1 ​ , a ) − Q ( s t ​ , a t ​ ) ] Q(s_t​,a_t​)←Q(s_t​,a_t​)+α[r_{t+1}​+γ\underset{a}{\max}​Q(s_{t+1}​,a)−Q(s_t​,a_t​)] Q(st,at)Q(st,at)+α[rt+1+γamaxQ(st+1,a)Q(st,at)]

Policy Gradient & PPO(Task 3)

Policy Gradient

强化学习有 3 个组成部分:演员(actor)环境(environment)奖励函数(reward function),其中环境和奖励函数不是可控制的,只有 actor 的策略可以调整。

策略 π θ \pi^\theta πθ,其中 θ \theta θ 代表策略 π \pi π 的参数

回合(episode) or 试验(trial):一次从开始到结束的游戏

回报(return) or 总奖励(total reward):在一个回合中获得的全部奖励的总和,记作 R R R

Trajectory(轨迹):把环境输出的 s s s 和演员输出的行为 a a a 按照时间的次序串起来。 Trajectory ⁡ τ = { s 1 ​ , a 1 ​ , s 2 ​ , a 2 ​ , … , s t ​ , a t } \operatorname{Trajectory} \tau = \bigl\{ s_1​,a_1​,s_2​,a_2​,\dots,s_t​,a_t \bigr\} Trajectoryτ={s1,a1,s2,a2,,st,at}

对特定的网络参数 θ \theta θ ,每一个轨迹发生的概率为 p θ ​ ( τ ) = p ( s 1 ) ∏ t = 1 T p θ ​ ( a t ​ ∣ s t ​ ) p ( s t + 1 ​ ∣ s t ​ , a t ​ ) p_θ​(\tau)=p(s_1)\prod_{t=1}^{T} p_\theta​(a_t​∣s_t​)p(s_{t+1}​∣s_t​,a_t​) pθ(τ)=p(s1)t=1Tpθ(atst)p(st+1st,at)。其中 p ( s t + 1 ∣ s t , a t ) p ( s t + 1 ∣ s t , a t ) p ( s t + 1 ​ ∣ s t ​ , a t ​ ) p(s_{t+1}∣s_t,a_t)p(s_{t+1}|s_t,a_t)p(s_{t+1}​∣s_t​,a_t​) p(st+1st,at)p(st+1st,at)p(st+1st,at)代表的是环境给反馈的概率, p θ ​ ( a t ​ ∣ s t ​ ) p_θ​(a_t​∣s_t​) pθ(atst)代表的是agent做出动作的概率。

在训练过程中,调整的是agent的参数 θ \theta θ 其方向是使得 π θ \pi ^\theta πθ获取的 R 最大 max ⁡ θ R \underset{\theta}{\max}R θmaxR。但是由于环境和agent的随机性, R R R 往往是一个随机的标量,因而不能通过 R R R 计算得到最好的 agent 的参数 θ \theta θ R R R 的期望 R θ ˉ \bar{R_\theta} Rθˉ 是一个稳定的值,可以被用来替代 R R R 实现对 agent 参数 θ \theta θ 的计算。
R θ ˉ ​ = ∑ τ ​ R ( τ ) p θ ( τ ) = E τ ∼ p θ ​ ( τ ) ​ [ R ( τ ) ] \bar{R_\theta}​=\underset{\tau}{\sum}​R(\tau)p_\theta(\tau) = E_{\tau∼p_\theta​(\tau)}​[R(\tau)] Rθˉ=τR(τ)pθ(τ)=Eτpθ(τ)[R(τ)]
为了能够使得 R θ ˉ \bar{R_\theta} Rθˉ获得相对较大的数值,在深度学习领域往往采用梯度上升的方法。

首先引入一个公式
∇ f ( x ) = f ( x ) ∇ l o g f ( x ) \nabla f(x)=f(x)\nabla logf(x) f(x)=f(x)logf(x)
∇ p θ ( τ ) \nabla p_{\theta}(\tau) pθ(τ) 使用这个公式,得到 ∇ p θ ( τ ) = p θ ( τ ) ∇ log ⁡ p θ ( τ ) \nabla p_{\theta}(\tau)=p_{\theta}(\tau) \nabla \log p_{\theta}(\tau) pθ(τ)=pθ(τ)logpθ(τ),最终得到

∇ p θ ( τ ) p θ ( τ ) ​ = ∇ log ⁡ p θ ​ ( τ ) \frac{\nabla p_\theta(\tau)}{p_\theta(\tau)}​=\nabla \log p_\theta​(\tau) pθ(τ)pθ(τ)=logpθ(τ)

所以
∇ R ˉ ​ ​ θ = ∑ τ ​ R ( τ ) ∇ p θ ​ ( τ ) = ∑ τ ​ R ( τ ) p θ ​ ( τ ) ∇ log ⁡ p θ ​ ( τ ) = E τ ∼ p θ ​ ( τ ) ​ [ R ( τ ) ∇ log ⁡ p θ ​ ( τ ) ] ​ \nabla \bar{R}​​_\theta = \underset{\tau}{\sum}​R(\tau) \nabla p_\theta​(\tau) \\ = \underset{\tau}{\sum}​R(\tau)p_\theta​(\tau) \nabla \log p_\theta​(\tau) \\ =E_{\tau∼p_\theta​(\tau)}​[R(\tau) \nabla \log p_\theta​(\tau)]​ Rˉθ=τR(τ)pθ(τ)=τR(τ)pθ(τ)logpθ(τ)=Eτpθ(τ)[R(τ)logpθ(τ)]
但是公式里的期望值没有办法直接计算获得,但是可以用采样的方式来获取一系列的 τ \tau τ ,并用来计算 ∇ R \nabla R R
E τ ∼ p θ ​ ( τ ) ​ [ R ( τ ) ∇ log ⁡ p θ ​ ( τ ) ] ​ ≈ 1 N ∑ ​ n = 1 N ​ R ( τ n ) ∇ log ⁡ p θ ​ ( τ n ) = 1 N ∑ n = 1 N ∑ t = 1 T n ​ ​ R ( τ n ) ∇ log ⁡ p θ ​ ( a t n ​ ∣ s t n ​ ) ​ E_{\tau∼p_\theta​(\tau)}​[R(\tau) \nabla \log p_\theta​(\tau)]​ \\ \approx \frac{1}{N} \sum_{​n=1}^{N​} R(\tau ^ n)\nabla \log p_\theta ​(\tau ^n)\\ =\frac{1}{N} \sum _{n=1}^{N} \sum _{t=1}^{T_n​}​R(\tau ^n)\nabla \log p_\theta​(a_t^n​∣s_t^n​)​ Eτpθ(τ)[R(τ)logpθ(τ)]N1n=1NR(τn)logpθ(τn)=N1n=1Nt=1TnR(τn)logpθ(atnstn)

其中 ∇ log ⁡ p θ ( τ ) \nabla \log p_{\theta}(\tau) logpθ(τ)的推导公式为:

∇ log ⁡ p θ ​ ( τ ) ​ = ∇ ( log ⁡ p ( s 1 ​ ) + ∑ t = 1 T log ⁡ p θ ​ ( a t ​ ∣ s t ​ ) + ∑ t = 1 T log ⁡ p ( s t + 1 ​ ∣ s t ​ , a t ​ ) ) = ∇ log ⁡ p ( s 1 ​ ) + ∇ ∑ t = 1 T log ⁡ p θ ​ ( a t ​ ∣ s t ​ ) + ∇ ∑ t = 1 T log ⁡ p ( s t + 1 ​ ∣ s t ​ , a t ​ ) = ∇ ∑ t = 1 T log ⁡ p θ ​ ( a t ​ ∣ s t ​ ) = ∑ t = 1 T ∇ ​ log ⁡ p θ ​ ( a t ​ ∣ s t ​ ) ​ \nabla \log p_\theta​(\tau)​=\nabla \Bigl(\log p(s_1​) + \sum_{t=1}^{T} \log p_\theta​(a_t​∣s_t​)+ \sum_{t=1}^{T} \log p(s_{t+1}​∣s_t​,a_t​)\Bigr) \\ =\nabla \log p(s_1​) + \nabla \sum_{t=1}^{T} \log p_\theta​(a_t​∣s_t​)+\nabla\sum_{t=1}^{T} \log p(s_{t+1}​∣s_t​,a_t​)\\ =\nabla \sum_{t=1}^{T}\log p_\theta​(a_t​∣s_t​) \\ =\sum_{t=1}^{T}\nabla​ \log p_\theta​(a_t​∣s_t​)​ logpθ(τ)=(logp(s1)+t=1Tlogpθ(atst)+t=1Tlogp(st+1st,at))=logp(s1)+t=1Tlogpθ(atst)+t=1Tlogp(st+1st,at)=t=1Tlogpθ(atst)=t=1T∇​logpθ(atst)
在公式中 p ( s 1 ​ ) p(s_1​) p(s1) p ( s t + 1 ∣ s t , a t ) p(s_{t+1}|s_t,a_t) p(st+1st,at) 来自于环境, p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(atst) 来自于 agent。 p ( s 1 ) p(s_1) p(s1) p ( s t + 1 ∣ s t , a t ) p(s_{t+1}|s_t,a_t) p(st+1st,at) 由环境决定与 θ \theta θ 无关,因此 ∇ log ⁡ p ( s 1 ) = 0 \nabla \log p(s_1)=0 logp(s1)=0 ∇ ∑ t = 1 T log ⁡ p ( s t + 1 ∣ s t , a t ) = 0 \nabla \sum_{t=1}^{T}\log p(s_{t+1}|s_t,a_t)=0 t=1Tlogp(st+1st,at)=0

PPO

DDPG (Deep Deterministic Policy Gradient)

DDPG 的提出是为了让 DQN 可以扩展到连续的动作空间
EasyRL笔记_第8张图片
在实际使用中,DDPG 有时表现很好,但在超参数和其他类型的调整方面经常很敏感。为了解决这一问题,TD3 引入了三个关键技巧:

  • 截断的双 Q 学习
  • 延迟的策略更新
  • 目标策略平滑

DDPG的实验代码接口

env = gym.make('Pendulum-v0') 
env.seed(1) # 设置env随机种子
n_states = env.observation_space.shape[0] # 获取总的状态数

rewards = [] # 记录总的rewards
moving_average_rewards = [] # 记录总的经滑动平均处理后的rewards
ep_steps = []
for i_episode in range(1, cfg.max_episodes+1): # cfg.max_episodes为最大训练的episode数
    state = env.reset() # reset环境状态
    ep_reward = 0
    for i_step in range(1, cfg.max_steps+1): # cfg.max_steps为每个episode的补偿
        action = agent.select_action(state) # 根据当前环境state选择action
        next_state, reward, done, _ = env.step(action) # 更新环境参数
        ep_reward += reward
        agent.memory.push(state, action, reward, next_state, done) # 将state等这些transition存入memory
        state = next_state # 跳转到下一个状态
        agent.update() # 每步更新网络
        if done:
            break
    # 更新target network,复制DQN中的所有weights and biases
    if i_episode % cfg.target_update == 0: #  cfg.target_update为target_net的更新频率
        agent.target_net.load_state_dict(agent.policy_net.state_dict())
    print('Episode:', i_episode, ' Reward: %i' %
          int(ep_reward), 'n_steps:', i_step, 'done: ', done,' Explore: %.2f' % agent.epsilon)
    ep_steps.append(i_step)
    rewards.append(ep_reward)
    # 计算滑动窗口的reward
    if i_episode == 1:
        moving_average_rewards.append(ep_reward)
    else:
        moving_average_rewards.append(
            0.9*moving_average_rewards[-1]+0.1*ep_reward)

你可能感兴趣的:(打卡,人工智能,机器学习)