Q-Learning基础
笔记整理自李宏毅老师的公开课
基础知识
在之前的笔记关于Policy Gradient和PPO方法中,需要学习的是某个策略 π \pi π。给定出一个策略网络 π \pi π,然后令计算机通过不断地训练策略网络,来实现智能。训练的过程中,更新迭代的也是策略网络的参数。
而Q-Learning中,不是直接训练策略网络 π \pi π,而是给学习一个Crtic,该Critic用于评估Agent做出的每个选择的评估值。
Q-Learning的核心在于一个Q-Function: Q π ( s t , a ) Q^{\pi}(s_t,a ) Qπ(st,a)。该函数的意义是,在状态 s t s_t st下,如果选择了行动 a a a,该函数会得到的返回值,其中 π \pi π表示某种策略或者说是Actor。注意, s t s_t st状态下选择行动 a a a,是由 Q Q Q函数决定的,此时如果让策略 π \pi π来选择行动,则不一定是行动 a a a。在选择 a a a之后,此时再令 π \pi π自己玩下去,知道游戏终结,返回结果作为 Q Q Q的值。
再给出一个评估函数 V π ( s ) V^{\pi}(s) Vπ(s),该函数作用是评定某个Actor π \pi π在状态 s s s下的分数,分数越高说明对 π \pi π越有利。评估的方式一般有两个:
- Monte-Carlo方式:让 π \pi π一直与环境进行互动,每次互动都会有相应的结果,直到最后会有一个结果总和 G G G。之后,令 V π ( s ) V^{\pi}(s) Vπ(s)与 G G G进行比较产生误差,利用误差进行修正 V V V的神经网络。但是,这个方法要求必须玩到游戏结束才能进行网络训练,有些时间太长的游戏不太适合这个方式。而且,这个方式的Variance比较大,因为游戏和状态选择本省就有较大的随机性。
- Temporal-difference方式:在游戏流程 ⋯   , s t , a t , r t , s t + 1 , ⋯ \cdots,s_t,a_t,r_t,s_{t+1},\cdots ⋯,st,at,rt,st+1,⋯中,有核心公式 V π ( s t ) = V π ( s t + 1 ) + r t V^{\pi}(s_t)=V^{\pi}(s_{t+1})+r_t Vπ(st)=Vπ(st+1)+rt,其中 r t r_t rt表示在 s t s_t st状态采取行动 a t a_t at后得到的回报。那么利用上述公式,可以直接训练评估网络。但是,这个方式的缺点在于 V π V^{\pi} Vπ评估不一定是准确的。
实际中,TD方式比较常用。
Q π ( s , a ) Q^{\pi}(s,a) Qπ(s,a)网络有两种输入和输出方式:
- 把状态 s s s作为输入,输出每个 a a a的值。这种方式比较适合离散有限个 a a a的情况
- 把状态 s s s和采取的 a a a作为输入,输出一个标量值,作为 s s s状态下采取 a a a行动的评估值。适合无限连续状态的情景
使用Q-Learning做RL的基本步骤:
-
π \pi π与环境互动。
-
通过MC或者TD的方式,学习出 Q π ( s , a ) Q^{\pi}(s,a) Qπ(s,a)。
-
找到一个更好的 π ′ \pi^{'} π′,并令 π = π ′ \pi=\pi{'} π=π′。之后继续步骤1
补充,更新
π
′
\pi^{'}
π′的公式:
π
′
=
a
r
g
m
a
x
a
Q
π
(
s
,
a
)
\pi^{'}=\mathop{arg\ max}_a Q^{\pi}(s,a)
π′=arg maxaQπ(s,a)
有两点需要注意:
- π ′ \pi^{'} π′没有提取任何参数,它由 Q Q Q决定
- 这种方式不适合连续的action
Exploration策略
ϵ
−
G
r
e
e
d
y
\epsilon-Greedy
ϵ−Greedy策略:
a
c
t
i
o
n
=
{
a
r
g
m
a
x
a
Q
π
(
s
,
a
)
,
1
−
ϵ
r
a
n
d
o
m
a
c
t
i
o
n
,
ϵ
action=\begin{cases} \mathop{arg\ max}_a Q^{\pi}(s,a), & 1-\epsilon\\ random\ action, & \epsilon \\ \end{cases}
action={arg maxaQπ(s,a),random action,1−ϵϵ
其中
ϵ
∈
(
0
,
1
)
\epsilon \in(0,1)
ϵ∈(0,1),是一个概率。
Boltzmann Exploration策略:
P
(
a
∣
s
)
=
exp
(
Q
(
s
,
a
)
)
∑
a
exp
(
Q
(
s
,
a
)
)
P(a|s)=\frac{\exp{(Q(s,a))}}{\sum_a\exp {(Q(s,a))}}
P(a∣s)=∑aexp(Q(s,a))exp(Q(s,a))
选择策略时,是借助概率进行的。
Replay Buffer策略
每次都把数据存储到一固定buffer中,训练的时候,从buffer中随机选取一个批次进行训练。如果buffer满了,则用新的数据更替就的数据。
Q-Learning一般性的算法
- 初始化Q-function Q Q Q ,目标Q-function Q ^ = Q \hat{Q}=Q Q^=Q
- 不断进行迭代:
- 对于一次迭代中的每一步,进行如下操作:
- 对于一次迭代中的某个状态 s t s_t st,根据 Q Q Q选择 a t a_t at,这是依赖于Exploration(见下文)策略的选择
- 获取这一步的奖励 r t r_t rt,并到达下一个状态 s t + 1 s_{t+1} st+1
- 把 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)存储到一个buffer中(Replay buffer策略见下文)
- 从buffer中,选取一个批次的 ( s i , a i , r i , s i + 1 ) (s_i,a_i,r_i,s_{i+1}) (si,ai,ri,si+1)
- 目标函数 y = r i + m a x a Q ^ ( s i + 1 , a ) y=r_i+\mathop{max}_a \hat{Q}(s_{i+1},a) y=ri+maxaQ^(si+1,a)
- 更新 Q Q Q的参数,使得 Q ( s i , a i ) Q(s_i,a_i) Q(si,ai)接近 y y y
- 每进行 C C C步,更新 Q ^ = Q \hat {Q}=Q Q^=Q
- 对于一次迭代中的每一步,进行如下操作:
Q-Learning训练的常用技巧
Double Q-Learning Network
实际的游戏中,一般Q-Value都是被高估了。Double DQN就是为了尽量减少这种情况。DDQN的方法是有两个函数
Q
Q
Q与
Q
′
Q^{'}
Q′:
Q
(
s
t
,
a
t
)
=
r
t
+
Q
′
(
s
t
+
1
,
a
r
g
m
a
x
a
Q
(
s
t
+
1
,
a
)
)
Q(s_t,a_t)=r_t+Q^{'}\left(s_{t+1},\mathop{arg\ max}_aQ(s_t+1,a)\right)
Q(st,at)=rt+Q′(st+1,arg maxaQ(st+1,a))
实际操作中,会有两个Q-Network,一个是选择行动的
Q
Q
Q网络,另一个是Target Network
Q
′
Q^{'}
Q′。其中
Q
Q
Q是需要更新参数的网络。
Noisy Network
在每一次与环境开始互动的时候,对神经网络添加噪声。之后用这个神经网络与环境互动,并更新参数,一直反复进行。