你好,我是zhenguo(郭震)
今天,介绍强化学习第6篇:策略迭代
策略迭代是马尔可夫决策过程(MDP)中的一种求解方法,当然也是强化学习常用求解方法。
它的思想可以用通俗的方式解释如下:
假设你正在玩一个迷宫游戏,目标是找到迷宫的出口。你每到达一个迷宫的某个位置,都需要根据当前的状态(位置)来选择一个行动(向上、向下、向左、向右)来移动。
你希望找到一种「最优的策略」,即在每个位置都选择最好的行动,从而尽快找到迷宫的出口。
策略迭代的思想也非常直接,就是通过不断「改进策略」来寻找最优策略。
它分为两个主要步骤:策略评估和策略改进。
兑现为代码:
代码语言:javascript复制# 策略迭代算法
def policy_iteration():
max_iterations = 1000 # 最大迭代次数
for _ in range(max_iterations):
policy_evaluation() # 策略评估
policy_improvement() # 策略改进
如何做策略评估?如何做策略改进呢?
策略评估
策略评估的算法思想直接说还是有些难,我们先通过例子来阐述。
我们依然还是以迷宫游戏为例子。
我们定义迷宫状态空间大小和动作空间大小分别为9和4,即在3*3
的网格中,动作有4种,上下左右,对应代码:
num_states = 9
num_actions = 4
有了它们,我们就有了策略,一个二维数组,即每一个状态下对应的4种动作的取值概率,对应代码如下:
代码语言:javascript复制policy = np.ones((num_states, num_actions)) / num_actions
策略迭代方法还有一个值函数,值函数的入参是状态,返回价值大小,因此它的结构为如下,初始状态,每个状态的值大小为0.
代码语言:javascript复制values = np.zeros(num_states)
有了这些定义,我们再理解策略评估:
❝对当前的策略进行评估,计算每个状态的值函数(表示在该状态下能够获得的预期累积奖励)。通过迭代计算每个状态的值函数,直到值函数收敛。 ❞
再通俗一点来说,就是迭代,比如1000次,在当前策略下,对每个状态遍历,求出每个状态对应的值函数,不断更新上面定义的values
值函数,直到收敛。
所以它的代码框架,大概如下所示:
代码语言:javascript复制iter = 0
while iter<1000:
for s in range(num_states):
new_values = f(policy[s], a, s_) # f是一个数学公式
if np.max(np.abs(new_values - values)) < delta:
break # 停止迭代
values = new_values
iter = 1
上面代码中f是一个数学公式,写一篇详细来阐述代码实现。
策略改进
接下来,策略迭代第二步,「策略改进」。
❝在策略改进阶段,根据已经计算得到的值函数,更新策略,以便在每个状态下选择更好的行动。通过比较每个行动的价值(即采取该行动后的预期累积奖励),选择在每个状态下最好的行动,从而改进策略。 ❞
policy
是一个[num_states, num_actions]
二维数组,在策略改进这一步实际上就是不断更新每个state下的最优action,就是更新policy二维数组的第二个维度num_actions
取值。
所以它的代码框架,大概如下所示:
代码语言:javascript复制 for s in range(num_states):
q_values = q(values[s], s, a) # q函数
new_policy = np.zeros(num_actions)
new_policy[best_action] = 1
policy[s] = new_policy # 更新s下的策略为new_policy
总结
策略迭代的过程是循环进行策略评估和策略改进,直到策略收敛到最优策略为止。
在每次迭代中,我们都会根据当前的策略评估值函数,并根据评估得到的值函数改进策略,然后再次进行策略评估,不断循环迭代,直到最终找到最优策略。
策略迭代是一种通过反复评估和改进策略的方法来求解马尔可夫决策过程的算法。它通过不断优化策略和值函数来找到最优策略,并帮助我们在迷宫游戏等问题中做出最佳的决策。