本文是DQN的学习笔记,学习内容为知乎上关于DQN的介绍。
原文链接为https://zhuanlan.zhihu.com/p/21262246?refer=intelligentunit
机器学习与RL:
增强学习在某种程度上也可看成机器学习的一种:
做很多次实验,每次实验得到一组数据样本
{
(
s
0
,
a
0
,
r
0
)
,
(
s
1
,
a
1
,
r
1
)
,
.
.
.
,
(
s
t
,
a
t
,
r
t
)
}
\{(s_0,a_0,r_0),(s_1,a_1,r_1),...,(s_t,a_t,r_t)\}
{(s0?,a0?,r0?),(s1?,a1?,r1?),...,(st?,at?,rt?)},很多次这样的实验构成我们的数据样本集。根据数据样本集进行学习,找到最好的policy。
其中
τ
:
=
{
(
s
0
,
a
0
)
,
(
s
1
,
a
1
)
,
.
.
.
,
(
s
t
,
a
t
)
}
\tau:=\{(s_0,a_0),(s_1,a_1),...,(s_t,a_t)\}
τ:={(s0?,a0?),(s1?,a1?),...,(st?,at?)}称为某次实验的轨迹。
可以认为目标函数就是total reward,然后我们的目标就是最大化total reward。
上面的每组实验可以看做是机器学习中的某次优化目标函数的实验。机器学习中有GD,增强学习中应该也有相应的算法。
Value func and action value func:
增强学习(RL)的目标是找一个policy最大化return:
G
t
=
∑
k
=
0
∞
λ
k
R
t
+
k
+
1
G_t=\sum_{k=0}^\infty\lambda^k R_{t+k+1}
Gt?=k=0∑∞?λkRt+k+1? 但除非整个过程结束,否则显然我们无法获取所有的reward来计算出每个状态的Return。
因此,引入一个概念: 价值函数Value Function,用value function
v
(
s
)
v(s)
v(s)来表示一个状态未来的潜在价值
v
(
s
)
=
E
[
G
t
∣
S
t
=
s
]
v(s)=E[G_t|S_t=s]\\
v(s)=E[Gt?∣St?=s] 实际处理时往往是最大化value function。这里的E代表对t时刻之后所有时刻的reward取期望。
注:设
θ
\theta
θ代表某个policy对应的参数,由于
所以上述期望实际需要对以下三种随机性取:
1-不同的策略, 即不同的
θ
\theta
θ
2-每种策略对应的概率分布,即
p
θ
(
a
t
∣
s
t
)
(
?
t
)
p_\theta(a_t|s_t)(\forall t)
pθ?(at?∣st?)(?t)
3-给定当前状态和action之后,下一时刻状态的概率分布
p
(
s
t
+
1
∣
s
t
,
a
t
)
(
?
t
)
p(s_{t+1}|s_t,a_t)(\forall t)
p(st+1?∣st?,at?)(?t)
前面提到因为
G
t
G_t
Gt?没法计算所以才引入
v
(
s
)
v(s)
v(s)的,那么
v
(
s
)
v(s)
v(s)怎么计算呢?就需要借助Bellman方程:
v
(
s
)
=
E
[
R
t
+
1
+
λ
v
(
S
t
+
1
)
∣
S
t
=
s
]
v(s)=E[R_{t+1}+\lambda v(S_{t+1})|S_t=s]
v(s)=E[Rt+1?+λv(St+1?)∣St?=s] 即当前状态的价值只和当前状态的reward以及下一步的价值有关。因此可以用迭代的方法来计算value func!!!
这里的E代表对
S
t
+
1
S_{t+1}
St+1?即下一时刻的状态以及
R
t
+
1
R_{t+1}
Rt+1?取期望。因此把需要取期望的随机性从所有的t简化为了当前时刻t。
按定义其为:
∑
s
′
,
r
p
(
s
′
,
r
∣
s
)
[
r
+
λ
v
(
s
′
)
]
\sum_{s',r}p(s',r|s)[r+\lambda v(s')]
s′,r∑?p(s′,r∣s)[r+λv(s′)] value function不依赖于策略,但实际更常用的是依赖于策略的value function,称之为action value function,其定义为
Q
π
(
s
,
a
)
:
=
E
[
∑
k
=
0
∞
λ
k
r
t
+
k
+
1
∣
s
,
a
]
=
E
[
r
t
+
1
+
λ
Q
π
(
s
′
,
a
′
)
∣
s
,
a
]
Q^\pi(s,a):=E[\sum_{k=0}^\infty\lambda^k r_{t+k+1}|s,a]=E[ r_{t+1}+\lambda Q^\pi(s',a')|s,a]
Qπ(s,a):=E[k=0∑∞?λkrt+k+1?∣s,a]=E[rt+1?+λQπ(s′,a′)∣s,a] 即该函数既依赖于状态s,又依赖于动作a。这里第二个等号根据的是bellman方程。这里的r仍然代表reward,但表示的是给定某个策略
π
\pi
π之后的reward。
第一个E代表对接下来所有时刻的所有可能的状态取期望,但由于这时策略
π
\pi
π已知,所以实际上这里是对
p
θ
(
a
t
∣
s
t
)
(
?
t
)
,
p
(
s
t
+
1
∣
s
t
,
a
t
)
(
?
t
)
p_\theta(a_t|s_t)(\forall t),p(s_{t+1}|s_t,a_t)(\forall t)
pθ?(at?∣st?)(?t),p(st+1?∣st?,at?)(?t)取期望。
第二个E把需要取期望的随机性从所有的t简化为了当前时刻t。
我们希望找到能让
Q
π
(
s
,
a
)
Q^\pi(s,a)
Qπ(s,a)最大的那个策略,即
Q
?
(
s
,
a
)
=
max
?
π
Q
π
(
s
,
a
)
Q^*(s,a)=\max_\pi Q^\pi(s,a)
Q?(s,a)=πmax?Qπ(s,a) 由于
Q
?
(
s
,
a
)
=
E
[
r
t
+
1
+
λ
Q
?
(
s
′
,
a
′
)
∣
s
,
a
]
Q^*(s,a)=E[ r_{t+1}+\lambda Q^*(s',a')|s,a]
Q?(s,a)=E[rt+1?+λQ?(s′,a′)∣s,a] 由于
Q
?
Q^*
Q?是所有策略对应的
Q
Q
Q值中最大的那个,所以其对应的策略采取的行为
a
′
a'
a′自然也是最优的,即a‘是让
Q
?
Q^*
Q?最大的a值。
Value iteration:
那么怎么得到最好的策略
π
\pi
π呢?可以使用所谓的Value iteration(注意这个迭代使用的是value func, 而不是action value func):
根据定义,
v
?
(
s
)
=
max
?
a
E
[
R
t
+
1
+
γ
v
?
(
S
t
+
1
)
∣
S
t
=
s
,
A
t
=
a
]
=
max
?
a
∑
s
′
,
r
p
(
s
′
,
r
∣
s
,
a
)
[
r
+
γ
v
?
(
s
′
)
]
v^*(s)=\max_a E[R_{t+1}+\gamma v^*(S_{t+1})|S_t=s, A_t=a]\\ =\max_a \sum_{s',r}p(s',r|s,a)[r+\gamma v^*(s')]
v?(s)=amax?E[Rt+1?+γv?(St+1?)∣St?=s,At?=a]=amax?s′,r∑?p(s′,r∣s,a)[r+γv?(s′)] 对应的迭代形式为:
v
k
+
1
(
s
)
=
max
?
a
E
[
R
t
+
1
+
γ
v
k
(
S
t
+
1
)
∣
S
t
=
s
,
A
t
=
a
]
=
max
?
a
∑
s
′
,
r
p
(
s
′
,
r
∣
s
,
a
)
[
r
+
γ
v
k
(
s
′
)
]
v_{k+1}(s)=\max_a E[R_{t+1}+\gamma v_k(S_{t+1})|S_t=s, A_t=a]\\ =\max_a \sum_{s',r}p(s',r|s,a)[r+\gamma v_k(s')]
vk+1?(s)=amax?E[Rt+1?+γvk?(St+1?)∣St?=s,At?=a]=amax?s′,r∑?p(s′,r∣s,a)[r+γvk?(s′)]
Q-Learning:
注意Value iteration的每次更新实际是在更新一个函数,因此每次需要对每个状态s都要遍历更新一遍,并且因为要关于a取最大值,所以每次也需要对所有的a遍历一下。
但实际情况下我们没办法遍历所有的状态,还有所有的动作,我们只能得到有限的系列样本。Q-learning针对Value iteration的这个缺陷给出了解决的办法,其对应的更新方法类似于GD/SGD:
Q
(
S
t
,
A
t
)
←
Q
(
S
t
,
A
t
)
+
α
[
R
t
+
1
+
λ
max
?
a
∈
A
Q
(
S
t
+
1
,
a
)
?
Q
(
S
t
,
A
t
)
]
Q(S_{t},A_t)\leftarrow Q(S_{t},A_t)+\alpha [R_{t+1}+\lambda\max_{a\in A} Q(S_{t+1},a)-Q(S_t,A_t)]
Q(St?,At?)←Q(St?,At?)+α[Rt+1?+λa∈Amax?Q(St+1?,a)?Q(St?,At?)] 其中
α
\alpha
α是学习率,
A
=
{
A
1
,
.
.
.
,
A
t
,
.
.
.
}
A=\{A_1,...,A_t,...\}
A={A1?,...,At?,...}
注意这里并不需要用到所有状态s下的Q值。只需要知道对于所有可能的
(
S
t
,
A
t
)
(S_t,A_t)
(St?,At?)对应的Q值即可。因此可以用矩阵来存储所有的Q值。
Q-Learning的缺陷:维数灾难
显然状态s,行动a的所有可能取值决定了储存Q值的矩阵的大小。因此当状态s的可能取值太大时Q储存Q矩阵所用空间就会过大。
一个可能的解决办法是不再记录所有可能的Q值而是用一个函数
f
(
s
,
a
)
f(s,a)
f(s,a)来近似
Q
(
s
,
a
)
Q(s,a)
Q(s,a)。因此只需要知道
f
f
f的所有参数就可以确定下来Q在任意状态和行动下的
Q
Q
Q值了。
DQN:
怎么确定下来
f
f
f呢?DQN给出的方案是跟DL结合,使用CNN表示
f
f
f, 因此
f
f
f的确定转化为了训练CNN。而训练CNN需要训练样本。这些样本的自变量当然是不同的状态s(知乎上解释了为什么没有行动a),但是样本的标签怎么确定呢?
回忆Q-learning算法:
Q
(
S
t
,
A
t
)
←
Q
(
S
t
,
A
t
)
+
α
[
R
t
+
1
+
λ
max
?
a
∈
A
Q
(
S
t
+
1
,
a
)
?
Q
(
S
t
,
A
t
)
]
Q(S_{t},A_t)\leftarrow Q(S_{t},A_t)+\alpha [R_{t+1}+\lambda\max_{a\in A} Q(S_{t+1},a)-Q(S_t,A_t)]
Q(St?,At?)←Q(St?,At?)+α[Rt+1?+λa∈Amax?Q(St+1?,a)?Q(St?,At?)] 我们的最终目标是让
Q
(
S
t
,
A
t
)
=
R
t
+
1
+
λ
max
?
a
∈
A
Q
(
S
t
+
1
,
a
)
Q(S_t,A_t)=R_{t+1}+\lambda\max_{a\in A} Q(S_{t+1},a)
Q(St?,At?)=Rt+1?+λmaxa∈A?Q(St+1?,a),因此只需取标签为等式右边的值即可。故CNN对应的目标函数为:
L
(
w
)
=
E
[
r
+
λ
max
?
a
′
Q
(
s
′
,
a
′
,
w
)
?
Q
(
s
,
a
,
w
)
]
2
L(w)=E[r+\lambda\max_{a'}Q(s',a',w)-Q(s,a,w)]^2
L(w)=E[r+λa′max?Q(s′,a′,w)?Q(s,a,w)]2 这里w代表CNN的权重,Q代表CNN代表的函数。
我的理解是这里的E代表的是样本平均值。
|