强化学习Chapter4——两个基本优化算法(1)
强化学习Chapter4——两个基本优化算法(1)
上一节导出了状态价值函数的贝尔曼方程以及最优状态价值函数:
之前也讲到,强化学习的优化目标,是得到最优策略 \(\pi^*\) 与相应的最优的状态价值 \(V^*(s)\)。结合贝尔曼方程的递归形式,其实容易看出,在给定策略 \(\pi\) 的前提下,可以通过一种类似动归的迭代方法,逼近最优解。本节将依据此思路,介绍两个求解 \(V^*\) 以及 \(\pi^*\) 的基本优化方法——策略迭代算法(policy iteration)、价值迭代算法(value iteration)。
O、introduction
根据贝尔曼方程能够导出类似动态规划的迭代方程,因而可以利用动态规划方法来求最优解。然而,在动规视角下,除了自变量外,都应当是确定量,这意味着状态转移函数 \(s_{t+1}=f(s_t,a)\) 和奖励函数 \(r_t=R(s_t,a_t)\) 均已知。换句话说,局部的状态迁移所有信息透明。当然这种特点也是该类算法的局限之处,在现实世界中的问题往往没有这么明确的信息。但是,其算法思想依然是理解后续其他强化学习算法的关键所在。
一、策略迭代算法(policy iteration)
策略迭代算法利用了状态价值函数 \(V^\pi(x)\) 的贝尔曼方程。尽管方程是状态价值的迭代,但本算法的核心却是策略的不断迭代调优:
- 假设一个初始策略 \(\pi^0\)。
- 通过贝尔曼方程,生成关于当前策略的评估。
- 依据评估结果,优化当前策略。
- 由此迭代,直至策略无法提升。
简单来讲,策略迭代算法包含俩个步骤:策略评估(policy evaluation)、策略提升(或策略调优,policy improvement)。
1、策略评估(policy evaluation)
评估结果是用于调优策略的,那么如何衡量一个策略的优劣呢?自然要谈到期望回报 Return,而要衡量 Return 自然要涉及 \(V^\pi\) 或 \(Q^\pi\) 的计算。因而我们期望可以计算获得 \(V^\pi\) 或者其估计值,成为衡量策略 \(\pi\) 的指标。
关键在于如何利用贝尔曼方程,得出较为准确的 \(V^\pi\) 估计。事实上,可以赋予 \(V^\pi\) 一个初始化值(譬如初始化为0,即 \(V^\pi_0(s)=0, \forall\ s\)),并利用贝尔曼方程进行时间步上的逐步迭代,将状态价值函数 \(V_k^\pi(s)\) 得最终收敛值 \(V^\pi\) 作为评价策略的指标
上述思路基于以下可几个可证的事实:
- 迭代贝尔曼方程,策略价值函数能够收敛,即\(\lim_{k\to \infty}V_k^\pi(s)=V^\pi\)
- \(V^\pi\) 相对于策略的优劣成单调关系
在实际应用中,往往迭代到 \(||V_k^\pi(s)-V_{k+1}^\pi(s)|| < \epsilon\) 就可以终止了。于是,针对一个固定的策略 \(\pi\),我们能通过迭代的方式解出贝尔曼方程的解 \(V^\pi\),从而能够将该价值函数作为标准,调优策略 \(\pi\).
2、策略提升(policy improvement)
由最初的思路可知,策略提升的任务是优化策略 \(\pi^k\) ,使得 \(k\rightarrow \infty\) 时,\(\pi^k\rightarrow \pi^*\)。下面给出关于策略优劣更准确的解释:
策略优劣定义:如果策略 \(\pi'\) 优于 \(\pi\),当前仅当对所有状态 \(s\),按照策略 \(\pi'\) 得到的动作都会使 \(V^\pi(s)\) 不减,即 \(Q^\pi(s,\pi'(s))>V^{\pi}(s)\). 从而有:
上述公式表明,只需要使新策略 \(\pi'\) 贪心地选择价值更高的动作,保证 \(Q^\pi(s,\pi'(s)) \ge V^\pi(s)\) ,可以保证 \(V^\pi\) 的单调性。具体而言,策略提升阶段,需要遍历每一个状态,贪心地使新策略选择即时价值最高的动作,就能得到一个不劣于原策略的新策略。同时由于 \(V^\pi\) 有界是显然的,所以根据单调有界定理,\(\{V^{\pi^k}\}\) 收敛,但是问题在于,是否收敛到 \(V^*\) ?答案是肯定的。
二、伪代码
def policy_eval(policy):
"""策略评估"""
while delta > theta:
delta = 0
for s in S:
v = copy(V) # 暂存旧的 V
V(s) = r(s, policy(s)) + gamma * E(s_next) # 迭代新的 V
delta = max(delta, |v - V(s)|)
return V
def policy_impro(old_policy):
"""策略提升"""
for s in S: # 迭代每一个状态
for a in A(s): # 迭代每一个状态对应的所有动作
max_q = max(max_q, Q(s,a))
single_impro(policy, max_q, s, a)
return policy
def policy_inter:
"""策略迭代"""
while True:
policy_eval()
old_policy = copy(policy)
new_policy = policy_impro(policy)
if old_policy == new_policy: break

浙公网安备 33010602011771号