based
的方法,这三种方法分别是 policy-based, value-based以及 model-based的方法,这三种方法分别代表着三种不同的模型,那么google的 Alpha Go正是基于以上这三种方法的融合: policy-based+value-based+model-based,这三种方法仅仅较适用于围棋。
Machine Learning就是在寻找一个可以拟合的损失函数,
下面我们以一个简单的DQN的方式来做。
Actor就是一个Function,通常我们记为 π \pi π,那么我们的输入输出维度是什么呢?Function的input就是机器看到的observation,他的output就是machine要采取的action。如果我们的Actor是Neural Network,那么我们这个过程就是一个Deep Reinforcement Learning,那么这个过程的observation就是一堆pixel,我们可以将其当成一个vector来进行描述或者是用一个matrix来描述,那么output就是我们的action,如果我们的input是一张image,那么我们的Actor就是CNN,那么我们到底有多少种output方式,那么我们的output就有多少种dimension。如下图打游戏图示所示:
但是在做Policy Gradient的时候,我们通常会假设Policy是stochastic
,所谓stochastic
就是说我们的outputs就是一个几率,如果你的分数是0.7,0.2,0.1,那么就是0.7的几率是left,0.2是right,0.1是fire。那么使用NN做一个action
的好处是什么?
传统就是使用表来进行所有动作的存储,但是ANN就很好的解决了我们这个问题。
我们要来决定一个Neural Network
的好坏。在传统的监督学习中,我们会给定一个Neural Network一些参数,类似 θ \theta θ,如果输出NN越类似我们的方程,那么我们就说这个网络是拥有越加的表现。
那么对于强化学习来说,我们怎么说其有着更好的表现呢?一个Actor的好坏也是非常的好坏,假设我们现在有一个NN了,那么一个Actor我们就用 π \pi π来表示,这个网络的参数我们使用 θ \theta θ来表示,同样的,我们可以使用s来表示这个网络所看到的observation,定义如下 π θ ( s ) \pi_\theta(s) πθ(s),那么怎么知道我们的actor的表现好坏呢?那么我们就需要使用我们的actor来玩下游戏,假设其做了如下步骤:
stochastic
看到同样的场景也会采取不同的action
,每次得到的 R θ R_\theta Rθ也是不一样,同样的,我们的游戏也是会有一个随机性,那么我们希望做的时候不是去max每次的 R θ R_\theta Rθ,而是每次 R θ ‾ \overline{R_\theta} Rθ,也就是我们的 R θ R_\theta Rθ的一个期望值。我们希望这个期望值越大越好,这里衡量模型的好坏。我们假设一场游戏就是一个 τ \tau τ,那么 τ \tau τ是一个sequence
,这里面包含了observation
,以及看到这个observation
后得到的reward
、还有新的observation
、所采取的action
以及得到的reward
等等,这里组合形成一个sequence
。下面我们定义 τ \tau τ的符号:这一步我们就要选择我们最好的Actor,这里我们就使用我们的Gradient Ascent,因为我们已经有我们的目标函数了,这里我们要最大化 R θ R_\theta Rθ,因为我们要max
我们的某一个值。
使用这个方法我们就可以得到我们的最大值,这里我们仅仅需要对 P ( τ ∣ θ ) P(\tau|\theta) P(τ∣θ)来做微分,不需要对 R ( τ ) R(\tau) R(τ)做任何微分,即使其是一个黑盒。
### 1.2.4 Natural DQN以及其改进方式
我们有了上述的一个描述状态过程 ( s 0 , a 0 , r 0 , s 1 , a 1 , r 1 , . . . , s t , a t , r t , ) (s_0,a_0,r_0,s_1,a_1,r_1,...,s_t,a_t,r_t,) (s0,a0,r0,s1,a1,r1,...,st,at,rt,)的表示方式的时候,我们需要做一个很重要的假设后,我们需要做一个假设上帝不掷筛子!。在强化学习领域,我们相信输入是确定的,那么输出也就一定是确定的,那么有了时间和确定性的假设,MDP(Markov Decision Process)便是为了描述这个世界而提出的概念。
MDP(Markov Decision Process)马尔可夫决策过程就是基于这样的一种假设:未来仅取决于当前!也就是用数学的话来描述就是,一个状态 S t S_t St是一个Markov,那么当且仅当 P ( s t + 1 ∣ s t ) = P ( s t + 1 ∣ s t , s t − 1 , . . . , s 1 , s 0 ) P(s_{t+1}|s_t)=P(s_{t+1}|s_t,s_{t-1},...,s_1,s_0) P(st+1∣st)=P(st+1∣st,st−1,...,s1,s0)其中, P P P为概率,简单的说就是下一个状态当前的动作注意,这里的状态是完全可观察的全部的环境状态(也就是所谓的上帝视角)。一个基本的MDP可以用(S,A,P)来表示,S代表状态,A代表动作,P代表状态转移概率。也就是根据当前的状态 s t s_t st以及 a t a_t at转移到 a t + 1 a_{t+1} at+1以及 s t + 1 s_{t+1} st+1的概率。如果我们知道了状态转移概率P,也就称我们获得了模型Model,有了模型,未来就是可以求得的,那么获取最优的动作也就是有了可能,这种通过模型来获取最优动作的方法也称为Model-Based的方法,但是在这种情况下,很多问题很难以获得准确的模型,因此有了Model-Free的方法来寻求最优的动作。关于具体的方法这里不具体讨论。
既然一个状态回应一个动作,那么我们就可以根据这个动作得到一个奖励,通过求这个奖励的期望来优化我们的模型参数,这里我们要引入一个价值函数以及一个Bellman Function。
由于每个状态时刻的状态是确定的,因此我们可以使用Value Function价值函数来描述这个状态的价值,从而来确定我们的决策方式,这里我们来用一个例子来说明Value Function价值函数。这里举一个投资的问题:
假设我们现在有一笔X美金的资金,我们眼前有3种选择方式来投资这笔资金,买卖或者原地不动放入银行,并且我们只能选择一种方式来执行我们的过程。Policy的意思就是我们有一套的Policy策略,我们基于这个策略进行操作:
if 股票跌: 我们就买入股票
else if 股票升:我们就卖出股票
else:我就是什么都不干,我就想放银行
这上面的伪代码就是表示一种极为简单的策略,那么我们把Policy策略看作是一个黑箱,那么基于策略的方法就是
那么好像这么做没有毛病,但是这里有一个巨大缺陷就是,基于上面的策略完全不考虑每一种选择对未来的价值影响,我们做决策是有目的的,那么就是为了最大化我们未来的投资汇报,那么对于这个闲钱的投资回报问题,我们的目标就是评估下每一种选择的潜在性价值。那么怎么评估?那我们有什么方式呢?
如下所示,我们可以换一种思维,使用状态或者动作+状态输入来获取我们的价值函数:
我们就评估每种状态(选择+股票涨跌)的价值,然后选择价值最高的作为最后的决策。比如说:
if 股票涨了:
因为未来几天内可能会有税率影响,价值为-100
if 股票跌了:
华为5g可期,虽然目前受美帝影响,但是以后股票必涨,价值+500
if 放入银行:
我可以先着,买车买房呀,很棒棒的选择,价值+300
…(更多的评估价值方法)
从数学的角度,我们常常会使用一个函数 V ( s ) V(s) V(s)来表示一个状态价值,也可以用 Q ( s , a ) Q(s,a) Q(s,a)来表示状态及某一个动作的价值。我们上面例子就是评估某个状态下动作的价值,然后根据价值来做判断,实际上,我们这里是有策略的,我们仅仅是让我们的策略更加的简单:
if 某一个决策的价值最大:选择这个决策
这就是价值函数的意义。在后面的文章中,其实我们还可以同时使用策略加价值评估的方法来联合给出决策,这种方法就是所谓的Actor Critic算法。
上面我们介绍了Value Function,那么我们就需要引入一些数学公式来完善这个函数,也就是一个回报 Result,也就是所有Reward的累加(带衰减系数discount factor)
G t = R t + 1 + λ t + 2 + . . . = ∑ k = 0 n λ k R t + k + 1 G_t = R_{t+1}+\lambda_{t+2}+...= \sum_{k=0}^n \lambda^kR_{t+k+1} Gt=Rt+1+λt+2+...=k=0∑nλkRt+k+1
也就是将Bellman方程展开可得:
v ( s ) = E [ R t + 1 + λ v ( S t + 1 ) ∣ S t = s ] v(s) = E[R_{t+1}+\lambda v(S_{t+1})|S_t = s] v(s)=E[Rt+1+λv(St+1)∣St=s]
上面这个公式就是Bellman方程的基本形态,从公式上看,当前状态的价值和下一步的价值以及当前反馈的Reward有关。
前面我们引入了价值函数,考虑到每个状态之后都有很多动作可以选择,每个动作之下的状态又多不一样,我们更关心在某个状态下的不同动作的价值。显然,如果知道每个动作价值,就可以选择价值最大的一个动作去执行。有了上面的定义,动作价值函数就可以表示如下:
Q π ( s , a ) = E [ r t + 1 + λ r t + 2 + λ 2 r t + 3 + . . . ∣ s , a ] = E s ′ [ r + λ Q π ( s ′ , a ′ ) ∣ s , a ] Q^\pi(s,a)=E[r_{t+1}+\lambda r_{t+2}+\lambda^2 r_{t+3}+...|s,a] = E_{s'}[r+\lambda Q^\pi (s',a')|s,a] Qπ(s,a)=E[rt+1+λrt+2+λ2rt+3+...∣s,a]=Es′[r+λQπ(s′,a′)∣s,a]
这里要说明的是动作价值函数的定义,加了 π \pi π,也就是在策略下的动作值,对于每个动作,都需要策略根据当前的状态生成,因此必须有策略支撑。前面的价值函数不一定依赖于策略,当然,如果定义 v π ( s ) v^\pi (s) vπ(s)则表示在策略 π \pi π下的价值。
事实上我们会更多使用动作价值函数而不是价值函数,因为动作价值函数更直观,更方便应用于算法当中。
首先是要求出我们根据输入的状态以及价值要得到动作价值函数,并最大化我们的动作价值函数 Q ∗ ( s , a ) = m a x π Q π ( s , a ) Q^*(s,a)=max_\pi Q^\pi (s,a) Q∗(s,a)=maxπQπ(s,a)
也就是最优的动作价值函数就是所有策略下的动作价值函数的最大值,通过这样的定义就可以使最优的动作价值唯一性,从而可以求解整个MDP。
Q ∗ ( s , a ) = E s ′ [ r + λ m a x a ′ Q ∗ ( s ′ , a ′ ) ∣ s , a ] Q^*(s,a)=E_{s'}[r+\lambda max_{a'}Q^* (s',a')|s,a] Q∗(s,a)=Es′[r+λmaxa′Q∗(s′,a′)∣s,a]
因为最优的Q值必然为最大值,所以,等式右侧的Q值必然为使a’取得最大的Q值。
本质上就是利用当前的策略产生新的样本,然后使用新的样本更好的估计策略的价值,然后利用策略的价值更新策略,然后不断反复。理论可以证明最终策略将收敛到最优。
这里要注意policy evaluation部分,这里迭代最重要一点就是需要state状转移概率p,也就是说依赖于model模型。而且按照算法要反复迭代直到收敛为止。所以一般需要做限制。比如到达某一个比率或者次数就停止迭代。
Q-Learning思想完全就是根据value iteration得到,但是要明确一点是value iteration每次都对所有的Q值更新一遍,也即是所有的动作状态。但事实上,在实际情况下我们没有办法遍历所有的动作状态,我们只能采取有限样本进行操作,那么Q-Learning提出了一种新的更新方法。
具体算法如下:
在上面的算法中,我们可以看到需要使用某一个policy来生成动作,也就是说,这个policy不是优化的那个policy,所以Q-Learning算法叫做Off-policy算法。另外,因为Q-Learning完全不考虑model模型也就是环境的具体情况,只考虑看到的环境及reward,因此是model-free的方法。
回到policy问题,那么要选择怎样的policy来生成action呢?有两种做法:
exploration
,也就是探索未知的动作会产生的效果,有利于更新Q值,获得更好的policy。而使用greedy policy也就是target policy则是exploitation,利用policy,这个相对来说就不好更新出更好的Q值,但可以得到更好的测试效果用于判断算法是否具有效果。有了上面的一个经验,我们就可以得到我们两种DQN的输入方式,第一种,就是:
1.使用我们的state以及action作为输入,来得到我们的Q(s,a)
2.仅仅使用我们的state来作为输入,最后来得到我们的Q(s,a)
上述两种方法如下图所示:
基本的DQN算法,也就是NIPS 2013版本,Deep Mind团队就不断对DQN进行改进,2015年首先于Nature上发布文章,提出了Nature版的DQN,接下来就提出了Double DQN,Prioritied Replay,还有Dueling Network三种方法,极大提升DQN的性能,目前很多改进型DQN算法在Atari游戏的平均得分是Nature版DQN的三倍多。
NIPS DQN在基本的Deep Q-Learning算法基础上使用了Experience Relay
经验池。通过将训练得到的数据存储起来然后随机采样的方法降低数据相关性。接下来,Nature DQN做了一个改进,就是增加Target Q
网络。也就是我们在计算目标Q值时使用专门的一个目标Q网络来计算,而不是直接使用预更新的Q网络。这样做的目的是为了减少目标计算与当前值的相关性。
I = ( r + γ max a ′ Q ( s ′ , a ′ , w − ) − Q ( s , a , w ) ) 2 I=(r+\gamma \max_{a'} Q(s', a', w^-)-Q(s,a,w))^2 I=(r+γa′maxQ(s′,a′,w−)−Q(s,a,w))2
如上面的损失函数公式所示,计算目标Q值的网络使用的参数是 w − w^- w−,而不是 w w w。就是说,原来NIPS版本的DQN目标网络Q网络是动态变化的,跟着Q网络的更新而变化,这样不利于计算目标Q值,导致目标Q值和当前的Q值相关性较大。因此提出单独使用一个目标Q网络。那么目标Q网络的参数如何来呢?还是从Q网络中来,只不过是延迟更新。也就是每次等训练了一段时间再将当前Q网络的参数值复制给目标Q网络。从Nature论文来看:
Nature-DQN提出来后,很多人思考如何改进,那么DQN有什么问题吗?
max Q
来计算有没有问题?Atari游戏
例如Montezuma's Revenge
,如何处理这些游戏?大幅度提升DQN玩Atari性能的主要就是Double DQN,Prioritised Relay还有Dueling Network三大方法。David Silver在ICML 2016中的Tutorial上做了介绍: