从多臂赌博机问题到强化学习
多臂赌博机,每次投币后只能选择按下一个臂,这个臂会有一定的概率给出奖励,但是我们并不知道每个臂给奖励的概率分布,那么如何获得最大收益呢?我们有两种策略,探索和利用, 探索是把所有的机会均分给每个臂,根据历史获得奖励的频率去近似它的真实奖励概率;利用就是每次都选择获得奖励频率最大的那个臂。探索可以更好的了解它的概率分布,从而制定更好的策略,缺点是会失去很多获得奖励的机会。而利用能抓住获得奖励的机会,但是可能得不到最优的方案。那么我们需要在其中做一个折中:即游戏开始的初期,我们采用比较多的探索和较小的利用,而随着游戏次数的增加,我们逐渐增加利用而减小探索。
这个策略就是 ϵ−greedy ϵ − g r e e d y 策略,每一步以 ϵ ϵ 的概率选择探索,以 1−ϵ 1 − ϵ 的概率选择利用,随着游戏的进行,慢慢减小 ϵ ϵ 。
上述的策略在利用的时候每次选择的都是历史平均奖励较大的臂,这是因为此时赌博机是stationary的,也就是说每个臂的概率分布是不会随着游戏的进行而改变的,因此只要探索的次数够大,就能用频率去逼近真实概率,那么每次只需要选择概率最大的臂即可。
假设现在店里的老板看你赢的这么舒服,悄悄地调整你这个机器每个臂奖励概率,不让你这么容易就把握规律怎么办?这个时候就是non-stationary了,如果还选择历史平均概率最大的臂这种策略就有问题咯,那么就轮到MDP上场了,即现在每次在利用的时候会选择未来累计奖励期望最大的那个臂,也就是Q值最大的那个臂,这就回到了我们经典的强化学习算法Q-learning来了。那么,如何知道这个Q值呢,这个时候就需要一些额外的信息,比如老板在什么时候调整机器,如何调整的等其他特征,这个就是我们需要观察的状态,这些状态能帮我们一定程度上消除这种动态性,因此我们需要在不同的状态下去估计每个臂的Q值,最终找到一种最优策略,能够逼近每个臂在不同状态下的最优的Q值,即为强化学习的目标。
注意,stationary的赌博机是没有状态,而只有动作和奖励,我们是通过对环境(赌博机)的建模来求解的,类似model-based强化学习。对于non-stationary的赌博机,我们若只观察老板调机器的状态来作出动作的选择的话是model-free的强化学习;若既观察老板调机器,又对当前的老虎机进行建模的话,就是model-based强化学习。关于model-free和model-based方法,请看这里
什么?你说可不可以不观察一些额外信息,也能玩转non-stationary的赌博机,那你肯定裤子都输光;然而我们现实生活中,那些游戏机为啥能赚你的钱,你自己心里没点数吗?
经典强化学习-Q学习
强化学习的本质基于马尔可夫链(MDP),认为未来状态只与现在的状态有关,而与过去无关,换句话说,凡是符合现在的动作可以影响未来这样的过程,都可以用强化学习建模。
强化学习的目标是要在当前状态下选择未来收益最大的动作,那么未来收益怎么衡量?用 rt r t 表示t时刻收到的奖励报酬,那么在t=0时刻未来的收益即为 ∑∞t=0γtrt ∑ t = 0 ∞ γ t r t ,这里 γ γ 为折扣因子,表示未来时刻的收益相对现在的即时奖励是有个折扣的;那么在t=1时刻未来的收益呢?当然是 ∑∞t=1γt−1rt ∑ t = 1 ∞ γ t − 1 r t 。我们把t=0时刻的未来收益展开发现:
当前时刻未来收益 = 现在的即时奖励+ γ γ 乘以下一个时刻的未来收益, 我们令状态价值函数 V(s0)=∑∞t=0rt V ( s 0 ) = ∑ t = 0 ∞ r t 表示状态 s0 s 0 下的未来收益,那么根据上式就有: V(s0)=r0+γV(s1) V ( s 0 ) = r 0 + γ V ( s 1 ) 。我们把这个式子推广到t时刻就得到了贝尔曼方程(Bellman Equation): V(st)=rt+γV(st+1) V ( s t ) = r t + γ V ( s t + 1 ) ,当知道了此时刻和下一时刻的收益之间的关系,我们就能应用动态规划的思想去求解。
上面的状态价值函数 V V 的意义表示某一个状态下的未来收益,是执行所有动作的平均收益,那么我们可以更加细化:用动作价值函数表示状态 st s t 下执行动作 at a t 的未来收益,那么就有 Qπ(st,at)=rt+γQπ(st+1,at+1) Q π ( s t , a t ) = r t + γ Q π ( s t + 1 , a t + 1 ) ,这里的 π π 指的是策略,表示一系列决策过程,如在 s0 s 0 下执行 a1 a 1 动作,而 s1 s 1 下执行 a3 a 3 动作等等,直到最后一个状态。注意此时的 rt r t 已不是某个状态下的平均收益,而是在 st s t 状态下执行 at a t 动作后的收益。
那么我们的决策目标就是找到一个最优策略 π∗ π ∗ 能够最大化我们未来的收益,因此最大收益为 Q∗(s,a)=maxπQπ(s,a) Q ∗ ( s , a ) = max π Q π ( s , a ) ,也就是说在最优策略下,最优的动作价值函数是最大的,那么很显然,我们可以通过动态规划构造满足一个最优子结构的状态关系:t时刻的最优Q值,等于t时刻的即时奖励加上t+1时刻的最优Q值,即t+1时刻Q的最大值,如下:
那么我们就可以利用上面的关系式去估计最优的Q值,因此更新Q-learning提供了以下对Q值的更新方法:
即每次用 rt+maxa′Q(st+1,a′) r t + max a ′ Q ( s t + 1 , a ′ ) 作为当前最优Q值的估计值,并计算这个估计值与当前Q值的差距(temporary difference)来指导当前Q值的更新,其中 α α 表示更新的步长。
当然还有其他更新Q值的方法,如DQN,它用一个具有参数 θ θ 的网络去估计当前的Q值 Q(st,at;θ) Q ( s t , a t ; θ ) ,并计算最优Q的估计值与当前Q值的欧式距离作为损失函数:
来指导网络的更新(梯度下降法),当然最主要的还是它使用一些其他的方法去稳定这个更新过程。
DQN:
两个重要的突破:
1. experience reply: 把每步agent经历状态,奖励,动作储存到经验池里,然后mini-batch采样来更新网络,这样可以打破样本之间的强依赖,稳定网络的更新
2. target network frezing: 每次迭代,计算Q的目标值
Q=rt+γmaxa′Q(st+1,a′;θtarget)
Q
=
r
t
+
γ
max
a
′
Q
(
s
t
+
1
,
a
′
;
θ
t
a
r
g
e
t
)
时使用的是target网络的输出,这个target网络的参数会保持一段时间不变,在经过了一定的迭代步数后,实时更新的Q网络参数会复制到target网络中。这个好处也是能够稳定训练过程。
Double Q-network
在标准的Q学习中,Q的值是有很多噪音的,因此会给对Q的估计值带来偏差。我们每次计算 Q=rt+maxa′Q(st+1,a′;θold) Q = r t + max a ′ Q ( s t + 1 , a ′ ; θ o l d ) 时,选择了target网络中使Q值最大的动作,而且用这个最大Q值来更新网络,此时,这个最大Q值可能是高估的overestimate,真实情况这个Q值其实没那么大,这种情况发生在我们每次只选择样本的最大值来估计随机变量期望的最大值。解决方法就是引入训练在不同样本上的两个网络,一个用来选择最优的动作,一个用来估计这个动作在这个状态下的Q值,具体来说,用Q网络选择最优动作,用target网络做估值,这样可以减小overestimate, 所有就有Double Q-learning计算Q值 Q=rt+γQ(st+1,argmaxa′Q(st+1,a′;θ);θold) Q = r t + γ Q ( s t + 1 , a r g m a x a ′ Q ( s t + 1 , a ′ ; θ ) ; θ o l d )
Prioritised replay
前面DQN,对经验池的各个样本是均匀采样,而Prioritised replay对样本的重要性进行了建模,计算每条样本的更新距离 |rt+maxa′Q(st+1,a′;θold)−Q(st,at;θ)| | r t + max a ′ Q ( s t + 1 , a ′ ; θ o l d ) − Q ( s t , a t ; θ ) | ,以所有的样本的更新距离构建一个采样分布:更新距离大的样本更容易被采样,这样就会让网络优先考虑那些差距大的样本,加快训练的收敛速度
Dueling Network
将DQN的输出分为状态值和动作优势的和 Q(s,a,θ,α,β)=V(s,θ,β)+A(s,a,θ,α) Q ( s , a , θ , α , β ) = V ( s , θ , β ) + A ( s , a , θ , α ) ,动作优势 A(s,a) A ( s , a ) 可以简单理解为这个动作 a a 在状态下的优势(advantage),我们选择优势大的动作执行,此时这个动作的Q值也是最大的,因为每个动作的advantage都加上同样的状态值V才等于Q值。
那么直接在网络的倒数第二层将V和A分开,然后在最后一层加起来这样不就可以吗?事实上这样并不行:4.5+0.5=5,3+2=5,同样等于5,但是相加的组合却有很多种,而我们的V其实相当于Q的均值,是这个状态的平均表现估计值,A相当于Q在V上的波动,代表每个动作的相对优势,因此需要把两部分固定,如对于Q=5,固定V在4.5左右,A在0.5上下波动;对于Q=6, V=5.6左右, A=0.5左右波动,那么就有了以下做法:
这样会强制V让接近最优的Q值,即 V=Q∗ V = Q ∗ ,因为此时最好的A也只能让后面的括号为0,因此A的波动其实在一个小负值到零之间,为了让A更好可以被优化,比如我们一般喜欢让变量在0附近优化,去除bias,因此可以让A减去A的平均值,如下:
这样对训练过程的稳定和收敛都很有帮助。很多情况下,不管你采用什么样的action对下一步的状态转变是没什么影响的。主要是比如状态很好的时候,状态值V很大,这个时候选择什么样的action都可以获得较好的reward,也就是每个动作的A都差不多。所以这个时候,为了制定策略,最好是把action的作用给提取出来,去除状态值对于决策的影响,相当于减去了baseline,这样模型对于action之间的即使细微的差别也更容易发现。
PG
前面的DQN都是基于Value值迭代的,计算每个动作的Q值,选择Q值最大的动作执行,此外,我们还有一种基于policy迭代的方法,能够直接对各个动作的概率进行建模,这种方法就是策略梯度policy gradient (PG),此时网路输出的是各个动作的概率,在选择动作时,直接进行均匀采样,那么概率大的动作更容易被采样执行,更新的梯度为: ▽θlogπ(s,a;θ)Rs,a ▽ θ log π ( s , a ; θ ) R s , a ,此时 Rs,a R s , a 代表的是未来真实的累计奖励,然而我们在执行每一步的过程中,并不知道未来的累计奖励(对于Model-free的方法 ),所以我们只能让agent一直执行动作到一轮游戏结束,再根据贝尔曼方程向前推导每一步的 Rs,a R s , a ,然后对整个网络进行更新,所以是基于episode的更新,这个算法就是著名的REINFORCE算法
Actor-critic
在上面PG中,我们可以用 Q(s,a) Q ( s , a ) 来代替 Rs,a R s , a 值,因为 Q(s,a) Q ( s , a ) 其实就是最优奖励 Rs,a R s , a 一个估计,因此我们可以得到策略梯度为: ▽θlogπ(s,a;θ)Q(s,a;θ) ▽ θ log π ( s , a ; θ ) Q ( s , a ; θ ) ,但是我们如何在基于策略迭代的方法中获得Q值呢,那么就引出来actor-critic方法:用actor的输出表示动作策略 π(s) π ( s ) ,用critic对 Q(s,a) Q ( s , a ) 值建模,此时critic网络的输入是状态s和选择的动作a,这种方法同时结合了值迭代和策略迭代,实际表现最好
对于上面的Actor-critic方法,策略梯度 ▽θlogπ(s,a;θ)Q(s,a;θ) ▽ θ log π ( s , a ; θ ) Q ( s , a ; θ ) 会存在一定的问题:对于每个动作,可能 Rs,a R s , a 都是正值,因此每个动作都会被鼓励,只是鼓励的幅度大小不同,为了突出每个动作的相对优势,我们的策略梯度改为 ▽θlogπ(s,a;θ)A(s,a;θ) ▽ θ log π ( s , a ; θ ) A ( s , a ; θ ) ,此时我们的critic输出的是 V(s,θ) V ( s , θ ) ,可以与actor共用feature层,而且动作优势可以由状态值和即时奖励计算: A(s,a;θ)=r+V(s′;θ)−V(s;θ) A ( s , a ; θ ) = r + V ( s ′ ; θ ) − V ( s ; θ ) 。用梯度策略更新完actor后,然后再用值迭代的方法更新critic
DPG
上面的动作状态空间是离散的,但是如果动作空间是连续的,动作的个数无穷大,那么上述就不适用了。所以对于连续状态空间,更多的用的是决定性的策略梯度deterministic policy gradient (DPG),此时actor的输出是动作的连续值,而critic的输入是所有动作的连续值(actor的输出值)和状态,然后我们用值迭代方法更新critic,获得的每个动作的梯度回传到actor里更新actor网络