动作的随机性来自于策略函数。给定当前的状态
s
s
s,策略函数
π
(
a
∣
s
)
\pi(a|s)
π(a∣s)会算出动作空间中每个动作
a
a
a的概率值。智能体agent执行的动作是随机抽样的结果,所以带有随机性。
状态的随机性来自于状态转移函数,即当状态
s
s
s和动作
a
a
a都被确定下来,下一个状态仍然有随机性。我们的环境用状态转移函数
p
(
s
′
∣
s
,
a
)
p(s^{'}|s,a)
p(s′∣s,a)计算所有可能状态的概率,然后做随机抽样,得到新的状态。
Q-learning
我们从value-based的表格式算法开始总结,第一个就是Q-learning。
算法流程
表格式算法即用一个表格去存储不同状态下不同行为对应的Q价值,如下图所示:
具体表格中的每个Q值更新的公式如下:
算法流程简单来说就是先随机初始化获得一个状态
s
s
s,在当前状态
s
s
s下根据
ϵ
\epsilon
ϵ-greedy策略选择一个动作
a
a
a,然后执行我们选择的动作
a
a
a与环境交互,获取下一个状态
s
′
s^{'}
s′,并得到
s
′
s^{'}
s′的即时回报
R
R
R,这时我们会更新我们初始状态行为对的Q值
Q
(
s
,
a
)
Q(s,a)
Q(s,a),我们更新公式中的$ max_{a’}Q(s^{’}, a{’})$即使用下一个状态$s{’}
中
对
应
价
值
最
大
的
动
作
的
Q
值
进
行
更
新
,
注
意
这
里
只
是
更
新
,
并
不
会
真
的
执
行
这
个
价
值
最
大
的
动
作
。
这
里
的
更
新
策
略
(
评
估
策
略
)
与
我
们
的
行
为
策
略
(
中对应价值最大的动作的Q值进行更新,注意这里只是更新,并不会真的执行这个价值最大的动作。这里的更新策略(评估策略)与我们的行为策略(
中对应价值最大的动作的Q值进行更新,注意这里只是更新,并不会真的执行这个价值最大的动作。这里的更新策略(评估策略)与我们的行为策略(\epsilon$-greedy)不同,这种算法我们也称为off-policy算法。
TD算法
我们注意到,我们算法更新公式中的核心
(
R
+
γ
m
a
x
a
′
Q
(
S
′
,
a
′
)
−
Q
(
S
,
A
)
)
(R + \gamma max_{a'}Q(S^{'}, a^{'}) - Q(S,A))
(R+γmaxa′Q(S′,a′)−Q(S,A)),两项的差值显然是在计算误差,那这是在计算什么误差?为什么这么计算误差就是对的?
我们一般把
R
+
γ
m
a
x
a
′
Q
(
S
′
,
a
′
)
R + \gamma max_{a'}Q(S^{'}, a^{'})
R+γmaxa′Q(S′,a′)称为TD-Target,把
(
R
+
γ
m
a
x
a
′
Q
(
S
′
,
a
′
)
−
Q
(
S
,
A
)
)
(R + \gamma max_{a'}Q(S^{'}, a^{'}) - Q(S,A))
(R+γmaxa′Q(S′,a′)−Q(S,A))称为TD-Error。
我们知道
Q
(
S
,
A
)
Q(S,A)
Q(S,A)是我们估计的在状态
S
S
S下采取动作
A
A
A的价值,这个价值是我们从表格近似得到的,而
R
+
γ
m
a
x
a
′
Q
(
S
′
,
a
′
)
R + \gamma max_{a'}Q(S^{'}, a^{'})
R+γmaxa′Q(S′,a′)是我们执行了动作后实际获得的奖励
R
R
R加上后续状态的估计
γ
m
a
x
a
′
Q
(
S
′
,
a
′
)
\gamma max_{a'}Q(S^{'}, a^{'})
γmaxa′Q(S′,a′),前者是纯估计,后者是实际得到的奖励+估计,可以把他称为部分估计,部分估计因为有事实的部分,所以一定会比纯估计要更准确,所以我们训练算法的时候让TD-Error变小的过程就是让我们估计的
Q
(
S
,
A
)
Q(S,A)
Q(S,A)逼近TD-Target的过程,也就是让我们不准确的“全估计”逼近更准确的“部分估计”的过程。
既然我们要结合深度学习,那就需要构造损失函数进行训练,回想之前Q-learning的更新公式,其中的核心部分是TD-Target减去Q(S,A),TD-Target是比Q(S,A)更准确的估计,可以当做true-label,把Q(S,A)当做我们的predict-label,这样我们的损失函数就构造出来了:
L
(
w
)
=
1
2
[
Q
(
s
t
,
a
t
;
w
)
−
T
D
−
T
a
r
g
e
t
]
2
L(w) = \frac{1}{2} [Q(s_t,a_t;w) - TD-Target] ^ 2
L(w)=21[Q(st,at;w)−TD−Target]2
Experience Replay Buffer
我们知道深度学习要求我们的输入数据是独立同分布(independent and identically distributed,i.i.d.),而在强化学习当中,因为数据(数据格式一般为:state, action, reward, next_state)之间是有关联的,所以我们不能像深度学习一样直接输入进网络。因此我们把需要的数据保存起来,保存进我们的经验池当中,当经验池中的数据足够多时,随机抽样得到的数据就能接近i.i.d.。
回顾一下,原始DQN是这样计算TD-Error:
(
R
+
γ
m
a
x
a
′
Q
(
s
′
,
a
′
;
w
)
−
Q
(
s
,
a
;
w
)
)
(R + \gamma max_{a'}Q(s^{'}, a^{'};w) - Q(s,a;w))
(R+γmaxa′Q(s′,a′;w)−Q(s,a;w)),然后通过梯度下降更新
w
w
w,使得
Q
(
s
,
a
;
w
)
Q(s,a;w)
Q(s,a;w)越来越接近TD-Target。想要切断bootstrap带来的偏差,可以用另一个网络计算TD-Target,而不是用DQN自己计算TD-Target。另一个网络就叫做目标网络(Target Network),把他记做
Q
(
s
,
a
;
w
−
)
Q(s,a;w^{-})
Q(s,a;w−),它的神经网络结构与 DQN 完全相同,但是参数和原始参数不同。
原来的经验回放是从经验池当中均匀抽样出来样本进行更新,但其实这是有问题的,因为不同样本的重要性是不同的,这里的越重要指的是预测的
Q
(
S
,
A
)
Q(S,A)
Q(S,A)离TD-Target越远(TD-Error越大),即你预测的Q值越不准我自然越要拿你出来更新让你变准。
优先经验回放对经验池的样本做非均匀抽样,对经验池里的每个样本都赋予一个权重,权重即是TD-Error的绝对值
∣
δ
i
∣
|\delta_i|
∣δi∣,它的抽样概率取决于TD-Error。有两种方法设置抽样概率,一种是:
p
i
=
∣
δ
i
∣
+
ϵ
p_i = |\delta_i| + \epsilon
pi=∣δi∣+ϵ
此处的
ϵ
\epsilon
ϵ是个很小的数,防止抽样概率接近零,用于保证所有样本都以非零的概率被抽到。第二种是先将
δ
i
\delta_i
δi做降序排列,然后计算:
p
i
=
1
r
a
n
k
(
i
)
p_i = \frac{1}{rank(i)}
pi=rank(i)1
这里的rank(i)是
δ
(
i
)
\delta(i)
δ(i)的序号,大的
δ
(
i
)
\delta(i)
δ(i)序号小,小的
δ
(
i
)
\delta(i)
δ(i)序号大。
优先经验回放做非均匀抽样,导致不同的样本抽样概率不同,改变了样本分布,而我们一开始引起经验回放就是为了要独立同分布的数据进行训练,所以优先经验回放必然引起偏差。应该相应调整学习率,抵消掉不同抽样概率造成的偏差。如果一条样本被抽样的概率大,那么它的学习率就应该比较小。可以这样设置学习率:
α
i
=
α
(
b
∗
p
i
)
β
\alpha_i = \frac{\alpha}{(b * p_i)^\beta}
αi=(b∗pi)βα
此处的b是经验池样本的总数,
β
\beta
β是一个范围在0到1的超参数,需要调整。
这里要注意,抽样概率和学习率之间的变化并不会抵消。比如当
β
\beta
β=1时,如果抽样概率
p
i
p_i
pi变大10倍,从公式来看那学习率就减少10倍,看起来似乎两者的变化抵消了,但其实并不是。两种情况并不等价:
那我们该如何缓解最大化造成的高估呢?我们回想一下前面使用目标网络的思路,为了缓解bootstrap造成的偏差,让计算TD-Target和计算
Q
(
s
,
a
)
Q(s,a)
Q(s,a)的网络不为同一个。那这种思路是否能用来缓解最大化造成的高估呢?显然是可以的。
我们可以把计算TD-Target分为两步,第一步是通过最大化选择动作
a
r
g
m
a
x
Q
(
s
,
a
;
w
)
argmax Q(s,a;w)
argmaxQ(s,a;w),第二步则是求值
y
=
R
+
γ
Q
(
s
,
a
;
w
)
y = R + \gamma Q(s,a;w)
y=R+γQ(s,a;w),沿用之前的思路,我们只要把选择动作的网络和求值的网络区分开,一个用原本的网络,一个用目标网络,自然就可以缓解最大化造成的高估。