动态规划
概述
上次我们讲到了动态规划可以用来计算 v π ( s ) , q π ( s , a ) v_\pi(s),q_\pi(s,a) vπ(s),qπ(s,a),用来评估一个策略的好坏。另外,该算法也包括了优化策略这一目标。动态规划是使用状态价值函数来结构化地搜索最优策略(有些的算法是使用策略价值函数来搜索的)。
以下的文章没有详细的数学证明过程
计算 v π ( s ) v_\pi(s) vπ(s)
1.随机初始化所有状态的价值函数,终止状态必须为0(为了保证收敛)。
2.多轮更新,每一轮更新所有的状态的价值函数。
3.每一轮更新过程如下:
v k + 1 ( s ) = ∑ a ∈ A π ( a ∣ s ) ( R s a + γ ∑ s ′ ∈ S P s s ′ π v k ( s ′ ) ) v_{k+1}(s)=\sum_{a \in A}\pi(a|s)\big(R_s^a+ \gamma \sum_{s' \in S}P_{ss'}^\pi v_k(s')\big) vk+1(s)=∑a∈Aπ(a∣s)(Rsa+γ∑s′∈SPss′πvk(s′))
reinforcement learning 2 书上的公式可能与我的不相同,但其实是等价的
4.为了防止无法收敛,检查更新后的价值函数是否足够逼近。这里我们用到了一些极限的思想。取一个很小的正数 θ \theta θ,如果对于所有的状态 ∣ v k + 1 ( s ) − v k ( s ) ∣ < θ |v_{k+1}(s)-v_{k}(s)|< \theta ∣vk+1(s)−vk(s)∣<θ,那么我们就认为足够逼近,否则继续更新。
没有严谨的证明,但是大伙都能感受出来正确性
更新策略
我们已经可以算出任意策略的 v π ( s ) v_\pi(s) vπ(s),那么如何以此来更新策略呢?
我们先考虑进更新一个状态的策略,且假设更新的策略是贪心策略。其余状态下的策略和之前一样。
假设我们要更新s的策略。根据已知的 v π ( s ′ ) v_\pi(s') vπ(s′)算出所有的 q π ( s , a ) q_\pi(s,a) qπ(s,a)的大小。拿出最大的动作(贪心最优动作,假设为一个。就算是多个也很好拓展) q ∗ ( s , a ) = m a x a ∈ A q π ( s , a ) q_*(s,a) = max_{a \in A} q_\pi(s,a) q∗(s,a)=maxa∈Aqπ(s,a),将状态s的策略定为选择动作a。
这样我们就更新了一次策略,那么我们应当如何证明新的策略更好呢?显然更好,由于对于状态s,我们采取了最优的动作,那么 v ( s ) v(s) v(s)会更高。对于其余的状态,由于是根据下一个状态算的,要么不变(下一个状态不是s),要么变大(如果下一个状态是s的话)。所以新的策略会更好。
既然更新一步策略会更好,那么依次递推,我们可以对所有的状态都采取这种更新方式,就可以获得一个更好的策略。
然后我们再对新的策略计算 v π ′ ( s ) v_{\pi'}(s) vπ′(s),再重复更新策略即可。
更新终止
如果更新后的策略所有的 v ( s ) v(s) v(s)都和原来一样,那么就停止更新
提前截至
我们原本的思路为:经过多次的迭代,计算获得 v π ( s ) v_\pi(s) vπ(s)的近似值。根据 v π ( s ) v_\pi(s) vπ(s)的值更新策略。
然而计算
v
π
(
s
)
v_\pi(s)
vπ(s)的值开销极大,我们是否可以不必计算的特别精确,仅仅迭代有限次之后便进行策略的更新呢?
答案是完全可以,有些问题甚至可以仅仅迭代一次便更新策略。
广义动态规划
让我们对思路再做一次更新。这次我们更加激进。
原思路可以分成两部分:策略评估和策略更新。每次策略更新前我们都要进行策略评估,即使有时仅评估一轮。现在不妨做如下改进:
1.两者交织进行,不必在评估完成后在进行更新,而是一边更新一边评估。最极端的情况就是:仅更新一个状态的策略,随后仅评估与该状态相邻状态的价值。通俗点来说,不论我们什么时候评估,什么时候更新,更新多少,评估多少。只要我们确保最优策略存在,在两者交织进行的情况下,我们一定可以得到最优策略。
2.异步动态规划:选择特殊的状态进行策略更新和评估。“特殊”的意思是:起主要作用的状态。
对特殊状态进行一次更新往往要比对无关紧要的状态进行多次更新效果更好。