这本书第一部分的内容是表格解决方法(即用表格来存储价值函数,从而选择最优动作)。但这类方法仅适用于状态空间和动作空间不大的情况下。本章要讲的赌博机问题只存在一个状态。
假设在我们面前有 k k k个赌博机(即 k k k个动作),每当我们选择一个赌博机,并且摇动它的摇杆时,就会得到一个数值奖励。我们的目标是最大化一定时间内总的奖励。
由于摇动一个赌博机的摇杆得到的奖励是不确定的,所以某个动作的价值是等于做该动作得到奖励的期望。即:
q ∗ ( a ) = E [ R t ∣ A t = a ] q_*(a) = \mathbb{E}[R_t | A_t = a] q∗(a)=E[Rt∣At=a]
如果我们知道做每个动作(选择每个赌博机)的价值,那么我们就可以每次选择价值最大的动作。但是我们并不知道 q ∗ ( a ) q_*(a) q∗(a)的值,所以通常会对每个动作的价值做出一个估计,在 t t t时刻动作 a a a的价值表示为 Q t ( a ) Q_t(a) Qt(a)。我们希望 Q t ( a ) Q_t(a) Qt(a)接近于 q ∗ ( a ) q_*(a) q∗(a)。
如果将 Q ( a ) Q(a) Q(a)的值保存下来,那么每次选择价值最大的动作的方法叫做greedy方法,也称为exploiting。这种方法就是利用以往的经验知识,选择一个当前状态认为最好的动作。
如果随机选择一个当前最优动作以外的动作,这就叫做exploring,这时候就需要更新动作的价值了。
这里给出了两种计算的思路:
Q t ( a ) = ∑ i = 1 t − 1 R i ⋅ 1 A i = a ∑ i = 1 t − 1 1 A i = a Q_t(a) = \frac{\sum_{i=1}^{t-1}R_i \cdot 1_{A_i = a}}{\sum_{i=1}^{t-1} 1_{A_i = a}} Qt(a)=∑i=1t−11Ai=a∑i=1t−1Ri⋅1Ai=a
其中 1 A i = a 1_{A_i = a} 1Ai=a表示的是一个指示函数,当 A i = a A_i = a Ai=a时为1,否则为0。
根据大数定律,不断执行动作, Q t ( a ) Q_t(a) Qt(a)会收敛到 q ∗ ( a ) q_*(a) q∗(a)。
greedy method选择动作的方式为:
A t = arg max a Q t ( a ) A_t = \argmax_{a} Q_t(a) At=aargmaxQt(a)
即选择当前动作价值最大的动作。
用第一种方法计算Q值时,需要存储每一次做的动作和获得的奖励。
但是我们将计算公式做一些改变之后,对于计算来说就会方便很多。如下:
)
Q Q Q值更新的标准形式为:
N e w E s t i m a t e ← O l d E s t i m a t e + S t e p S i z e [ T a r g e t − O l d E s t i m a t e ] NewEstimate \leftarrow OldEstimate + StepSize[Target - OldEstimate] NewEstimate←OldEstimate+StepSize[Target−OldEstimate]
StepSize表示更新的步长,平均方法的步长为1/n。我们可以将这个参数表示为 α t ( α ) \alpha_t(\alpha) αt(α)。
本章主要讲了四种方法来权衡探索和利用(也是选择动作的依据):
前面介绍了greedy method,就是选择当前动作价值最大的动作。但这样做可能会忽略那些动作价值可能更大,但没有执行过的动作。
所以,为了进行一定的探索,尽可能找到全局最优的动作。 ϵ \epsilon ϵ-greedy方法被提出。该方法是对greedy方法的改进。在每次选择动作的时候,以 1 − ϵ 1-\epsilon 1−ϵ的概率选择当前 Q Q Q值最大的动作,以 ϵ \epsilon ϵ的概率从所有动作中随机选择一个。
这样做的好处是,随着采样次数的增加,在极限条件下,每个动作都会被采样无限次,从而确保 Q t ( a ) Q_t(a) Qt(a)收敛到 q ∗ ( a ) q_*(a) q∗(a)。
ϵ \epsilon ϵ-greedy方法虽然给了当前 Q Q Q不是最大的动作(以下叫做non-greedy action)一些机会。但其实每一个non-greedy action也是有区别的,对于那些接近于最优 Q Q Q值的动作,或者不确定性特别大的动作,应该优先考虑。因为执行这样的动作能带来更大奖励。
所以,在选择动作时,可以基于这两方面考虑,找到一个价值最大的动作。
A t = arg max a [ Q t ( a ) + c ln t N t ( a ) ] A_t = \argmax_{a}[Q_t(a) + c \sqrt{\frac{\ln t}{N_t(a)}}] At=aargmax[Qt(a)+cNt(a)lnt]
式中的 c > 0 c>0 c>0表示探索的程度。 N t ( a ) N_t(a) Nt(a)表示时刻 t t t之前,动作 a a a被采样到的次数。
所以可以看出,如果某个动作的价值大,那么有两种情况:
如果 N t ( a ) = 0 N_t(a) = 0 Nt(a)=0,动作 a a a就在本次被选择。根式中的分子之所以采用自然对数的形式,是因为随着时间的增加, ln t \ln t lnt增加越来越慢,即逐渐减小探索的程度。
下图是UCB方法和 ϵ \epsilon ϵ-greedy方法在10臂赌博机上的测试结果。可以看出UCB总体表现要比 ϵ \epsilon ϵ-greedy好。
补充:
关于第二章中讨论的stationary problems和nonstationary problems:
Gradient bandit算法中定义了一个对动作的“偏好”函数 H t ( a ) H_t(a) Ht(a),这个值越大,选择该动作的概率就越大。我们用 π t ( a ) \pi_t(a) πt(a)表示 t t t时刻选择动作 a a a的概率。使用softmax来计算即为:
π t ( a ) = e H t ( a ) ∑ b = 1 k e H t ( b ) \pi_t(a) = \frac{e^{H_t(a)}}{\sum_{b=1}^{k}e^{H_t(b)}} πt(a)=∑b=1keHt(b)eHt(a)
因为动作的偏好程度 H t ( a ) H_t(a) Ht(a)并非固定的,在执行动作之后,会对其进行更新,更新公式如下:
其中的 R t ˉ \bar{R_t} Rtˉ表示t时刻之前得到的平均奖励。上面的式子直观理解就是:如果执行动作 A t A_t At得到的奖励 R t R_t Rt大于平均奖励,那就增大动作 A t A_t At的偏好值,并且减小其他动作的偏好值。
直观理解比较简单,但是这其实是基于梯度上升的思想实现的。这里的梯度是指期望奖励对偏好函数的梯度。具体的推导公式可参考书上或者这篇博客:Gradient Bandit及实现。
这个是适用于stationary问题的一个小trick,其实不太算是一种正式的促进探索的算法。
在多臂赌博机问题中,假设动作价值 q ∗ ( a ) q_*(a) q∗(a)是服从一个正态分布,均值为0,方差为1。在很多方法中,对于所有动作,初始值 Q 1 ( a ) Q_1(a) Q1(a)设置为0。
但如果我们把初始值设置为+5,这叫做乐观估计。但是这样有利于agent进行探索。比如在10-armed bandit问题中,第一次选择动作时,所有动作的 Q Q Q值都为5,这时随机选择一个动作 a a a,执行之后得到的Q_2(a) < 5。下一次选择动作时,还是利用greedy方法,在剩下的9个动作中选择一个,执行后得到的 Q Q Q值也是小于5。这样继续下去,每一个动作都有机会执行到。所以达到了充分探索的目的。
本章最重要的内容就是几种权衡探索和利用的方法: