对于 supervised-learning ,有两个假设:
强化学习的后续数据来自于后续动作,我们希望得到有稳定提升的数据,即在强化学习里面一个非常重要的问题就是,怎么让智能体的动作一直稳定地提升。
监督学习的数据都是人打标签做到的,因此监督学习的上限就是标签,但是强化学习是Agent在环境中自己探索,强化学习的上限是无法预知的。
强化学习是根据当前状态输出下一步动作,很多时候无法对下一步动作进行标注
预演(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)为观测概率
强化学习智能体要包含以下三种能力:
① 策略: 根据当前的观测和状态->输出下一步动作
② 价值函数: 输入当前智能体的状态,价值函数评估此状态的价值
V函数只评估状态的价值,Q函数评估(当前状态+下一步动作)的价值
③ 模型: 智能体对环境状态的理解
模型的输入是 ( 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 agent)**显式地学习价值函数,隐式地学习它的策略。策略是其从学到的价值函数里面推算出来的。**基于策略的智能体(policy-based agent)**直接学习策略,我们给它一个状态,它就会输出对应动作的概率。基于策略的智能体并没有学习价值函数。
根据是否有状态转移模型,我们把智能体分为model-based和model-free
状态转移模型是智能体对环境进行的拟合,是智能体通过对环境的感知自己构建的虚拟环境
对于强化学习任务,最重要的是 < S , A , P , R > , 即状态空间,动作空间,状态转移模型,奖励函数 对于强化学习任务,最重要的是,即状态空间,动作空间,状态转移模型,奖励函数 对于强化学习任务,最重要的是<S,A,P,R>,即状态空间,动作空间,状态转移模型,奖励函数
如果以上信息已知,那么智能体具有足够能力对真实环境进行仿真
model-baesd:
均已知且容易设置,就可以采取model-based的策略
model-free:
通常情况下,状态转移函数和奖励函数很难估计,甚至连环境中的状态都可能是未知的,这时就需要采用免模型强化学习。免模型强化学习没有对真实环境进行建模,智能体只能在真实环境中通过一定的策略来执行动作,等待奖励和状态迁移,然后根据这些反馈信息来更新动作策略,这样反复迭代直到学习到最优策略。
(model-free需要大量数据, model-based需要的数据少一些)
事实上,探索(估计摇臂的优劣)和利用(选择当前最优摇臂)这两者是矛盾的,因为尝试次数(总投币数)有限,加强了一方则自然会削弱另一方,这就是强化学习所面临的探索-利用窘境(exploration-exploitation dilemma)。
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
马尔可夫性质: 在一个随机过程给定过去状态和当前状态下,未来状态的条件概率分布仅仅取决于当前状态
即 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)
先用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′)代入贝尔曼期望方程里面进行迭代,就可以算出它的状态价值。
预测是给定一个马尔可夫决策过程以及一个策略 π \pi π, 计算 V 函数 V函数 V函数
input | output |
---|---|
V π ( s ) V_\pi(s) Vπ(s) |
控制是搜索最佳策略的过程,输出最佳价值函数和最佳策略
input | output |
---|---|
最佳价值函数 V ∗ 和最佳策略函数 π ∗ 最佳价值函数V^*和最佳策略函数\pi^* 最佳价值函数V∗和最佳策略函数π∗ |
控制问题要做的就是,给定同样的条件,求出在所有可能的策略下最优的价值函数是什么,最优策略是什么。
什么是最佳策略?什么是最优价值函数?
最佳策略函数 : π ∗ ( 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)
我们该怎么找到最佳策略?
穷举法效率极低,常用的方法有两种: ① 策略迭代; ② 价值迭代;
策略迭代用于优化策略函数,策略迭代分为两步: ① 策略评估; ②策略改进;
① 策略评估: 根据 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π比之前的大多少的时候或者经过多少轮迭代就终止
初始化: 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 值,这种单步更新的方法被称为时序差分方法
多次采样得到多条以当前状态 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))
自举: 根据 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就是蒙特卡洛方法
试探性出发假设: 任意一对 ( s , a ) 都有大于 0 的概率被选中。 任意一对(s,a)都有大于0的概率被选中。 任意一对(s,a)都有大于0的概率被选中。
策略迭代: 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三种主要思想
更新公式中: 我们用 ( 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
Q-Learning 有两种策略:
算法参数: 步长 α < 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
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适用场景:
一条轨迹 τ = 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 τ轨迹出现的概率)
将式(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)
我们该如何改变参数 θ \theta θ呢?
θ = θ + η ▽ R θ ˉ \theta = \theta + \eta \bigtriangledown \bar{R_\theta} θ=θ+η▽Rθˉ
我们要用参数为 θ的智能体与环境交互, 也就是拿已经训练好的智能体先与环 境交互,交互完以后,就可以得到大量游戏的数据。
策略梯度(policy gradient,PG)采样的数据只会用一次(因为采样都是根据上一时刻的策略网络进行的)。我们采样这些数据,然后用这些数据更新参数,再丢掉这些数据。接着重新采样数据,才能去更新参数。
假设在采样的过程中,在某个状态下,我们采样到要采取动作 a, 那么就把动作 a 当作标准答案(ground truth)。比如,我们在某个状态下,采样到要向左。因为是采样,所以向左这个动作不一定概率最高。假设我们采样到向左,在训练的时候,让智能体调整网络的参数, 如果看到某个状态,我们就向左。
如果给定 状态 s 状态s 状态s采取动作 a a a, 整场游戏得到正的奖励,就要增加 ( s , a ) (s,a) (s,a)的概率,反之减小。
θ = θ + η ▽ R θ ˉ \theta = \theta + \eta \bigtriangledown \bar{R_\theta} θ=θ+η▽Rθˉ
但是在很多游戏里面(比如乒乓球游戏),奖励总是正的,最低是0。分数为0~21分,这种情况下围殴了避免全部提升概率可能导致的。我们直接在奖励里面减去一个常数,这样就有负有正。
在同一场游戏里面,也许哟写动作是好的,有些动作是不好的,即使整场游戏的结果是好的,并不代表该场内每个动作都是好的。
我们希望可以给每个不同的动作都乘不同的权重。
如果整场游戏得到的分数是 +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)。
① 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,θ)]
如果要学习的那个 agent,一边跟环境互动,一边做学习这个叫 on-policy。 如果它在旁边看别人玩,通过看别人玩来学习的话,这个叫做 off-policy。
近端策略优化(Proximal Policy Optimization, 简称PPO)是PG的一个变形,是现在OpenAi默认的强化学习算法。
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)
有一个问题:如果 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
∑ 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)]
状态价值函数 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有啥区别?
我们学习出一个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函数以后,再去寻找一个更好的策略。这样一直循环下去,策略就会越来越好。
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网络的参数。
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
经验回放(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学习直接采用下一个状态的数据进行学习。
在实际过程中, 通过海量采样计算出的Q值被我们称为真实的Q值,我们发现估计出的Q值是比真实的Q值高的。(over estimate)
所以今天要提出 Double DQN 的方法,它可以让估测的值跟实际的值是比较接近的。
在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来算。
与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就越大
在演员-评论员算法里面,最知名的算法就是异步优势演员-评论员算法。如果我们去掉异步,则为优势演员-评论员(advantage actor-critic,A2C)算法。A2C算法又被译作优势演员-评论员算法。如果我们加了异步,变成异步优势演员-评论员算法。
Actor是策略函数 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s),即学习一个策略以得到一个尽可能高的回报。Critic是指价值函数 V π ( s ) V_\pi(s) Vπ(s).借助于价值函数,Actor-Critic可以进行单步更新。
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π<