学习强化学习总结的笔记,按照自己的理解总结的,还没总结完,边学边总结,可能存在错误欢迎指正
Deep Q Network(DQN)
DQN存在两个神经网络,即
(1) Action_Net:用于DQN选择动作a(输出为每个动作的Q值,然后选取最大Q值对应的动作。即输出后过softmax)。通过反向传播对权重进行更新。
输入维度:(状态数量,1)
输出维度:(动作数量,1)
(2)Target_Net:用于估计Q值以更新模型参数。参数更新的方式为每 X步用Action_Net 对Target_Net 进行覆盖。
输入维度:(状态数量,1)
输出维度:(动作数量,1)
DQN总流程图:
DQN的整个过程可分为两部分:使执行过程和学习过程。
首先是执行过程为Action_Net工作,即更新自身状态和储存样本。
然后是学习过程为Target_Net工作,即从经验池中抽取小批量数据然后进行更新模型参数。
上述两个过程一般在编写代码时主要在主函数main中体现。即先调用模型的动作选择函数model.choose_action(),然后在调用模型的学习函数model.learn().
【注】:执行过程中仅Action_Net参与,而学习过程中Action_Net和Target_Net均参与。
执行过程(Action_Net):
(1)将当前状态S扔进Action_Net,输出所有动作对应的Q值(
Q
A
Q_A
QA)并选取最大Q值的动作a执行。
(2)执行动作a与环境交互,获取下一个时刻的状态
s
′
s'
s′和奖励
r
r
r。
(3)储存样本(
S
,
a
,
R
,
s
′
S,a,R,s'
S,a,R,s′)
学习过程(Action_Net,Target_Net):
(4)从存储记忆中抽取一个batch作为训练样本,即若干个
(
S
,
a
,
R
,
S
′
)
(S,a,R,S')
(S,a,R,S′)。
(5)将
S
S
S扔进Action_Net获取所有动作对应的Q值(
Q
A
Q_A
QA)。
(6)将
S
′
S'
S′扔进Target_Net获取所有动作对应的Q值(
Q
T
Q_T
QT),然后计算
y
=
r
+
γ
m
a
x
a
Q
T
y = r + \gamma \underset{a}{max}Q_{T}
y=r+γamaxQT. 其中
γ
\gamma
γ表示折扣因子。
(7)定义
l
o
s
s
=
(
y
−
Q
A
)
2
loss = (y-Q_{A})^2
loss=(y−QA)2,并采用梯度下降更新Action_Net。
Double DQN:
由于DQN中Target_Net输出的 m a x a Q T \underset{a}{max}Q_{T} amaxQT会产生overestimate,说白了就是Target_Net选择的动作不对导致估计的Q值不太合适。那怎么解决这个问题,很简单,Q值没估计对主要是赖在 m a x a \underset{a}{max} amax上,那既然估计的动作不合适,那直接上实际的就完事了。所以这个动作的选择直接让Action_Net来做。所以DDQN的总体与DQN大致相同,唯一的区别在于学习过程中y值的计算方式不一样。
DQN:
Y
t
D
Q
N
=
R
t
+
1
+
γ
m
a
x
a
Q
(
S
t
+
1
,
a
:
θ
t
−
)
Y^{DQN}_t=R_{t+1}+ \gamma\underset{a}{max}Q(S_{t+1},a:\theta^-_t)
YtDQN=Rt+1+γamaxQ(St+1,a:θt−).
DQN中,
y
y
y值的计算只与Target_Net有关。
m
a
x
a
Q
(
S
t
+
1
,
a
:
θ
t
−
)
\underset{a}{max}Q(S_{t+1},a:\theta^-_t)
amaxQ(St+1,a:θt−)意思是Target_Net输出在状态
S
′
S'
S′下所有动作对应的Q值,然后看哪个动作对应的Q值最大,把该Q值选出来计算y.
Doube DQN:
Y
t
D
o
u
b
l
e
D
Q
N
=
R
t
+
1
+
γ
Q
(
S
t
+
1
,
a
r
g
m
a
x
a
Q
(
S
t
+
1
,
a
:
θ
t
)
;
θ
t
−
)
Y^{DoubleDQN}_t=R_{t+1}+ \gamma Q(S_{t+1}, \underset{a}{argmax}Q(S_{t+1},a:\theta_t);\theta^-_t)
YtDoubleDQN=Rt+1+γQ(St+1,aargmaxQ(St+1,a:θt);θt−).
DDQN中,
y
y
y值的计算与Target_Net和Action_Net均有关。即首先将状态
S
′
S'
S′扔进Action_Net把动作a给定死了。然后把状态
S
′
S'
S′扔进Target_Net出所有动作的Q值,然后直接把动作a的Q值拿去计算y(DDQN中,Target_Net的输出中即使动作a对应的Q值不是最大的,但仍然拿去计算y)。
DDQN学习过程(Action_Net,Target_Net):
(1)从存储记忆中抽取一个batch作为训练样本,即若干个
(
S
,
a
,
R
,
S
′
)
(S,a,R,S')
(S,a,R,S′)。
(2)将
S
S
S扔进Action_Net获取所有动作对应的Q值(
Q
A
Q_A
QA)。
(3)将
S
′
S'
S′扔进Action_Net根据输出的Q值确定动作
a
a
a。
(4)将
S
′
S'
S′扔进Target_Net获取所有动作对应的Q值(
Q
T
Q_T
QT),然后挑选出动作
a
a
a对应的Q值(
Q
T
a
Q^{a}_T
QTa)
(5)然后计算
y
=
r
+
γ
Q
T
a
y = r + \gamma Q^{a}_{T}
y=r+γQTa. 其中
γ
\gamma
γ表示折扣因子。
(6)定义
l
o
s
s
=
(
y
−
Q
A
)
2
loss = (y-Q_{A})^2
loss=(y−QA)2,并采用梯度下降更新Action_Net。
【注】:
θ
−
\theta^{-}
θ−表示Target_Net,
θ
\theta
θ表示Action_Net.
Actor-Critic
策略梯度是每个episode返回一个reward,因此存在以下三个问题:
① 由于agent在一个episode中会采取很多动作,我们很难说哪个动作对最后结果是有用的,换句话说,这种算法存在高方差(variance);
② 收敛速度慢;
③ 只在这种episodic环境下能用。
为了解决上述问题,于是提出了Actor-Critic算法。这种算法就是通过引入一种评价机制来解决高方差的问题。即 AC = Q-learning + policy gradient
Actor的前生是 Policy Gradients, 负责在连续动作中选取合适的动作并从环境中获取反馈(即 R e w a r d e n v Reward_{env} Rewardenv),;Critic的前生是 Q-learning 或者其他的以值为基础的学习法 , 负责对Actor进行评价(即 R e w a r d c r i Reward_{cri} Rewardcri), 通过对比 R e w a r d e n v Reward_{env} Rewardenv和 R e w a r d c r i Reward_{cri} Rewardcri,来对Critic进行更新。
算法流程:
1、选取初始状态
S
t
S_t
St;
2、Actor根据状态
S
t
S_t
St选取动作
a
t
a_t
at, 取得状态
S
t
+
1
S_{t+1}
St+1和
R
e
w
a
r
d
e
n
v
Reward_{env}
Rewardenv;
3、Critic评价状态
S
t
+
1
S_{t+1}
St+1;
4、计算TD_error: ;
5、根据TD_error更新Critic;
【注】:Actor的输入为
S
t
S_t
St,输出为
a
t
a_t
at
Critic的输入为
S
t
+
1
S_{t+1}
St+1,输出为
R
e
w
a
r
d
c
r
i
Reward_{cri}
Rewardcri
Actor-Critic方法的优势:可以单步更新,但比传统的 Policy Gradient要快
Actor-Critic方法的劣势:取决于Critic的价值判断,但是Critic难收敛,再加上Actor的更新,就更难收敛。为了解决收敛问题,提出了Deep Deterministic Policy Gradient(DDPG)。
Deep Deterministic Policy Gradient(DDPG)
DDPG分为Actor和Critic两部分,且每部分内均含有执行和target两个网络:即Actor( θ μ \theta_\mu θμ)、Actor_Targe( θ μ ′ \theta^{\mu'} θμ′)、Critic( θ Q \theta^Q θQ)、Critic_Target( θ Q ′ \theta^{Q'} θQ′)。
Actor需要输出连续的动作值,故Actor的更新采用policy gradient;Critic用于估计Q值,故采用对loss进行反向传播更新模型参数。与DQN一样,Target网络的权重通过执行网络覆盖来进行更新。
一句话概括 DDPG: 一种使用 Actor Critic 结构, 但是输出的不是行为的概率, 而是具体的行为, 用于连续动作 (continuous action) 的预测. 即 DDPG = Actor-Critic + DQN,提高了 Actor Critic 的稳定性和收敛性。
(图片源于https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/DDPG/)
Actor采用Policy Gradient
动作估计网络(Actor):用来输出实时的动作, 供 actor 在现实中实行.
动作现实网络(Actor_Target):用来更新价值网络系统的
Critic采用Value-Based
状态现实网络(Critic):输入(动作现实网络来的动作 + 状态的观测值)计算TD_error
状态估计网络(Critic_Target):拿着当时 Actor 施加的动作当做输入
模型更新:
Actor:
∇
θ
μ
≈
1
N
∑
i
∇
a
Q
(
s
,
a
∣
θ
Q
)
∣
s
=
s
i
,
a
=
μ
(
s
i
)
∇
θ
μ
μ
(
s
∣
θ
μ
)
∣
s
i
\nabla_{\theta^\mu}\approx \frac{1}{N}\sum_{i}\nabla_aQ(s,a|\theta^Q)|_{s=s_i,a=\mu(s_i)} \nabla_{\theta^\mu}\mu(s|\theta^\mu)|_{s_i}
∇θμ≈N1i∑∇aQ(s,a∣θQ)∣s=si,a=μ(si)∇θμμ(s∣θμ)∣si
1
N
∑
i
∇
a
Q
(
s
,
a
∣
θ
Q
)
∣
s
=
s
i
,
a
=
μ
(
s
i
)
\frac{1}{N}\sum_{i}\nabla_aQ(s,a|\theta^Q)|_{s=s_i,a=\mu(s_i)}
N1∑i∇aQ(s,a∣θQ)∣s=si,a=μ(si)(From Critic):这次 Actor 的动作要怎么移动, 才能获得更大的 Q.
∇
θ
μ
μ
(
s
∣
θ
μ
)
∣
s
i
\nabla_{\theta^\mu}\mu(s|\theta^\mu)|_{s_i}
∇θμμ(s∣θμ)∣si(From Actor):Actor 要怎么样修改自身参数, 使得 Actor 更有可能做这个动作.
Critic:
y
i
=
r
i
+
γ
Q
′
(
s
i
+
1
,
μ
′
(
s
i
+
1
∣
θ
μ
′
)
∣
θ
Q
′
)
l
o
s
s
:
L
=
1
N
∑
i
(
y
i
−
Q
(
s
i
,
a
i
∣
θ
Q
)
)
2
y_i=r_i+\gamma Q'(s_{i+1},\mu ' (s_{i+1}|\theta^{\mu'})|\theta^{Q'}) \\ loss:L=\frac{1}{N}\sum_i(y_i-Q(s_i,a_i|\theta^Q))^2
yi=ri+γQ′(si+1,μ′(si+1∣θμ′)∣θQ′)loss:L=N1i∑(yi−Q(si,ai∣θQ))2
上面这个是关于 Critic 的更新, 它借鉴了 DQN 和 Double Q learning 的方式, 有两个计算 Q 的神经网络, Q_target 中依据下一状态, 用 Actor 来选择动作, 而这时的 Actor 也是一个 Actor_target (有着 Actor 很久之前的参数). 使用这种方法获得的 Q_target 能像 DQN 那样切断相关性, 提高收敛性.