1. 引述
之前的笔记,在用函数逼近时,通常都是用的线性函数。在 14 年,有一个方法使用神经网络作为函数逼近,将深度学习和强化学习结合了起来。
这个方法,将前面提到过的 Q-Learning 和深度神经网络(Deep Neural Network)相结合,提出了 Deep Q-learning Network,简称DQN
2. DQN
2.1 方法介绍
回顾一下之前笔记(ch.4)提过的 Q-Learning 的概念,这是一种逐渐逼近 Q 值的 TD 算法。当前状态下 Return 的计算公式是:(1-step)
这个方法是的背景,是假定当前状态有限,于是可以去更新一个 Q 值表。
然而,在DQN算法的背景中,状态是无限的或者说不可数的。比如 DQN 就被用在雅达利的游戏中,输入是雅达利2600(一款很老的游戏机)的游戏画面,所以状态是无限的。
在函数逼近那一节的笔记(ch.5)中提到过,对于无限的状态,Q 值表无法存储。于是需要通过拟合一个函数,来逼近真实 Q 值。
DQN 使用神经网络作为函数逼近真实Q值,其 Return 计算公式如下:
DQN 是一个神经网络,输入是状态,输出是当前所有 Action 的一个 Q 值,如下图所示。
假设我们之后往上、下、左、右四个方向走的动作,那么输出就是 4 个神经元,每个神经元代表其对应动作的 Q 值。
2.2 两个神经网络
既然 DQN 是一个神经网络,那免不了要去训练参数。训练参数就需要有真实值和预测值。对于真实值,就是之前提到的这个公式:
虽然说是真实值,但是其实是一阶差分的预测值。不过我们把它当真实值来用,毕竟这也是 Q-Learning 等一系列 TD 算法的做法。
而当前状态的预测值就很简单了:
可以看到,由于真实值和预测值都依赖 DQN 的参数,所以训练效果会非常不稳定。因此,引入了类似 off policy 的技巧,用两个神经网络。一个 Online 网络用来输出真实值,一个 Target 网络用来输出预测值。
在训练一开始,为这两个网络随机初始化相同的参数。随后,Online 网络输出预测值:
Target 网络输出真实值:
每采样一次 Trajectory,更新一次 Online 网络,而不更新 Target 网络。直到过了 K 个 epoch 之后,比如过了 100 个 epoch,就用 Online 网络的参数去覆盖 Target 网络的参数,然后继续训练,以此类推。
在别人介绍 DQN 的时候,有一些专用术语,比如 “经验回放”,这其实就是把 Agent 和环境的交互过程记录了下来,组成一个四元组(比如 s0, a0, r1, s1)
2.3 策略
策略采用 算法(ch.3),对于 Online 网络的预测 Q 值:
有一定概率随机走,剩下的概率就采取 Q 值最大的动作
2.4 训练过程
假设现在有一个 3 * 3 的格子,Agent 从左上开始走,走到右下给予 10 点奖励并终止,走到下方给予 -10 点奖励并终止,其他格子基于 -1 点奖励。如下图所示:
第一步是经验回放过程,也叫做数据收集过程。这个过程就是记录 Agent 从开始到结束的一整个 Trajectory。每一次SARS过程,记录成一个四元组:
SARS过程:基于当前状态
,作出决策
,然后从环境中获得奖励
,并从环境中获取下一状态
的这一整个过程。
比如,一次 Agent 的路线可能是这样:S1, S2, S5, S8
此时的经验回放内容如下:
[
(S1, Right, -1, S2),
(S2, Down, -1, S5),
(S5, Down, -1, S8)
]
接着,基于经验回放的内容,计算损失并反向传播,损失函数使用均方误差。经验回放中的每一个 4 元组,都可以计算一次损失并反向转播。由于计算方式相同,所以我只用其中一个 4 元组举例。
对于 4 元组:(S1, Right, -1, S2),这意味着 Agent 将 S1 输入到 Online 网络中,获得了一系列 Q 值。比如说,获得的 Q 值如下:
Online 网络:
Q(S1, Right) = -0.67
Q(S1, Left) = 1.36
Q(S1, Up) = -1.63
Q(S1, Down) = 0.72
根据 4 元组 (S1, Right, -1, S2) 的内容,我们知道 Agent 基于 算法,采取了向右走的策略,并获得奖励:
,和下一个状态 S2。
那么此时的预测值就是:(0.67 是当前 Online 网络对于向右走这一策略的 Q 值)
随后,我们将 S2 输入到 Target 网络中。Target 网络也会返回一系列 Q 值,比如说返回的 Q 值如下:
Target 网络:
Q(S2, Right) = 1.02
Q(S2, Left) = -0.66
Q(S2, Up) = -1.36
Q(S2, Down) = 1.42
我们将其中最大的值取出来,也就是
然后基于这个最大值计算出真值:(衰减因子设置为 1)
最后用真值和预测值计算损失(均方误差):
随后用这个值进行反向传播
2.5 后续研究
这个 DQN 网络是 14 年的论文提出的方法,存在许多缺陷。后续也有不少在这个网络上做的改进,比如 Double-DQN(2015)、Rainbow-DQN(2017)
3. Actor-Critic 方法(AC)
3.1 方法思想
首先,有一个 Actor 网络,这个网络接收当前的状态作为输入,输出一个动作,如下图所示:
然后,有一个 Critic 网络,这个网络的目的是用来给 Actor 网络输出的动作打分。所以 Critic 网络接收当前的状态和 Actor 网络输出的动作作为输入,输出一个得分:
随后,Actor 网络基于 Critic 网络的打分来改进自己的输出:
但是 Critic 网络在初始化的时候参数随机,也就是说它并不能很好的作为一个裁判打出合适的分数。为此,Critic 网络就需要学习如何打分,学习的方式就是结合环境的 Reward:
在训练阶段,Critic 网络辅助 Actor 网络学习。在测试阶段,只有 Actor 网络输出,Critic 网络不再使用。
3.2 函数逼近
这个方法同样也是用了两个神经网络。不过和 REINFORCE 不同的是,这里使用函数逼近 V 值函数,而不是策略函数。
在之前的笔记(ch.2)我们知道,V 值可以写成这个:
于是,就用两个神经网络,分别去逼近公式中的策略函数 和 Q 值函数
。分别定义这两个神经网络为:
于是,V 值就可以写成:
其中, 被叫做 Actor 网络;
被叫做 Critic 网络。
3.3 Critic 网络
如上图所示。Critic 网络接收当前的状态和 Actor 网络输出的行为的概率分布采样得到的一个具体的作为输入(不是把整个概率分布作为输入)。
在分别提取特征+特征拼接之后,输出一个预测的 Q 值,这个 Q 值被试做 Critic 网络打的分数。(如果在某些情况下,动作是离散的,那么就用 One-Hot 编码表示动作)
在更新这个网络的时候,和 DQN 一样,由于是神经网络,就需要预测值和真实值。真实值同样是通过一阶差分(ch.4)获取。
首先输入当前状态 给 Actor 网络,返回得到一个采样的动作
,随后从环境中获得奖励
和下一个状态
,接着将
输入到 Actor 网络采样得到一个动作
,然后计算下一个状态的预测 Q 值
,最后得到真实值:
而当前状态的预测值就是:
最后用均方误差作为损失函数,计算损失并反向传播:
3.4 Actor 网络
如上图所示。Actor 网络用来预测动作的概率分布。输入当前状态,在经过神经网络的卷积层(Conv)+全连接层(Dense)+ Softmax 之后输出每个动作的概率分布。
既然是概率分布,那么做决策采取哪个动作的时候,就不需要如同 DQN 一样用 算法来决策了,只需要采样概率即可。
那么这个网络的参数 要如何更新呢?
依旧是用梯度下降,先把 V 值公式变形,把这个式子对 求偏导:
因为 这个参数在推导过程中不需要,于是我们就对下面这个式子求导:
我们这里求的是近似梯度,假设 和
无关,于是有:
这里,有两个关键的部分。第一个是 “和的偏导 = 偏导的和”,随后是这一步:
这一步是怎么变换的呢,其实就和重要性采样那部分采用的 Trick 是一样的,见:
【强化学习】【笔记】【ch.3】蒙特卡洛策略-CSDN博客
其中的 3.2 节
为了估计这个期望,我们把期望里面的式子单独拎出来:
最后,我们这里是省略了 这个参数的,我们把这个参数加回去:
这个公式是一个梯度的公式,转化成损失函数的话就是这样:
为什么是这个呢,因为反向传播的时候,就是这个 Loss 求导(梯度)去传。这个 Loss 求导回去就是