强化学习的学习笔记
摘要
本来像搞懂PPO,发信啊没有前置知识我根本看不懂啊。所以今天整体复习了以下强化学习中的DQN、Policy gradient 和 actor critic。这里分别对三者简单说明了思路,然后尝试用pytorch-like伪代码描述流程。希望基于此,最近能进一步看懂PPO。
dqn
整体思维
我们都知道,强化学习就是,有个智能体,可以做出动作a和环境S交互,得到环境的反馈r(同时环境会变为S_),然后智能体会尽量最大化反馈,以使得模型变优秀。
而需要注意的是,很多优化任务并不是单步的,是一个流程。那么整体的反馈return并不能及时的得到。有些做法是把智能体的历史行为数据拿来训练(即离线策略off line policy),但是这样不高效。
dqb用td error使得边跑边训成为可能。
dqn中构建一个神经网络P(价值函数)用于预测某个状态S下动作a将得到的反馈值r。value = P(S)(a)
每次智能体进行交互,会得到一组数据:(S, a, r, S_)
我们很多人都明白了监督学习的那一套,那么从监督学习的角度出发,理论上就可以通过刚才收集到的数据,构建一个常见的MSE损失函数。
l
o
s
s
=
M
S
E
(
y
p
r
e
,
y
t
u
r
e
)
=
M
S
E
(
P
(
S
)
(
a
)
,
r
+
γ
∗
m
a
x
(
P
(
S
_
)
)
)
loss = MSE(y_{pre}, y_{ture}) = MSE(P(S)(a),r + \gamma *max(P(S\_)))
loss=MSE(ypre,yture)=MSE(P(S)(a),r+γ∗max(P(S_)))
但是可能会导致难以收敛????(这里没那么懂)
所以需要将y_pre和y_true中所用到的神经网络参数分离开,所以尝试用一个无梯度的编码器B代替P对y_ture进行计算。
同时,借鉴一个队列数据结构来存储数据集。
说实话这两个改进,真是非常像对比学习moco1中的队列和动量编码器。看来各领域间互相学习是可以碰撞出大火花的。
详细算法流程
P = MLP()
B = P.clone()
env
buffer = queue
S = env.reset()
for i in range(10000):
# 采集数据
values = P(S)
a = argmax(values)
r, S_ = S.act(a)
buffer.put([S, a, r, S_])
# 开始学习
if i > 5 :# 先收集5代在开始训
data = buffer.pop() # 随机获取一个batch数据
y_pre = P(data.S)(a)
y_ture = data.r + gamma * max(B(data.S_))
loss = MSE(y_pre,y_ture)
loss.back_ward()
B = P.clone()
## 后面海需要做什么判断终止条件等善后工作
Policy gradient
据说不要对照着dqn学pg,容易混淆。pg感觉就是很简单的,收集了很多历史数据后,收集历史数据计算y_ture = r_1 + \gamma * r_2 + … 。从监督学习的角度来说,这里网络Pi构建用于 预测当前 智能体能走的各动作的概率,即分布logits。
那么整体可以看成,实践阶段,智能体根据当前环境S,预测各动作的概率logits,然后根据logits抽样实际走的路,直到收集了足够多的数据后,停掉智能体,开始学习。学习阶段,从历史数据[S,a,r]中抽出数据计算 y_true和y_pre = env.act(Pi(S))[0]#(即走当前最优步骤所得到的回报)
这只是大致思路,实际不这么做,实际会有一个严格推导出的基于策略梯度的参数更新公式。????
先停在这。
Actor Critic
为了使得pg中不用每次都在结束之后,再用历史数据计算y_ture. 我们再用一个神经网络来预测y_ture。
智能体照例根据神经网络A基于env构建了logits,并且sample出了动作,然后C来评价A的动作,给出y值。那么A通过loss = C(S,a)进行训练。
同时通过td error构建y_true = r_1 + gamma * r_2, 则loss2 = MSE(C(S,a), y_true).
当然其中也用了一个Pi_old,以及重采样技巧. 详细还需仔细看看。
[1]:dqn: https://zhuanlan.zhihu.com/p/630554489
[2]: 深入理解强化学习(七)- Actor-Critic - 莫冉的文章 - 知乎
https://zhuanlan.zhihu.com/p/478709774