目前我们所讨论的动作-值评估方法都是采样平均法。现在我们来讨论一个问题,如何在计算机上以一种高效的方式来计算这个奖励的采样平均值,在存储容量固定和连续的分布计算的要求下。
为了简化定义,我们集中于一个动作上。令表示第i次选择后的这个动作的奖励,令表示这个动作被采样了n-1次后这个动作的值,这里我们把它简写成如下形式:
一种显而易见的计算方法是,记下来所有奖励,然后在每次需要预估动作a的时候都计算一次。但是,如果这么做了,存储空间和计算量会随着时间逐渐增大。每一个额外的奖励都需要一个额外的空间来存储,并且需要额外计算分子中的和。
但其实不必要这么做,很容易设计一个增量表达式来更新这个平均值,它只需要很小的,固定的计算来处理新的奖励。给定和第n步的奖励,那么新的平均值可以用以下式子来计算:
上式即使在n=1的情况下也成立,对于任意一个,有. ()这种实现方法只要求存储和,并且只需要对新的奖励进行非常少量的计算。使用增量计算来计算采样均值,并使用 贪心算法来选择动作的老虎机算法的完整伪代码如下所示。其中,函数设为输入一个动作,返回一个对应的奖励。
Initialize, for a=1 to k:
Q(a) <-- 0
N(a) <-- 0
Loop forever:
A <-- { argmax_a Q(a) with probability 1-\epsilon (breaking ties randomly)
{ a random action with probability \epsilon
R <-- bandit(A)
N(A) <-- N(A)+1
Q(A) <-- Q(A)+1/N(A)[R-Q(A)]
这种更新方式在本书中会经常用到,他的一般形式是:
新的估计<--旧的估计+步长*[目标-旧的估计]
表达式[目标-旧的估计]是估计的误差,通过把它挪进目标一步来减少这个误差。这个目标假定为一个期望的移动方向,尽管他可能是个噪声。(始终用当前获得奖励来优化估计,认为当前的奖励是真实的值,所以要把旧的估计往当前奖励处靠近)在上面这个例子中,目标就是第n步的奖励。
注意到StepSize这个参数是随时间变化的,在上面这个例子里,我们用的是,而在本书中,我们把步长参数设为,更一般的设为(就是某个动作在t时刻的步长)。