给定一个马尔科夫决策过程(MDP) < S , A , P , R , γ > <\mathcal S,\mathcal A,\mathcal P,\mathcal R,\gamma> <S,A,P,R,γ>,根据状态转移概率 P \mathcal P P是否已知,强化学习可分为基于模型(Model-based)和无模型(Model-free)的两种学习方法。而动态规划是基于模型的强化学习方法,分为策略迭代(policy iteration)和价值迭代(value iteration)两种。
策略迭代包括策略评估和策略改进。
策略评估的目的是给定一个策略 π \pi π,计算出每个状态在该策略下的价值函数,即评估每个状态的好坏。
我们首先给出当前状态 s ∈ S s\in \mathcal S s∈S的价值函数与后继状态 s ′ s^\prime s′的价值函数之间的关系:
v π ( s ) = ∑ a π ( a ∣ s ) ( ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] ) (1) v_\pi(s)=\sum_{a}\pi(a|s) \left (\sum_{s^\prime,r} p(s^\prime,r|s,a)[r+\gamma v_\pi(s^\prime)] \right) \tag{1} vπ(s)=a∑π(a∣s)⎝⎛s′,r∑p(s′,r∣s,a)[r+γvπ(s′)]⎠⎞(1)
其中, π ( a ∣ s ) \pi(a|s) π(a∣s)为待评估的策略,是已知的。奖励 r ∈ R r\in \mathcal R r∈R,折扣因子 γ \gamma γ,转移概率 p ( s ′ , r ∣ s , a ) p(s^\prime, r|s,a) p(s′,r∣s,a)也是已知的。因此方程(1)中唯一的未知数是状态价值函数 v π ( s ′ ) v_\pi(s^\prime) vπ(s′),且有 ∣ S ∣ |\mathcal S| ∣S∣个未知数和 ∣ S ∣ |\mathcal S| ∣S∣个等式的线性方程组。理论上,该方程可以被直接解出来,但计算过程较复杂,因此我们采用迭代的方式来解决此问题,这里选择高斯-赛德尔迭代法:
v k + 1 ( s ) = ∑ a ∈ A π ( a ∣ s ) ( ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v k ( s ′ ) ] ) (2) v_{k+1}(s)=\sum_{a\in \mathcal A}\pi(a|s) \left (\sum_{s^\prime,r} p(s^\prime,r|s,a)[r+\gamma v_k(s^\prime)] \right) \tag{2} vk+1(s)=a∈A∑π(a∣s)⎝⎛s′,r∑p(s′,r∣s,a)[r+γvk(s′)]⎠⎞(2)
其中下标 k k k为迭代次数,给定方程一个初始解,例如 ( 0 , 0 , . . . , 0 ) (0,0,...,0) (0,0,...,0),通过迭代直到收敛到一个最优解。
以下为策略评估的伪代码:
\rule[0pt]{17.8cm}{0.2em} 输入待评估的策略 π \pi π,设置一个决定评估精度的 θ > 0 \theta > 0 θ>0,初始化非终止状态 s ∈ S + s\in \mathcal S^+ s∈S+的价值 V ( s ) V(s) V(s),而终止状态的价值 V ( t e r m i n a l ) = 0 V(terminal)=0 V(terminal)=0
Loop: \text{Loop:} Loop:
Δ ← 0 \Delta \leftarrow 0 Δ←0
Loop for each s ∈ S : \text{Loop for each }\ s\in S: Loop for each s∈S:
v ← V ( s ) v\leftarrow V(s) v←V(s)
V ( s ) ← ∑ a π ( a ∣ s ) ( ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ V ( s ′ ) ] ) V(s) \leftarrow \sum_a \pi(a|s) \left (\sum_{s^\prime,r}p(s^\prime,r|s,a)[r+\gamma V(s^\prime)] \right) V(s)←∑aπ(a∣s)(∑s′,rp(s′,r∣s,a)[r+γV(s′)])
Δ ← max ( Δ , ∣ v − V ( s ) ∣ ) \Delta \leftarrow \max(\Delta,|v-V(s)|) Δ←max(Δ,∣v−V(s)∣)
Until Δ < θ \text{Until}\ \Delta < \theta Until Δ<θ
\rule[0pt]{17.8cm}{0.2em}
\\[30pt]
注意,每个动作会导致状态转移,但当动作会导致智能体移出网格时,状态保持不变。假定我们需要评估的策略为均等的随机策略,即:
π ( up ∣ s ) = π ( down ∣ s ) = π ( left ∣ s ) = π ( right ∣ s ) = 0.25 , ∀ s ∈ S \pi(\text{up}|s)=\pi(\text{down}|s)=\pi(\text{left}|s)=\pi(\text{right}|s)=0.25, \ \forall s\in \mathcal S π(up∣s)=π(down∣s)=π(left∣s)=π(right∣s)=0.25, ∀s∈S
下图为迭代过程中14个状态的价值函数变化过程,我们可以看出当k=3时,已经达到了optimal policy。
根据公式(2),我们计算k=2时,状态4的价值函数:
v 2 ( 4 ) = 0.25 × ( − 1 + 0 ) + 0.25 × ( − 1 − 1 ) + 0.25 × ( − 1 − 1 ) + 0.25 × ( − 1 − 1 ) = − 1.75 v_2(4)=0.25 \times (-1+0) + 0.25 \times (-1-1) + 0.25 \times (-1-1) + 0.25 \times (-1-1)=-1.75 v2(4)=0.25×(−1+0)+0.25×(−1−1)+0.25×(−1−1)+0.25×(−1−1)=−1.75
保留两位有效数字便是-1.7。
计算一个给定策略下的价值函数的目的是为了找出更好的策略。假定对于给定的一个策略,我们已经计算出在该策略下所有状态的价值函数 v π ( s ) , s ∈ S v_\pi(s), s\in S vπ(s),s∈S。对于某个状态 s s s,我们想知道是否应该选择一个不同于给定的策略的动作 a ≠ π ( s ) a\neq \pi(s) a=π(s)。一个很自然的方法是当已知当前策略下的价值函数时,在每个状态处采用贪婪策略对当前策略进行改进,即
π l + 1 ( s ) = arg max a q π l ( s , a ) = arg max a ( ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] ) (3) \pi_{l+1}(s)=\argmax\limits_a q_{\pi_l}(s,a)=\argmax\limits_a \left (\sum_{s^\prime,r} p(s^\prime,r|s,a)[r+\gamma v_\pi(s^\prime)] \right) \tag{3} πl+1(s)=aargmaxqπl(s,a)=aargmax⎝⎛s′,r∑p(s′,r∣s,a)[r+γvπ(s′)]⎠⎞(3)
假定在策略评估阶段我们迭代10次(k=10)来计算策略 π 0 \pi_0 π0下所有状态的价值函数,随后进行策略改进。下图为k=10时的价值函数以及对应的贪婪策略,我们以状态4和5为例来说明怎样做策略改进:
策略迭代包括策略评估和策略改进两个步骤。在策略评估中,对于给定的一个策略,通过迭代法计算得到该策略下所有状态的价值函数;然后在策略改进中利用该价值函数和贪婪策略得到新的策略。如此循环下去,最终得到最优策略。下面为策略迭代的流程。
\rule[0pt]{17.8cm}{0.2em}
\rule[0pt]{17.8cm}{0.2em}
\\[30pt]
从策略迭代的流程来看,进行策略改进之前要得到价值函数的收敛,而价值函数的收敛需要迭代多次,那么问题来了,在进行策略改进之前我们是否需要等到价值函数的收敛呢?回答是肯定的。如果我们在评估一次策略之后就进行策略改进,这种方法称为价值迭代(value iteration)。
\rule[0pt]{17.8cm}{0.2em} 初始化
对 s ∈ S s\in S s∈S,任意设定 V ( s ) ∈ R V(s)\in \Bbb R V(s)∈R,一个决定估计精度的 θ > 0 \theta >0 θ>0
Loop : \text{Loop}: Loop:
Δ ← 0 \Delta \leftarrow 0 Δ←0
Loop for each s ∈ S : \text{Loop for each}\ s\in S: Loop for each s∈S:
v ← V ( s ) v \leftarrow V(s) v←V(s)
V ( s ) ← max a ( ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ V ( s ′ ) ] ) V(s) \leftarrow \max\limits_a \left(\sum_{s^\prime,r}p(s^\prime,r|s,a)[r+\gamma V(s^\prime)] \right) V(s)←amax(∑s′,rp(s′,r∣s,a)[r+γV(s′)])
Δ = max ( Δ , ∣ v − V ( s ) ∣ ) \Delta= \max(\Delta,|v-V(s)|) Δ=max(Δ,∣v−V(s)∣)
Until Δ ← θ \text{Until}\ \Delta \leftarrow \theta Until Δ←θ
输出 π ( s ) = arg max a ( ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ V ( s ′ ) ] ) \pi(s)=\argmax\limits_a \left(\sum_{s^\prime,r}p(s^\prime,r|s,a)[r+\gamma V(s^\prime)] \right) π(s)=aargmax(∑s′,rp(s′,r∣s,a)[r+γV(s′)])
\rule[0pt]{17.8cm}{0.2em}
\\[30pt]
下面的代码是解决以下寻宝问题,其中红色圆圈为智能体,黑色方框为陷阱,箱子为宝藏。
策略迭代和价值迭代的python代码
参考资料:
(1)Richard S. Sutton and Andrew G. Barto著, 俞凯译《强化学习》第二版
(2)张斯俊. 欢迎大家入坑Reinforcment Learning【知乎】
(3)郭宪, 方勇纯. 《深入浅出强化学习:原理入门》