2.4 incremental implementation 增量实现

目前我们所讨论的动作-值评估方法都是采样平均法。现在我们来讨论一个问题,如何在计算机上以一种高效的方式来计算这个奖励的采样平均值,在存储容量固定和连续的分布计算的要求下。

为了简化定义,我们集中于一个动作上。令R_i表示第i次选择后的这个动作的奖励,令Q_n表示这个动作被采样了n-1次后这个动作的值,这里我们把它简写成如下形式:

Q_n\doteq \frac{R_1+R_2+...+R_{n-1}}{n-1}

一种显而易见的计算方法是,记下来所有奖励,然后在每次需要预估动作a的时候都计算一次。但是,如果这么做了,存储空间和计算量会随着时间逐渐增大。每一个额外的奖励都需要一个额外的空间来存储,并且需要额外计算分子中的和。

但其实不必要这么做,很容易设计一个增量表达式来更新这个平均值,它只需要很小的,固定的计算来处理新的奖励。给定Q_n和第n步的奖励R_n,那么新的平均值可以用以下式子来计算:

Q_{n+1} = \frac{1}{n}\sum_{i=1}^{n}R_i \\= \frac{1}{n}(R_n+\sum_{i=1}^{n-1}R_i) \\=\frac{1}{n}(R_n+(n-1)\frac{1}{n-1}\sum_{i=1}^{n-1}R_i)\\=\frac{1}{n}(R_n+(n-1)Q_n)\\=\frac{1}{n}(R_n+nQ_n-Q_n)\\=Q_n+\frac{1}{n}[R_n-Q_n]

上式即使在n=1的情况下也成立,对于任意一个Q_1,有Q_2 = R_1. (Q_1=0)这种实现方法只要求存储Q_nn,并且只需要对新的奖励进行非常少量的计算。使用增量计算来计算采样均值,并使用 \epsilon 贪心算法来选择动作的老虎机算法的完整伪代码如下所示。其中,函数bandit(a)设为输入一个动作,返回一个对应的奖励。

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)]

这种更新方式在本书中会经常用到,他的一般形式是:

NewEstimate \leftarrow OldEstimate + StepSize[Target-OldEstimate]

新的估计<--旧的估计+步长*[目标-旧的估计]

表达式[目标-旧的估计]是估计的误差,通过把它挪进目标一步来减少这个误差。这个目标假定为一个期望的移动方向,尽管他可能是个噪声。(始终用当前获得奖励来优化估计,认为当前的奖励是真实的值,所以要把旧的估计往当前奖励处靠近)在上面这个例子中,目标就是第n步的奖励。

注意到StepSize这个参数是随时间变化的,在上面这个例子里,我们用的是1/n,而在本书中,我们把步长参数设为\alpha,更一般的设为\alpha_t(a)就是某个动作在t时刻的步长)。

你可能感兴趣的:(强化学习)