强化学习:蒙特卡罗,时序差分,多步时序差分

1,蒙特卡罗

1.1,基本原理

动态规划是基于模型的强化学习方法,但在实际情况下,环境的状态转移概率及回报往往很难得知,此种情况下,动态规划就不再适用了。这时候可考虑采用无模型方法通过采样的方式替代策略评估,蒙特卡罗方法就是基于这个思想。 

蒙特卡罗方法也称为统计模拟方法(或称统计实验法),是一种基于概率与统计的数值计算方法。该计算方法的主要核心是通过对建立的数学模型进行大量随机试验,利用概率论求得原始问题的近似解,与它对应的是确定性算法。

例如:计算图中蝴蝶的面积,可以通过随机撒豆子,统计在蝴蝶中豆子的比例进而计算蝴蝶的面积。

蒙特卡罗算法的核心思想是,在问题领域进行随机抽样,通过不断、反复、大量的抽样后,统计结果,得到解空间上关于问题领域的接近真实的分布。

蒙特卡罗强化学习在进行策略评估时,通过多次采样产生轨迹,求取平均累计回报作为期望累计回报的近似。整个蒙特卡罗强化学习使用了广义策略迭代框架,由策略评估和策略改进两部分组成,一次策略评估后面紧跟着对当前策略的改进,两个步骤交互进行,直至获得最优策略。

1.2,蒙特卡罗评估

蒙特卡罗评估是通过学习智能体与环境交互的完整轨迹来估计值函数的。所谓完整轨迹是指,从一个起始状态开始,使用某种策略一步步执行动作,直至结束形成的经验信息,包括所有时间步的状态、行为、立即回报等。

假设共执行 T 步,形成的完整轨迹如下:<s_0,a_0,r_0,s_1,a_1,r_1,...,s_T,a_T,r_T>

使用蒙特卡罗方法评估策略时,对评估方法做了三点改变:

  • 因为是无模型的方法,无法通过贝尔曼方程迭代获得值函数,因此通过统计多个轨迹中累计回报的平均数对值函数进行估计。
  • 在求累计回报平均时采用增量更新的方式进行更新,避免了批量更新方法中对历史数据的存储,提高来计算效率。
  • 为了方便直接从估计对象中求解最优策略,蒙特卡罗将估计值函数 V 改为估计行为值函数 Q,这样可通过贪心策略直接获得最优行为。

利用平均累计回报估计值函数

值函数、行为值函数:

V_{\pi}(s)=E_{\pi}\left [ G_t|S_t=s \right ]=E_{\pi}\left [ R_{t+1}+\gamma R_{t+2}+...|S_t=s \right ]

Q_{\pi}(s,a)=E_{\pi}\left [ G_t|S_t=s,A_t=a \right ]=E_{\pi}\left [ R_{t+1}+\gamma R_{t+2}+...|S_t=s,A_t=a \right ]

=E_{\pi}\left [ \sum_{k=0}^{\infty } \gamma ^kR_{t+k+1}|S_t=s,A_t=a\right ]

可见,状态值函数、行为值函数的计算实际上是计算累计回报的期望。在没有模型时,可以采用蒙特卡罗方法进行采样,产生经验信息。这些经验性信息经验性地推导出每个状态 s 的平均回报,以此来替代回报的期望,而后者就是状态值函数。状态值函数的估计通常需要掌握完整的估计才能准确计算得到。

当要评估智能体的当前策略 \pi 时,可以利用策略 \pi产生多个轨迹,每个轨迹都是从任意的初始状态开始直到终止状态,例如下面多个完整的轨迹:

  • 轨迹1:<s_0,a_0,r_{11},s_1,a_1,r_{12},...,s_1,a_2,r_{1k},...,s_{T},a_{T},r_{1T}>
  • 轨迹2:<s_0,a_0,r_{21},s_3,a_1,r_{22},...,s_1,a_k,r_{2k},...,s_{T},a_{T},r_{2T}>
  • ......

计算一个轨迹中状态处 s 的基类回报返回值为:

G_t=r_{t+1}+\gamma r_{t+2}+...=\sum_{k=0}^{\infty }\gamma ^{k}r_{t+k+1}

为计算方便,轨迹中用累计回报代替立即回报,则上面的轨迹表达式可表示为:

  • 轨迹1:<s_0,a_0,G_{11},s_1,a_1,G_{12},...,s_1,a_2,G_{1k},...,s_{T},a_{T},G_{1T}>
  • 轨迹2:<s_0,a_0,G_{21},s_3,a_1,G_{22},...,s_1,a_k,G_{2k},...,s_{T},a_{T},G_{2T}>
  • ......

在状态转移过程中,可能发生一个状态经过一定的转移后又一次或多次返回该状态,此时在多个轨迹里如何计算整个状态的平均回报呢?有两种方法:第一次访问蒙特卡罗方法(初访)和每次访问蒙特卡罗方法(每访)。

  • 初访法是指:在计算状态 s 处的值函数时,只利用每个轨迹中第一次访问到状态 s 时的累计回报。如轨迹1中,状态 s_1 出现了两次,但计算状态 s_1 处累计回报均值时只利用 s_1 初次出现的累计回报 G_{12}(不计算 s_1 第二次出现后的累计回报 G_{1k})。轨迹2中,状态 s_1 仅出现了一次,其累计回报为 G_{2k}。因此初访法计算 V(s_1) 的公式为:

V(s_1)=\frac{G_{12}+G_{2k}+...}{N(s_1)}

其中,N(s_1) 表示包含状态 s_1 的轨迹数。

  • 每访法是指:在计算状态 s 处的值函数时,利用所有访问到状态 s 时的累计回报。如轨迹1,计算状态 s_1 处的均值时需要用到 G_{12},G_{1k} 。因此,每访法计算 V(s_1) 的公式为:

V(s_1)=\frac{G_{12}+G_{1k}+G_{2k}+...}{N(s_1)}

其中,N(s_1) 表示状态 s_1 出现的总次数。

蒙特卡罗方法是用统计的方法求取值函数的,根据大数定律:当样本数量足够多的时候,即 N(s_1) 无穷大时,根据样本求取的值函数 V(s_1) 接近于真实值函数 V_{\pi}(s_1) 。

增量式更新

通常,蒙特卡罗法再求平均值到时候采用批处理进行的,即在一个完整的采样轨迹完成后,对全部的累计回报进行更新。实际上,这个更新过程可以增量式进行,使得在计算平均值时不需要存储所有既往累计回报,而是每得到一个累计回报之后就计算其平均值。

对于状态 s_t,不妨设基于 k(初访法 k 指的是含有状态 s_t 的轨迹数,每访法指的是状态 s_t 的数目)个采样数据估计出值函数为 V(s_1),增量公式:

V_k=\frac{1}{k}\sum_{j=1}^kG_j=\frac{1}{k}\left ( G_k+\sum_{j=1}^{k-1}G_j \right )

=\frac{1}{k}\left ( G_k+(k-1)V_{k-1} \right )

=\frac{1}{k}\left ( G_k+kV_{k-1}- V_{k-1}\right )

=V_{k-1}+\frac{1}{k}\left ( G_k-V_{k-1} \right )

则在得到第 k+1 个采样数据 G_t(s_t) 状态对应累计回报时,有:

V_{k+1}\leftarrow V_k(s_t)+\frac{1}{k+1}\left ( G_{k+1}(s_t)-V_k(s_t) \right )

可简写为:

V(s_t)\leftarrow V(s_t)+\frac{1}{k+1}\left ( G_t -V(s_t)\right )

显然,只需要给 V(s_t) 加上 \frac{1}{k+1}\left ( G_t-V(s_t) \right ) 即可,更一般地,将 \frac{1}{k+1} 替换为常数 \alpha , 令 1>\alpha >0 ,表示更新步长,\alpha 越大,代表越靠后的累回报报越重要。

最终得到蒙特卡罗方法值函数估计的更新公式:

V(s_t)\leftarrow V(s_t)+\alpha (G_t-V(s_t))

估计行为值函数 Q 代替估计值函数 V

动态规划中的策略迭代算法估计的是值函数 V,而最终的策略通过行为值函数 Q 获得,或者下一个状态的 V 获得。当模型已知的时候,从值函数 V 到行为函数 Q 有一个很简单的转换公式,可以根据此公式求解 \pi^{'}(s)

\pi^{'}(s)=arg\,\underset{a\in A} {max}\,Q(s,a)

同时因为知道 P_{ss^{'}}^a 和 R_s^a,也可以根据如下公式求解:

\pi^{'}(s)=arg\, \underset{a\in A}{max}\, \left [ R_s^a+\gamma \sum_{s^{'}\in S}P_{ss^{'}}^aV(s^{'}) \right ]

蒙特卡罗这种无模型方法难以通过上面两个方法求解策略,于是考虑将估计对象从值函数 V改为行为值函数 Q ,也就是说蒙特卡罗法估计的是行为值函数的值。

假设使用初访法,利用每个轨迹中第一次访问到状态 s 且采取行为 a 时的累计回报的平均值来计算状态行为对 (s,a) 的行为值函数。如轨迹1状态行为对 (s,a) 仅出现1次,其对应的累计回报为 G_{12} ,则有:

Q(s_1,a_1)=\frac{G_{12}+...}{N(s_1,a_1)}

其中,N(s_1,a_1) 表示包含状态行为对 (s_1,a_1) 的轨迹数。结合增量式更新公式,可得到行为值函数:

Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha (G_t-Q(s_t,a_t))

import numpy as np

S = ["S1","S2","S3","S4","S5"] # 状态集合
A = ["保持S1","前往S1","前往S2","前往S3","前往S4","前往S5","概率前往"] # 动作集合
# 状态转移函数
P = {
    "S1-保持S1-S1":1.0, "S1-前往S2-S2":1.0,
    "S2-前往S1-S1":1.0, "S2-前往S3-S3":1.0,
    "S3-前往S4-S4":1.0, "S3-前往S5-S5":1.0,
    "S4-前往S5-S5":1.0, "S4-概率前往-S2":0.2,
    "S4-概率前往-S3":0.4, "S4-概率前往-S4":0.4,
}
# 奖励函数
R = {
    "S1-保持S1":-1, "S1-前往S2":0,
    "S2-前往S1":-1, "S2-前往S3":-2,
    "S3-前往S4":-2, "S3-前往S5":0,
    "S4-前往S5":10, "S4-概率前往":1,
}
gamma = 0.5 # 折扣因子
MDP = (S, A, P, R, gamma)

# 策略1,随机策略
Pi_1 = {
    "S1-保持S1":0.5, "S1-前往S2":0.5,
    "S2-前往S1":0.5, "S2-前往S3":0.5,
    "S3-前往S4":0.5, "S3-前往S5":0.5,
    "S4-前往S5":0.5, "S4-概率前往":0.5,
}
# 策略2
Pi_2 = {
    "S1-保持S1":0.6, "S1-前往S2":0.4,
    "S2-前往S1":0.3, "S2-前往S3":0.7,
    "S3-前往S4":0.5, "S3-前往S5":0.5,
    "S4-前往S5":0.1, "S4-概率前往":0.9,
}
# 把输入的两个字符串通过“-”连接,便于使用我们上述定义的P,R变量
def join(str1, str2):
    return str1 + '-' + str2
def sample(MDP, Pi, timestep_max, number):
    ''' 采样函数,策略Pi,限制最长时间步timestep_max,总共采样序列数number '''
    S, A, P, R, gamma = MDP
    episodes = []
    for _ in range(number):
        episode = []
        timestep = 0
        s = S[np.random.randint(4)] # 随机选择一个除了s5以外的状态s作为起点
        while s != "S5" and timestep <= timestep_max: # 当前状态为终止状态或者时间步太长时,一次采样结束
            timestep += 1
            rand, temp = np.random.rand(), 0
            # 在状态s根据策略选择动作
            for a_opt in A:
                temp += Pi.get(join(s, a_opt), 0)
                if temp > rand:
                    a = a_opt
                    r = R.get(join(s, a), 0)
                    break
            rand, temp = np.random.rand(), 0
            # 根据状态转移概率得到下一个状态s_next
            for s_opt in S:
                temp += P.get(join(join(s, a), s_opt), 0)
                if temp > rand:
                    s_next = s_opt
                    break
            episode.append((s, a, r, s_next)) # 把(s,a,r,s_next)元组放入序列中
            s = s_next # s_next变成当前状态,开始接下来的循环
        episodes.append(episode)
    return episodes

# 采样5次,每个序列最长不超过1000步
episodes = sample(MDP, Pi_1, 20, 5)
print('第一条序列\n', episodes[0])
print('第二条序列\n', episodes[1])
print('第五条序列\n', episodes[4])
# 对所有采样序列计算所有状态的价值
def MC(episodes, V, N, gamma):
    for episode in episodes:
        G = 0
        for i in range(len(episode)-1, -1, -1):##一个序列从后往前计算
            (s, a, r, s_next) = episode[i]
            G = r + gamma * G
            N[s] = N[s] + 1
            V[s] = V[s] + (G - V[s]) / N[s]

timestep_max = 20
# 采样1000次,可以自行修改
episodes = sample(MDP, Pi_1, timestep_max, 1000)
gamma = 0.5
V = {"S1":0, "S2":0, "S3":0, "S4":0, "S5":0}
N = {"S1":0, "S2":0, "S3":0, "S4":0, "S5":0}
MC(episodes, V, N, gamma)
print("使用蒙特卡洛法计算MDP状态价值为\n", V)
使用蒙特卡洛法计算MDP状态价值为
 {'S1': -1.228923788722258, 'S2': -1.6955696284402704, 'S3': 0.4823809701532294, 'S4': 5.967514743019431, 'S5': 0}

可以看到用蒙特卡洛方法估计得到的状态价值和我们用 MRP 解析解得到的状态价值是很接近的,这得益于我们采样了比较多的序列。

1.3,蒙特卡罗控制

策略评估的结果是获得每一个状态行为对 (s_t,a_t) 的行为值函数 Q(s_t,a_t) ,策略控制要做的事情就是基于策略评估结果采用贪心算法改进策略:

\pi^{'}(s_t)=arg\,\, \underset{a_t\in A}{max}\, \, Q(s_t,a_t)

如果完全使用贪心算法就会存在一个问题,很有可能由于没有足够的采样经验而导致选择的是不是最优的策略。因此,需要不时地尝试新行为去挖掘更多的信息,这就是探索(Exploration)。

为了解决这一问题,需要引入一个随机机制,使得某一状态下所有可能的行为都有一个非零概率被选中执行,以保证持续的探索,代表性的方法是 ε-贪心探索。以 ε 的概率从所有动作中均匀随机选取一个,以 1-ε 的概率选取当前最优动作。假设 m 为动作数,在ε-贪心策略中,当前最优动作被选中的概率是 1-\varepsilon +\frac{\varepsilon }{m} ,而每个非最优动作被选中的概率是 \frac{\varepsilon }{m} :

\left\{\begin{matrix} \frac{\varepsilon }{m}+1-\varepsilon & a^{*}=arg\, \, \underset{a\in A}{max}\, \, Q(s,a)\\ \frac{\varepsilon }{m} & other \end{matrix}\right.

m 代表全部可选的行为,\frac{1}{m} 代表从 m 个可选行为中选中行为 a 的概率, \frac{\varepsilon }{m} 代表以 \varepsilon 的概率在 m 个可选行为中选中行为 a 的概率。最好的行为 a^* 有两种情况下可能被选到,一是 1-\varepsilon 的概率下选择当前认为最好的行为,二是随机选的时候也恰好选到最好的行为。

ε-贪心策略中,每个动作都会被选取,保证了探索的充分性。如果使用这样的策略进行采样(生成轨迹),就可以保证多次采样产生不同的采样轨迹,保证采样的丰富性。下面需要证明使用 ε-贪心策略可以改进任意一个给定的策略,并且是在评估这个策略的同时改进它。假设需要改进的策略为 \pi ,使用 ε-贪心策略选取动作后对应的策略为 \pi^{'}

Q_{\pi}(s,\pi^{'}(s))=\sum_{a\in A}\pi^{'}(a|s)Q_{\pi}(s,a)=\frac{\varepsilon }{m}\sum_{a\in A}Q_{\pi}(s,a)+(1-\varepsilon )\, \underset{a\in A}{max}\, Q_{\pi}(s,a)

\underset{a\in A}{max}\, Q_{\pi}(s,a)\geqslant \sum_{a\in A}\pi(a|s)Q_{\pi}(s,a)=\sum_{a\in A}\pi(a|s)\frac{1-\varepsilon }{1-\varepsilon }Q_{\pi}(s,a)

=\sum_{a\in A}\frac{\pi(a|s)-\pi(a|s)\varepsilon }{1-\varepsilon }Q_{\pi}(s,a)=\frac{\sum_{a\in A}\pi(a|s)-\sum_{a\in A}\pi(a|s)\varepsilon }{1-\varepsilon }Q_{\pi}(s,a)

=\frac{\sum_{a\in A}\pi(a|s)-\varepsilon }{1-\varepsilon }Q_{\pi}(s,a)=\frac{\sum_{a\in A}\pi(a|s)-\sum_{a\in A}\frac{1}{|A|}\varepsilon }{1-\varepsilon }Q_{\pi}(s,a)

=\sum_{a\in A}\frac{\pi(a|s)-\frac{\varepsilon }{m} }{1-\varepsilon }Q_{\pi}(s,a)

则有:

Q_{\pi}(s,\pi^{'}(s))\geqslant \frac{\varepsilon }{m}\sum_{a\in A}Q_{\pi}(s,a)+(1-\varepsilon )\sum_{a\in A}\frac{\pi(a|s)-\frac{ \varepsilon }{m}}{1-\varepsilon }Q_{\pi}(s,a)

=\frac{\varepsilon }{m}\sum_{a\in A}Q_{\pi}(s,a)+\left ( \sum_{a\in A}\pi(a|s)-\frac{ \varepsilon }{m} \right )Q_{\pi}(s,a)=\sum_{a\in A}\pi(a|s)Q_{\pi}(s,a)

=V_{\pi}(s)

上述结果摆明,ε-贪心策略可以改进任意一个给定的策略 \pi 满足 Q_{\pi}(s,\pi^{'}(s))\geqslant V_{\pi}(s),接下来需要证明:策略改进后,值函数单调递增,即 V_{\pi}(s)\leqslant V_{\pi^{'}}(s) (显然)

V_{\pi}(s)\leqslant Q_{\pi}(s,\pi^{'}(s))

=E[R_{t+1}+\gamma V_{\pi}(S_{t+1})|S_t=s,A_t=\pi^{'}(s)]

=E_{\pi^{'}}[R_{t+1}+\gamma V_{\pi}(S_{t+1})|S_t=s]

\leqslant E_{\pi^{'}}[R_{t+1}+\gamma Q_{\pi}(S_{t+1},\pi^{'}(S_{t+1}))|S_t=s]

=E_{\pi^{'}}[R_{t+1}+\gamma E[R_{t+2}+\gamma V_{\pi}(S_{t+2})|S_{t+1},A_{t+1}=\pi^{'}(S_{t+1})|S_t=s]

= E_{\pi^{'}}[R_{t+1}+\gamma R_{t+2}+\gamma^2V_{\pi}(S_{t+2})|S_t=s]

\leqslant E_{\pi^{'}}[R_{t+1}+\gamma R_{t+2}+\gamma^2 R_{t+3} +\gamma ^3V_{\pi}(S_{t+2})|S_t=s]

....

\leqslant E_{\pi^{'}}[R_{t+1}+\gamma R_{t+2}+\gamma^2 R_{t+3} +\gamma ^3 R_{t+4}+...|S_t=s]

=V_{\pi^{'}}(s)

解决了策略评估和策略控制两个问题,最终得到蒙特卡罗方法,即使用行为值函数 Q 进行策略评估,使用ε-贪心算法改进策略,该方法最终可以收敛至最优策略。

1.4,在线策略蒙特卡罗

根据产生采样的策略(行为策略)和评估改进的策略(原始策略)是否是同一个策略,蒙特卡罗方法又分为在线策略(on-policy)蒙特卡罗和离线策略(off-policy)蒙特卡罗。

  • 在线策略是指产生数据与要评估改进的策略是同一个策略。其基本思想是遵循一个已有策略进行采样,根据样本数据中的回报更新值函数。或者遵循该策略采取行为,根据行动得到回报更新值函数。最后根据更新的值函数来优化这个已有的策略,以得到更优的策略。由于要优化改进的策略就是当前遵循的策略,所以此方法称为在线策略。
  • 离线策略是指产生数据的策略与评估改进的策略不是同一个策略。其基本思想上,虽然已有一个原始策略,但是并不针对这个原始策略进行采样,而是基于另一个策略进行采样。这另一个策略可以是先前学习到的策略,也可以是人类的策略等一些较为成熟的策略。观察这类策略的行为和回报,并根据这些回报评估和改进原始策略,以此达到学习的目标。

1.5,离线策略蒙特卡罗

重要性采样离线策略蒙特卡罗在离线蒙特卡罗强化学习中,使用了重要性采样的方法,通过随机性策略(如 ε-贪心策略)产生的数据,对原始贪心策略进行评估和改进。其中,产生采样数据的策略叫做行为策略,用 \pi^{'} 表示;评估和改进的策略叫原始策略,用 \pi 表示。

重要性采样的原理:一般的,假设 p,q 为两个不同的概率分布,函数 f(x) 在概率分布 p 下的期望可以表示为:

E(f)=\int _{x}p(x)f(x)dx

可使用从概率分布 p 上的采样 \left \{ x_1,x_2,...,x_m \right \} 来估计 f 的期望,有:

\hat{E}(f)=\frac{1}{m}\sum_{i=1}^{m}f(x_i)

上式也可看成是函数 \frac{p(x)}{q(x)}f(x) 在分布 q 下的期望:

E(f)=\int _{x}p(x)f(x)dx=\int_{x}q(x)\frac{p(x)}{q(x)}f(x)dx

使用q上的采样 \left \{ x_1^{'},x_2^{'},...,x_m^{'} \right \} ,估计 f 的期望,有: 

\hat{E}(f)=\frac{1}{m}\sum_{i=1}^{m}\frac{p(x^{'}_i)}{q(x^{'}_i)}f(x^{'}_i)=\frac{1}{m}\sum_{i=1}^{m}f(x_i)

可见,当随机变量 f(x) 的分布(f(x) 服从于 p 分布)无法产生样本,或者产生的样本比较复杂的时候,就可以考虑使用一个已知样本或者比较简单的概率分布(如 使用  \frac{p(x)}{q(x)}f(x)服从于 q 分布)来逼近随机变量 f(x) 的期望。  

分别用 \pi,\pi^{'} 产生两条采样轨迹,两条轨迹的区别是每个“状态行为对”被采样的概率不同。使用策略 \pi 的采样轨迹评估策略\pi,实际上是在求取状态行为对 (s,a) 的累计回报期望,即行为值函数:

Q(s,a)=\frac{1}{m}\sum_{i=1}^{m}G_i 

G_i 表示第 i 条轨迹上,自状态行为对 (s,a) 到结束的累计回报,若使用策略 \pi^{'} 的采样轨迹来评估策略 \pi,则对累计回报加权,得到:

Q(s,a)=\frac{1}{m}\sum_{i=1}^{m}\frac{P_{i}^{\pi}}{P_i^{\pi^{'}}}G_i

P_i^{\pi},P_i^{\pi^{'}} 分别表示两个策略产生第 i 条轨迹的概率,对于一条给定的轨迹:

<s_0,a_0,r_0,s_1,a_1,r_1,s_2,a_2,r_2,...,s_T,a_T,r_T>

策略 \pi 产生该轨迹的概率为:

P_i^{\pi}=\prod _{j=0}^{T-1}\pi(a_j|s_j)P_{s_j,s_{j+1}}^{a_j}

同理,策略 \pi^{'} 产生该轨迹的概率为:

P_i^{\pi^{'}}=\prod _{j=0}^{T-1}\pi^{'}(a_j|s_j)P_{s_j,s_{j+1}}^{a_j}

\rho_i^{T}=\frac{P_{i}^{\pi}}{P_i^{\pi}}^{'}=\prod_{j=0}^{T-1}\frac{\pi(a_j|s_j)}{\pi^{'}(a_j|s_j)}

\rho_i^T 称为重要采样比率,i 表示第 i 条轨迹,T 为终止时刻。可见,原始策略和行为策略产生轨迹概率的比值转化为了两个策略概率的比值。

使用策略 \pi^{'} 的采样轨迹评估策略 \pi ,增量式更新公式:

Q_m(s_t,a_t)=\frac{1}{m}\sum_{i=1}^m\rho_i^TG_i=\frac{\rho_m^TG_m+Q_{m-1}(s_t,a_t)(m-1)}{m}

i 代表轨迹,m 为最后一条轨迹。

=Q_{m-1}(s,a_t)+\frac{\rho_m^TG_m-Q_{m-1}(s_t,a_t)}{m}

=Q_{m-1}(s_t,a_t)+\alpha \left ( \prod_{j=t}^{T-1}\frac{\pi(a_j|s_j)}{\pi^{'}(a_j|s_j)}G_m-Q_{m-1}(s_t,a_t) \right )

\alpha =\frac{1}{m} 代表学习率

Q(s_t,a_t)\leftarrow Q(s_t,a_t)+a\left ( \prod_{j=t}^{T-1}\frac{\pi(a_j|s_j)}{\pi^{'}(a_j|s_j)}G_m-Q(s_t,a_t) \right )

若 \pi 为贪心策略,而 \pi^{'} 是 \pi 的 ε-贪心策略,则 \pi(a_j|s_j) 对于 a_j=\pi(s_j) 为 1,\pi^{'}(a_j|s_j) 为 1-\varepsilon +\frac{\varepsilon }{m} 或 \frac{\varepsilon }{m} 。则可以通过行为策略(ε-贪心策略)对原始策略(贪心策略)进行评估。

加权重要性采样离线策略蒙特卡罗:基于重要性采样的积分是无偏估计,因此使用重要性采样进行策略评估时,得到的行为值函数的估计也是无偏估计。在进行计算时,对被积函数乘以一个重要性比例:

\prod_{j=t}^{T-1}\frac{\pi(a_j|s_j)}{\pi^{'}(a_j|s_j)}G_t

使得被积函数方差发生较大变化,如果轨迹存在循环不终止的情况,对应的方差会变得无穷大。为了解决采样方差的问题,就有了加权重要性采样方法:

\hat{E}(f)=\frac{\sum_{i=1}^{m}\frac{p(x^{'}_i)}{q(x^{'}_i)}f(x^{'}_i)}{\sum_{i=1}^m\frac{p(x^{'}_i)}{q(x^{'}_i)}}

与普通重要采用相比,分母由 m 变为重要的采样比率之和  \sum_{i=1}^m\frac{p(x^{'}_i)}{q(x^{'}_i)} 。用加权重要性采样方法解决离线策略蒙特卡罗问题时,对应的行为值函数估计可表示为:

Q(s,a)=\frac{\sum_{i=1}^{m}\rho_i^T G_i}{\sum_{i=1}^m \rho_i^T}

加权重要采样方法更新:

Q_m(s,a)=\frac{\sum_{i=1}^m \rho_i^TG_i}{\sum_{i=1}^m\rho _i^T}=\frac{\rho_m^TG_m+\sum_{i=1}^{m-1}\rho_i^TG_i}{\sum_{i=1}^{m}\rho_i^T}

=\frac{\rho_m^TG_m+Q_{m-1}(s,a)\sum_{i=1}^{m-1}\rho_i^{T}}{\sum_{i=1}^{m}\rho_i^T}

=\frac{\rho_m^TG_m+Q_{m-1}(s,a)\sum_{i=1}^{m}\rho_i^{T}-\rho_m^TQ_{m-1}(s,a)}{\sum_{i=1}^{m}\rho_i^T}

=Q_{m-1}(s,a)+\frac{\rho_m^T}{\sum_{i=1}^{m}\rho_i^T}\left ( G_m- Q_{m-1}(s,a)\right )

\frac{\rho_m^T}{\sum_{i=1}^{m}\rho_i^T} 称为加权重要性采样权值。若 \pi 为贪心策略,而 \pi^{'} 是随机策略。m 为轨迹数,则可以通过行为策略(随机策略)对原始策略(贪心策略)进行评估。

2,时序差分

2.1,基本概念

蒙特卡罗强化学习需要学习完整的采样轨迹,才能去更新值函数和改进策略,学习效率很低。而动态规划强化学习需要采用自举的方法,用后继状态的值函数估计当前值函数,可以在每执行一步策略之后就进行值函数的更新,相比而言,效率更好。时序差分方法结合了动态规划的自举和蒙特卡罗的采样,通过学习后继状态的值函数来逼近当前状态值函数,实现对不完整轨迹进行学习,可以高效地解决模型强化学习问题。

时序差分法的优势:结合动态规划的思想,可以实现单步更新,提升效率;结合蒙特卡罗的采样,可以避免对状态转换概率的依赖,通过采样估计状态的期望值函数。即使缺少环境动态模型,也能从原始经验中直接进行学习。

蒙特卡罗使用实际的累计回报平均值 G_t 作为值函数的估计来更新值函数:

V(s_t)\leftarrow V(s_t)+\alpha \left ( G_t-V(s_t) \right )

而时序差分方法的应用场景是不完整轨迹,无法获得累计回报。它在估计状态 S_t 的值函数时,用的离开该状态的立即回报 R_{t+1} 与下一状态 S_{t+1} 的预估折扣值函数 \gamma V(S_{t+1}) 之和:

V_{\pi}(S_t)=E_{\pi}[G_t|S_t=s]=E_{\pi}[R_{t+1}+\gamma V(S_{t+1})|S_t=s]

用 R_{t+1}+\gamma V(S_{t+1}) 代替 G_t ,结合蒙特卡罗增量式更新,就有了时序差分方法(TD)的值函数更新公式:

V_{\pi}(S_t)\leftarrow V_{\pi}(S_t)+\alpha(R_{t+1}+\gamma V(S_{t+1})-V(S_t))

其中:R_{t+1}+\gamma V(S_{t+1}) 称为 TD 目标值;

\delta _i=R_{t+1}+\gamma V(S_{t+1})-V(S_t) 称为 TD 误差。

2.2,动态规划、蒙特卡罗和时序差分

值函数估计三种方法最大的不同体现在值函数的更新公式上。

方法值函数估计是否自举是否采样
DPV(S_t)\leftarrow E_{\pi}[R_{t+1}+\gamma V(S_{t+1})]自举无须采样
MCV(S_t)\leftarrow V(S_t)+\alpha (G_t-V(S_t))不自举采样,完整轨迹。
TDV(S_t)\leftarrow V(S_t)+\alpha (R_{t+1}+\gamma V(S_{t+1}))自举采样,不完整轨迹。

蒙特卡罗(MC)方法使用的是值函数最原始的定义,该方法依靠采样,学习完整的轨迹,利用实际累计回报的平均值 G_t估计值函数。

V(S_t)\leftarrow V(S_t)+\alpha (G_t-V(S_t))

时序差分(TD)和动态规划(DP)则利用一步预测方法计算当前状态值函数,其共同点是利用自举,使用后继值函数逼近当前值函数。不同的是,动态规划方法无须采样,直接根据完整模型,通过当前状态 S 所有可能的转移状态 S^{'}、转移概率、立即回报来计算当前状态 S的值函数。

V(S_t)\leftarrow E_{\pi}[R_{t+1}+\gamma V(S_{t+1})]

而时序差分(TD)方法是无模型方法,无法获得当前状态的所有后继状态及回报等,仅能通过采样学习轨迹片段,用下一状态的预估状态价值更新当前状态预估价值。

V(S_t)\leftarrow V(S_t)+\alpha (R_{t+1}+\gamma V(S_{t+1}))

偏差/方差:蒙特卡罗(MC)和时序差分(TD)均是利用样本去估计值函数,可以从统计学的角度对比两种方法的期望和方差。

蒙特卡罗在估计值函数时,使用的是累计回报 G_t 的平均值,G_t 期望便是值函数的定义,因此蒙特卡罗方法是无偏估计。

G_t=r_{t+1}+\gamma r_{t+2}+...+\gamma^{T-1}r_T=\sum_{k=0}^T\gamma ^kr_{t+k+1}

蒙特卡罗在计算 G_t 值时,需要计算从当前状态到最终状态之间所有的回报,在这个过程中要经历很多随机的状态和动作,因此每次得到的随机性很大。所以尽管期望等于真值,但方差无穷大。

时序差分方法使用 R_{t+1}+\gamma V(S_{t+1}) 估计值函数,若 TD 目标采用真实值,是基于下一状态的实际价值对当前状态实际价值进行估计,则 TD 估计也是无偏差估计。然而在实际中 TD 目标用的是估计值,即基于下一状态预估值函数计算当前预估值函数,因此时序差分估计属于有偏估计。跟蒙特卡罗相比,时序差分只用到了一步随机状态和动作,因此 TD 目标的随机性比蒙特卡罗方法中的 G_t 要小,其方差也比蒙特卡罗的方差小。

动态规划方法利用模型计算所有后继状态,借助贝尔曼方程,利用后继状态得到当前状态的真实值函数,不存在偏差和方差。

方法偏差方差
DP无偏差无方差
MC无偏差高方差
TD

 无偏差(真实TD目标)

 有偏差(预估TD目标)

低方差

马尔可夫性:动态规划方法是基于模型的方法,基于现有的一个马尔可夫决策模型MDP的状态转移概率和回报,求解当前状态的值函数,因此该方法具有马尔可夫性。

蒙特卡罗和时序差分方法都是无模型方法,都需要通过学习采样轨迹估计当前状态值函数。所不同的是,应用时序差分(TD)算法时,时序差分算法视图利用现有的轨迹构建一个最大可能性的马尔可夫决策模型,即首先根据已有经验估计状态间的转移概率:

\hat{P}_{s,s^{'}}^a=\frac{1}{N(s,a)}\sum_{k=1}^K\sum_{t=1}^{T_k}I(s_t^k,a_t^k,s_{t+1}^k=s,a,s^{'})

同时估计某一个状态的立即回报:

\hat{R}_s^a=\frac{1}{N(s,a)} \sum_{k=1}^K \sum_{t=1}^{T_k}I(s_t^k,a_t^k=s,a)r_t^k

最后计算该马尔可夫决策模型的状态函数。

蒙特卡罗算法并不试图构建马尔可夫决策模型,该算法试图最小化状态值函数与累计回报的均方误差:

\sum_{k=1}^K\sum_{t=1}^{T_k}(G_t^k-V(s_t^k))^2

通过比较可以看出,时序差分和动态规划均使用了马尔可夫决策模型问题的马尔可夫属性,在马尔可夫环境下更有效;但是蒙特卡罗方法并不利用马尔可夫属性,通常在非马尔可夫环境下更有效:

方法是否使用马尔可夫属性
DP
MC
TD

2.3,Sarsa:在线策略TD

与蒙特卡罗、动态规划一致,时序差分方法也遵循了广义策略迭代框架,由策略评估和策略改进两个步骤交替进行,直至获取最优解。因为是无模型方法,所以策略评估是针对采样数据进行的。同样地,根据产生采样数据的策略和评估改进的策略是否为同一个策略,时序差分也可分为在线策略法和离线策略法。

Sarsa的名字来源于一组序列描述:基于状态 S ,遵循当前策略,选择一个行为 A ,形成第一个状态对 (S,A) 。与环境交互,得到回报 R,进入下一个状态 S^{'},再次遵循当前策略,产生一个行为为 A^{'},产生第二个行为对 (S^{'},A^{'})利用后一个状态行为对 (S^{'},A^{'}) 的行为值函数 Q(S^{'},A^{'}) 值更新前一个状态行为对 (S,A) 的 Q(S,A) 值。

对应的行为值函数更新公式:

Q(S,A)\leftarrow Q(S,A)+\alpha \left ( R+\gamma Q(S^{'},A^{'})-Q(S,A) \right )

在具体执行时,单个轨迹内,每进行一个时间步,都会基于这个时间步的数据对行为值函数进行更新,产生采样的策略和评估改进的策略都是 ε -贪心策略。

2.4,Q-learning:离线策略TD方法

离线策略时序差分(TD)学习的任务是借助策略 \mu(a|s) 的采样数据来评估和改进另一个策略 \pi(a|s) 。离线策略 TD 也使用了重要性采样方法,假设在状态 s_t 下遵循两个不同的策略产生了同样的行为 a_t ,则两种情形下产生行为 a_t 的概率大小不一样。

首先考虑使用原始策略 \pi 来评估策略\pi。情形如下:基于状态 s_t ,遵循策略 \pi,产生行为 a_t,得到回报 R_{t+1} ,进入新的状态 s_{t+1},再次遵循策略 \pi ,产生行为 a_{t+1} 。评估策略 \pi 时对应的 TD 目标变为:

R_{t+1}+\gamma Q(s_{t+1},a_{t+1})

若是改用行为策略 \mu 来评估策略 \pi ,则需要给 R_{t+1}+\gamma Q(s_{t+1},a_{t+1}) 乘以一个重要性采样比率,对应的 TD 目标变为:

\frac{\pi(a_t|s_t)}{\mu(a_t|s_t)}(R_{t+1}+\gamma Q(s_{t+1},a_{t+1}))

离线策略 TD 方法策略评估对应的具体数学表示为:

Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha \left (\frac{\pi(a_t|s_t)}{\mu(a_t|s_t)}(R_{t+1}+\gamma Q(s_{t+1},a_{t+1}))-Q(s_t,a_t) \right )

这个公式可以这样解释:在状态 s_t 时,分别比较依据策略 \pi(a_t|s_t) 和当前策略 \mu(a_t|s_t) 产生行为 a_t 的概率大小,比值作为 TD 目标的权重,依次调整原来状态 s_t 的价值 Q(s_t,a_t) 。

应用这种思想表现最好的方法是 Q-learning 方法。Q-learning 方法的要点在于更新一个状态行为对的 Q 值,而是待评估策略(目标策略 \pi )产生的下一个状态行为对的 Q 值。

Q(S_t.A_t)\leftarrow Q(S_t,A_t)+\alpha (R_{t+1}+\gamma Q(S_{t+1},A^{'})-Q(S_t,A_t))

TD 目标 R_{t+1}+\gamma Q(S_t,A^{'}) 是基于目标策略 \pi 产生的行为 A^{'} 得到的 Q 值和一个立即回报的和。在 Q-learning 方法中,实际与环境交互时遵循的策略 \mu 是一个基于原始策略的 ε-贪心策略,它能保证经历足够丰富的新状态。而目标策略 \pi 是单纯的贪心策略,保证策略最终收敛到最佳策略。

接下来,对 Q-learning 方法的更新公式进行变换。因为 A^{'} 是基于目标策略 \pi 产生的行为,目标策略 \pi 是基于行为值函数的贪心策略,所以 A^{'} 可表示为:

\pi(S_{t+1})=arg\, \, \underset{a^{'}}{max}\, \, Q(S_{t+1},a^{'})

则 Q-learning 的 TD目标为:

R_{t+1}+\gamma Q(S_{t+1},A^{'})=R_{t+1}+\gamma Q(S_{t+1},arg\, \, \underset{a^{'}}{max}\, \, Q(S_{t+1},a^{'}))

=R_{t+1}+\underset{a^{'}}{max}\, \, \gamma \,Q(S_{t+1},a^{'})

可见,在状态 s_t 遵循 ε-贪心策略得到的 Q 值将朝最大价值的方向更新。同 Sarsa方法一样,Q-learning 在具体执行时,单个轨迹内,每进行一个时间步,也会基于这个时间步的数据对行为进行更新。其产生采样的策略是 ε-贪心策略,而评估改进的策略是贪心策略。

3,多步时序差分

3.1,基本原理

蒙特卡罗方法和时序差分方法之间存在一个关键的不同点:更新当前状态的值函数时,基于当前状态往未来看的距离不同。在蒙特卡罗算法中,这个距离是整个轨迹的长度,记为 N;而在一步时序差分方法中,这距离是 1(单位是时间步)。那么在 1\sim N 中,就有很多可以选择的距离 d ,使得 1\leqslant d \leqslant N 。通过利用这个不同距离,构造出了新的算法类型——多步时序差分法(资格迹法)。

多步时序差分法存在两种视角:

  • 一种是向前视角,向前看,即由当前状态出发向还未访问的状态观察设计的一种算法。前向视角也叫理论视角,它认为资格迹是连接时序差分和蒙特卡罗方法的桥梁。当 n=1 步,资格迹法退化为一步时序拆分法;当 n\geqslant N 步,资格迹法发展为蒙特卡罗法;当 1< n< N 步,则产生了一系列介于时序差分和蒙特卡罗两者中间的多步时序差分方法。可以采用不同的 n 值的线性组合来对参数进行更新,只要它们权重值和为 1 。
  • 另一种是向后视角,向后看,即由当前状态向已经访问过的状态观察设计的一种算法。资格迹是进行资格分配(信用分配)的方法,它是强化学习的一项基本机制。TD(\lambda ) 算法中的 \lambda 就是对资格迹的运用。几乎所有的 TD 算法,包括 Q-learning 方法、Searsa方法,都可以结合资格迹来提升效率。后向视角也叫工程视角,它认为资格迹是事件发生的临时记录,如访问某个状态或采取某个行动。它为轨迹中每个状态(或状态行为对)附加一个属性,这个属性决定了该状态(或状态行为对)与当前正访问的状态(或状态行为对)的值函数更新量之间的关联程度,或者说影响程度。当目标误差( TD 误差 )产生时,只有资格的状态行为才能被分配回报或者惩罚。

虽然两种算法的表达不一样,但在本质上是统一的。前向视角告诉我们资格迹在理论层面如何工作的;后向视角告诉我们资格迹在工程层面是如何实现的。实际中,因为前向算法计算量较大,一般采用后向算法实现。

3.2,多步TD评估

考虑使用蒙特卡罗算法来估计值函数 V(s_t) ,采用如下公式:

V(s_t)\leftarrow V(s_t)+\alpha \left ( G_t-V(s_t) \right )

其中,更新目标 G_t 为累计回报。

G_t=r_{t+1}+\gamma r_{t+2}+\gamma ^2r_{t+3}+...+\gamma ^{T-t+1}r_{T}

在用一步 TD 估计值函数 V(s_t) 时,它的更新目标为一步回报:

G_t^1=r_{t+1}+\gamma V(s_{t+1})

很容易知道,两步 TD 的更新目标为两步回报:

G_t^2=r_{t+1}+\gamma r_{t+2}++\gamma ^2V(s_{t+2}) 

于是,n 步 TD 的更新目标为 n 步回报:

G_t^n=r_{t+1}+\gamma r_{t+2}+...+\gamma^{n-1} r_{t+n}+\gamma^{n} V(s_{t+n})

可见,当 n 步中的 n 大于等于轨迹长度时,多步时序差分方法就变成了蒙特卡罗TD方法。所以,蒙特卡罗实际上是多步时序差分方法的一个特例。

其中,白色代表状态,黑色代表动作,灰色代表中止状态。

那么,使用 n 步 TD 方法估计值函数时的更新公式为:

V(s_t)\leftarrow V(s_t)+\alpha \left ( G_t^n -V(s_t)\right )

G_t^n=r_{t+1}+\gamma r_{t+2}+...+\gamma^{n-1} r_{t+n}+\gamma^{n} V(s_{t+n})

3.3,前向算法

既然存在 n 步时序差分法,那么 n 为多少时效果最好?一种最简单的方法就是通过平均多少个不同的 n 步回报进行更新,即给每个回报赋予一定的权值,并确保这些权值的和为 1。

比如,选择 2 步和 4 步 TD 算法相结合,在每次状态更新时,2 步算法的更新量占 \frac{1}{2} 权重,4 步算法的更新量占 \frac{1}{2} 权重,然后求加权和,将 \frac{1}{2}G_t^2+\frac{1}{2}G_t^4 ,作为最终更新量。

从向前视角看 TD(\lambda) 算法,其主要特点就是这种平均化操作的运用。唯一特别的是,TD(\lambda) 直接平均了所有的 n 步回报,每个回报的权重是 (1-\lambda)\lambda^{n-1} 。通过引入这个新的参数 \lambda ,综合考虑所有步数的回报,并保证了最终所有权重之和为 1 。

S=(1-\lambda)+(1-\lambda)\lambda+(1-\lambda)\lambda^2+...+(1-\lambda)^{n-1}

S=(1-\lambda)(1+\lambda+\lambda^2+...+\lambda^{n-1})

S=(1-\lambda)\frac{1*(1-\lambda^n)}{1-\lambda}=1-\lambda^n

\underset{n\rightarrow \infty }{lim}S=1

把通过这种平均方式得到的回报叫做 λ-回报,相应地,TD(\lambda) 前向算法也称为 λ-回报算法:

G_t^\lambda=(1-\lambda)\sum_{n=1}^{\infty }\lambda^{n-1}G_t^n

如果轨迹长度为 T ,则有:

G_t^\lambda=(1-\lambda)\sum_{n=1}^{T-t-1}\lambda^{n-1}G_t^n+\lambda^{T-t-1}G_t

值函数更新:

V(s_t)\leftarrow V(s_t)+\alpha (G_t^{\lambda}-V(s_t))

下图为 TD(\lambda) 方法的前向视角描述。对于每个访问到的状态 s_t ,从它开始向前看所有的未来状态 s_{t+1},s_{t+2},...,s_{T},并决定如何结合未来状态的回报来更新当前状态 s_t 的值函数 V(s_t) 。每次更新完当前状态 s ,就转移至下一个状态 s_{t+1} ,不再回头关心已更新的状态 s_t。可见,前向观点通过观察未来状态的回报估计当前状态的值函数

3.4,后向算法

利用 TD(\lambda) 的前向观点估计值函数时,每一个时间步都需要用到很多步之后的信息,这个在工程上很不高效。可以说,前向视角只提供了一个非常好但却无法直接实现的思路,这个跟蒙特卡罗方法类似。实际中,需要一种无须等到实验结束就可以更新当前状态的值函数的更新方法。

这种增量式的更新方法需要利用多步时序差分的后向观点。它采用一种带有明确因果性的递增机制来实现值函数更新,恰恰解决了更新低效的问题。

后向视角在实现过程中,引入了一个和每个状态都相关的额外变量——资格迹。例如,一只小狗在连续接受了3次拳击和1次电击后死亡,那么在分析小狗死亡原因时,到底是拳击的因素较重要还是电击的因素较重要呢?用资格迹表示就是哪个因素最有资格导致小狗死亡。

实际中进行资格分配时,有两种方式:一种是频率启发式,将资格分配给最频繁的状态,如拳击。另一种是最近启发式,将资格分配给最近的状态,如电击。

在 t 时刻的状态 s 对应的资格迹,标记为 E_t(s) :

E_0(s)=0

E_t(s)=\gamma \lambda E_{t-1}(s)+I(S_t=s)

初始时刻,每条轨迹中所有状态有一个初始资格迹 E_0(s)=0, 下一时刻,被访问到的状态,其资格迹为前一时刻该状态资格迹 E_{t-1}(s) 乘以迹退化参数 \lambda 和衰减因子 \gamma,然后加1,表示当前时刻该状态的资格迹变大。其他未被访问的状态,其资格迹都只是在原有基础上乘以 \lambda 和 \gamma ,不用加 1,表明它们的资格迹退化了。这种更新方式的资格迹为“累计型资格迹”。它在状态被访问的时候累计,不被访问的时候退化。 

例如,假设小狗死亡一共涉及两个状态:拳击和电击,分别用 s_1,s_2 表示。\lambda = 0.9,\gamma =0.8。初始时,令所有的状态资格迹都为 0。

  • 初始时刻,有:E_0(s_1)=E_0(s_2)=0
  • 当 t=1 时,有:\left\{\begin{matrix} E_1(s_1)=\lambda \gamma E_0(s_1)+1=1\\ E_1(s_2)=\lambda \gamma E_0(s_2)=0 \end{matrix}\right.
  • 当 t=2 时,有:\left\{\begin{matrix} E_2(s_1)=\lambda \gamma E_1(s_1)+1=0.9*0.8*1+1=1.72\\ E_2(s_2)=\lambda \gamma E_1(s_2)=0 \end{matrix}\right.
  • 当 t=3 时,有:\left\{\begin{matrix} E_3(s_1)=\lambda \gamma E_2(s_1)+1=0.8*0.9*1.72+1=2.24\\ E_3(s_2)=\lambda \gamma E_2(s_2)=0 \end{matrix}\right.
  • 当 t=4 时,有:\left\{\begin{matrix} E_4(s_1)=\lambda \gamma E_3(s_1)=2.24*0.8*0.9=1.61\\ E_4(s_2)=\lambda \gamma E_3(s_2)+1=1 \end{matrix}\right.

因此在推断小狗的致死原因时,拳击所占的比重更大一些。同时,从计算拳击和电击两个状态的资格迹的过程课件,资格迹定义同时结合了频率启发式和最近启发式。其中:\lambda \gamma E_{t-1}(s) 代表频率启发式,指示函数 I(s_t=s) 代表最近启发式。

可用资格迹 E_t(s) 来分配各值函数更新的资格,也就是说可用使用资格迹来衡量当 TD 误差发生时,各状态的值函数更新会受到多大程度的影响。

TD 误差公式如下:

\delta_t=R_{t+1}+\gamma V_t(S_{t+1})-V_t(S_t)

结合资格迹更新状态价值,则有:

V(s)\leftarrow V(s)+\alpha \delta _tE_t(s)

这就是多步时序差分后向算法的值函数更新公式。

每次当前状态获得一个误差量 \delta_t 时,这个误差量都会根据之前各状态的资格迹来分配误差,进行值函数更新。此时之前各状态值函数更新的大小应该与距离当前访问状态的时间步相关。假设当前状态为 s_tTD 偏差为 \delta _t,那么 s_{t-1} 处的值函数更新资格乘以 \lambda \gamma ,状态 s_{t-2} 处的值函数更新乘以 (\lambda \gamma)^2 ,依次类推。

上面的后向算法使用的资格迹是累计型资格迹,强化学习领域还有另一种资格迹也被广泛使用,即替代资格迹。当状态被访问时,相应的资格迹被置为 1,不管以前的资格迹如何,新迹代替了旧迹,表示如下:

E_t(S)=\left\{\begin{matrix} \gamma \lambda E_{t-1}(s) &s_t \ne s \\ 1 &s_t=s \end{matrix}\right.

可见,累计型资格迹对重复发生的事件赋予了较大的信度。当某个状态被频繁访问的时候,累计型资格迹会不断爬升,数值不断增加。而替代型资格迹则会一直保持 1 不变。这种区别使得替代型资格迹在某些任务中的效果优于累计型资格迹。比如迷宫游戏中仅存在三种格1子:陷阱、宝藏和无状态格子。进入陷阱会返回上一格子中,找到宝藏回报加 1,其余格子无回报。在一个轨迹中,假设智能体在找到宝藏之前,多次进入某个陷阱,在这种情况下,陷阱的资格迹可能比旁边未被访问的无状态格子大。最终,陷阱的值函数可能比旁边无状态区的大。这样的话,在一个轨迹中,智能体可能倾向于进入值函数较大的这个陷阱中。

3.5,前向算法和后向算法统一

前向算法和后向算法在更新时所采用的方式不同。前向算法需要等到一次试验结束后再更新当前状态的值函数,更新完当前状态的值函数后,此状态的值函数就不再改变。而后向观点不需要等到轨迹结束,在每个时间步计算完当前状态的 TD 误差后,其他状态的值函数需要利用当前状态的 TD 误差进行更新,是增量式更新方法。虽然前向算法和后向算法值函数更新方式不同,但两者本质上是一回事,在两种视角下,同一条轨迹中状态值函数的更新总量相同。

对于前向算法的一个长度为 T 的轨迹来说,有:

G_t^{\lambda}=(1-\lambda )\sum_{n=1}^{T-t-1}\lambda^{n-1}G_t^n+\lambda^{T-t-1}G_t

值函数更新公式如下:

V(s_t)\leftarrow V(s_t)+\alpha (G_t^{\lambda}-V(s_t))

  • 当 \lambda =1 时,根据上式,除了 G_t 的权重为 1,其他回报的权重均为 0 。G_t^{\lambda}=G_tG_t 指的是从当前状态开始,一直到轨迹结束的累计回报,则 TD(\lambda) 算法变为蒙特卡罗方法。
  • 当 \lambda = 0 时,除了 G_t^1 的权重为 1(因 G_t^1 的权重为 1-\lambda ) ,其他回报的权重均为 0G_t^{\lambda}=G_t^{1}TD(\lambda) 算法变成了 1-step\, \, TD 也就是 TD(0) 。

后向算法的更新公式:

E_0(s)=0

E_t(s)=\gamma \lambda E_{t-1}(s)+I(S_t=s)

TD 误差公式如下:

\delta_t=R_{t+1}+\gamma V_t(S_{t+1})-V_t(S_t)

结合资格迹更新状态价值,则有:

V(s)\leftarrow V(s)+\alpha \delta _tE_t(s)

  • 当 \lambda = 0 时,TD(\lambda) 退化成 TD(0) ,除了当前状态,其他所有状态的资格迹为 0。这时候,当前状态的 TD 误差不会传递给其他状态,只用于当前状态值函数更新。此时前后向算法本质相同。
  • 当 \lambda = 1 时,当 \gamma 不等于 1 时,其他状态的资格迹依照 \gamma ^kk 为距离当前状态的时间步)逐步递减;如果 \gamma 等于 1,那么所有状态的资格迹不再递减。把 \lambda=1 时的 TD 算法叫做 TD(1) 。

后向算法中,TD(1) 的更新总量:

\triangledown V^{TD1}(S_t)=\delta _t+\gamma \delta _{t+1}+\gamma ^2 \delta _{t+2}+...+\gamma ^{T-t-1}\delta _{T-1}

=R_{t+1}+\gamma V(S_{t+1})-V(S_t)+\gamma R_{t+2}+\gamma ^ 2V(S_{t+2})-\gamma V(S_{t+1})+\gamma ^2 R_{t+3}+\gamma ^ 3V(S_{t+3})-\gamma ^2 V(S_{t+2})+\gamma ^{T-t-1} R_{T}+\gamma ^ {T-t}V(S_{T})-\gamma ^{T-t-1} V(S_{T-1})

=R_{t+1}+\gamma R_{t+2}+...+\gamma ^{T-t-1} R_{T}+\gamma^{T-t} V(S_T)-V(S_t)

=R_{t+1}+\gamma R_{t+2}+...+\gamma ^{T-t-1} R_{T}-V(S_t)

其中,V(S_T)=0 表示终止状态的值函数为 0。

前向算法中TD(1) 的更新总量:

\triangledown V^{MC}(S_t)=G_t-V(S_t)=R_{t+1}+\gamma R_{t+2}+...+\gamma ^{T-t-1}R_T-V(S_t)

则, 前后向算法在 \lambda =1 时,等价。但是,尽管两者更新总量相同,但两者适用范围不同。传统蒙特卡罗(MC)需要完整的轨迹,可即时地从正在进行的轨迹中学习,因此 TD(1) 不但适用于片段式任务,也适用于连续性任务。

对于一般的 \lambda ,0<\lambda <1

\triangledown V^{fore}(S_t)=G_t^{\lambda}-V(S_t)

=-V(S_t)+(1-\lambda)\sum_{n=1}^{\infty }\lambda^{n-1}G_t^n

=-V(S_t)+(1-\lambda)\sum_{n=1}^{\infty }\lambda^{n-1}\left ( R_{t+1}+\gamma R_{t+2}+...+\gamma^{n-1} R_{t+n}+\gamma^{n} V(S_{t+n}) \right )

=-V(S_t)+(1-\lambda)\lambda^0[R_{t+1}+\gamma V(S_{t+1})]+(1-\lambda)\lambda^{1}[R_{t+1}+\gamma R_{t+2}+\gamma ^2 V(S_{t+2})]+(1-\lambda)\lambda^2 [R_{t+1}+\gamma R_{t+2}+\gamma ^2R_{t+3}+\gamma ^3 V(S_{t+3})]+...

=(\gamma \lambda)^0[R_{t+1}+\gamma V(S_{t+1})-\gamma \lambda V(S_t)]+(\gamma \lambda)^1[R_{t+2}+\gamma V(S_{t+2})-\gamma \lambda V(S_{t+1})]+(\gamma \lambda)^2[R_{t+3}+\gamma V(S_{t+3})-\gamma \lambda V(S_{t+2})]+...

=\delta _t+\gamma \lambda \delta _{t+1}+(\gamma \lambda)^2 \delta _{t+2}+...+(\gamma \lambda)^{T-1-t}\delta _{T-1}=\triangledown V^{back}(S_t)

最终求得前向算法更新总量恰好等于后向算法的更新总量,因此这两种视角在本质上是相同的。上面证明过程设定 TD(\lambda) 为离线更新,即轨迹完成之后,对所有的数据进行累加更新。相应地,在线更新指的是每一步一有数据就立即之心更新,实际上对于在线更新的情况,上面证明近似成立。

3.6,Sarsa(λ) 方法

Sarsa(\lambda ) 是把资格迹思想和 Sarsa 算法结合,与 TD(\lambda ) 相比,需要做出变化的是不再去学习 V_t(s) ,而是去学习 Q_t(s,a) 。同样的,Sarsa(\lambda ) 也分为前向和后向 Sarsa(\lambda ) 。

Sarsa(\lambda ) 的前向视图,其主要思想同 TD(\lambda ) 一样,是通过给每个回报赋予权值 (1-\lambda )\lambda ^{n-1} 来平均多个不同的 Q-回报进行更新。这里的 Q-回报,相对于累计回报 G ,指的是状态行为对 (s,a) 从 t 时刻开始往后所有的回报的有衰减的总和。

其中,n-step\, \, \, Sarsa 的 Q-回报为:

Q_t^n=r_{t+1}+\gamma r_{t+2}+...+\gamma^{n-1}r_{t+n}+\gamma^nQ(s_{t+n},a_{t+n})

对 Q-回报加权求和得到 Q 的 \lambda 回报 Q_t^{\lambda} :

Q_t^{\lambda}=(1-\lambda)\sum_{n=1}^{\infty }\lambda^{n-1}Q_t^{(n)}

结合 Sarsa 的更新公式,得到 Sarsa(\lambda) 的更新公式为:

Q(S_t,A_t)\leftarrow Q(S_t,A_t)+\alpha (Q_t^{\lambda}-Q(S_t,A_t))

同普通 TD(\lambda) 前向算法一样,前向 Sarsa(\lambda) 估计值函数时,需要用到很多步以后的 Q-回报,这在工程应用中很不高效,因此在实际中用得比较多的还是增量更新的后向算法。

后向Sarsa(\lambda ) 算法通过引入资格迹,将当前行为值函数误差按比例抛给其他状态行为值函数,作为其更新的依据。不同的是,资格迹不再是 E_t(s) ,而是 E_t(s,a) ,即针对每一个状态行为对都有一个资格迹,公式如下:

E_0(s,a)=0

E_t(s,a)=\gamma \lambda E_{t-1}(s,a)+I(S_t=s,A_t=a)

其他的部分和后向 TD(\lambda) 一模一样。Q_t(s,a) 的更新公式如下:

Q_{t+1}(s,a)\leftarrow Q_{t+1}(s,a)+\alpha \delta _tE_t(s,a)

其中,\delta _t=R_{t+1}+\gamma Q(s_{t+1},a_{t+1})-Q(s_t,a_t)

Sarsa(\lambda ) 是在线策略算法,也就是采用的策略和平鸽改进策略是同一个策略。对于在线策略算法,策略的更新方式有很多,最简单的就是依据当前的行为值函数估计值采用 ε-贪心算法进行更新。

Sarsa(\lambda ) 后向算法为单个轨迹内,每进行一个时间步,都会基于这个时间步的数据对行为值函数进行更新,产生采样的策略和评估改进的策略都是 ε-贪心策略。

3.7,Q(λ) 方法

前向 Watkins's Q(λ)方法:常规的Q-learning 方法属于离线策略算法,即产生采样的策略(行为策略)和评估的策略(目标策略)不是同一个策略。也就是说:Q-learning 方法需要依据带有 ε-贪心行为 的轨迹来学习一个贪心策略。

在进行行为值函数估计的时候,Q-learning 采用的更新公式如下:

Q(s,a)\leftarrow Q(s,a)+\alpha (R+\gamma \, \, \underset{a^{'}}{max}\, \,Q(s^{'},a^{'})-Q(s,a))

对应的更新目标为:

Q_t=R+\gamma \, \, \underset{a^{'}}{max}\, \,Q(s^{'},a^{'})

Q-learning 实现多步:假设正在求解贪心策略在状态行为对 (s_t,a_t) 的行为值函数,前两个时间步选择的行为是贪婪行为,但是第三个时间步选择的行为是探索行为,那么 Watkins's Q(λ) 使用有效轨迹长度,最长就到第二个时间步,从第三个时间步往后的序列都不再理会。也就是说 Watkins's Q(λ) 使用的有效轨迹长度最远到达第一个探索行为对应的时间步长。因为 Q(\lambda) 要学习的是贪心策略,而第三步采用的是探索行为,因此当 n\geqslant 3 的 n 步回报已经和贪心策略没有联系了。

通过把当前选择的行为和当前的 arg\, \, \underset{a^{'}}{max}Q(s^{'},a^{'}) 对比,如果一致就是贪婪行为,不一致就是探索行为。

因此,不同于 TD(\lambda) 或者 Sarsa(\lambda) ,Watkins's Q(λ) 所用使用的有效轨迹长度不是整个轨迹从开始到结束,它只考虑最近的探索行为,一旦探索行为发生,则轨迹结束。

假设求解状态行为对 (s_t,a_t) 在贪心策略下的行为值函数时,a_{t+n} 是第一个探索行为,轨迹以 s_{t+n} 为最后一个状态,则最长的 n 步 Q-回报为:

Q_t^n=r_{t+1}+\gamma r_{t+2}+...+\gamma^{n-1}r_{t+n}+\gamma ^n\, \underset{a}{max}\, Q(s_{t+n},a)

可见,Watkins's Q(λ) 方法所使用的有效轨迹的长度取决于第一个探索行为。如果第一个探索行为在轨迹结束前出现,则该方法有效轨迹长度最远到达此探索行为对应的时间步,否则有效轨迹长度等于整个轨迹长度。

对 Q-回报加权求和得到 Q 的 λ-回报 Q_t^{\lambda} :

Q_t^{\lambda}=(1-\lambda)\sum_{n=1}^{\infty }\lambda ^{n-1}Q_t^{(n)}

Watkins's Q(λ) 更新公式为:

Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha \left ( Q_t^{\lambda}-Q(s_t,a_t) \right )

后向 Watkins's Q(λ)方法:对于所有状态行为对 (s,a) 的资格迹,更新分为两部分:首先,如果当前选择行为 a_t 是贪婪行为,资格迹乘以系数 \gamma \lambda,否则资格迹变为 0;其次,对于当前正在访问的 (s_t,a_t) ,其资格迹单独加 1 。资格迹公式如下:

E_t(s,a)=I_{ss_t}\cdot I_{aa_t}+\left\{\begin{matrix} \gamma \lambda E_{t-1}(s,a) & Q_{t-1}(s_t,a_t)=\underset{a}{max}\,Q_{t-1}(s_t,a) \\ 0 &other \end{matrix}\right.

其中,I_{ss_t},I_{aa_t} 为指示函数。I_{ss_t} 表示当 s=s_t 时,其值为 1 。

假设当前正在访问的状态行为对为 (s_t,a_t) ,其中 a_t 是探索行动,状态行为对 (s,a) 的资格迹为:E_t(s,a)=0+0=0 。与此同时,当前正在访问的状态行为对 (s_t,a_t) 的资格迹 E_t(s_t,a_t)=1+0=1 。

Q(s,a) 更新公式如下:Q_{t+1}(s,a)=Q_t(s,a)+\alpha \delta _tE_t(s,a)

\delta _t 计算公式如下:\delta _t=r_{t+1}+\gamma \, \underset{a^{'}}{max} \, Q_t(s_{t+1},a^{'})-Q_t(s_t,a_t)

只有贪婪行为才能影响状态行为对 (s_t,a_t) 的行为值函数 Q(s_t,a_t) 的更新。因为当探索行为发生时,如 (s_{t+n},a_{t+n}) ,当前状态行为对 (s_t,a_t) 的资格迹会变为 0 。所以从探索行为时间步处传递过来的误差量 \delta _{t+n} 不会影响 Q(s_t,a_t) 。

Peng‘s Q(λ)方法:Watkins's Q(λ)方法有个很大的缺点,每次只考虑一段轨迹中探索行为之前的部分,这样会浪费大量后面的轨迹信息。如果有很多探索行为发生在轨迹的早期,那么每段估计的有效信息就只有一两个时间步。

Peng‘s Q(λ) 算法可以看作既有在线部分又有离线策略部分的混合型 Q(\lambda ) 算法。从Peng‘s Q(λ)方法的前向视角可以看到,在每个备份过程中(除了最长的完整轨迹),前面的状态转移过程属于实际经验,都是依据某个随机的探索策略采样得到;最后一个行为的选择,则是依据贪婪行为,即根据 \underset{a}{max}\, Q(s,a) 来选择最优行为。这么看的话,每个备份过程都是既有在线策略乘法(前面部分 Q 的更新基于当前的策略),又有离线策略部分(最终的行为选择基于贪心策略)。

然而 Peng‘s Q(λ)方法 也有两个缺点:(1)代码实现起来不容易;(2)在理论上不能保证收敛到最优行为值函数 Q(s,a) 。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燕双嘤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值