【强化学习的数学原理】第08课-值函数近似-笔记
学习资料:bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接:强化学习的数学原理 西湖大学 赵世钰
文章目录
- 一、例子:曲线拟合
- 二、原理-目标函数介绍
- 三、原理-优化算法和函数选择
- 四、原理-示例与分析
- 五、Sarsa和Q-learning
- 六、Deep Q-learning (DQN) 基本原理
- 七、Deep Q-learning (DQN) Experience replay(经验回放)
- 八、Deep Q-learning (DQN) 代码与例子
一、例子:曲线拟合
截止到目前为止,我们所介绍的state value和action value都是以表格的形式呈现的(如下图所示)。这种呈现方式虽然清晰简单,但难以处理很大/连续的状态空间、动作空间。
下面通过一个例子来介绍value function approaximation的基本思想。
假设现在有
∣
S
∣
|S|
∣S∣个状态,基于给定的策略,每个状态都有一个state value(用下图中的离散点表示,每一个离散点代表状态s对应的state value v(s))。如果状态s的数量非常多,那么储存就耗费很大空间,因此希望用一个函数来拟合这些点。
首先,用一个直线来拟合这些点。如下图所示。
w
w
w里面包含a和b,是parameter vector;
ϕ
(
s
)
\phi(s)
ϕ(s)是特征向量。
用直线进行拟合的好处:节约存储空间。现在不用存储很多状态s的state value,只需要存储两个参数a和b。但缺点是,拟合后的结果只是一个近似值,不那么精确了。
下面是一个非线性的拟合方式,这种方法使用的参数多一些,提高了拟合精度。
简单总结:总体思想是用参数化的函数来拟合状态s的state value。
优点:
(1)节省存储空间
(2)提高泛化性。假如s1/s2/s3是相邻的三个状态,现在episode访问到了s2,需要更新s2的state value,更新后的state value变大。在表格的形式中,s1和s3的state value值是保持不变的。但是在函数的形式中,s2的state value变化后,拟合的函数发生变化(w变化),此时对s1和s3的state value的估计值也更准确。
二、原理-目标函数介绍
v
π
(
s
)
v_{\pi}(s)
vπ(s)是state value的真实值,
v
^
(
s
,
w
)
\hat{v}(s,w)
v^(s,w)是state value的近似值。
我们的目标是找到一个最优的
w
w
w,使得对于每一个状态
s
s
s,
v
^
(
s
,
w
)
\hat{v}(s,w)
v^(s,w)都能最好地近似
v
π
(
s
)
v_{\pi}(s)
vπ(s)。
为了寻找最优的
w
w
w,我们定义如下目标函数:
值得指出的是, S S S是一个随机变量,既然是一个随机变量,这个随机变量就是有概率分布的。那么S的概率分布是什么呢?有几种方式来定义S的概率分布。
第一种方式是均匀分布。这种方式下,每一个状态的权重都是一样的,一共有
∣
S
∣
|S|
∣S∣个状态,那每一个状态的权重就是
1
/
∣
S
∣
1/|S|
1/∣S∣。但这样的缺点在于,并不是每一个状态都是同等重要,有的状态更重要,我们需要这样的状态权重高一点,计算的误差小一点。
第二种方式是stationary distribution。在这种方式下,从某一个状态开始,不断地和环境进行交互,交互很多次之后,就达到了一种平稳的状态,在这种平稳的状态下,能够计算出,每一个状态出现的概率是多少。这个概率分布用
d
π
(
s
)
d_{\pi}(s)
dπ(s)来表示,基于
d
π
(
s
)
d_{\pi}(s)
dπ(s)可以把目标函数写成如下图所示的形式。
d
π
(
s
)
d_{\pi}(s)
dπ(s)实际上扮演了权重的角色。
stationary distribution是状态state 的概率分布,从当前状态出发,跑了很多很多步之后达到的一种平稳的分布。它也被称作steady-state distribbution或者limiting distribution。
下图展示了一个例子。用
n
π
(
s
)
n_{\pi}(s)
nπ(s)表示在基于
π
\pi
π的策略基础上,在一个很长的episode中,访问s的次数。
d
π
(
s
)
d_{\pi}(s)
dπ(s)是比值结果,表示状态被访问的概率。右下角的图表示,随着步长越来越长,比值逐渐趋于稳定。
三、原理-优化算法和函数选择
优化算法
用梯度下降方法求解优化目标。下图给出了梯度下降算法,以及计算了目标函数
J
(
w
)
J(w)
J(w)的梯度。
而这个梯度算出来是有期望的,期望不太好算,所以下面使用随机梯度来代替真实的梯度。
但是这个算法仍然是不好实施的,因为
v
π
(
s
t
)
v_{\pi}(s_t)
vπ(st)的值是不知道的。可以用其他量来代替
v
π
(
s
t
)
v_{\pi}(s_t)
vπ(st)。
第一种方法:Monte Carlo的方法。用
g
(
t
)
g(t)
g(t)来代替
v
π
(
s
t
)
v_{\pi}(s_t)
vπ(st),
g
(
t
)
g(t)
g(t)是在某一个episode中从状态
s
t
s_t
st出发所得到的discounted return。(这个思想就是和蒙特卡洛方法一致的)
第二种方法:TD learning的方法。把
v
π
(
s
t
)
v_{\pi}(s_t)
vπ(st)用下式来代替。
TD learning算法的伪代码如下。(分为general case和linear case两种情况)值函数估计的目标还是计算给定策略的state value。
函数选择
如何选择函数
v
^
(
s
,
w
)
\hat{v}(s,w)
v^(s,w)呢?
第一种方法,是用线性函数linear function作为
v
^
(
s
,
w
)
\hat{v}(s,w)
v^(s,w)。(以前常用)
第二种方法,是用神经网络作为一种非线性函数近似。神经网络的输入是状态state,输出是近似的结果
v
^
(
s
,
w
)
\hat{v}(s,w)
v^(s,w)。网络权重是
w
w
w。(现在常用)
下面看一下线性的情况。如果
v
^
(
s
,
w
)
\hat{v}(s,w)
v^(s,w)用线性函数表示,则其梯度为
ϕ
(
s
)
\phi(s)
ϕ(s),把这个梯度应用到TD算法中,就得到如下图3所示的结果。这也被称作TD-Linear。
Linear function approximation的优劣势:
劣势:很难去选择一个好的feature vector。(好的拟合函数)
优势:相对于非线性函数,线性函数的理论性质能被很好地分析;线性函数的表征能力相对还是比较强的。
四、原理-示例与分析
例1:
下面是一个5*5的网格世界的例子,目标是用函数拟合的方法,在给定策略的基础上计算25个状态的state value。
下图展示了Ground truth。我们收集了500个episode,每个episode有500步。每个episode出发的state action pair是随机选择的,并服从均匀分布。
1.用一个平面来拟合
下面用TD-Linear算法来求解。所选择的feature vector实际上是一个平面(有x、y)。
下图(中间)给出了TD Linear的计算结果,下图(左边)是ground truth。可以看出,趋势是对的,但对于某些状态估计得不太准确。因为我的拟合函数只是一个平面,而真实结果是一个复杂的曲面。
2.用更高阶的曲面来拟合
从拟合结果中可以看出来,用更高阶的曲面来拟合,效果更好了。
小结:
PS:从(2)到(3)的替换在数学上是不严谨的。更详细的分析可以见赵老师的书。
五、Sarsa和Q-learning
Sarsa with function approximation
下图是Sarsa和value function approaximation相结合后的算法。和上一节讲到的TD算法相比,就是把
v
^
(
s
t
)
\hat{v}(s_t)
v^(st)换成
q
^
(
s
t
,
a
t
)
\hat{q}(s_t,a_t)
q^(st,at)。这里本质上仍然是在做policy evaluation,action value
q
^
=
ϕ
T
w
\hat{q}=\phi^Tw
q^=ϕTw。
下图是伪代码。首先在当前状态
s
t
s_t
st的情况下遵循策略选择动作
a
t
a_t
at,产生
r
t
+
1
r_{t+1}
rt+1和
s
t
+
1
s_{t+1}
st+1,然后在新的状态下遵循策略选择新的动作
a
t
+
1
a_{t+1}
at+1。然后进行value update 过程,对参数w进行更新,这里本质上仍然是在做policy evaluation。再进行policy update过程,这里采用的是
ϵ
\epsilon
ϵ-greedy的方法。
下图展示了将Sarsa和linear function approximation结合的例子。任务是从某一状态出发,到达目标状态。
Q-learning with function approximation
算法如下:
这是Q-learning with function approximation(on policy)版本的伪代码。
下图展示了将Q-learning和linear function approximation结合的例子。任务是从某一状态出发,到达目标状态。
六、Deep Q-learning (DQN) 基本原理
DQN把深度神经网络引入到强化学习中。下图的
J
(
w
)
J(w)
J(w)展示了DQN的目标函数/损失函数。如果达到最优的话,loss function应该是等于0。
然后用梯度下降法对目标函数进行优化。但对这个目标函数求梯度有点困难。因为第二部分的梯度好求,但是第一部分的梯度有点难求。可以把第一部分+R看作一个整体y。
设计两个网络,在main network中,参数是w,w是一直被更新的,有新的采样进来的时候,就会被更新。但在target network中,参数是
w
T
w_T
wT,这个参数不是一直被更新的,隔一段时间之后,会把main network中的参数w的值给赋值过来。最后,
w
w
w和
w
T
w_T
wT都能收敛到最优的值。
所以它的梯度公式最终是写成这样的:
值得强调的是,DQN使用了两个网络,main network和target network,其参数分别是
w
w
w和
w
T
w_T
wT。在每次迭代中,从replay buffer中提取一些sample,使得输出的结果尽量接近
y
T
y_T
yT。训练一段时间后,参数
w
w
w的值变化了,把这个值赋给
w
T
w_T
wT,
w
T
w_T
wT再用来训练这个
w
w
w。
七、Deep Q-learning (DQN) Experience replay(经验回放)
什么是经验回放?
在收集数据experience samples的时候,是有一定的先后顺序的,但是在使用数据的时候,并不一定要遵循这个顺序。我们把这些数据存到一个
B
B
B集合中(从状态s出发,采取action a,得到reward r,跳转到下一个状态s’),这个集合的名字叫replay buffer。
每次训练神经网络的时候,从这个replay buffer中抽取一些mini-batch的随机样本。这些样本的抽取叫做experience replay,这需要遵循均匀分布。
为什么要经验回放?
为什么要在deep Q-learning中使用experience replay?为什么这个replay必须遵循均匀分布呢?
把
(
S
,
A
)
(S,A)
(S,A)当成一个索引,将其当成一个随机变量。给定
(
S
,
A
)
(S,A)
(S,A)后,
R
R
R和
S
′
S'
S′都服从系统的模型。假设
(
S
,
A
)
(S,A)
(S,A)服从均匀分布(因为我们没有先验知识,无法判断哪些
(
s
,
a
)
(s,a)
(s,a)重要,哪些不重要,所以我们只能让它服从均匀分布)。
为了不按照采集experience的顺序使用数据,采用了experience replay经验回放的方法,把数据打散,然后再均匀地从中抽取数据。
八、Deep Q-learning (DQN) 代码与例子
下面是Deep Q-learning的伪代码,off-policy 版:
初始的策略
π
b
\pi_b
πb产生了很多sample,这些sample被存在集合
B
B
B中。下面在每一个iteration中,首先从集合
B
B
B中进行随机的采样,然后对采样进行进一步的处理,计算
y
T
y_T
yT(希望近似值
q
^
\hat{q}
q^尽可能地接近
y
T
y_T
yT)。然后把
(
s
,
a
,
y
T
)
(s,a,y_T)
(s,a,yT)送入到神经网络中进行训练。每经过C次迭代,就把
w
w
w赋值给
w
T
w_T
wT。
例子:
任务是对所有的state action pair,去找到其optimal action value。一些具体的设置如下图所示。需要注意的是,这里设计的神经网络很简单,只有三层:隐藏层、输入层、输出层,隐藏层只有100个神经元。
下面是结果。可以看到TD error和state value error逐渐收敛到0。