文章目录
证明收敛?
-
对于Value迭代:不动点证明的思路
首先定义一个算子 B : B V = max a r a + γ T a V \mathcal{B}:\mathcal{B}V=\max_ar_a+\gamma\mathcal{T}_aV B:BV=maxara+γTaV
接着有一个不动点 V ∗ ( s ) = max a r ( s , a ) + γ E [ V ∗ ( s ′ ) ] V^*(s)=\max_{a}r(s,a)+\gamma E[V^*(s')] V∗(s)=maxar(s,a)+γE[V∗(s′)],有 V ∗ = B V ∗ V^*=\mathcal{B}V^* V∗=BV∗
每次使用算子都会,V离不动点的距离有收缩: ∣ ∣ B V − V ∗ ∣ ∣ ∞ ≤ γ ∣ ∣ V − V ∗ ∣ ∣ ∞ ||\mathcal{B}V-V^*||_\infty\leq\gamma||V-V^*||_{\infty} ∣∣BV−V∗∣∣∞≤γ∣∣V−V∗∣∣∞ -
对于神经网络拟合的Value迭代:对于监督学习,也是得到一个 V ′ V' V′使得距离 ∣ ∣ V ′ ( s ) − ( B V ) ( s ) ∣ ∣ 2 ||V'(s)-(\mathcal{B}V)(s)||^2 ∣∣V′(s)−(BV)(s)∣∣2最小——投影
V的迭代是这样的 V ← Π B V V\leftarrow \Pi\mathcal{B}V V←ΠBV
定义一个新的算子 Π : Π V = arg max V ′ ∈ Ω 1 2 ∑ ∣ ∣ V ′ ( s ) − V ( s ) ∣ ∣ 2 \Pi:\Pi V=\arg\max_{V'\in\Omega}\frac{1}{2}\sum||V'(s)-V(s)||^2 Π:ΠV=argmaxV′∈Ω21∑∣∣V′(s)−V(s)∣∣2, Π \Pi Π实际上是用l2范数对 Ω \Omega Ω的投影,也是收缩的
[!收缩:]
∣ ∣ Π V − Π V ˉ ∣ ∣ 2 ≤ ∣ ∣ V − V ˉ ∣ ∣ 2 ||\Pi V-\Pi \bar{V}||^2\leq||V-\bar{V}||^2 ∣∣ΠV−ΠVˉ∣∣2≤∣∣V−Vˉ∣∣2(注意这里用的是2范数而上面是无穷范数,两种算子都是再各自的范数上收缩的),但是把两个算子结合在一起就不会收缩了
所以就导致了使用Q-table能够保证收敛,而用神经网络拟合的V的Q-iteration不能够收敛
- 对于Q-iteration
和上面一样,用神经网络拟合时不收敛,因为有投影算子 - 对于A-C
也是再用神经网络拟合的时候不收敛
尽管理论上令人沮丧,但是实际中可以表现的很好!
Deep RL with Q-Functions
这里面包含了replay buffer和target network,但是暂时不细说了。
Polyak averaging
:模型平均的问题
Double Q-Learning
在实际的使用过程中,Q-Learning总是出现overestimate的问题:估计的价值比实际的价值高很多:
为什么会出现这样呢:
我们的target value是
y
i
=
r
i
+
γ
max
a
j
′
Q
ϕ
′
(
s
j
′
,
a
j
′
)
y_i=r_i+\gamma\max_{a'_j}Q_{\phi'}(s'_j,a'_j)
yi=ri+γmaxaj′Qϕ′(sj′,aj′),其中
ϕ
′
\phi'
ϕ′是当前的价值函数
imagine we have two random variables:
X
1
,
X
2
X_1,X_2
X1,X2,We have
E
[
max
(
X
1
,
X
2
)
]
≥
max
(
E
[
X
1
]
,
E
X
2
)
E[\max(X_1,X_2)]\ge\max(E[X_1],E{X_2})
E[max(X1,X2)]≥max(E[X1],EX2)
而对于
Q
ϕ
′
(
s
′
,
a
′
)
Q_{\phi'}(s',a')
Qϕ′(s′,a′),它是对真正Q函数的估计,也就是真正的Q函数加上一些“噪声”,所以当我们取
Q
ϕ
′
(
s
′
,
a
′
)
Q_{\phi'}(s',a')
Qϕ′(s′,a′)的最大值的时候,尽管“噪声”是无偏的,也会导致最后的值变大:
max
a
′
Q
ϕ
′
(
s
′
,
a
′
)
=
Q
ϕ
′
(
s
′
,
arg
max
a
′
Q
ϕ
′
(
s
′
,
a
′
)
)
\max_{a'}Q_{\phi'}(s',a')=Q_{\phi'}(s',\arg\max_{a'} Q_{\phi'}(s',a'))
a′maxQϕ′(s′,a′)=Qϕ′(s′,arga′maxQϕ′(s′,a′))
为什么有上面这个式子的写法? 别忘了遵循贪婪(没有”探索“)的策略,我们选择下一个action就是根据
Q
ϕ
′
Q_{\phi'}
Qϕ′的,因为是根据
arg
max
\arg\max
argmax选出来的,因此如果我们选择了正的噪声的action作为价值函数的输入,那么价值函数会基于同样的贪婪也会选择正的噪声,就会overestimate。
理论上的解法
因此,提出了Double Q-Learning
,我们分别使用两个神经网络去产生动作和估计价值,这样两个神经网络拟合时产生的”噪声“就是不相关的!——这个操作非常像通信里面的啊!
Q
ϕ
A
(
s
,
a
)
=
r
+
γ
Q
ϕ
B
(
s
′
,
arg
max
a
′
Q
ϕ
A
(
s
′
,
a
′
)
)
Q_{\phi_A}(s,a)=r+\gamma Q_{\phi_B}(s',\arg\max_{a'} Q_{\phi_A}(s',a'))
QϕA(s,a)=r+γQϕB(s′,arga′maxQϕA(s′,a′))
Q
ϕ
B
(
s
,
a
)
=
r
+
γ
Q
ϕ
B
(
s
′
,
arg
max
a
′
Q
ϕ
B
(
s
′
,
a
′
)
)
Q_{\phi_B}(s,a)=r+\gamma Q_{\phi_B}(s',\arg\max_{a'} Q_{\phi_B}(s',a'))
QϕB(s,a)=r+γQϕB(s′,arga′maxQϕB(s′,a′))
实际上的解法
实际上,我们不需要麻烦的创造一个动作选择神经网络,一个价值神经网络,而是直接利用现成的:
别忘了我们其实有两个
ϕ
\phi
ϕ和
ϕ
′
\phi'
ϕ′的,一个表示目标函数,另一个则是不断更新的,而目标函数会定期更新,因此我们直接借助这两个现成的:
y
i
=
r
i
+
γ
Q
ϕ
′
(
s
j
′
,
arg
max
a
′
Q
ϕ
(
s
′
,
a
′
)
)
y_i=r_i+\gamma Q_{\phi'}(s'_j,\arg\max_{a'}Q_{\phi}(s',a'))
yi=ri+γQϕ′(sj′,arga′maxQϕ(s′,a′))
上面利用当前的神经网络去确定动作action,而利用目标网络去确定价值value
DDPG: Q-Learning with continuous actions
- 各种对连续动作采样的方法
- DDPG
回忆一下,我们的目标是
max
a
Q
ϕ
(
s
,
a
)
=
Q
ϕ
(
s
,
arg
max
a
Q
ϕ
(
s
,
a
)
)
\max_a Q_{\phi}(s,a)=Q_{\phi}(s,\arg\max_{a}Q_{\phi}(s,a))
maxaQϕ(s,a)=Qϕ(s,argmaxaQϕ(s,a))
因此,想办法训练另一个网络
μ
θ
≈
arg
max
a
Q
ϕ
(
s
,
a
)
\mu_\theta\approx\arg\max_a Q_\phi(s,a)
μθ≈argmaxaQϕ(s,a),它可以看作是一个状态-动作函数,用来模拟
arg
max
\arg\max
argmax的过程
怎么去寻找这个网络的参数呢?因为我们是寻找最大的Q,因此用梯度上升就可以
d
Q
ϕ
d
θ
=
d
a
d
θ
d
Q
ϕ
d
a
\frac{dQ_\phi}{d\theta}=\frac{da}{d\theta}\frac{dQ_\phi}{da}
dθdQϕ=dθdadadQϕ
新的target:
y
j
=
r
j
+
γ
Q
ϕ
′
(
s
j
′
,
μ
θ
(
s
j
′
)
)
≈
r
j
+
γ
Q
ϕ
′
(
s
j
′
,
arg
max
a
′
Q
ϕ
′
(
s
j
′
,
a
j
′
)
)
y_j=r_j+\gamma Q_{\phi'}(s'_j,\mu_\theta(s'_j))\approx r_j+\gamma Q_{\phi'}(s'_j,\arg\max_{a'}Q_{\phi'}(s'_j,a'_j))
yj=rj+γQϕ′(sj′,μθ(sj′))≈rj+γQϕ′(sj′,argmaxa′Qϕ′(sj′,aj′))
Advanced tips for Q-Learning
- Q-Learning再不同问题上的稳定度很不同,因此需要首先确保稳定性,包括选择合适的随机数种子。
- 较大的replay buffer能够帮助提高稳定性
- Looks more like fitted Q-iteration
- 学习可能需要很长时间才能有突破
- 进行探索的时候,先把 ϵ \epsilon ϵ设置大一点,随后慢慢的逐步减小
- Bellman error gradients can be big: clip gradients or use Huber loss instead L = { x 2 / 2 if ∣ x ∣ ≤ δ δ ∣ x ∣ − δ 2 / 2 otherwise L=\begin{cases} x^2/2& \text{ if } |x|\leq\delta \\ \delta|x|-\delta^2/2& \text{ otherwise } \end{cases} L={x2/2δ∣x∣−δ2/2 if ∣x∣≤δ otherwise
- 多使用Double Q-Learning,非常好用
- 变化的学习率或者Adam optimizer会很有帮助