一、强化学习基础
1.1 强化学习与监督学习
-
对于 supervised-learning ,有两个假设:
- ① 输入的数据都是independent and identically distributed (i.i.d.)
- ② 必须要立刻获得反馈(error)
-
强化学习的后续数据来自于后续动作,我们希望得到有稳定提升的数据,即在强化学习里面一个非常重要的问题就是,怎么让智能体的动作一直稳定地提升。
-
监督学习的数据都是人打标签做到的,因此监督学习的上限就是标签,但是强化学习是Agent在环境中自己探索,强化学习的上限是无法预知的。
-
强化学习是根据当前状态输出下一步动作,很多时候无法对下一步动作进行标注
1.2 一些基本概念
-
预演(rollout): 在当前状态下,尝试多种action,直到一局游戏结束。
-
序列决策过程: 智能体动作,从环境中获得奖励和状态,根据状态进行下一步动作。
-
一个回合(episode)/一个试验(trial): 就是一局游戏,从开始到结束。
-
轨迹: 即一条路走到结束,并且记录每一步的 S t a t e 和 A c t i o n State和Action State和Action
τ = ( s 0 , a 0 , s 1 , a 1 , s 2 , a 2 , s 3 , a 3 . . . ) \tau = (s_0, a_0,s_1, a_1,s_2, a_2,s_3, a_3...) τ=(s0,a0,s1,a1,s2,a2,s3,a3...)
-
历史:
H t = ( o 1 , r 1 , a 1 , o 2 , r 2 , a 2 . . . o t , r t , a t ) H_t = (o_1,r_1,a_1,o_2,r_2,a_2...o_t,r_t,a_t) Ht=(o1,r1,a1,o2,r2,a2...ot,rt,at)
S t = f ( H t ) S_t = f(H_t) St=f(Ht)
-
状态S和观测O:
-
观测(Observation)是指观测到或能感知到的所有参数的集合,如通过摄像头采集的图像,通过传感器获取的各种信号
-
状态(State)是对某一个情景的完备性描述,例如, 我们可以用 RGB 像素值的矩阵来表示一个视觉的观测,可以用机器人关节的角度和速度来表示一个机器 人的状态。
-
严格来说,智能体通过接受观测输出动作和智能体的状态,环境接受智能体的动作,输出环境的状态,在强化学习的设定里面, 环境的状态才是真正的所有状态。
当智能体的状态与环境的状态等价的时候,即当智能体能够观察到环境的所有状态时,我们称这个环境是完全可观测的,这种情况下可以用可观测Markov模型解决。
在马尔可夫决策过程中, o t = s t a = s t e o_t = s_t^a = s_t^e ot=sta=ste
-
-
生活中,智能体无法观测全部环境状态,即部分可观测Markov模型,下面是POMDP的七元组
( S , A , T , R , Ω , γ ) (S,A,T,R,\Omega,\gamma) (S,A,T,R,Ω,γ)
(状态空间,动作空间,状态转移概率,奖励函数,观测概率,观测空间,折扣系数)
T
(
s
′
∣
s
,
a
)
为状态转移概率,
Ω
(
o
∣
s
,
a
)
为观测概率
T(s^{'}|s,a)为状态转移概率,\Omega(o|s,a)为观测概率
T(s′∣s,a)为状态转移概率,Ω(o∣s,a)为观测概率
- 深度强化学习:有了深度网络,就有了端到端的能力,我们就不用去考虑特征。可以直接设计一个 输入State输出Action的函数。
1.3 Agent
-
强化学习智能体要包含以下三种能力:
-
① 策略: 根据当前的观测和状态->输出下一步动作
- 随机性策略: π ( a ∣ s ) , 输入当前状态,输出执行动作空间各个动作的概率 \pi(a|s),输入当前状态,输出执行动作空间各个动作的概率 π(a∣s),输入当前状态,输出执行动作空间各个动作的概率
- 确定性策略: a r g m a x [ π ( a ∣ s ) ] ,输入当前状态,输出一个动作 argmax [\pi(a|s)],输入当前状态,输出一个动作 argmax[π(a∣s)],输入当前状态,输出一个动作
-
② 价值函数: 输入当前智能体的状态,价值函数评估此状态的价值
V函数只评估状态的价值,Q函数评估(当前状态+下一步动作)的价值
- V x ( s ) = E π [ G t ∣ s t = s ] = E π [ Σ γ k r t + k + 1 ∣ s t = s ] V_x(s)=E_{\pi}[G_t|s_t=s]=E_{\pi}[\Sigma{\gamma^kr_{t+k+1}|s_t=s}] Vx(s)=Eπ[Gt∣st=s]=Eπ[Σγkrt+k+1∣st=s]
- Q π ( s , a ) = E π [ G t ∣ s t = s , a t = a ] = E π [ Σ γ k r t + k + 1 ∣ s t = s , a t = a ] Q_{\pi}(s,a)=E_{\pi}[G_t|s_t=s,a_t=a]=E_{\pi}[\Sigma{\gamma^kr_{t+k+1}|s_t=s,a_t=a}] Qπ(s,a)=Eπ[Gt∣st=s,at=a]=Eπ[Σγkrt+k+1∣st=s,at=a]
-
③ 模型: 智能体对环境状态的理解
模型的输入是 ( s t , a t ) , 输出是“执行 a 后状态转移到 s ′ 的概率” 模型的输入是(s_t,a_t),输出是“执行a后状态转移到s^{'}的概率” 模型的输入是(st,at),输出是“执行a后状态转移到s′的概率”
p s − > s ′ a = p ( s t + 1 = s ′ ∣ s t = s , a t = a ) p_{s->s^{'}} ^a= p(s_{t+1}=s^{'}|s_t=s,a_t=a) ps−>s′a=p(st+1=s′∣st=s,at=a)
-
- **根据如何利用价值函数和策略函数,**我们可以把智能体分为Value-based和Policy-based,即对于智能体来说,根据环境中的不同状态,输出的是动作还是当前状态的价值。
**基于价值的智能体(value-based agent)**显式地学习价值函数,隐式地学习它的策略。策略是其从学到的价值函数里面推算出来的。**基于策略的智能体(policy-based agent)**直接学习策略,我们给它一个状态,它就会输出对应动作的概率。基于策略的智能体并没有学习价值函数。
-
根据是否有状态转移模型,我们把智能体分为model-based和model-free
状态转移模型是智能体对环境进行的拟合,是智能体通过对环境的感知自己构建的虚拟环境
对于强化学习任务,最重要的是 < S , A , P , R > , 即状态空间,动作空间,状态转移模型,奖励函数 对于强化学习任务,最重要的是<S,A,P,R>,即状态空间,动作空间,状态转移模型,奖励函数 对于强化学习任务,最重要的是<S,A,P,R>,即状态空间,动作空间,状态转移模型,奖励函数
如果以上信息已知,那么智能体具有足够能力对真实环境进行仿真
-
model-baesd:
<S,A,P,R>均已知且容易设置,就可以采取model-based的策略
-
model-free:
通常情况下,状态转移函数和奖励函数很难估计,甚至连环境中的状态都可能是未知的,这时就需要采用免模型强化学习。免模型强化学习没有对真实环境进行建模,智能体只能在真实环境中通过一定的策略来执行动作,等待奖励和状态迁移,然后根据这些反馈信息来更新动作策略,这样反复迭代直到学习到最优策略。
(model-free需要大量数据, model-based需要的数据少一些)
-
- 什么是探索和利用:
- t探索: 将所有的尝试机会平均分配给每个摇臂(即轮流按下每个摇臂),最后以每个摇臂各自的平均吐币概率作为其奖励期望的近似估计。
- 利用: 按下目前最优的(即到目前为止平均奖励最大的)摇臂,若有多个摇臂同为最优,则从中随机选取一个。
事实上,探索(估计摇臂的优劣)和利用(选择当前最优摇臂)这两者是矛盾的,因为尝试次数(总投币数)有限,加强了一方则自然会削弱另一方,这就是强化学习所面临的探索-利用窘境(exploration-exploitation dilemma)。
- gym环境: https://www.gymlibrary.ml/environments/classic_control/
1.4 gym使用例子: MountainCar-v0
import gym
env = gym.make('MountainCar-v0')
print('观测空间 = {}'.format(env.observation_space))
print('动作空间 = {}'.format(env.action_space))
print('观测范围 = {} ~ {}'.format(env.observation_space.low,
env.observation_space.high))
print('动作数 = {}'.format(env.action_space.n))
output:
观测空间 = Box(2,) #观测空间是形状为(2,)的浮点型 np.array
动作空间 = Discrete(3) #动作空间是取 {0,1,2} 的 int 型数值
观测范围 = [-1.2 -0.07] ~ [0.6 0.07]
动作数 = 3
二、Markov
2.1 Markov奖励过程和Markov决策过程
-
马尔可夫性质: 在一个随机过程给定过去状态和当前状态下,未来状态的条件概率分布仅仅取决于当前状态
即 p ( X t + 1 = x t + 1 ∣ X 0 : t = x 0 : t ) = p ( X t + 1 = x t + 1 ∣ X t = x t ) p(X_{t+1}=x_{t+1}|X_{0:t}=x_{0:t})=p(X_{t+1}=x_{t+1}|X_t=x_t) p(Xt+1=xt+1∣X0:t=x0:t)=p(Xt+1=xt+1∣Xt=xt)
离散时间的马尔可夫过程也称为马尔可夫链
-
马尔可夫奖励过程:
回报是奖励的累加,即: G t = r t + 1 + γ r t + 2 + γ 2 r t + 2 + . . . G_t = r_{t+1} + \gamma r_{t+2} + \gamma^2 r_{t+2} + ... Gt=rt+1+γrt+2+γ2rt+2+...
当我们有了回报之后,就可以定义状态的价值了,
对于马尔可夫决策过程,状态价值函数被定义为回报的期望即:
(我们对策略进行采样得到一个期望)
状态价值函数 : V t ( s ) = E [ G t ∣ s t = s ] 状态价值函数: V^t(s)=E[G_t|s_t=s] 状态价值函数:Vt(s)=E[Gt∣st=s]
当我们有了一些轨迹的实际回报时,怎么计算它的价值函数呢?比如我们想知道 s 1 s_1 s1的价值,即当我们进入 s 1 s_1 s1 后,它的价值到底如何?一个可行的做法就是我们可以生成很多轨迹,然后把轨迹都叠加起来。比如我们可以从 s 1 s_1 s1开始,采样生成很多轨迹,把这些轨迹的回报都计算出来,然后将其取平均值作为我们进入 s 1 s_1 s1的价值。这其实是一种计算价值函数的办法,也就是通过蒙特卡洛采样的方法计算 s 1 s_1 s1的价值。但是这样搞,太麻烦了,而且采样效果不一定好。因此,引入了贝尔曼方程
-
贝尔曼方程的作用就是如何根据一堆轨迹的回报去设计状态价值函数
下面的是马尔可夫奖励过程的价值函数的贝尔曼方程
V ( S ) = R ( s ) + γ Σ p ( s ′ ∣ s ) V ( s ′ ) V(S) = R(s) + \gamma \Sigma p(s^{'}|s)V(s^{'}) \\ V(S)=R(s)+γΣp(s′∣s)V(s′)
贝尔曼方程就是当前状态与未来状态的迭代关系,表示当前状态的价值函数可以通过下个状态的价值函数来计算。
-
奖励函数(策略 π \pi π状态s下的奖励函数)
r π ( s ) = Σ π ( a ∣ s ) R ( s , a ) r_{\pi}(s) = \Sigma \pi(a|s)R(s,a) rπ(s)=Σπ(a∣s)R(s,a)- 马尔可夫过程/奖励过程中:状态 s 1 s_1 s1转移到状态 s 2 s_2 s2的状态转移概率
- 马尔可夫决策过程: 状态 s 1 s_1 s1且执行动作 a 1 a_1 a1转移到状态 s 2 s_2 s2的状态转移概率
-
V
函数叫价值函数
:
V
π
(
s
)
=
E
π
[
G
t
∣
s
t
=
s
]
Q
函数叫动作价值函数
:
在某一个状态采取一个动作,可能得到的回报的期望
Q
π
(
s
,
a
)
=
E
π
[
G
t
∣
s
t
=
s
,
a
t
=
a
]
V函数叫价值函数: \\ V_\pi(s) = E_\pi [G_t|s_t=s] \\ \\ Q函数叫动作价值函数: 在某一个状态采取一个动作,可能得到的回报的期望\\ Q_\pi(s,a) = E_\pi [G_t|s_t=s,a_t=a]
V函数叫价值函数:Vπ(s)=Eπ[Gt∣st=s]Q函数叫动作价值函数:在某一个状态采取一个动作,可能得到的回报的期望Qπ(s,a)=Eπ[Gt∣st=s,at=a]
Q函数是针对某个(s,a)的,V函数才是针对某个s的,故:
V π ( s ) = Σ π ( a ∣ s ) Q π ( s , a ) V_\pi(s) = \Sigma \pi(a|s)Q_\pi(s,a) \\ Vπ(s)=Σπ(a∣s)Qπ(s,a)
先用V计算Q,再用Q计算V。
(
b
)
V
函数
=
Q
函数
×
当前状态下各个动作执行概率
V
π
(
s
)
=
Σ
π
(
s
∣
a
)
Q
π
(
s
∣
a
)
(
c
)
Q
π
(
s
∣
a
)
=
R
(
s
,
a
)
+
γ
Σ
p
(
s
′
∣
s
,
a
)
V
π
(
s
′
)
(b)V函数=Q函数×当前状态下各个动作执行概率 \\ V_\pi(s) = \Sigma \pi(s|a)Q_\pi(s|a) \\ \\ (c) \\ Q_\pi(s|a) = R(s,a) + \gamma \Sigma p(s^{'}|s,a)V_\pi(s^{'}) \\
(b)V函数=Q函数×当前状态下各个动作执行概率Vπ(s)=Σπ(s∣a)Qπ(s∣a)(c)Qπ(s∣a)=R(s,a)+γΣp(s′∣s,a)Vπ(s′)
一开始的时候,我们对*V(s′)进行初始化,不同的 V(s’) 都会有一个值;接着,我们将V(s′)*代入贝尔曼期望方程里面进行迭代,就可以算出它的状态价值。
策略评估: 如何计算
V
π
(
s
)
V_{\pi}(s)
Vπ(s)呢?
V
π
t
(
s
)
=
Σ
p
(
π
(
s
)
=
a
)
(
r
(
s
,
a
)
+
γ
Σ
p
(
s
′
∣
s
,
a
)
)
V_\pi ^t(s) = \Sigma p(\pi(s)=a)(r(s,a) + \gamma\Sigma p(s^{'}|s,a) )
Vπt(s)=Σp(π(s)=a)(r(s,a)+γΣp(s′∣s,a))
一开始的时候,我们对V(s′)进行初始化,不同的 V(s′) 都会有一个值;接着,我们将V(s′)代入贝尔曼期望方程里面进行迭代,就可以算出它的状态价值。
2.2 预测与控制
-
预测是给定一个马尔可夫决策过程以及一个策略 π \pi π, 计算 V 函数 V函数 V函数
input output <S,A,P,R, γ \gamma γ>、 策略 π 策略\pi 策略π V π ( s ) V_\pi(s) Vπ(s) -
控制是搜索最佳策略的过程,输出最佳价值函数和最佳策略
input output <S,A,P,R, γ \gamma γ> 最佳价值函数 V ∗ 和最佳策略函数 π ∗ 最佳价值函数V^*和最佳策略函数\pi^* 最佳价值函数V∗和最佳策略函数π∗ 控制问题要做的就是,给定同样的条件,求出在所有可能的策略下最优的价值函数是什么,最优策略是什么。
2.3 策略迭代和价值迭代
什么是最佳策略?什么是最优价值函数?
最佳策略函数
:
π
∗
(
s
)
=
a
r
g
m
a
x
π
V
π
(
s
)
最佳价值函数
:
V
∗
(
s
)
=
m
a
x
π
V
π
(
s
)
最佳策略函数: \pi^*(s)=\underset{_{}^{}}{_{}^{}}{argmax}_\pi^{} V_\pi(s) \\ 最佳价值函数: V^*(s) = \underset{_{}^{}}{_{}^{}}{max}_\pi^{} V_\pi(s)
最佳策略函数:π∗(s)=argmaxπVπ(s)最佳价值函数:V∗(s)=maxπVπ(s)
我们该怎么找到最佳策略?
穷举法效率极低,常用的方法有两种: ① 策略迭代; ② 价值迭代;
2.3.1 策略迭代
策略迭代用于优化策略函数,策略迭代分为两步: ① 策略评估; ②策略改进;
① 策略评估:
根据
M
D
P
和
π
求
V
π
(
对任意
s
)
根据MDP和\pi求V_\pi(对任意s)
根据MDP和π求Vπ(对任意s)
V
π
=
[
V
π
(
s
1
)
V
π
(
s
2
)
.
.
.
V
π
(
s
∣
S
∣
)
]
V
π
(
s
)
=
E
π
[
G
t
∣
s
t
=
s
]
=
E
π
[
R
t
+
1
+
γ
V
π
(
s
t
+
1
)
]
=
Σ
π
(
a
∣
s
)
[
Σ
s
′
,
r
p
(
s
′
,
r
∣
a
)
(
r
+
γ
V
π
(
s
′
)
)
]
=
Σ
π
(
a
∣
s
)
[
Σ
s
′
,
r
p
(
s
′
,
r
∣
a
)
r
]
+
γ
Σ
π
(
a
∣
s
)
[
Σ
s
′
,
r
p
(
s
′
,
r
∣
a
)
V
π
(
s
′
)
(
2
−
1
)
前面记作
:
R
π
(
s
)
,
R
π
(
s
)
有
S
个,因为对于每个
S
,策略都是固定的
式
(
2
−
1
)
=
V
π
(
s
)
=
R
π
(
s
)
+
γ
Σ
p
π
(
s
,
s
′
)
V
π
(
s
′
)
V_\pi = \begin{bmatrix} V_\pi(s_1) \\V_\pi(s_2) \\... \\ V_\pi(s_{|S|}) \end{bmatrix} \\ V_\pi(s) = E_\pi[G_t|s_t=s] = E_\pi[R_{t+1}+\gamma V_\pi(s_{t+1})] \\ = \Sigma \pi(a|s) [\Sigma_{s^{'},r} p(s^{'},r|a) (r+\gamma V_\pi(s^{'})) ] \\ = \Sigma \pi(a|s) [\Sigma_{s^{'},r} p(s^{'},r|a) r] + \gamma \Sigma \pi(a|s) [\Sigma_{s^{'},r} p(s^{'},r|a) V_\pi(s^{'}) \quad (2-1) \\ 前面记作: R_\pi(s),R_\pi(s)有S个,因为对于每个S,策略都是固定的 \\ 式(2-1) = V_\pi(s) = R_\pi(s)+ \gamma \Sigma p_\pi(s,s^{'})V_\pi(s^{'})
Vπ=⎣
⎡Vπ(s1)Vπ(s2)...Vπ(s∣S∣)⎦
⎤Vπ(s)=Eπ[Gt∣st=s]=Eπ[Rt+1+γVπ(st+1)]=Σπ(a∣s)[Σs′,rp(s′,r∣a)(r+γVπ(s′))]=Σπ(a∣s)[Σs′,rp(s′,r∣a)r]+γΣπ(a∣s)[Σs′,rp(s′,r∣a)Vπ(s′)(2−1)前面记作:Rπ(s),Rπ(s)有S个,因为对于每个S,策略都是固定的式(2−1)=Vπ(s)=Rπ(s)+γΣpπ(s,s′)Vπ(s′)
在代码中,就是
V
π
=
r
π
+
γ
P
π
V
π
(
r
π
,
P
π
都是对环境的描述
)
V_\pi = r_\pi + \gamma P_\pi V_\pi \quad (r_\pi, P_\pi都是对环境的描述)
Vπ=rπ+γPπVπ(rπ,Pπ都是对环境的描述)
迭代求解说白了就是设计一个数列
V
1
,
V
2
,
V
3
.
.
.
最终满足上面的收敛条件
V_1,V_2,V_3...最终满足上面的收敛条件
V1,V2,V3...最终满足上面的收敛条件
V
k
+
1
(
s
)
=
Σ
π
(
a
∣
s
)
[
Σ
s
′
,
r
p
(
s
′
,
r
∣
a
)
(
r
+
γ
V
k
(
s
′
)
)
]
V_{k+1}(s) = \Sigma \pi(a|s) [\Sigma_{s^{'},r} p(s^{'},r|a) (r+\gamma V_k(s^{'})) ]
Vk+1(s)=Σπ(a∣s)[Σs′,rp(s′,r∣a)(r+γVk(s′))]
② 策略改进: 使用新的 π ′ 改进之前的 π , 使得 V π ‘ > V π 使用新的\pi^{'}改进之前的\pi,使得V_{\pi^{‘}}>V_\pi 使用新的π′改进之前的π,使得Vπ‘>Vπ
-
策略改进定理: 对任意状态 s ,如果 Q π ( s , π ′ ( s ) ) > V π ( s ) ⇒ 对任意状态 s , V π ‘ ( s ) > V π ( s ) 对任意状态s,如果Q_\pi(s,\pi^{'}(s)) > V_\pi(s) \Rightarrow 对任意状态s,V_{\pi^{‘}}(s)>V_\pi(s) 对任意状态s,如果Qπ(s,π′(s))>Vπ(s)⇒对任意状态s,Vπ‘(s)>Vπ(s)
-
贪心策略: π ′ ( s ) = a r g m a x a Q π ( s , a ) \pi^{'}(s) = \underset{a}{argmax} Q_\pi(s,a) π′(s)=aargmaxQπ(s,a)
一直这样更新下去,直到 V π = V π ′ V_\pi = V_{\pi^{'}} Vπ=Vπ′
-
实际计算中,策略评估其实也是一个迭代计算的过程(直到数列收敛),我们可以截断一下,减小计算量。即当迭代的 V π V_\pi Vπ比之前的大多少的时候或者经过多少轮迭代就终止
2.3.2 价值迭代
初始化: k = 1,对于所有的s, V 0 ( s ) = 0 V_0(s)=0 V0(s)=0
对于 k = 1: H (H是让V(s)收敛所需要的迭代次数)对于所有状态s:
Q k + 1 ( s , a ) = R ( s , a ) + γ Σ p ( s ′ ∣ s , a ) V k ( s ′ ) Q_{k+1}(s,a) = R(s,a) + \gamma \Sigma p(s^{'}|s,a)V_k(s^{'}) Qk+1(s,a)=R(s,a)+γΣp(s′∣s,a)Vk(s′)
V k + 1 = m a x Q k + 1 ( s , a ) V_{k+1} = max Q_{k+1}(s,a) Vk+1=maxQk+1(s,a)
k = k + 1
π ( s ) = a r g m a x [ R ( s , a ) + γ Σ p ( s ′ ∣ s , a ) V H + 1 ( s ′ ] \pi(s) = argmax [R(s,a) + \gamma \Sigma p(s^{'}|s,a)V_{H+1}(s^{'}] π(s)=argmax[R(s,a)+γΣp(s′∣s,a)VH+1(s′]
价值迭代是极端情况下的策略迭代( V π 只进行简单的更新 V_\pi只进行简单的更新 Vπ只进行简单的更新)
- 贝尔曼等式:
V = R + γ P V V = R + \gamma PV V=R+γPV
-
Iterative Algorithm(动态规划方法): 可用来计算价值函数的值。通过一直迭代对应的Bellman Equation,最后使其收敛。当这个最后更新的状态跟你上一个状态变化并不大的时候,这个更新就可以停止。
-
Q函数是动作价值函数,即Q(s,a)
-
根据Q函数求最优的策略有三种方法:
-
① 穷举法
-
② 策略迭代
-
③ 价值迭代
-
-
价值函数 V π ( s ) V_\pi(s) Vπ(s)与当前状态s和策略函数 π \pi π有关,因此所谓的最有价值函数,就是选择自变量函数 π \pi π使得 V π ( s ) V_\pi(s) Vπ(s)最大
记作: 最有价值函数 V ∗ ( s ) = m a x π V π ( s ) = m a x π Q π ( s , a ) 最有价值函数V^*(s) = \underset{_{}^{}}{_{}^{}}{max}_\pi^{} V_\pi(s) = \underset{_{}^{}}{_{}^{}}{max}_\pi^{} Q_\pi(s,a) 最有价值函数V∗(s)=maxπVπ(s)=maxπQπ(s,a)
三、表格型方法
-
我们使用 状态转移函数 和 奖励函数 来描述环境。
-
什么是动态规划方法?
使用迭代的方法求解贝尔曼期望方程:
V π ( s ) = Σ π ( a ∣ s ) [ Σ p ( s ′ , r ∣ s , a ) ( r + γ V π s ′ ) ] V_\pi(s) = \Sigma \pi(a|s) [\Sigma p(s^{'},r|s,a)(r+\gamma V_\pi{s^{'}})] Vπ(s)=Σπ(a∣s)[Σp(s′,r∣s,a)(r+γVπs′)] -
在 m o d e l − f r e e model-free model−free的方案中:
-
V ( s ) V(s) V(s)用于判断状态是好的还是坏的。
-
Q Q Q函数用于判断在 s s s下采取什么a可以获得最大的 G t G_t Gt
-
-
在Chapter2中的策略迭代和价值迭代都是需要 p ( s ′ ∣ s , a ) 和 r ( s , a ) p(s^{'}|s,a)和r(s,a) p(s′∣s,a)和r(s,a)的,但是在很多实际问题中,环境描述起来非常困难,所以当 M D P MDP MDP的模型未知或者很大时,我们可以使用 m o d e l − f r e e model-free model−free的强化学习方法。
-
Q表格:
(对于悬崖行走问题)
-
强化是指我们可以用下一个状态的价值来更新当前状态的价值,其实就是强化学习里面自举的概念。
在强化学习里面,我们可以每走一步更新一次 Q 表格,用下一个状态的 Q 值来更新当前状态的 Q 值,这种单步更新的方法被称为时序差分方法
3.1 如何求 V π ( s ) V_\pi(s) Vπ(s) ( m o d e l − f r e e ) (model-free) (model−free)?
3.1.1 蒙特卡洛方法
多次采样得到多条以当前状态
s
s
s为起点的轨迹:
G
t
=
r
t
+
1
+
γ
r
t
+
2
+
γ
2
r
t
+
3
+
.
.
.
V
π
(
s
)
=
E
[
G
t
∣
s
t
=
s
]
G_t = r_{t+1} + \gamma r_{t+2} + \gamma^{2} r_{t+3} + ... \\ V_\pi(s) = E[G_t|s_t=s]
Gt=rt+1+γrt+2+γ2rt+3+...Vπ(s)=E[Gt∣st=s]
蒙特卡洛方法不需要 M D P MDP MDP的状态转移函数和奖励函数,并且不需要像动态规划那样用自举的方法。
如何使用蒙特卡洛方法更新Q表格呢? (即新采到一条轨迹后,如何更新)
N
(
s
t
)
+
=
1
V
(
s
t
)
=
V
(
s
t
)
+
α
(
G
t
−
V
(
s
t
)
)
N(s_t) += 1 \\ V(s_t) = V(s_t) + \alpha (G_t - V(s_t))
N(st)+=1V(st)=V(st)+α(Gt−V(st))
循环(each trajectory):
由 π \pi π生成一条轨迹 S 0 , A 0 , R 1 , S 1 , A 1 , R 2 . . . S T − 1 , A T − 1 , R T , S T S_0,A_0,R_1,S_1,A_1,R_2...S_{T-1},A_{T-1},R_{T},S_{T} S0,A0,R1,S1,A1,R2...ST−1,AT−1,RT,ST循环(each step) t = T − 1 , T − 2 , . . . 0 t=T-1,T-2,...0 t=T−1,T−2,...0:
G ← γ G + R t + 1 G \leftarrow \gamma G + R_{t+1} G←γG+Rt+1
若 S t S_t St未出现在 S 0 : t − 1 S_{0:t-1} S0:t−1:将G加入到 r e t u r n ( S t ) return(S_t) return(St)
V ( S t ) = a v e r a g e ( r e t u r n ( S t ) ) V(S_t) = average(return(S_t)) V(St)=average(return(St))
3.1.2 时序差分(TD)
自举: 根据 V ( s t ) 和 π 去估计 V ( s t + 1 ) V_(s_t)和\pi去估计V_(s_{t+1}) V(st)和π去估计V(st+1)
演示例子: https://cs.stanford.edu/people/karpathy/reinforcejs/gridworld_td.html
每往前走一步,就做一部自举,用得到的“估计回报”
r
t
+
1
+
γ
V
t
(
s
+
1
)
r_{t+1}+\gamma V_t(s+1)
rt+1+γVt(s+1)来更新
v
(
S
)
v(S)
v(S)
V
(
s
t
)
=
V
(
s
t
)
+
α
(
r
t
+
1
+
γ
V
t
(
s
+
1
)
−
V
(
s
t
)
)
V(s_t) = V(s_t) + \alpha (r_{t+1}+\gamma V_t(s+1)- V(s_t))
V(st)=V(st)+α(rt+1+γVt(s+1)−V(st))
-
对比蒙特卡洛与时序差分:
-
在蒙特卡罗方法里, G i , t G_{i,t} Gi,t是走完一条轨迹后实际得到的值,但是 T D TD TD只执行一步,状态的值就更新。
-
时序差分方法可以在线学习(online learning),每走一步就可以更新,效率高。蒙特卡洛方法必须等游戏结束时才可以学习。
-
n步TD
n = 1 : G t = r t + 1 + γ V ( s t + 1 ) n = 2 : G t = r t + 1 + γ V ( s t + 1 ) + γ 2 V ( s t + 2 ) . . . n = ∞ : G t = r t + 1 + γ V ( s t + 1 ) + γ 2 V ( s t + 2 ) + . . . n = 1:G_t = r_{t+1} + \gamma V(s_{t+1}) \\ n = 2:G_t = r_{t+1} + \gamma V(s_{t+1}) + \gamma^2 V(s_{t+2}) \\ ... n = ∞: G_t = r_{t+1} + \gamma V(s_{t+1}) + \gamma^2 V(s_{t+2}) + ... n=1:Gt=rt+1+γV(st+1)n=2:Gt=rt+1+γV(st+1)+γ2V(st+2)...n=∞:Gt=rt+1+γV(st+1)+γ2V(st+2)+...
可见,无穷阶TD就是蒙特卡洛方法
-
- 自举是指更新时使用了估计。
3.2 如何把策略迭代应用到model-free情境下?
-
试探性出发假设: 任意一对 ( s , a ) 都有大于 0 的概率被选中。 任意一对(s,a)都有大于0的概率被选中。 任意一对(s,a)都有大于0的概率被选中。
- 用于生成样本的策略(行动策略) = 待评估待改进的策略(目标策略),叫on-policy。
- 但是我们无法确保我们的环境和策略是满足试探性出发假设的,因此有了off-policy。
- off-policy中分为行动策略和目标策略, 行动策略探索性随机性较强,保证尽可能满足试探性出发假设。
-
策略迭代: Q Q Q函数评估 + 贪心方法改进策略
但是没有 p ( s ′ , r ∣ s , a ) p(s^{'},r|s,a) p(s′,r∣s,a)和 r ( s , a ) r(s,a) r(s,a),该如何执行策略迭代呢?
-
① 使用MC方法替代原有的DP方法进行价值评估。
-
② 使用贪心方法改进策略:
并不是一直取 a r g m a x Q ( s t ) argmaxQ(s_t) argmaxQ(st),而是有 ϵ \epsilon ϵ的概率采取随机策略,这就是** ϵ − g r e e d y 方法 \epsilon-greedy 方法 ϵ−greedy方法**
下面三种是value-based三种主要思想
-
3.3 Sarsa (on-policy的时序差分)
- Sarsa就是用时序差分的方法更新Q函数,是on-policy的方法(采样的Q和待更新的Q是同一套策略)
-
更新公式中: 我们用 ( S t , A t , R t + 1 , S t + 1 , A t + 1 ) (S_t,A_t,R_{t+1},S_{t+1},A_{t+1}) (St,At,Rt+1,St+1,At+1)来更新 Q Q Q函数
-
sarsa算法图:
算法参数: 步长 α < 1 \alpha<1 α<1 极小值 ϵ \epsilon ϵ (两个超参数)
对于所有 Q ( s , a ) Q(s,a) Q(s,a)随机初始化,终点处$ Q(s_{end},a) = 0$for (each trajectory):
初始化 S S S
a t = ϵ − g r e e d y ( s t ) a_t = \epsilon -greedy \quad(s_t) at=ϵ−greedy(st)
for (each step):
执行 a t a_t at,得到 ( r t + 1 , s t + 1 ) (r_{t+1},s_{t+1}) (rt+1,st+1)
a t + 1 = ϵ − g r e e d y ( s t + 1 ) a_{t+1} = \epsilon -greedy \quad(s_{t+1}) at+1=ϵ−greedy(st+1)
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})+\alpha[r_{t+1}+\gamma 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)]
s t = s t + 1 , a t = a t + 1 s_t = s_{t+1},a_t = a_{t+1} st=st+1,at=at+1
3.4 Q-Learning (off-policy的时序差分)
-
Q-Learning 有两种策略:
- 目标策略(待优化的策略): π \pi π
- 行为策略(实际执行并采样的策略): μ \mu μ
-
-
算法参数: 步长 α < 1 \alpha<1 α<1 极小值 ϵ \epsilon ϵ (两个超参数)
对于所有 Q ( s , a ) Q(s,a) Q(s,a)随机初始化,终点处$ Q(s_{end},a) = 0$
for (each trajectory):
初始化 S S S
for (each step):
a t = ϵ − g r e e d y ( s t ) a_{t} = \epsilon -greedy \quad(s_{t}) at=ϵ−greedy(st)
执行 a t a_t at,得到 ( r t + 1 , s t + 1 ) (r_{t+1},s_{t+1}) (rt+1,st+1)
a t + 1 = ϵ − g r e e d y ( s t + 1 ) a_{t+1} = \epsilon -greedy \quad(s_{t+1}) at+1=ϵ−greedy(st+1)
Q ( s t , a t ) = Q ( s t , a t ) + α [ r t + 1 + γ m a x a Q ( s t + 1 , a ) − Q ( s t , a t ) ] Q(s_{t},a_{t})=Q(s_{t},a_{t})+\alpha[r_{t+1}+\gamma \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)]
s t = s t + 1 s_t = s_{t+1} st=st+1
3.5 Sarsa与Q-Learning的区别
-
Sarsa 在更新 Q 表格的时候,它用到的 A’ 。我要获取下一个 Q 值的时候,A’ 是下一个 step 一定会执行的 action 。这个 action 有可能是 ε-greddy 方法 sample 出来的值,也有可能是 max Q 对应的 action,也有可能是随机动作。但是就是它实实在在执行了的那个动作。
-
Q-learning 在更新 Q 表格的时候,它用到这个的Q(S’,a’)对应的那个 action ,它不一定是下一个 step 会执行的实际的 action,因为你下一个实际会执行的那个 action 可能会探索。
四、策略梯度
-
强化学习有三个组成部分: ① actor; ② environment;③ reward function;
这三者里,只有actor的策略是我们可以控制的,我们唯一需要做的就是调整演员里面的策略,使得演员可以得到最大的奖励。
-
策略是一个网络,输入是游戏的画面,它通常是由像素组成的;对于动作空间是离散的问题: 输出是我们可以执行的动作,有几个动作,输出层就有几个神经元。
-
一场游戏称为一个回合(episode)
-
policy-based适用场景:
- ① 随即策略
- ② 动作空间连续
4.1 基础概念
-
一条轨迹 τ = s 1 , a 1 , s 2 . . . s t , a t 一条轨迹 \tau = {s_1,a_1,s_2...s_t,a_t} 一条轨迹τ=s1,a1,s2...st,at
-
如果我们知道策略网络函数 p ( a ∣ s ) p(a|s) p(a∣s)和环境中的状态转移概率 p ( s ′ ∣ s , a ) p(s^{'}|s,a) p(s′∣s,a),就可以计算某个轨迹发生的概率:( θ 是策略网络的参数 \theta是策略网络的参数 θ是策略网络的参数)
P θ ( τ ) = p ( s 1 ) p θ ( a 1 ∣ s 1 ) p ( s 2 ∣ s 1 , a 1 ) p θ ( a 2 ∣ s 2 ) . . P_\theta(\tau) = p(s_1)p_\theta(a_1|s_1)p(s_2|s_1,a_1)p_\theta(a_2|s_2).. Pθ(τ)=p(s1)pθ(a1∣s1)p(s2∣s1,a1)pθ(a2∣s2)..
-
( p θ ( τ ) p_\theta(\tau) pθ(τ)是 τ \tau τ轨迹出现的概率)
- 我们希望期望奖励越大越好,因此可以采用梯度上升的方法来最大化期望奖励:
▽ R θ ˉ = Σ R ( τ ) ▽ p θ ( τ ) = Σ R ( τ ) p θ ( τ ) ▽ l n [ p θ ( τ ) ] ( 4 − 1 ) \bigtriangledown \bar{R_\theta} = \Sigma R(\tau) \bigtriangledown p_\theta(\tau) \\ =\Sigma R(\tau) p_\theta(\tau)\bigtriangledown ln[ p_\theta(\tau)] \quad (4-1) ▽Rθˉ=ΣR(τ)▽pθ(τ)=ΣR(τ)pθ(τ)▽ln[pθ(τ)](4−1)
(依旧是采样多条轨迹)
▽ l n [ p θ ( τ ) ] = ▽ l n [ p ( s 1 ) p θ ( a 1 ∣ s 1 ) p ( s 2 ∣ s 1 , a 1 ) p θ ( a 2 ∣ s 2 ) . . ] = l n [ p ( s 1 ) ] + ▽ Σ t l n [ p θ ( a t ∣ s t ) ] + ▽ Σ t l n [ p ( s t + 1 ∣ s t , a t ) ] 因为是对 θ 求梯度,只有 ▽ Σ t l n [ p θ ( a t ∣ s t ) ] 与 θ 有关,剩余两项仅由环境决定 : 即 ▽ l n [ p θ ( τ ) ] = ∑ t = 1 T ▽ l n [ p θ ( a t ∣ s t ) ] ( 4 − 2 ) \bigtriangledown ln[ p_\theta(\tau)] = \bigtriangledown ln[p(s_1)p_\theta(a_1|s_1)p(s_2|s_1,a_1)p_\theta(a_2|s_2)..]\\ =ln[p(s_1)] + \bigtriangledown \underset{t}{\Sigma} ln[p_\theta(a_t|s_t)] + \bigtriangledown \underset{t}{\Sigma} ln[p(s_{t+1}|s_t,a_t)] \\ 因为是对\theta求梯度,只有\bigtriangledown \underset{t}{\Sigma} ln[p_\theta(a_t|s_t)]与\theta有关,剩余两项仅由环境决定: \\ 即 \bigtriangledown ln[ p_\theta(\tau)] = \sum_{t=1}^{T} \bigtriangledown ln[p_\theta(a_t|s_t)] \quad (4-2) ▽ln[pθ(τ)]=▽ln[p(s1)pθ(a1∣s1)p(s2∣s1,a1)pθ(a2∣s2)..]=ln[p(s1)]+▽tΣln[pθ(at∣st)]+▽tΣln[p(st+1∣st,at)]因为是对θ求梯度,只有▽tΣln[pθ(at∣st)]与θ有关,剩余两项仅由环境决定:即▽ln[pθ(τ)]=t=1∑T▽ln[pθ(at∣st)](4−2)
将式(4-2)带入到式(4-1)中可以得到:
(说明: (n)代表第那条轨迹,即
a
3
(
2
)
a_3^{(2)}
a3(2)代表第2条轨迹第3个时间步上执行的策略。 )
▽
R
θ
ˉ
=
Σ
R
(
τ
)
▽
p
θ
(
τ
)
≈
1
N
∑
n
=
1
N
R
(
τ
(
n
)
)
▽
p
θ
(
τ
n
)
=
1
N
∑
n
=
1
N
∑
t
=
1
T
(
n
)
R
(
τ
(
n
)
)
▽
l
n
[
p
θ
(
a
t
(
n
)
∣
s
t
(
n
)
)
]
(
4
−
3
)
\bigtriangledown \bar{R_\theta} = \Sigma R(\tau) \bigtriangledown p_\theta(\tau) ≈ \frac{1}{N}\sum_{n=1}^{N} R(\tau^{(n)}) \bigtriangledown p_\theta(\tau^{n}) \\ = \frac{1}{N}\sum_{n=1}^{N} \sum_{t=1}^{T^{(n)}} R(\tau^{(n)}) \bigtriangledown ln[p_\theta(a_t^{(n)}|s_t^{(n)})] \quad (4-3)
▽Rθˉ=ΣR(τ)▽pθ(τ)≈N1n=1∑NR(τ(n))▽pθ(τn)=N1n=1∑Nt=1∑T(n)R(τ(n))▽ln[pθ(at(n)∣st(n))](4−3)
- 假设 ( s t 2 , a t 2 ) (s_{t_2},a_{t_2}) (st2,at2)发现 τ \tau τ的奖励是正的,我们就要增大 p θ ( a t 2 ∣ s t 2 ) p_\theta(a_{t_2}|s_{t_2}) pθ(at2∣st2),反之减小。
我们该如何改变参数
θ
\theta
θ呢?
θ
=
θ
+
η
▽
R
θ
ˉ
\theta = \theta + \eta \bigtriangledown \bar{R_\theta}
θ=θ+η▽Rθˉ
我们要用参数为 θ的智能体与环境交互, 也就是拿已经训练好的智能体先与环 境交互,交互完以后,就可以得到大量游戏的数据。
策略梯度(policy gradient,PG)采样的数据只会用一次(因为采样都是根据上一时刻的策略网络进行的)。我们采样这些数据,然后用这些数据更新参数,再丢掉这些数据。接着重新采样数据,才能去更新参数。
假设在采样的过程中,在某个状态下,我们采样到要采取动作 a, 那么就把动作 a 当作标准答案(ground truth)。比如,我们在某个状态下,采样到要向左。因为是采样,所以向左这个动作不一定概率最高。假设我们采样到向左,在训练的时候,让智能体调整网络的参数, 如果看到某个状态,我们就向左。
4.2 实现PG要注意的两个点
4.2.1 给奖励添加常数
如果给定
状态
s
状态s
状态s采取动作
a
a
a, 整场游戏得到正的奖励,就要增加
(
s
,
a
)
(s,a)
(s,a)的概率,反之减小。
θ
=
θ
+
η
▽
R
θ
ˉ
\theta = \theta + \eta \bigtriangledown \bar{R_\theta}
θ=θ+η▽Rθˉ
但是在很多游戏里面(比如乒乓球游戏),奖励总是正的,最低是0。分数为0~21分,这种情况下围殴了避免全部提升概率可能导致的。我们直接在奖励里面减去一个常数,这样就有负有正。
4.2.2 分配合适的分数
在同一场游戏里面,也许哟写动作是好的,有些动作是不好的,即使整场游戏的结果是好的,并不代表该场内每个动作都是好的。
我们希望可以给每个不同的动作都乘不同的权重。
如果整场游戏得到的分数是 +3 分,因此在训练的时候, 每一个状态-动作对都会被乘上 +3,但是同样的状态-动作对在不同的轨迹下乘的值(
R
(
τ
)
R(\tau)
R(τ))是不同的。为了解决这个问题:把执行这个动作以后发生的所有奖励加起来,才是这个动作真正的贡献。
▽
R
θ
ˉ
=
1
N
∑
n
=
1
N
∑
t
=
1
T
(
n
)
[
∑
τ
=
1
T
(
n
)
r
t
(
n
)
]
▽
l
n
[
p
θ
(
a
t
(
n
)
∣
s
t
(
n
)
)
]
(
4
−
4
)
\bigtriangledown \bar{R_\theta} =\frac{1}{N}\sum_{n=1}^{N} \sum_{t=1}^{T^{(n)}} [\sum_{\tau=1}^{T^{(n)}} r_t^{(n)} ]\bigtriangledown ln[p_\theta(a_t^{(n)}|s_t^{(n)})] \quad (4-4)
▽Rθˉ=N1n=1∑Nt=1∑T(n)[τ=1∑T(n)rt(n)]▽ln[pθ(at(n)∣st(n))](4−4)
更进一步,我们把未来的奖励做一个折扣,即:
▽
R
θ
ˉ
=
1
N
∑
n
=
1
N
∑
t
=
1
T
(
n
)
[
∑
τ
=
1
T
(
n
)
γ
τ
−
t
r
t
(
n
)
]
▽
l
n
[
p
θ
(
a
t
(
n
)
∣
s
t
(
n
)
)
]
(
4
−
5
)
\bigtriangledown \bar{R_\theta} =\frac{1}{N}\sum_{n=1}^{N} \sum_{t=1}^{T^{(n)}} [\sum_{\tau=1}^{T^{(n)}} \gamma^{\tau-t} r_t^{(n)} ]\bigtriangledown ln[p_\theta(a_t^{(n)}|s_t^{(n)})] \quad (4-5)
▽Rθˉ=N1n=1∑Nt=1∑T(n)[τ=1∑T(n)γτ−trt(n)]▽ln[pθ(at(n)∣st(n))](4−5)
再结合3.2.1的内容,可得:
▽
R
θ
ˉ
=
1
N
∑
n
=
1
N
∑
t
=
1
T
(
n
)
[
∑
τ
=
1
T
(
n
)
(
γ
τ
−
t
r
t
(
n
)
−
b
)
]
▽
l
n
[
p
θ
(
a
t
(
n
)
∣
s
t
(
n
)
)
]
(
4
−
6
)
\bigtriangledown \bar{R_\theta} =\frac{1}{N}\sum_{n=1}^{N} \sum_{t=1}^{T^{(n)}} [\sum_{\tau=1}^{T^{(n)}} (\gamma^{\tau-t} r_t^{(n)} -b)]\bigtriangledown ln[p_\theta(a_t^{(n)}|s_t^{(n)})] \quad (4-6)
▽Rθˉ=N1n=1∑Nt=1∑T(n)[τ=1∑T(n)(γτ−trt(n)−b)]▽ln[pθ(at(n)∣st(n))](4−6)
我们把 R-b 这一项称为优势函数(advantage function,用
A
θ
(
s
t
,
a
t
)
A^{\theta}(s_t,a_t)
Aθ(st,at)来代表优势函数,
A
θ
(
s
t
,
a
t
)
A^{\theta}(s_t,a_t)
Aθ(st,at)通常可以由一个网络估计出来,这个网络称为评论员(critic)。
4.3 REINFORCE:蒙特卡洛策略梯度
① REINFORCE是先产生一个回合的数据(REINFORCE必须得到一个完整的episode才进行更新),如:
(
s
1
,
a
1
,
G
1
)
,
(
s
2
,
a
2
,
G
2
)
,
(
s
3
,
a
3
,
G
3
)
.
.
.
(
s
T
,
a
T
,
G
T
)
(s_1,a_1,G_1),(s_2,a_2,G_2),(s_3,a_3,G_3)...(s_T,a_T,G_T)
(s1,a1,G1),(s2,a2,G2),(s3,a3,G3)...(sT,aT,GT)
(
G
的计算依据迭代式
:
G
t
=
r
t
+
1
+
γ
G
t
+
1
G的计算依据迭代式: G_t = r_{t+1} + \gamma G_{t+1}
G的计算依据迭代式:Gt=rt+1+γGt+1)
② 针对每个动作计算梯度 ▽ l n π ( a t ∣ s t , θ ) \bigtriangledown ln_\pi(a_t|s_t,\theta) ▽lnπ(at∣st,θ)
对于每一个action,假设策略函数输出为[0.2,0.5,0.3]
损失
=
−
G
t
⋅
[
0
,
1
,
0
]
⋅
l
n
[
0.2
,
0.5
,
0.3
]
损失=-G_t\cdot [0,1,0]\cdot ln[0.2,0.5,0.3]
损失=−Gt⋅[0,1,0]⋅ln[0.2,0.5,0.3]
REINFORCE算法流程:
输入: 可微调的策略参数 π ( a ∣ s , θ ) \pi(a|s,\theta) π(a∣s,θ)
算法参数: 步长大小 α > 0 \alpha>0 α>0
初始化的策略参数 θ \theta θ
循环(each trajectory):
根据 π ( ⋅ ∣ ⋅ , θ ) \pi(\cdot|\cdot,\theta) π(⋅∣⋅,θ),生成 S 0 , A 0 , R 1 , . . . S T − 1 , A T − 1 , R T S_0,A_0,R_1,...S_{T-1},A_{T-1},R_{T} S0,A0,R1,...ST−1,AT−1,RT
对一个回合的每一步进行循环, t = 0 , 1 , . . . , T − 1 t=0,1,...,T-1 t=0,1,...,T−1
G = ∑ k = t + 1 T γ k − t − 1 R k G = \sum_{k=t+1}^{T} \gamma^{k-t-1} R_k G=∑k=t+1Tγk−t−1Rk
θ = θ + α γ t G ▽ l n [ π ( a t ∣ s t , θ ) ] \theta = \theta + \alpha \gamma^t G \bigtriangledown ln[\pi(a_t|s_t,\theta)] θ=θ+αγtG▽ln[π(at∣st,θ)]
五、PPO
-
如果要学习的那个 agent,一边跟环境互动,一边做学习这个叫 on-policy。 如果它在旁边看别人玩,通过看别人玩来学习的话,这个叫做 off-policy。
-
近端策略优化(Proximal Policy Optimization, 简称PPO)是PG的一个变形,是现在OpenAi默认的强化学习算法。
5.1 重要性采样
-
PG是on-policy的方法,根据 p θ ( a ∣ s ) p_\theta(a|s) pθ(a∣s)采样若干条轨迹更新策略函数为 p θ ′ ( a ∣ s ) p_\theta^{'}(a|s) pθ′(a∣s),之后再根据 p θ ′ ( a ∣ s ) p_\theta^{'}(a|s) pθ′(a∣s)采样若干条轨迹重新学习,这种方式很浪费时间。我们可以再找一个actor来采样,然后把采样的数据存起来,可能之后还用得到。
-
E [ f ( x ) ] = ∫ p ( x ) f ( x ) d x = ∫ p ( x ) q ( x ) q ( x ) f ( x ) d x E[f(x)] = \int p(x)f(x)dx = \int \frac{p(x)}{q(x)}q(x)f(x)dx E[f(x)]=∫p(x)f(x)dx=∫q(x)p(x)q(x)f(x)dx
即我们使用 θ ′ \theta^{'} θ′进行采样, 采样结果服从 q ( x ) q(x) q(x), 因我们要用这个采样轨迹去更新 θ \theta θ,就要补上重要性权重: p ( x ) q ( x ) \frac{p(x)}{q(x)} q(x)p(x)
A θ ( s t , a t ) ≐ [ ∑ τ = 1 T ( n ) ( γ τ − t r t ( n ) − b ) ] A^{\theta}(s_t,a_t) \doteq [\sum_{\tau=1}^{T^{(n)}} (\gamma^{\tau-t} r_t^{(n)} -b)] Aθ(st,at)≐[τ=1∑T(n)(γτ−trt(n)−b)]
▽ R θ ˉ = E [ p θ ( s t , a t ) p θ ′ ( s t , a t ) A θ ( s t , a t ) ▽ l n [ p θ ( a t ( n ) ∣ s t ( n ) ) ] ] p θ ( s t , a t ) = p θ ( a t ∣ s t ) p θ ( s t ) , p θ ′ ( s t , a t ) = p θ ′ ( a t ∣ s t ) p θ ′ ( s t ) 假设模型是 θ 的时候,你看到 s t 的概率,跟模型是 θ ′ 的时候,你看到 s t 的概率是差不多的,即 p θ ( s t ) = p θ ′ ( s t ) 同时 : p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) 是可以直接根据现有的两个网络计算出来的 \bigtriangledown \bar{R_\theta} = E[\frac{p_\theta(s_t,a_t)}{p_\theta^{'}(s_t,a_t)}A^{\theta}(s_t,a_t)\bigtriangledown ln[p_\theta(a_t^{(n)}|s_t^{(n)})]] \\ p_\theta(s_t,a_t) = p_\theta(a_t|s_t)p_\theta(s_t), \quad p_\theta^{'}(s_t,a_t) = p_\theta^{'}(a_t|s_t)p_\theta^{'}(s_t) \\ 假设模型是 \theta 的时候,你看到 s_t的概率,跟模型是 \theta'的时候,你看到 s_t 的概率是差不多的,即 p_{\theta}(s_t)=p_{\theta'}(s_t) \\ 同时:\frac{p_\theta(a_t|s_t)}{p_\theta^{'}(a_t|s_t)}是可以直接根据现有的两个网络计算出来的 ▽Rθˉ=E[pθ′(st,at)pθ(st,at)Aθ(st,at)▽ln[pθ(at(n)∣st(n))]]pθ(st,at)=pθ(at∣st)pθ(st),pθ′(st,at)=pθ′(at∣st)pθ′(st)假设模型是θ的时候,你看到st的概率,跟模型是θ′的时候,你看到st的概率是差不多的,即pθ(st)=pθ′(st)同时:pθ′(at∣st)pθ(at∣st)是可以直接根据现有的两个网络计算出来的
-
如何计算梯度 ? ①用 θ ′ 去跟环境做互动,采样出 s t , a t ; ②计算 s t 跟 a t 的 a d v a n t a g e ,然后再乘 p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) 如何计算梯度? \quad ① 用 \theta^{'}去跟环境做互动,采样出 s_t,a_t;\\ \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad ② 计算 s_t跟 a_t的 advantage,然后再乘\frac{p_\theta(a_t|s_t)}{p_\theta^{'}(a_t|s_t)} 如何计算梯度?①用θ′去跟环境做互动,采样出st,at;②计算st跟at的advantage,然后再乘pθ′(at∣st)pθ(at∣st)
5.2 PPO
-
有一个问题:如果 p θ ( a t ∣ s t ) 和 p θ ′ ( a t ∣ s t ) p_\theta(a_t|s_t)和p_\theta^{'}(a_t|s_t) pθ(at∣st)和pθ′(at∣st)相差太多,重要性采样的结果就会不好。怎么避免它差太多呢?这个就是
Proximal Policy Optimization (PPO)
在做的事情。 -
PPO是on-policy的算法。
-
Proximal Policy Optimization (PPO): 避免在使用important sampling时由于 p θ ( a t ∣ s t ) 和 p θ ′ ( a t ∣ s t ) p_\theta(a_t|s_t)和p_\theta^{'}(a_t|s_t) pθ(at∣st)和pθ′(at∣st)相差太多,导致important sampling结果偏差较大而采取的算法。具体来说就是在training的过程中增加一个constrain,这个constrain对应着 θ跟 θ′ output 的 action 的 KL divergence,来衡量 θ与θ′的相似程度。
-
为了使训练过程中 p θ ( a t ∣ s t ) 和 p θ ′ ( a t ∣ s t ) p_\theta(a_t|s_t)和p_\theta^{'}(a_t|s_t) pθ(at∣st)和pθ′(at∣st)尽可能接近,我们在训练的时候,多加一个约束。这个约束是 θ \theta θ 跟 θ ′ \theta^{'} θ′ 输出的动作的 KL 散度(KL divergence),简单来说,这一项的意思就是要衡量 θ \theta θ 跟 θ ′ \theta^{'} θ′ 有多像。
所以在 PPO 里面有两个部分,一方面是优化本来要优化的东西,但再加一个约束。这个约束就好像正则化的项一样,这样正则化做的事情就是希望最后学习出来的 θ \theta θ不要跟 θ ′ \theta^{'} θ′ 太不一样。
-
PPO 有一个前身叫做
信任区域策略优化(Trust Region Policy Optimization,TRPO)
,PPO 是直接把约束放到你要优化的那个式子里面,然后你就可以用梯度上升的方法去最大化这个式子。但 TRPO 是把 KL 散度当作约束。
TRPO 的式子如下式所示:
E [ p θ ( s t , a t ) p θ ′ ( s t , a t ) A θ ( s t , a t ) ] s u b j e c t t o : K L ( θ , θ ′ ) < δ E[\frac{p_\theta(s_t,a_t)}{p_\theta^{'}(s_t,a_t)}A^{\theta}(s_t,a_t)] \\ subject \quad to: \\ KL(\theta,\theta^{'})< \delta \quad E[pθ′(st,at)pθ(st,at)Aθ(st,at)]subjectto:KL(θ,θ′)<δ
直接把 KL 散度当做一个函数,输入是θ 跟 θ*′,但我的意思并不是说把 θ 或 θ′* 当做一个分布,算这两个分布之间的距离。所谓的 θ 跟 θ′ 的距离并不是参数上的距离,而是行为(behavior)上的距离。我们真正在意的是这个 actor 的行为上的差距,而不是它们参数上的差距。 -
如何将 θ \theta θ 跟 θ ′ \theta^{'} θ′ 输出的动作的 KL 散度放到你要优化的那个式子里面?
有两种思路: ① PPO-Penalty ② PPO-Clip
5.2.1 PPO-Penalty
- 在这个方法里面,你先设一个你可以接受的 KL 散度的最大值。假设优化完这个式子以后,你发现 KL 散度的项太大,那就代表说后面这个惩罚的项没有发挥作用,那就把 β 调大。
- 另外,你设一个 KL 散度的最小值。如果优化完上面这个式子以后,你发现 KL 散度比最小值还要小,那代表后面这一项的效果太强了,所以你要减少 β。
5.2.2 PPO-Clip
∑ s t , a t m i n [ p θ ( s t , a t ) p θ ′ ( s t , a t ) A θ ( s t , a t ) , c l i p ( p θ ( s t , a t ) p θ ′ ( s t , a t ) , 1 − ϵ , 1 + ϵ ) A θ ( s t , a t ) ] \sum_{s_t,a_t} min[\frac{p_\theta(s_t,a_t)}{p_\theta^{'}(s_t,a_t)}A^{\theta}(s_t,a_t),clip(\frac{p_\theta(s_t,a_t)}{p_\theta^{'}(s_t,a_t)},1-\epsilon,1+\epsilon)A^{\theta}(s_t,a_t)] st,at∑min[pθ′(st,at)pθ(st,at)Aθ(st,at),clip(pθ′(st,at)pθ(st,at),1−ϵ,1+ϵ)Aθ(st,at)]
- 第二项前面有个 clip 函数,clip 函数的意思是说,
- 在括号里面有三项,如果第一项小于第二项的话,那就输出 1−ε 。
- 第一项如果大于第三项的话,那就输出 1+ε
六、七、八、DQN
-
状态价值函数 V π ( s t ) V_\pi(s_t) Vπ(st): 评论员无法凭空评价一个状态的好坏,它所评价的是在给定某一个状态的时候,如果接下来交互的演员的策略是 π \pi π,我们会得到多少奖励,这个奖励就是我们评价得出的值。因为就算是同样的状态,接下来的 π \pi π不一样,得到的奖励也是不一样的
-
传统的离散Q函数只能是对应于离散的“状态-动作对”,对于状态or动作是连续的问题,无法用Q表格,而是要使用深度网络来代替Q表格,称为 Q 网络(Q-network)。
-
如何计算状态价值函数 V π ( s ) V_\pi(s) Vπ(s)?
-
① 蒙特卡罗方法(MC):分局采集到的数据做一个回归网络
-
② 时序差分方法(TD):
-
-
MC与TD有啥区别?
- ① 蒙特卡罗方法最大的问题就是方差很大,我们可以把 G a G_a Ga看作是一个随机变量,因为我们每次到 s a s_a sa的时候,得到的 G a G_a Ga是不一样的。(因为是随机采样若干条轨迹求出来的)
- ② 时序差分中, V π ( s t ) = r + V π ( s t + 1 ) V_\pi(s_t)=r+V_\pi(s_{t+1}) Vπ(st)=r+Vπ(st+1), r r r具有随机性,但是比 G G G的方差小很多
-
我们学习出一个Q函数以后,就可以找到一个新的策略 π ′ \pi^{'} π′ ,策略会 π ′ \pi^{'} π′比原来的策略 π \pi π要好。所以假设我们有一个Q函数和某一个策略 π \pi π,根据策略 π \pi π学习出策略 π \pi π的Q函数,
π ′ ( s ) = a r g m a x a Q π ( s , a ) \pi^{'}(s) = \underset{a}{argmax} Q_\pi(s,a) π′(s)=aargmaxQπ(s,a)
接下来可以找到一个新的策略 π ′ \pi^{'} π′,它会比 π \pi π要好。我们用 π ′ \pi^{'} π′取代 π \pi π,再去学习它的 Q 函数,得到新的Q函数以后,再去寻找一个更好的策略。这样一直循环下去,策略就会越来越好。
6.1 目标网络
Q π ( s t , a t ) = r t + Q π ( s t + 1 , π ( s t + 1 ) ) Q_\pi(s_t,a_t) = r_t + Q_\pi(s_{t+1},\pi(s_{t+1})) Qπ(st,at)=rt+Qπ(st+1,π(st+1))
假如我们以 Q π ( s t , a t ) Q_\pi(s_t,a_t) Qπ(st,at)为预测值, r t + Q π ( s t + 1 , π ( s t + 1 ) ) r_t + Q_\pi(s_{t+1},\pi(s_{t+1})) rt+Qπ(st+1,π(st+1))为 l a b e l label label, 我们发现 l a b e l label label是变动的,这会导致训练变得不太稳定。所以我们会把其中一个Q网络固定住,在训练的时候只有等式左侧的Q网络发生参数更新,等式右侧的网络参数固定(被称为目标网络),我们只调整左侧Q网络的参数
在实现的时候,我们会把左边的 Q 网络更新多次,再用更新过的 Q 网络替换目标网络。但这两个网络不要一起更新,一起更新,结果会很容易不好。一开始这两个网络是一样的,在训练的时候,我们会把右边的 Q 网络固定住,在做梯度下降的时候,只调整左边Q网络的参数。
6.2 探索
a = a r g m a x a Q ( s , a ) a = \underset{a}{argmax}Q(s,a) a=aargmaxQ(s,a)
不难发现这个算式并不具备随机性,这并不是一个好的更新方式,假设我们对于状态 s 1 s_1 s1一直采取 a 2 a_2 a2那么其他的价值我们是无法准确估计到的,即便是对于Q网络。
假设我们用深度Q网络玩slither.io网页游戏,我们有一条蛇,在环境里走来走去,吃到星星,就加分。假设一开始蛇往上走,然后吃到星星,就可以得到分数,那接下来可能他就会一直只在此位置采取往上走的策略。可能会忽略下面较远处的一大团星星,这个问题就是探索-利用窘境,有两个方法可以增大探索性解决此问题:① ϵ 贪心;②玻尔兹曼探索; \epsilon贪心;②玻尔兹曼探索; ϵ贪心;②玻尔兹曼探索;
-
① ϵ 贪心 ① \epsilon贪心 ①ϵ贪心
{ a r g m a x a Q ( s , a ) 1 − ϵ 的概率 随机 ϵ 的概率 \left\{\begin{matrix} \underset{a}{argmax}Q(s,a) & 1-\epsilon的概率\\ 随机& \epsilon的概率 \end{matrix}\right. {aargmaxQ(s,a)随机1−ϵ的概率ϵ的概率
(我们通常设置 ϵ 为 0.1 ) \epsilon为0.1) ϵ为0.1) -
② 玻尔兹曼探索 玻尔兹曼探索 玻尔兹曼探索
π ( a ∣ s ) = e Q ( s , a ) / T Σ e Q ( s , a ′ ) / T \pi(a|s)=\frac{e^{Q(s,a)/T}}{\Sigma e^{Q(s,a^{'})/T}} π(a∣s)=ΣeQ(s,a′)/TeQ(s,a)/T- a被选中的概率与 e Q ( s , a ) / T e^{Q(s,a)/T} eQ(s,a)/T成正比
- T是一个可调参数,如果T很大,所有动作几乎以等概率选择(探索);如果 T 很小,Q值大的动作更容易被选中(利用);如果T趋于0,我们就只选择最优动作。
6.3 经验回放
经验回放(experience replay)会构建一个回放缓冲区(replay buffer)。回访缓冲区是指现在有一个策略 π \pi π与环境交互,他会去收集数据,我们把收集到的数据放在数据缓冲区里。
我们会迭代的训练Q函数,在每次迭代里面,从回访缓冲区中随机挑选一个batch,我们根据这个batch去更新Q函数。
如果某个算法使用了经验回放的训练方法,该算法就变成了 o f f − p o l i c y off-policy off−policy的算法,因为实际上回访缓冲区里存储的这些经验不是通通来自 π \pi π,有些是过去策略遗留下来的经验。
-
经验回放有两个好处:
-
① 强化学习过程中,最花时间的是与环境交互,训练网络反而是比较快的。使用回访缓冲区可以减小与环境交互的次数。
-
② 对于数据集,我们希望一个批量的数据越多样越好,如果经验缓冲区里的经验统统来自不同的策略,我们采样到的一个批量里面的数据会是比较多样的。
-
-
回放缓冲区放的都是一项一项的 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)
DQN算法流程:
初始化函数 Q Q Q、目标函数 Q ^ \hat{Q} Q^,令 Q ^ = Q \hat{Q}=Q Q^=Q
for(each episode)for(each step)
a t = [ ϵ − g r e e d y ] ( s t ) a_t = [\epsilon-greedy](s_t) at=[ϵ−greedy](st)
s t + 1 , r t = e n v . s t e p ( a t ) s_{t+1},r_t= env.step(a_t) st+1,rt=env.step(at)将 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)存储到缓冲区中
从缓冲区中采样
y = r i + m a x a Q ^ ( s i + 1 , a ) y=r_i+\underset{a}{max}\hat{Q}(s_{i+1},a) y=ri+amaxQ^(si+1,a)
更新Q的参数使得 Q ( s i , a i ) Q(s_i,a_i) Q(si,ai)尽可能接近于y
Q ^ = Q \hat{Q}=Q Q^=Q
深度Q网络 将Q学习与深度学习结合,用深度网络来近似动作价值函数,而 Q学习 则是采用表格存储;深度Q网络采用了经验回放的训练方法,从历史数据中随机采样,而Q学习直接采用下一个状态的数据进行学习。
- Deep Q-Network是基于深度学习的Q-learning算法,其结合了 Value Function Approximation(价值函数近似)与神经网络技术,并采用了目标网络(Target Network)和经验回放(Experience Replay)的方法进行网络的训练。
7.1 Double DQN
在实际过程中, 通过海量采样计算出的Q值被我们称为真实的Q值,我们发现估计出的Q值是比真实的Q值高的。(over estimate)
所以今天要提出 Double DQN 的方法,它可以让估测的值跟实际的值是比较接近的。
- 为什么 Q 值总是被高估了呢?
Q π ( s t , a t ) = r t + Q π ( s t + 1 , π ( s t + 1 ) ) Q_\pi(s_t,a_t) = r_t + Q_\pi(s_{t+1},\pi(s_{t+1})) Qπ(st,at)=rt+Qπ(st+1,π(st+1))
我们总希望左侧的算式和右侧的接近,一旦出现高估的现象,这种影响就会被扩大。即假设是第一个动作被高估了,那这个目标就会选这个动作,然后就会选这个高估的 Q 值来加上 r t r_t rt ,来当作你的目标。所以你总是会选那个 Q 值被高估的,你总是会选那个 reward 被高估的动作当作这个 max 的结果去加上 r t r_t rt当作你的目标,所以你的目标总是太大。
-
在double DQN里,我们有两个Q-network:
-
Q : Q: Q: 决定哪一个动作的Q值最大(把所有的a带入Q中,看看哪一个Q值最大)
-
Q ′ : Q^{'}: Q′: 在决定了动作之后, Q Q Q值是用 Q ′ Q^{'} Q′算出来的
-
假设Q高估了他现在选出来的动作a,但是只要 Q ′ Q^{'} Q′没有高估这个动作的值,算出来的就还是正常的Q值。
假设 Q ′ Q^{'} Q′高估了某一个动作的值,那只要前面这个Q不要选那个动作出来就没事了。
Double DQN相较于原来的DQN没有过多的改动,它几乎没有增加任何运算量,连新的网络都没有,因为原来就有两个网络了。唯一的改变就是:本来在找Q值最大的a的时候,是用 Q ′ Q^{'} Q′来算;现在改用Q来算。
7.2 Dueling DQN
- Dueling DQN 也蛮好做的,相较于原来的 DQN,它唯一的差别是改了网络的架构。
- 本来的 DQN 就是直接输出 Q 值的值,dueling DQN不直接输出 Q 值的值,它分成两条路径去运算:
- 第一条路经会输出一个scalar— V ( s ) V(s) V(s)
- 第二条路径会输出一个vector— A ( s , a ) A(s,a) A(s,a)
8.1 DQN(连续动作)
与PG相比,DQN是比较稳的,PG没有太多游戏玩得起来,在PPO出现之前我们很难用PG做什么事情。DQN比较容易训练的一个理由是:在DQN里面,你只要能估计出Q函数,就保证你一定可以找到一个比较好的策略。
但是DQN在处理动作连续的问题上存在这样的问题:
a
=
a
r
g
m
a
x
a
Q
(
s
,
a
)
a = \underset{a}{argmax}Q(s,a)
a=aargmaxQ(s,a)
假设a是离散的,我们可以把每一个可能的动作都带到Q里面计算它的Q值。但是假如a是连续的,你无法穷举所有的连续动作,那怎么解决这个问题呢?
方案①: 自己列举N个a值然后比哪个最大
方案②: 梯度上升的方法去求最大值,这种方法的计算量非常大。
方案③: 设计一个容易求解argmax的Q函数
先输入s,得到 μ , Σ , V \mu,\Sigma,V μ,Σ,V,然后再输入 a a a,接下来把 a a a和 μ \mu μ相减。欲求Q(s,a)的最值很方便,因为 ( a − μ ( s ) ) T Σ ( s ) ( a − μ ( s ) ) 一定是正的,那么 ( a − μ ( s ) ) 越小, Q 就越大 (a-\mu(s))^T\Sigma(s)(a-\mu(s))一定是正的,那么(a-\mu(s))越小,Q就越大 (a−μ(s))TΣ(s)(a−μ(s))一定是正的,那么(a−μ(s))越小,Q就越大
九、Actor-Critic
-
在演员-评论员算法里面,最知名的算法就是异步优势演员-评论员算法。如果我们去掉异步,则为优势演员-评论员(advantage actor-critic,A2C)算法。A2C算法又被译作优势演员-评论员算法。如果我们加了异步,变成异步优势演员-评论员算法。
-
-
Actor是策略函数 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s),即学习一个策略以得到一个尽可能高的回报。Critic是指价值函数 V π ( s ) V_\pi(s) Vπ(s).借助于价值函数,Actor-Critic可以进行单步更新。
9.1 PG和DQN回顾
-
PG:
首先智能体与环境交互,可以计算出在某一个状态 s s s采取某一动作 a a a的概率 p θ ( a t ∣ s t ) p_{\theta}(a_t|s_t) pθ(at∣st), 接下来计算状态 s s s采取动作 a a a之后直到游戏结束的累计奖励 ( Σ t ′ = t γ t ′ − t r t − b ) (\underset{t^{'}=t}{\Sigma} \gamma^{t^{'}-t}r^t-b) (t′=tΣγt′−trt−b), 之后更新策略函数:
▽ R θ ˉ = 1 N ∑ n = 1 N ∑ t = 1 T ( n ) [ ∑ τ = 1 T ( n ) γ τ − t r t ( n ) − b ] ▽ l n [ p θ ( a t ( n ) ∣ s t ( n ) ) ] ( 9 − 1 ) \bigtriangledown \bar{R_\theta} =\frac{1}{N}\sum_{n=1}^{N} \sum_{t=1}^{T^{(n)}} [\sum_{\tau=1}^{T^{(n)}} \gamma^{\tau-t} r_t^{(n)} -b]\bigtriangledown ln[p_\theta(a_t^{(n)}|s_t^{(n)})] \quad(9-1) ▽Rθˉ=N1n=1∑Nt=1∑T(n)[τ=1∑T(n)γτ−trt(n)−b]▽ln[pθ(at(n)∣st(n))](9−1) -
DQN:
深度Q网络有两种函数: ① V π ( s ) V_\pi(s) Vπ(s); ② Q π ( s ) Q_\pi(s) Qπ(s);
9.2 优势演员-评论员算法(A2C)
(Advantage Actor-Critic)
Q
π
(
s
t
,
a
t
)
:
=
E
[
G
t
]
=
Σ
t
′
=
t
γ
t
′
−
t
r
t
′
V
π
(
s
1
)
=
E
[
Q
π
(
s
1
,
a
i
)
]
Q_\pi(s_t,a_t) :=E[G_t] = \underset{t^{'}=t}{\Sigma} \gamma^{t^{'}-t} r_{t^{'}} \\ V_\pi(s_1) = E[Q_\pi(s_1,a_i)]
Qπ(st,at):=E[Gt]=t′=tΣγt′−trt′Vπ(s1)=E[Qπ(s1,ai)]
对于式(9-1), 我们将其中的b换为 V π ( s ) V_\pi(s) Vπ(s), Σ t ′ = t γ t ′ − t r t − V π ( s ) \underset{t^{'}=t}{\Sigma} \gamma^{t^{'}-t}r^t-V_\pi(s) t′=tΣγt′−trt−Vπ(s)这一项就会有负有正。我们将这个算法叫优势演员-评论员算法。
但是这么做我们需要两个网络:Q和V, 事实上,我们可以只设计网络V然后用V来表示Q:
Q
π
(
s
t
,
a
t
)
=
E
[
r
t
+
V
π
(
s
t
+
1
)
]
Q_\pi(s_t,a_t)=E[r_t+V_\pi(s_{t+1})]
Qπ(st,at)=E[rt+Vπ(st+1)]
在Actor-Critic算法中,策略梯度更新公式为:
▽
R
θ
ˉ
=
1
N
∑
n
=
1
N
∑
t
=
1
T
(
n
)
[
r
t
+
V
π
(
s
t
+
1
)
−
V
π
(
s
t
)
]
▽
l
n
[
p
θ
(
a
t
(
n
)
∣
s
t
(
n
)
)
]
(
9
−
2
)
\bigtriangledown \bar{R_\theta} =\frac{1}{N}\sum_{n=1}^{N} \sum_{t=1}^{T^{(n)}} [r_t+V_\pi(s_{t+1})-V_\pi(s_t)]\bigtriangledown ln[p_\theta(a_t^{(n)}|s_t^{(n)})] \quad (9-2)
▽Rθˉ=N1n=1∑Nt=1∑T(n)[rt+Vπ(st+1)−Vπ(st)]▽ln[pθ(at(n)∣st(n))](9−2)
Actor-Critic中,有两个网络: ① 策略网络; ② V网络;
9.3 异步优势演员-评论员算法(A3C)
(Asynchronous Advantage Actor-Critic)
为加快训练速度, 一开始有一个全局的网络(包含策略网络和价值网络),我们使用多个进程,每个进程放在一张cpu上跑,每个进程在工作签都会把全局网络的参数复制过来,接下来去做交互收集数据,算梯度,将梯度传回中央,中央的网络就会进行参数更新。
9.4 路径衍生策略梯度(PDPG)
这个方法可以看成 深度Q网络 解连续动作的一种特别的方法,也可以看成一种特别的演员-评论员的方法。
-
DQN的问题: 动作连续的问题中 a r g m a x a Q \underset{a}{argmax}Q aargmaxQ不好求。
A2C的问题: 评论员只告诉演员这个动作的好坏,没有告诉更多的信息。
-
接下来,我们要学习一个演员,这个演员的工作就是解决 argmax 的问题,即输入一个状态s,希望可以输出一个动作a。
-
A2C和PG的区别:
在传统的方法中,我们有一个policty π \pi π与环境交互并分局采样结果更新poliy π \pi π,
▽ R θ ˉ = 1 N ∑ n = 1 N ∑ t = 1 T ( n ) [ ∑ τ = 1 T ( n ) γ τ − t r t ( n ) − b ] ▽ l n [ p θ ( a t ( n ) ∣ s t ( n ) ) ] ( 9 − 1 ) \bigtriangledown \bar{R_\theta} =\frac{1}{N}\sum_{n=1}^{N} \sum_{t=1}^{T^{(n)}} [\sum_{\tau=1}^{T^{(n)}} \gamma^{\tau-t} r_t^{(n)} -b]\bigtriangledown ln[p_\theta(a_t^{(n)}|s_t^{(n)})] \quad(9-1) ▽Rθˉ=N1n=1∑Nt=1∑T(n)[τ=1∑T(n)γτ−trt(n)−b]▽ln[pθ(at(n)∣st(n))](9−1)
但是在A2C中,我们不是直接使用每一步得到的数据和反馈进行策略更新,而是使用这些数据更新价值函数 V V V, 之后再借助 V V V函数计算梯度,更新策略。
▽ R θ ˉ = 1 N ∑ n = 1 N ∑ t = 1 T ( n ) [ r t + V π ( s t + 1 ) − V π ( s t ) ] ▽ l n [ p θ ( a t ( n ) ∣ s t ( n ) ) ] ( 9 − 2 ) \bigtriangledown \bar{R_\theta} =\frac{1}{N}\sum_{n=1}^{N} \sum_{t=1}^{T^{(n)}} [r_t+V_\pi(s_{t+1})-V_\pi(s_t)]\bigtriangledown ln[p_\theta(a_t^{(n)}|s_t^{(n)})] \quad (9-2) ▽Rθˉ=N1n=1∑Nt=1∑T(n)[rt+Vπ(st+1)−Vπ(st)]▽ln[pθ(at(n)∣st(n))](9−2)相比单纯策略梯度,Actor - Critic应用了Q-learning或其他策略评估的做法,使得Actor Critic能进行单步更新而不是回合更新,比单纯的Policy Gradient的效率要高。
十、稀疏奖励
假设你要训练一个机器手臂,然后桌上有一个螺丝钉跟螺丝起子,那你要训练它用螺丝起子把螺丝钉栓进去,这个很难,为什么?因为一开始你的 agent 是什么都不知道的,它唯一能够做不同的 action 的原因是 exploration。举例来说,你在做 Q-learning 的时候,会有一些随机性,让它去采取一些过去没有采取过的 action,那你要随机到说,它把螺丝起子捡起来,再把螺丝栓进去,然后就会得到 reward 1,这件事情是永远不可能发生的。所以,不管你的 actor 做了什么事情,它得到 reward 永远都是 0,对它来说不管采取什么样的 action 都是一样糟或者是一样的好。所以,它最后什么都不会学到。即如果环境中的奖励非常的稀疏,RL问题就会非常困难,我们有三个方向来解决 sparse reward 的问题。
10.1 Reward Shaping
我们刻意地设计了一些 reward 来引导我们的 agent, 就是找一些你自己认为的好的轨迹并且设置假的reward,让agent可以有个一个初步的不错的轨迹。
Reward shaping 是有问题的,因为我们需要 domain knowledge,举例来说,机器人想要学会的事情是把蓝色的带孔的板子穿过一个柱子。机器人很难学会,我们可以做 reward shaping。一个貌似合理的说法是,蓝色的板子离柱子越近,reward 越大。但是 machine 靠近的方式会有问题,它会用蓝色的板子打柱子。而我们要把蓝色板子放在柱子上面去,才能把蓝色板子穿过柱子。 这种 reward shaping 的方式是没有帮助的,那至于什么 reward shaping 有帮助,什么 reward shaping 没帮助,会变成一个 domain knowledge,你要去调的。
最常用的设计 “假reward” 的方法是ICM(intrinsic curiosity module):
这个方法的输入为 ( s t , a t , s t + 1 ) (s_t,a_t,s_{t+1}) (st,at,st+1),输出 r I C M r_{ICM} rICM, 与真正环境的R加和。
在ICM里面,有一个网络,输入是 ( s t , a t ) (s_t,a_t) (st,at), 输出为 ( s t + 1 ^ ) (\hat{s_{t+1}}) (st+1^), 接下来对比 s t + 1 s_{t+1} st+1和 s t + 1 ^ \hat{s_{t+1}} st+1^,这两个相差得越多,得到的reward就越大,这是鼓励machine去冒险。但是可能在某个游戏里面,背景会有风吹草动,会有树叶飘动。那也许树叶飘动这件事情,是很难被预测的,对 machine 来说它在某一个 state 什么都不做,看着树叶飘动,然后,发现这个树叶飘动是没有办法预测的,接下来它就会一直站在那边,看树叶飘动。因此我们不能给网络直接输入 s t s_t st而是要搞一个中间量 ϕ ( s t ) \phi(s_t) ϕ(st),即搭一个输入为 s t s_t st, 输出为 ϕ ( s t ) \phi(s_t) ϕ(st)的网络。(我们期待这个 feature extractor 可以把那种没有意义的画面,state 里面没有意义的东西把它过滤掉,比如说风吹草动、白云的飘动、树叶的飘动这种没有意义的东西直接把它过滤掉。)
10.2 Curriculum Learning
-
curriculum learning并不是RL独有的概念,他的意思是说: 在教小朋友的时候,要从易至难,先教他九九乘法才能再教微积分。举例来说: 在训练RNN的时候,要先给机器看短的Sequence,再给机器看长的Sequence, 训练效果会很好。
-
-
举个例子,把蓝色的板子穿过柱子,怎么让机器一直从简单学到难呢?
- 如第一张图所示,也许一开始机器初始的时候,它的板子就已经在柱子上了。这个时候,机器要做的事情只有把蓝色的板子压下去,就结束了。这比较简单,它应该很快就学的会。它只有往上跟往下这两个选择嘛,往下就得到 reward,就结束了,他也不知道学的是什么。
- 如第二张图所示,这边就是把板子挪高一点,挪高一点,所以它有时候会很笨的往上拉,然后把板子拿出来了。如果它压板子学得会的话,拿板子也比较有机会学得会。假设它现在学的到说,只要板子接近柱子,它就可以把这个板子压下去的话。接下来,你再让它学更 general 的 case。
- 如第三张图所示,一开始,让板子离柱子远一点。然后,板子放到柱子上面的时候,它就会知道把板子压下去,这个就是 curriculum learning 的概念。当然 curriculum learning 有点 ad hoc(特别),就是需要人去为机器设计它的课程。
-
Reverse Curriculum Generation
就是倒着走迷宫,根据目标状态反向寻找近一些的状态。以让机器抓东西为例,我们可以设置一些距离东西比较近的位置。接下来这些近的状态出发看能不能到最终状态,得到轨迹 τ f i n a l \tau_{final} τfinal。接下来我们把 τ f i n a l \tau_{final} τfinal中极大和极小的去掉因为太简单的不需要学,太难的初始阶段也不需要学。
接下来,再根据这些 reward 适中的 case 去 sample 出更多的 state。假设你一开始,你机械手臂在这边,可以抓的到以后。接下来,就再离远一点,看看能不能够抓得到,又抓的到以后,再离远一点,看看能不能抓得到。这是一个有用的方法,它叫做
Reverse Curriculum learning
。
10.3 Hierarchial RL(分层强化学习)
我们要完成一个很大的task的时候,并不是从非常底层的action开始想起的,我们有一个plan。
假设校长、教授和研究生通通都是 agent。那校长的愿景可能就是说教授每年都要发三篇期刊。然后接下来这些 agent 都是有分层的,所以上面的 agent,他的动作就是提出愿景这样。那他把他的愿景传给下一层的 agent,下一层的 agent 就把这个愿景吃下去。如果他下面还有其他人的话,它就会提出新的愿景。比如说,校长要教授发期刊,但其实教授自己也是不做实验的。所以,教授也只能够叫下面的研究生做实验。所以教授就提出愿景,就做出实验的规划,然后研究生才是真的去执行这个实验的人。
走迷宫的例子是说粉红色的这个点代表的就是愿景。上层这个 agent,它告诉蓝色的这个 agent 说,你现在的第一个目标是先走到这个地方,蓝色的 agent 走到以后,再说你的新的目标是走到这里。蓝色的 agent 再走到以后,新的目标在这里。接下来又跑到这边,最后希望蓝色的 agent 就可以走到黄色的这个位置。
十一、模仿学习
模仿学习(Imitation Learn)
讨论的问题是: 假设我们连奖励都没有,要如何进行? 在模仿学习里,有一些专家的示范,那机器也可以跟环境互动,但是Agent无法从环境中获得任何的奖励,他只能看着专家的示范来学习什么是好的什么是不好的。
举例来说,在自动驾驶里面,虽然没法给出自动驾驶汽车的奖励,但是我们可以收集很多人开车的记录;在聊天机器人里,我们无法定义什么叫好的对话,但是我们可以收集很多人的对话当作范本。
我们主要介绍两种IL的方法:① 行为克隆(Behavior Cloning, BC)
;② 逆强化学习(Inverse Reinforcement Learning, IRL)
;
11.1 行为克隆
行为克隆和监督学习差不多,我们可以先根据采集到的数据去训练行为函数
输入
:
s
t
,
输出
:
a
t
输入:s_t,\quad 输出: a_t
输入:st,输出:at
-
但是监督学习有两个缺点:
- ① 采集数据决定了策略函数的上限;
- ② 采集的数据的情况太少,很多特殊位置的数据不会被采集到;
-
因此单做监督学习是不够的,我们还需要
数据集聚合
:我们希望收集专家在各种极端情况下会采取什么行为,我们会初始化一个策略函数去控制Agent,只记录过程中专家的 ( s t , a t ^ ) (s_t,\hat{a_t}) (st,at^), 并不真正执行专家估计的行为。在那这些数据去训练策略函数,这个方法就叫数据集聚合。
-
让机器学习什么东西是需要模仿,什么东西是不需要模仿,这件事情是重要的。而单纯的行为克隆就没有把这件事情学进来,因为机器只是复制专家所有的行为而已,它不知道哪些行为是重要,是对接下来有影响的,哪些行为是不重要的,是对接下来是没有影响的。
11.2 逆强化学习(IRL)
机器和环境互动,但是不直接获得奖励。奖励必须要根据专家数据计算出来,据此反推奖励函数·。
即: 我们有了专家的示范,我们相信专家是对的,反推说,专家是因为什么样的奖励函数才会采取这些行为。
有了奖励函数之后,就可以设计一套方法去找出最优的Actor
奖励函数是一个输入为 τ \tau τ, 输出为 R ( τ ) R(\tau) R(τ)的神经网络, 我们先拿专家去采数据得到一堆 τ ^ \hat{\tau} τ^, 再拿随机初始化的Agent去采数据。得到 τ \tau τ 最后我们希望奖励网络的 R ( τ ^ ) 越大越好, R ( τ ) 越小越好。 R(\hat{\tau})越大越好,R(\tau)越小越好。 R(τ^)越大越好,R(τ)越小越好。
逆强化学习的框架如下图所示,其实我们只要把逆强化学习的演员看成生成器,把奖励函数看成判别器,就是GAN。在IRL中,actor 会想办法,从这个已经 learn 出来的 reward function 里面得到高分,然后 iterative 地去循环这其实是与 GAN 的过程是一致的。
逆强化学习只是一种示范,只是一种范例,实际上机器可以去跟环境互动非常多次。所以在逆强化学习的文献, 往往会看到说只用几笔数据就训练出一些有趣的结果。
-
行为克隆的缺点:
- ① 如果只收集专家的数据,看到的obs是非常有限的,我们还需要收集expert在各种极端情况下的action。
- ② 机器会完全复制专家的行为,我们希望机器能超过专家.
- ③ 训练数据和测试数据是mismatch的,可以用数据集聚合解决此问题。
-
IRL是怎么样运行的?
首先,我们有一个专家 π ^ , 这个专家去和环境互动, 采集到很多 τ ^ , 接下来搭建奖励网络, 以 R ( τ ^ ) 越大越好, R ( τ ) 越小越好作为目标。 最终的 r e w a r d 函数应该让 e x p e r t 和 a c t o r 对应的 r e w a r d 都得到比较高的分数。 首先,我们有一个专家\hat{\pi},这个专家去和环境互动,\\采集到很多\hat{\tau},接下来搭建奖励网络,\\以R(\hat{\tau})越大越好,R(\tau)越小越好作为目标。\\最终的reward函数应该让expert和actor对应的reward都得到比较高的分数。 首先,我们有一个专家π^,这个专家去和环境互动,采集到很多τ^,接下来搭建奖励网络,以R(τ^)越大越好,R(τ)越小越好作为目标。最终的reward函数应该让expert和actor对应的reward都得到比较高的分数。
十二、DDPG
动作可能是连续的,也可能是离散的。对于离散动作,在神经网络的输出层加一层softmax, 对于连续动作,再神经网络的输出层加一层tanh。
在动作空间连续的控制问题,最经典的算法就是: 深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)
, 这是一个确定性策略的模型。
-
DQN直接在DQN基础上加了一个策略网络来直接输出动作值,所以DDPG一边学习Q网络,一边学习策略网络。
-
Q网络的参数用 ω \omega ω表示, 策略网络的参数用 θ \theta θ表示。
-
DDPG的结构就是Actor-Critic结构:
- Actor根据Critic的打分来调整自己的策略,更新 θ \theta θ。
- Critic根据reward来调整打分策略,更新
ω
\omega
ω参数
-
我们优化Q网络的方法和在DQN中是一样的,根据r和下一步的 Q ′ Q^{'} Q′来拟合。
但是Q网络的优化存在一个和DQN一样的问题: Q_target是不稳定的,为了稳定这个Q_target, DDPG分别给Q网络和策略网络都搭建了target network。
-
DDPG表现很不错,但是它在超参数和其它类型的调整方面很敏感,且经常高估Q值。为了解决这些问题,有人搞了个TD3:
- ① 截断的双D学习: 搞两个Q网络,两个Q网络使用相同的目标,两个Q网络较小的值被作为Q-target。
- ② 延迟的策略更新: 同步训练动作网络和评价网络,却不使用目标网络,会导致训练过程不稳定;但是仅固定动作网络时,评价网络往往能收敛到正确的结果。
- ③ 目标策略平滑: 在目标动作中加入噪音,平滑Q的变化。