强化学习网络与机器人控制——数学基础

强化学习

强化学习是一个很有意思的分支,它是机器学习旗下的三元猛将之一,即:监督学习、非监督学习、强化学习。对于强化学习,这里我放出一张OpenAI的图片,本系列将会带大家从原理到代码到实践,完成这些内容。

1

表格方法

我们之前写过很多关于强化学习的内容了:

学会神经网络[3]——强化学习与脉冲神经网络

QTansformer强化学习网络

深度强化学习算法

关于强化学习的数学基础

在这些写过的历史文章的内容中,我们似乎没有对强化学习进行一个全面而且系统的内容,本期就着重说明一下。所谓的表格方法其实就是使用到DP算法思想的强化学习算法,包括对系统状态动作收益进行一系列保存进行统一学习的办法。

贝尔曼方程

我们首先定义一下奖励、收益、回报、价值的含义:

  • 奖励(r):采取一次动作得到的即时数值
  • 回报(G):按照折扣率把后续奖励按时间顺序累加起来的值
  • 收益(Q):在状态s下采取动作a后能获得的期望回报
  • 价值(V):在状态s下能获得的期望回报

我们希望通过我们的网络,根据环境实时交互反馈的数据进行学习,我们必须要确定一下评价学习的标准。一般我们都是通过平均值进行表达即:

其中a代表采取了某种动作,n为当前所处的步数,我们对求和公式展开> 关于强化学习的数学基础

我们把这个公式写为文字性的语句即:

其中的V即为我们迭代计算得到的价值。利用这种关系就有贝尔曼方程。这样我们就知道了强化学习的基本方式,就是通过不断计算在当前状态下,采取何种行为才能让V最大化,也就是收益最大化。

有限马尔可夫决策

我们发现V无法有效的表达我们的评价标准,我们需要把其中的V换做Q就可以得到马尔可夫决策过程了。马尔可夫过程的核心性质是下一时刻的状态只依赖当前状态,与更早的历史无关,我们可以写出它的状态转移概率p,根据文字公式我们发现价值偏差即为不同概率下的价值即:

我们假设折损为$\gamma$,就得到了Q与V之间的贝尔曼关系:

在这个过程中我们引入了马尔可夫状态转移的概率p,也假设出了Q与V之间的关系。

DP与蒙特卡洛

我们通过把所有状态-动作对的Q值保存在一个有限维数组(表格)内,通过一定批量的数据进行学习,这里需要使用的算法为蒙特卡洛方法,假设我们的策略为$\pi$,我们希望:

配合$\epsilon$贪心策略就可以进行有限步骤的学习了。

贪心学习

刚才我们提到了贪心策略,这里必须说到同轨策略和离轨策略,前者意味着采样用的策略和目标策略是同一个,后者意味着两者不同。同轨策略通常使用$\epsilon$贪心进行学习,也就是策略有概率不按贪心结果执行(以$\epsilon$的概率随机探索),取到最优动作的概率大小为:$1-\epsilon+\frac{\epsilon}{|A|}$

即取到最优动作时:

取到其他动作时:

但是我们并不能让epsilon永远保持一个值,需要随着时间的推移逐步下降,最终就可以收敛一个非常完美的策略。

重要度采样

重要度采样即策略在学习前后执行更有动作的概率比,即:

我们在计算收益时引入重要度采样与回报的乘积就可以进行离轨策略估计了,注意,此法仅适用于离轨策略估计。这里简单证明一下

假设有两种策略$\mu,\pi$,分别叫做行为策略和目标策略。其中行为策略用于生成数据,目标策略用于评估和改进。对于价值的重要度采样核心为:

所谓的价值期望就是价值的数学期望,而重要度采样就是利用已知的策略进行学习:

上面两个式子整理为一个就得到:

通过简单的化简得到:

TD方法

TD方法就是所谓的时序差分算法,它用每一步的即时奖励加上下一状态的估计来更新价值,不需要等一整幕结束。基于蒙特卡洛方法,我们可以写作一个统一的表达式:

我们思考一下梯度上升可以发现,括号里的偏差其实就充当了梯度的角色,我们把收益G展开得到:

这样我们只需要观察出每一步得到的回报就可以迭代V了。

正如刚才所说,偏差也起到类似梯度的作用,这个偏差就叫TD误差,写作:

通过分析误差我们发现,误差是下一状态对于当前状态的差值,通过对误差求和我们就得到了蒙特卡洛误差:

我们给TD引入一个参数,也就是TD(n),这里面的n指的是n步内的TD方法,通过收集n步的奖励R进行迭代。一般我们都使用TD(0),也就是随用随学。


SARSA

既然提到了TD(n)就不得不说一下SARSA算法了,它是在TD方法上改进得到的,我们假设我们的系统可以传递给策略一个状态参数s,假设我们决策的函数需要这个状态参数,我们就有:

假设我们的环境为Env:

我们能发现在这个过程中用到了$s_t、a_t、r_t、s_{t+1}$这几个数据,通过保存这样的数据组利用TD算法就可以进行优化了,我们现在对TD算法进行升级。

因Q与V存在对应关系,我们直接把V换成Q:

这里面的数据都是我们SARSA的更新数据。我们发现SARSA是一个同轨策略,行为策略和目标策略必须一致,没法直接拿别的策略产生的数据来学。接下来是离轨学习的代表:Q学习


Q学习

Q学习与SARSA存在很高的相似度,区别是Q学习在计算目标时直接对下一状态的所有动作取最大值, 我们假定折扣回报为能让Q最大的状态动作对:

这个办法是一个离轨策略,因为目标是取最大值的贪心策略,而实际产生数据的是$\epsilon$贪心策略,两者不是同一个。

如果反过来尝试取平均值而非最大值,就可以更均衡地学习,我们可以写作:

这里的求和步骤其实就是Q的数学期望。这个方法也叫做期望SARSA。

n步自举TD(n)

n步自举是TD的延伸,通过计算回报G实现对V的更新。

这里G的角标意味着一个区间,通过计算区间内的截断回报,代替了完整的按时间打折的收益和。

这种办法的价值更新为:

当然这就是我们前文说过的TD(n)


当然我们可以把这个n步自举发展到SARSA中,写作一个严谨的函数:

我们在价值偏差上进行修正,引入重要性采样,就可以写作:

函数逼近方法

所谓的函数逼近方法指的就是使用一个策略进行逐步优化,当然这个策略可以是神经网络,这也是我们第二部分需要提及的内容,也就是深度强化学习网络,所以函数逼近方法是我们搭建深度强化学习网络的基础。

半梯度

我们把上文提到的价值偏差换成梯度形式:函数逼近里的参数更新要用到价值函数对参数的梯度,即$\nabla v(s_t,w_t)$,然后利用梯度上升法进行列写:

通过这种办法,我们就可以通过迭代逐步收敛得到一个局部最优解,而这就是所谓的半梯度——目标里的$U_t$当作常数不参与求导,所以叫“半”梯度。

为了衡量价值估计的误差,我们使用均方误差记作VE:

对于TD和MC方法,我们都可以在价值偏差加入这个项,得到下面的式子:

这里的V是逼近出来的价值函数,它不一定是线性的,所以我们可以把V写作一个神经网络,通过SGD方法进行迭代学习最终收敛。而损失函数就使用上面说过的均方误差

我们为什么使用半梯度:

​ 原因很简单,单纯的误差统计无法衡量全局的特性,我们无法知道一些非线性的系统有没有偏差(误差和偏差计算方式不同),所以我们在此基础上乘梯度就可以有效缓解偏差的积累。同时引入梯度的概念也帮助我们的深度神经网络进行学习,通过pytorch等框架的符号自动求导就可以进行收敛迭代了

我们在SARSA基础上进行优化,我们在对SARSA的价值偏差计算上进行统计,进行参数优化,得到了一个新的公式:

其中的w为Q内的权重参数,我们叫这种方法为分幕式半梯度单步SARSA。

离轨半梯度

我们对于离轨策略的价值偏差都引入了重要性采样,这样可以保证我们可以均匀地获取不同探索体的信息,我们对参数更新也仅仅只是添加了一个重要性采样:

我们发现这与TD0有几分相似,仅仅只是引入了一个梯度,我们同理可以写出TD误差:

对于SARSA也可以写出同样的方程。对于一些没有重要性采样的方法,我们可以使用价值回溯算法即:

在收集足够多的sarsa数据后利用差分方程:

这是一步回溯,我们可以同时回溯n步,我们直接写出:

这个方程看起来很复杂其实就是对$Q_{t+1}$进行递推展开。

资格迹

我们把一段时间内的SARSA保存住,其实就可以看作是策略在与环境交互过程中留下的足迹,这就是所谓的迹,把这些交互数据保存下来就可以用于学习训练了。

$\lambda$回报

我们把回报展开即:

归纳整合一下就得到了:

而这就是所谓的lambda回报。它把不同步数截断的回报按λ加权平均,兼顾了估计的偏差和方差,是衡量当前轨迹优劣的评价标准。我们也可以把时间差分方法也写出lambda迹:

资格迹可以理解为这次状态被更新的权重,其中的$z_t$就是所谓的资格向量。

我们把lambda回报作为价值偏差项加入价值更新方程中,就会得到同轨lambda回报算法即:

我们把半梯度Sarsa算法中的收益换做lambda收益:

我们发现$\lambda、\gamma$在含义上极为类似,都是一种对价值收益的折扣,只不过一个作用在步数上,一个作用在时间上。我们希望对离轨策略进行资格迹计算,并修改差分法方程。根据N步自举得到:

其中我们引入了重要性采样变量,我们给出他的TD误差:

策略梯度

策略梯度方法直接对策略网络的参数求梯度,不需要像价值方法那样先拟合价值偏差。我们把这个导数记作雅可比J,可以写出梯度上升:

使用策略梯度的学习策略都被称为策略-评判法,也就是Actor-Critic方法(行动者-评论家方法),我们假设Actor通过从环境状态学出对应的动作A,将A与环境交互后得到一个奖励和新的状态,将其保存在经验池中,当经验积累一定程度后,Critic进行价值评估,同时根据价值反馈计算优势函数来更新Actor。

我们在对Actor进行前向传播后,希望得到的是各个动作执行的概率,不同维度的向量意味着不同的动作,所以我们可以通过softmax处理输出向量,求解出来的向量我们假设满足某分布律$\mu$,我们可以假定策略梯度J:

其中的$\pi$依然作为我们的策略网络(比如PPO里的Actor)

REINFORCE

提及策略梯度不得不提及这个经典的蒙特卡洛策略梯度方法,它直接用整条轨迹的回报来估计梯度,不需要价值网络:

我们在做参数更新时把策略梯度当作梯度上升的梯度用即可,也就是说,我们的策略梯度就是其中代替价值偏差的方法。我们需要对方程引入一个重要性采样系数以提高我们的学习效果:

我们凑一个 $\pi/\pi$ 就得到了这个式子,然后由全概率公式化简掉$\pi$

最后将价值转化为收益即可:

这就是我们的蒙特卡洛梯度,我们利用它就可以非常快速地进行梯度上升算法。

通过观察分析,我们发现回报可能一直大于0,如果回报总是正数,差的动作也很难被压低概率,所以要减去一个偏差B(有的教材也叫基线):

这个偏差与状态有关,可以是任何内容,包括常数、价值函数或者0。

AC方法

我们刚才说过了AC方法,这部分进行AC策略梯度的解释,Actor-Critic与一般的TD方法很类似,我们可以用TD误差代替整条轨迹的回报G:

这样我们就不需要等整幕结束,单步就能更新。用 log 技巧可以把 $\frac{\nabla\pi}{\pi}$ 写成 $\nabla \ln \pi$:

总结

我们通过上面这些公式可能会一时摸不到强化学习的精髓,其实归根结底,我们都是在讨论不同情况下的价值更新即:

而我们换种表达方式就有:

我们把强化学习的各种公式列出,归根结底就是讨论价值偏差对梯度的替换,通过这种办法,我们就可以逐步收敛靠近我们期望的最优解了。比如重要性采样:把交互数据存进经验池,训练的时候按重要性权重计算即可。这里给出一小段代码,也就是重要性采样在离轨DQN中的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def update(self, batch_size):
if len(self.memory) < batch_size:
return
# 随机采样
samples = random.sample(self.memory, batch_size)
states, actions, rewards, next_states, dones = zip(*samples)

states = torch.FloatTensor(states)
actions = torch.LongTensor(actions)
rewards = torch.FloatTensor(rewards)
next_states = torch.FloatTensor(next_states)
dones = torch.FloatTensor(dones)

# 计算目标值
with torch.no_grad():
# 计算TD目标: 即时奖励 + 下一状态的最大Q
target_values = rewards + self.gamma * torch.max(self.target_network(next_states), dim=1)[0] * (1 - dones)

# 计算Q值
q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()

# 计算重要性采样权重
behavior_probs = [self.epsilon / self.action_size if action != a else (1 - self.epsilon) + (self.epsilon / self.action_size)
for action in actions]
# 得出重要性权重,用于计算损失(价值偏差)使用
importance_weights = [1.0 / prob for prob in behavior_probs]

# 计算加权损失
loss = (importance_weights * (q_values - target_values)).mean()

# 更新网络
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()

DQN这类算法没法用先收集数据再离线训练的方式完成,神经网络必须边交互边学习,这样才能快速收敛。

无论是什么方法,只要涉及到深度学习我们必然会涉及反向传播,梯度上升或者下降,一些强化学习算法就是对梯度计算进行一系列优化,进而达到摸索学习的效果。

对于更前沿或者更严谨的解释,大家可以观看OpenAI提供的论文:

https://spinningup.openai.com/en/latest/spinningup/keypapers.html#imitation-learning-and-inverse-reinforcement-learning


强化学习网络与机器人控制——数学基础
https://blog.minloha.cn/posts/23262329d0fccc2024102622.html
作者
Minloha
发布于
2024年10月26日
更新于
2024年10月26日
许可协议