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

强化学习

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

1

表格方法

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

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

QTansformer强化学习网络

深度强化学习算法

关于强化学习的数学基础

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

贝尔曼方程

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

  • 奖励(r):决策网络$\pi$采取一次动作得到的数值r
  • 收益(Q):决策网络在一定时间内得到的奖励的平均值
  • 回报(G):按照一个衰减率,根据时间顺序依次加起来的奖励值
  • 价值(V):估计决策网络在某概率的情况下获得回报

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

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

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

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

有限马尔可夫决策

我们发现V无法有效的表达我们的评价标准,我们需要把其中的V换做Q就可以得到马尔可夫决策过程了,众所周知,马尔可夫过程就是下一时刻的概率不依赖与上一时刻的过程,我们可以写出它的状态转移概率p,根据文字公式我们发现价值偏差即为不同概率下的价值即:

我们假设折损为$\gamma$得到MC决策:

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

DP与蒙特卡洛

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

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

贪心学习

刚才我们提到了贪心策略,这里必须说到同轨策略离轨策略,前者意味$\pi$与最终学习计算的策略是一个,后者意味着$\pi$与最终学习计算的策略不同。同轨策略通常使用$\epsilon$贪心进行学习即策略有概率不执行策略的函数,概率大小为:$1-\epsilon$

即:

但是我们并不能让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存在很高的相似度,我们在$G_t$的计算出进行一个多次试探的对象, 我们假定折扣回报为能让Q最大的状态动作对:

这个办法是一个离轨策略,原因是我们需要统筹多个 $Q(s_{t+1}|a)$进行取最大值,反而去训练另一个策略。

通过此法我们可以尝试对离轨策略的统计进行取平均值而非最大值,这样可以均衡的学习,我们可以写作:

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

n步自举TD(n)

n步自举其实是在TD延申出来的一种算法,通过计算回报G实现对V的更新。

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

这种办法的价值更新为:

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


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

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

函数逼近方法

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

半梯度

我们给上文提到的价值偏差进行完善,我们发现这个价值偏差无法衡量价值对状态的偏差,我们求解一下价值梯度即:$\nabla v(s_t,w_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-Criris方法(AC方法、演说家评价员方法),我们假设Actor通过从环境状态学出对应的动作A,将A与环境交互后得到一个奖励和新的状态,将其保存在经验池中,当经验积累一定成都后进行迭代评价员方法,同时根据价值反馈计算优势函数进行迭代Actor。

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

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

REINFORCE

提及策略梯度不得不提及这个经典的蒙特卡洛策略梯度方法,它忽略了输出的分布律而是简单的把梯度当作一个数学期望去做,即:

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

我们简单的加个坟墓就得到了这个式子,然后由全概率公式化简掉$\pi$

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

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

通过观察分析,我们发现我们最终的收益可能一直大于0,导致我们的网络没有办法学到错误教训,所以我们需要对Q进行修正,也就是引入一个偏差B(有的教材也叫基线)将收益减去这个B即可:

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

AC方法

刚才我们说过了AC方法,我们这部分进行AC策略梯度的解释,Actor-Critis与一般的TD方法很类似,我们可以用TD误差代替偏差部分的计算即:

这样我们收集到的错误就不会重复的进行学习。当然我们也可以引入半梯度来进一步优化:

总结

我们通过上面一大堆莫名其妙的公式可能会不理解强化学习的精髓,归根结底,我们都是在讨论不同情况下的价值更新即:

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

我们把强化学习的各种公式列出,归根结底就是讨论价值偏差对梯度的替换,通过这种办法,我们就可以逐步收敛靠近我们期望的最优解了。比如我们的重要性采样,给定一个深度神经网络我们可以统计sarsa进行保存在经验池,然后通过计算就可以了,这里给出一小段代码,也就是重要性采样在离轨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():
# 这就是lambda回报计算方法
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月28日
许可协议