一、TD算法
时间差分算法,TD 算法是一种结合了动态规划(DP)和蒙特卡罗(MC)方法思想的强化学习算法,它能够在不需要完整环境模型的情况下,通过与环境的交互学习得到最优策略,用于估计值函数等强化学习中的关键量.
1.1 算法描述
给定一个策略π,我们的目标是对所有s ∈ S估计这个策略的state value vπ(s),假设我们有一些经验样本(s0,r1,s1,...,st,rt+1,st+1,...)由我们的策略π产生,t表示时间步长,也就是在不同时间下的状态s,与获得的奖励r,下一时间st+1,以下TD算法可以使用这些样本来估计状态值:
分析上面的式子,第一个首先是vt+1的时间点,其为vt - 系数乘以误差,什么是误差,vt(st)是当前的状态,rt+1+yvt+1(st+1)这个式子就是目标中下一时间的跳转状态,这个就是在t时刻的一个估计值,我要更新st对应的state value vt(st),就是让 vt-() 其中t = 0,1,2,....这里,vt(st)是t时刻vπ(st)的估计值; αt(st)是t时刻st的学习率。第二个,应当注意,在时间t,仅更新访问状态st的值。未访问状态st+1 = st的值保持不变。
实际上,它可以看作是求解Bellman方程的一种特殊的随机逼近算法。要了解这一点,首先回想一下状态值的定义是
根据贝尔曼公式来的,他就是st采取行动后跳到st+1的state value
那么你就可以把这个式子写作
1.2 公式分析
我们上面说过,要把式子拆出来来看,我们就给整个式子
1.2.1 TD target
其中,我们又把TD target单独拉出来,把他称为
同时,当前状态减去TD target就得到了TD error
可以看出,新的估计值Vt+1(st)是当前估计值Vt(st)和TD误差δt的组合,首先,这个误差被称为时间差,因为δt = vt(st)−(rt+1 + γvt(st+1))反映了两个时间步长t和t + 1之间的差异。第一,如果给上面的式子同减去target,你就会发现式子 新状态=参数*旧状态,这个参数是0~1之间的数,所以新状态也会更加接近Vt
1.2.2 TD error
首先,这个误差被称为时间差,因为δt = vt(st)−(rt+1 + γvt(st+1))反映了两个时间步长t和t + 1之间的差异。第二,当状态值估计准确时,TD误差在期望意义下为零。要看到,当vt = vπ时,TD误差的期望值为0.
因此,TD误差不仅反映了两个时间步长之间的差异,而且更重要的是反映了估计值Vt与真实状态值vπ之间的差异,TD误差可以被解释为创新,其指示从经验样本(st,rt+1,st+1)获得的新信息。TD学习的基本思想是根据新获得的信息来校正我们当前对状态值的估计。
二、Sarsa
Sarsa算法是TD算法的一种,TD是估计state value,二Sarsa可以直接估计动作值。估计动作值很重要,因为它可以与策略改进步骤相结合,以学习最佳策略。给定一个策略π,我们的目标是估计动作值。假设我们有一些经验样本生成如下π:(s0,a0,r1,s1,a1,...,st,at,rt+1,st+1,at+1,...).我们可以使用以下Sarsa算法来估计动作值:
上面的式子和TD算法旧非常的接近了,把state value替换成q,补充当前状态采取的行动a,其中t = 0,1,2,...αt(st,at)是学习率。这里,qt(st,at)是qπ(st,at)的估计。在时间t,只有(st,at)的q值被更新,而其他的q值保持不变。算法的每次迭代都需要(st,at,rt+1,st+1,at+1)
2.1 什么是Sarsa算法
因为算法的每次迭代都需要(st,at,rt+1,st+1,at+1),这就是状态、奖励、行动、状态、行动的简称。Sarsa实际上是一种随机近似算法,用于求解给定策略的Bellman方程:
2.2 基于Sarsa的最优策略学习
Sarsa算法的目标是让智能体从s0到达目标状态,对于每一条路径,在给定(st,at)的情况下,收集一个经验样本(rt+1,st+1,at+1):通过与环境交互生成rt+1,st+1;在πt(st+1)之后生成at+1,以此来更新q-value
并且更新st的策略
由上面的流程来看,每次迭代有两步。第一步是更新访问状态-动作对的q值。第二步是将策略更新为贪婪策略。q值更新步骤仅更新在时间t访问的单个状态-动作对。之后,st的策略立即更新。因此,在更新策略之前,我们不会充分评估给定的策略。这是基于广义策略迭代的思想。此外,在策略被更新之后,该策略被立即用于生成下一个经验样本。
下面例子中,所有的情节都从左上角的状态开始,并在目标状态结束。奖励设置为:rtarget = 0,rforbidden = rboundary = −10,rother = −1。此外,对于所有t,αt(s,a)= 0.1,且α = 0.1。对于所有(s,a),动作值的初始猜测是q0(s,a)= 0。
该策略可以成功地从起始状态引导到目标状态。然而,其他一些区域的策略可能不是最佳的。这是因为其他地区没有探索,所以策略不好的原因。在这里,总奖励是所有即时奖励(非折扣)的总和。可以看出,每次迭代的总奖励逐渐增加。这是因为最初的策略不好,因此经常获得负回报。策略越好,总奖励越多。
每一次经历的长度逐渐下降(所经过的state)。那是因为最初的策略不好,可能会走很多弯路才能达到目标。当策略变得更好时,轨迹的长度会变得更短。值得注意的是,策略的长度可能突然增加,相应的总奖励也急剧下降。这是因为该策略是并非完全贪婪的,有小概率会进行探索,这个时候探索可能就会有不好的行动出现。解决这个问题的一个方法是使用衰减,其值逐渐收敛到零,但是如果坏策略出现,对比其他的策略值更小,自然就会被忽略了。
% SARSA算法实现网格世界导航
% 环境:5x5网格,左上角(1)为起点,右下角(25)为终点
% 参数设置
alpha = 0.1; % 学习率
gamma = 0.99; % 折扣因子
epsilon = 0.1; % 探索率
num_episodes = 2000; % 训练轮数
% 初始化Q表(25个状态 x 5个动作)
Q = zeros(25, 5);
% 记录每轮的步数
steps_history = zeros(num_episodes, 1);
% 训练过程
for episode = 1:num_episodes
state = 1; % 初始状态(左上角)
action = choose_action(Q, state, epsilon);
steps = 0;
while state ~= 25
% 执行动作获得下一个状态和奖励
[next_state, reward] = take_action(state, action);
% 选择下一个动作
next_action = choose_action(Q, next_state, epsilon);
% 更新Q值
Q(state, action) = Q(state, action) + alpha * (reward + gamma * Q(next_state, next_action) - Q(state, action));
% 移动到下一个状态
state = next_state;
action = next_action;
steps = steps + 1;
end
steps_history(episode) = steps;
% 可选:探索率衰减
% epsilon = epsilon * 0.998;
end
% 绘制收敛曲线
window_size = 50;
avg_steps = movmean(steps_history, window_size);
figure;
plot(avg_steps, 'LineWidth', 1.5);
xlabel('训练轮数', 'FontSize', 12);
ylabel('平均步数', 'FontSize', 12);
title('SARSA算法收敛性分析', 'FontSize', 14);
grid on;
% 状态转移函数
function [next_state, reward] = take_action(state, action)
% 转换为行列坐标
row = ceil(state / 5);
col = state - (row-1)*5;
% 根据动作计算新位置
switch action
case 1 % 上
new_row = max(1, row-1);
new_col = col;
case 2 % 下
new_row = min(5, row+1);
new_col = col;
case 3 % 左
new_col = max(1, col-1);
new_row = row;
case 4 % 右
new_col = min(5, col+1);
new_row = row;
case 5 % 停留
new_row = row;
new_col = col;
end
next_state = (new_row-1)*5 + new_col;
% 奖励函数设置
if next_state == 25
reward = 10; % 到达终点奖励
else
reward = -1; % 每步惩罚
end
end
% 动作选择函数(ε-greedy策略)
function action = choose_action(Q, state, epsilon)
if rand < epsilon
action = randi(5); % 随机探索
else
[~, action] = max(Q(state, :)); % 利用当前知识
end
end
三、n-step Sarsa
回想一下 action value 的定义是
其中Gt是折扣后的收益,事实上,Gt也可以分解为不同的形式:
实际上n-Sarsa就是扩展版的Sarsa,应当注意,Gt = G(1)t = G(2)t = G(n)t = G(∞)t,其中上标仅指示Gt的不同分解结构。当n为1时
可以看出,n=1的时候,就是普通的Sarsa,求解该方程的相应随机近似算法是
当n为无穷时
实际上,这是MC学习算法,它使用从(st,at)开始的情节的折扣回报来近似(st,at)的动作值,求解此方程的相应算法为
其中gt是GT的样本。实际上,这是MC学习算法,它使用从(st,at)开始的情节的折扣回报来近似(st,at)的动作值
这种算法被称为n步Sarsa算法。也就是把后面的一个rt+1,增加到第n步,这样可以更有效的利用我们拥有的数据,n步Sarsa是一种更通用的算法,因为当n = 1时,它成为(一步)Sarsa算法,当n = ∞时(通过设置α t = 1),它成为MC学习算法。我们需要经验样本(st,at,rt +1,st +1,at +1,...,rt + n,st + n,at + n)。由于(rt + n,st + n,at + n)在时间t没有被收集,我们必须等到时间t + n来更新(st,at)的q值。
由于n步Sarsa包括Sarsa和MC学习作为两种极端情况,因此n步Sarsa的性能介于Sarsa和MC学习的性能之间并不奇怪。特别地,如果n被选为一个大的数,n步Sarsa接近MC学习:估计具有相对高的方差,但偏差小。如果选择较小的n,则n步Sarsa接近于Sarsa:估计值具有相对较大的偏差,但方差较低。
三、Q-learning
Sarsa只能估计给定策略的动作值,并且必须与策略改进步骤相结合才能找到最优策略。相比之下,Q学习可以直接估计最佳动作值并找到最佳策略。
其中t = 0,1,2,....这里,qt(st,at)是(st,at)的最优动作值的估计,αt(st,at)是(st,at)的学习速率。Q-learning与Sarsa的表达方式相似。
上面的算法就是Q-Learning的算法,和Sarsa非常接近,区别在于他去了最优的行动值,而Sarsa取得是策略后面得到的q,Q学习的TD目标是rt+1 + γ maxa qt(st+1,a),而Sarsa的TD目标是rt+1 + γqt(st+1,at+1)。此外,给定(st,at),Sarsa在每次迭代中需要(rt+1,st+1,at+1),而Q-学习仅需要(rt+1,st+1)。
四、 策略学习与非策略学习
与其他TD算法相比,Q学习的特殊之处在于Q学习是非策略的,而其他算法是策略的。什么是
Off-policy 与 on-policy呢?也就是有指定策略任何强化学习任务中都存在两种策略:行为策略(behavior policy)和目标策略(target policy)。行为策略是用于生成经验样本的策略。目标策略是不断更新以收敛到最优策略的策略。当行为策略与目标策略相同时,这样的学习过程称为on-policy。否则,当它们不同时,学习过程被称为off-policy
off-policy的优点在于,它可以基于由其他策略生成的经验样本来学习最优策略,所述其他策略可以是例如由人类操作员执行的策略。作为一个重要的案例,行为策略可以选择为探索性的。例如,如果我们想估计所有状态动作对的动作值,我们必须生成访问每个状态动作对足够多次的情节。虽然Sarsa使用贪婪策略来保持一定的探索能力,但贪婪值通常很小,因此探索能力是有限的。相比之下,如果我们能够使用一个具有较强探索能力的策略来生成事件,然后使用离策略学习来学习最优策略,那么学习效率将会显著提高.
为了确定算法是符合策略还是不符合策略,我们可以检查两个方面。第一个是算法要解决的数学问题。二是算法所需的经验样本
4.1 Sarsa - on-policy
Sarsa在每次迭代中都有两个步骤。第一步是通过求解Bellman方程来评估策略π。要做到这一点,我们需要由π生成的样本。因此,这个π是行为策略。第二步是基于π的估计值获得改进的策略。因此,π是不断更新并最终收敛到最优策略的目标策略。在这里生成样本的策略和修改策略是同一个,因此为 on-policy
从另一个角度来看,我们可以检查算法所需的样本。Sarsa在每次迭代中需要的样本包括(st,at,rt+1,st+1,at+1)
根据上面公式,行动策略πB当前所处状态st,根据给定策略可以得到需要采取的行动at,根据模型就知道rt+1,在st+1生成at+1的行动策略。Sarsa算法旨在估计表示为πT的策略的(st,at)的动作值,这是目标策略,因为它在每次迭代中基于估计值进行改进。实际上,πT与πB相同,因为πT的求值依赖于样本(rt+1,st+1,at+1),其中at+1在πB之后生成,所以就是依赖本身的优化来进行。换句话说,Sarsa评估的策略就是用于生成样本的策略。
4.2 Q-learning off-policy
Q-learning是一种求解Bellman最优性方程的算法,而Sarsa是求解给定策略的Bellman方程。求解Bellman方程可以评估相关的策略,而求解Bellman最优性方程可以直接生成最优值和最优策略。Q学习在每次迭代中所需的样本是(st,at,rt+1,st+1)。
行为策略πB是生成at at st。Q学习算法旨在估计(st,at)的最优动作值。该估计过程依赖于样本(rt+1,st+1),也就是我们需要的内容不依赖行为策略,而sarsa需要行为策略生成at,at+1,这就是最大的区别。生成(rt+1,st+1)的过程不涉及πB,因为它由系统模型(或与环境的相互作用)控制。因此,(st,at)的最优动作值的估计不涉及πB,并且我们可以使用任何πB来生成st的at。