前言
本篇博客大概会记录强化学习RL的基础知识,基本方法,以及如何推导到DQN,和关于DeepMind的Playing Atari with Deep Reinforcement Learning(DQN学习打砖块游戏)这篇论文的一些理解,后续改进方向,还有一些具体实现。若有理解不当,恳请指出!
强化学习基础
强化学习中两大最基本的要素:Agent(智能体)与Environment(环境)。
在每个时间
t
t
内:
- Agent需要 1.做出行动 2. 观察环境
Ot
O
t
计算收益
Rewardt
R
e
w
a
r
d
t
- Environment需要 1. 感知Agent做出的行动 At A t 2. 做出环境反应 Ot+1 O t + 1 3. 反馈收益 Rt+1 R t + 1
具体可以使用下图来表示:(Agent 为大脑 地球为 Environment)
可以表示为四元式 E=<X,A,P,R> E =< X , A , P , R > 其中 X X 为当前状态做出的行动 P P 状态转移矩阵收益Reward
而状态State到动作Action的过程就称之为一个策略Policy,一般用 π π 表示 ,也就是需要找到以下关系:
a=π(s) a = π ( s )强化学习的学习目标是让Agent学习到一个好的策略policy,使总体期望reward最大。
我们一开始并不知道最优的策略是什么,因此往往从随机的策略开始,使用随机的策略进行试验,可以得到一系列的状态,动作和反馈:
{s1,a1,r1,s2,a2,r2...} { s 1 , a 1 , r 1 , s 2 , a 2 , r 2 . . . }强化学习主要方法有 1.有模型学习(Bellman和策略迭代,值迭代) 2. 无模型学习(蒙特卡洛方法,时序差分学习(Q-learning)) 3. 值函数近似 4. 模仿学习
MDP马尔科夫决策过程
接下来介绍一下强化学习基于的世界观。强化学习的研究依然建立在经典物理学的范畴上(没有量子计算也没有相对论)。这个世界的时间是可以分割成一个一个时间片的,并且有完全的先后顺序,也就是上面提到的一系列时间序列状态:
{s1,a1,r1,s2,a2,r2...} { s 1 , a 1 , r 1 , s 2 , a 2 , r 2 . . . }
其中一个重要的假设是在 每一次的参数调整中都会对环境造成确定性的影响,即输入确定,输出也确定。那么有了时间和确定性的假设,MDP(Markov Decision Process)便是为了描述这个世界而提出的概念。
马尔科夫链性质:系统下一时间状态仅由当前时刻状态与action决定。即
P(st+1|st)=P(st+1|st,st−1,...s1,s0) P ( s t + 1 | s t ) = P ( s t + 1 | s t , s t − 1 , . . . s 1 , s 0 )一个基本的MDP可以用(S,A,P)来表示,S表示状态,A表示动作,P表示状态转移概率,也就是根据当前的状态 st s t 和 at a t 转移到 st+1 s t + 1 的概率。
Value Function 价值函数
简单了解了MDP,我们试着定义价值函数 v(s) v ( s ) 来表示一个状态的未来潜在价值:
v(s)=E[Gt|St=s] v ( s ) = E [ G t | S t = s ]
其中回报Return Gt G t 来表示某个时刻t的状态将具备的回报
Gt=Rt+1+λRt+2+...=∑k=0∞λkRt+k+1 G t = R t + 1 + λ R t + 2 + . . . = ∑ k = 0 ∞ λ k R t + k + 1
上式中R是Reward反馈,λ是discount factor折扣因子,一般小于1,就是说一般当下的反馈是比较重要的,时间越久,影响越小。
之前说到我们学习目标是让agent学习到一个策略policy使总体期望最大,我们通过价值函数有两种比较常用的方法:- 直接优化策略 π(a|s) π ( a | s ) 或者 a=π(s) a = π ( s ) 使得回报更高
- 通过估计value function来间接获得优化的策略。(DQN)
Bellman方程
下面引入Bellman方程,方便之后探讨基于Bellman方程而衍生得到的求解Value Function的方法。
Bellman方程基本形式:
v(s)=E[Rt+1+λv(St+1)|St=s] v ( s ) = E [ R t + 1 + λ v ( S t + 1 ) | S t = s ]
Bellman方程说明了当前状态的值函数与下个状态的值函数的关系。从公式上看,当前状态的价值和下一步的价值以及当前的反馈Reward有关。它表明Value Function是可以通过迭代来进行计算的。虽然看似简单,确是强化学习的基础。Action-value Function 动作价值函数
我们定义一个新的函数 动作价值函数(Action-value function) Qπ(s,a) Q π ( s , a ) 从状态s出发,执行动作a后再使用策略 π π 的累计奖赏
Qπ(s,a)=E[rt+1+λrt+2+λ2rt+3+...|s,a]=Es′[r+λQπ(s′,a′)|s,a](1)(2)(3) (1) Q π ( s , a ) = E [ r t + 1 + λ r t + 2 + λ 2 r t + 3 + . . . | s , a ] (2) (3) = E s ′ [ r + λ Q π ( s ′ , a ′ ) | s , a ]Optimal Value Function 最优价值函数
求最优策略等价于求解最优Value Function(即value-base approach,DQN就是属于这种方法)
其他以下方法:
- policy-base approach: 直接计算策略函数
- model-base approach: 估计模型,计算状态转移函数,从而整个MDP过程得解。
Q∗(s,a)=maxπQπ(s,a)=Es′[r+λmaxa′Q∗(s′,a′)|s,a] Q ∗ ( s , a ) = max π Q π ( s , a ) = E s ′ [ r + λ max a ′ Q ∗ ( s ′ , a ′ ) | s , a ]Bellman有两个基本算法:策略迭代,值迭代
Policy Iteration策略迭代:目的通过迭代计算value function 使policy收敛到最优,算法分为两步
- Policy Evaluation 策略评估 :更新value function 估计当前策略价值
- Policy Improvement 策略改进:使用 greedy policy 产生新样本,用于第一步评估
policy iteration使用bellman方程来更新value,最后收敛的value 即 vπ v π 是当前policy下的value值(所以叫做对policy进行评估),目的是为了后面的policy improvement得到新的policy。
vk+1(s)=E[Rt+1+γvk(St+1)|St=s]=∑aπ(a|s)∑s′,rp(s′,r|s,a)[r+γvk(s′)](4)(5) (4) v k + 1 ( s ) = E [ R t + 1 + γ v k ( S t + 1 ) | S t = s ] (5) = ∑ a π ( a | s ) ∑ s ′ , r p ( s ′ , r | s , a ) [ r + γ v k ( s ′ ) ]Value Iteration值迭代: 使用Bellman最优方程更新value,最后收敛得到的value即 v∗ v ∗ 就是当前state状态下的最优的value值。因此,只要最后收敛,那么最优的policy也就得到的。因此这个方法是基于更新value的,所以叫value iteration。
v∗(s)=maxaE[Rt+1+γv∗(St+1)|St=s,At=a]=max∑s′,rp(s′,r|s,a)[r+γv∗(s′)](6)(7) (6) v ∗ ( s ) = max a E [ R t + 1 + γ v ∗ ( S t + 1 ) | S t = s , A t = a ] (7) = max ∑ s ′ , r p ( s ′ , r | s , a ) [ r + γ v ∗ ( s ′ ) ]
然后改变成迭代形式vk+1(s)=maxaE[Rt+1+γvk(St+1)|St=s,At=a]=max∑s′,rp(s′,r|s,a)[r+γvk(s′)](8)(9) (8) v k + 1 ( s ) = max a E [ R t + 1 + γ v k ( S t + 1 ) | S t = s , A t = a ] (9) = max ∑ s ′ , r p ( s ′ , r | s , a ) [ r + γ v k ( s ′ ) ]
其中 p p 为状态转移函数上面使用的是价值函数版本,动作价值函数版本为
Q-learning
Q Learning根据value iteration得到。但要明确一点是value iteration每次都对所有的Q值更新一遍,也就是所有的状态和动作。但事实上在实际情况下我们没办法遍历所有的状态,还有所有的动作,我们只能得到有限的系列样本。因此,只能使用有限的样本进行操作。那么,怎么处理?Q Learning提出了一种更新Q值的办法:
Q(St,At)←Q(St,At)+α(Rt+1+λmaxaQ(St+1,a)−Q(St,At)) 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 ) )虽然根据value iteration计算出target Q值,但是这里并没有直接将这个Q值(是估计值)直接赋予新的Q,而是采用渐进的方式类似梯度下降,朝target迈近一小步,取决于α,这就能够减少估计误差造成的影响。类似随机梯度下降,最后可以收敛到最优的Q值。
具体算法如下:ϵ−greedy ϵ − g r e e d y 即以 ϵ ϵ 的概率选取随即动作,以1- ϵ ϵ 的概率根据当前Q值计算并作出一个最优动作。
接下来的问题是如何存储Q值
使用矩阵为最简单的方法
如图所示,我们使用一个矩阵来存储Q值,每一个单元格表示Q(s,a),再通过 ϵ−greedy ϵ − g r e e d y 进行动作选择。但是问题也很明显,如果我们的state与action很多,就如打砖块游戏,每个时间不同的砖块排列跟剩余都是不同的state,就会导致维度灾难。价值函数近似Value
Q(s,a)≈f(s,a,w)=w1+ws2a+w0 Q ( s , a ) ≈ f ( s , a , w ) = w 1 + w s 2 a + w 0
因为我们并不知道Q值的实际分布情况,本质上价值函数近似就是用一个函数来近似Q值的分布。进而可以推出Q值神经网络化,也就是DQN。
我们使用Q-learning为QNetwork提供有标签的样本 Rt+1+λmaxaQ(St+1,a) R t + 1 + λ max a Q ( S t + 1 , a ) ,利用Reward和Q计算出来的目标Q值。所以损失函数可以表示为
L(w)=E[(r+γmaxa′Q(s′,a′,w)−Q(s,a,w))2] L ( w ) = E [ ( r + γ max a ′ Q ( s ′ , a ′ , w ) − Q ( s , a , w ) ) 2 ]
其中 r+γmaxa′Q(s′,a′,w) r + γ max a ′ Q ( s ′ , a ′ , w ) 为target
DQN
下图为DQN 2013论文中的算法
其中用到了随机采样,原因是玩Atari采集的样本是一个时间序列,样本之间具有连续性,如果每次得到样本就更新Q值,受样本分布影响,效果会不好。因此,一个很直接的想法就是把样本先存起来,然后随机采样如何?这就是Experience Replay的意思。中文详解与理解如下1、初始化replay memory D 容量为N
2、用一个深度神经网络作为Q值网络,初始化权重参数
3、设定游戏片段总数M
4、初始化网络输入,大小为84*84*4,并且计算网络输出
5、以概率ϵ随机选择动作at或者通过网络输出的Q(max)值选择动作at
6、得到执行at后的奖励rt和下一个网络的输入
7、根据当前的值计算下一时刻网络的输出
8、将四个参数作为此刻的状态一起存入到D中(D中存放着N个时刻的状态)
9、随机从D中取出minibatch个状态 (随即采样)
10、计算每一个状态的目标值(通过执行at后的reward来更新Q值作为目标值)
11、通过SGD更新weight网络结构设计:
后续的Improvement方向
- Q值的计算方法
- 随机采样重要性
- 改进网络结构,或者使用RNN代替时序性?
- 改进训练时间(训练时间稍长,据说1080要训练一天)
- 是否可以输出连续动作,可否会改进
- 更多有难度的游戏
Win10下的具体实现可以看下一篇博客
参考文献
- http://www0.cs.ucl.ac.uk/staff/D.Silver/web/Teaching.html (David Silver的课程PPT)
- https://zhuanlan.zhihu.com/p/21547911
- http://www.cnblogs.com/wangxiaocvpr/p/5601972.html
- http://www.cnblogs.com/jinxulin/p/3526542.html
- http://blog.csdn.net/buyulian/article/details/79209338
- DeepMind, Playing Atari with Deep Reinforcement Learning,2013
- 周志华,机器学习西瓜书