强化学习的数学原理学习笔记 - 基于模型(Model-based)
文章目录
参考资料:
- 【强化学习的数学原理】课程:从零开始到透彻理解(完结)(主要)
- Sutton & Barto Book: Reinforcement Learning: An Introduction
- 机器学习笔记
- GitHub - MathFoundationRL/Book-Mathmatical-Foundation-of-Reinforcement-Learning
本系列文章大部分内容来自西湖大学赵世钰老师的强化学习的数学原理课程(参考资料1),并参考了部分参考资料2、3的内容进行补充。
系列博文索引:(更新中)
*注:【】内文字为个人想法,不一定准确
概览:RL方法分类
*图源:https://zhuanlan.zhihu.com/p/36494307
RL算法中存在两种策略:
- 行为策略(Behavior policy):与环境交互,生成experience采样
- 目标策略(Target policy):迭代更新,直到收敛至最优策略
据此,可以将RL算法分为两类:
- On-policy:Behavior policy即为Target policy,例如MC、Sarsa等
- Off-policy:Behavior policy与Target policy可以不同,例如Q-learning等
- 好处:从别的策略得到的经验中学习,允许更为广泛的探索而不必考虑利用
*On-policy可以看作是Off-policy的一种特殊情况,因为Off-policy允许两种策略相同。
基于模型(Model-Based)
基于模型:环境MDP的模型已知,基于动态规划(DP)求解
- 优:提供了RL的理论基础
- 劣:假设过强(完美的环境模型,比如状态转移矩阵),计算开销过高
基于模型的方法:
- 策略迭代:收敛速度较快,适用于小状态空间
- 值迭代:计算量较少,适用于大状态空间
*值迭代可以看作是策略迭代的一种特殊情况
值迭代(Value Iteration)
算法步骤:在第 k k k次迭代中
- 策略更新:给定 v k v_k vk?,求解对应的策略 π k + 1 = arg?max ? π ( r π + γ P π v k ) \pi_{k+1} = \argmax_\pi (r_\pi + \gamma P_\pi v_k) πk+1?=argmaxπ?(rπ?+γPπ?vk?)
- 值更新:根据策略
π
k
+
1
\pi_{k+1}
πk+1?,计算
v
k
+
1
=
r
π
k
+
1
+
γ
P
π
k
+
1
+
v
k
v_{k+1} = r_{\pi_{k+1}} + \gamma P_{\pi_{k+1}} + v_k
vk+1?=rπk+1??+γPπk+1??+vk?
- *此处的 v k v_k vk?并非状态值,只是一个值,因为其并不满足贝尔曼方程
*详细步骤见强化学习的数学原理学习笔记 - 基础知识中求解贝尔曼最优方程部分。
算法公式:
v
k
+
1
(
s
)
=
max
?
a
∑
s
′
,
r
p
(
s
′
,
r
∣
s
,
a
)
[
r
+
γ
v
k
(
s
′
)
]
v_{k+1} (s) = \max_a \sum_{s', r} p(s', r|s, a) [r + \gamma v_k(s')]
vk+1?(s)=amax?s′,r∑?p(s′,r∣s,a)[r+γvk?(s′)]
伪代码:
v[0] = init_state_value()
while ||v_[k] - v_[k-1]|| >= threshold:
for s in StateSpace:
for a in ActionSpace:
q[a] = calculate_q_value(s, a, v_[k])
a_star = get_optimal_action(q)
# policy update
pi[k+1] = update_policy(a_star)
# value update
v[k+1] = update_value(pi[k+1], v_[k])
k = k + 1
值迭代可以看作将贝尔曼优化方程转为一个更新规则:先计算最优值函数,再从中提取对应的策略作为最优策略
🟦策略迭代(Policy Iteration)
反复执行策略评估(Policy Evaluation,PE)和策略提升(Policy Improvement,PI),直至收敛至最优策略。【*能够收敛的要求:有限MDP仅有有限个策略】
- 策略评估:评价某个策略本身如何,即计算任意策略
π
\pi
π的状态值函数
v
π
v_{\pi}
vπ?,称之为预测问题(Prediction Problem )
-
v
k
+
1
(
s
)
=
∑
a
π
(
a
∣
s
)
∑
s
′
,
r
p
(
s
′
,
r
∣
s
,
a
)
[
r
+
γ
v
k
(
s
′
)
]
v_{k+1} (s) = \sum_a \pi (a|s) \sum_{s', r} p(s', r|s, a) [r + \gamma v_k(s')]
vk+1?(s)=∑a?π(a∣s)∑s′,r?p(s′,r∣s,a)[r+γvk?(s′)]
- 注意这里与值迭代的区别:值迭代直接求解最优的状态值,而策略评估仅是计算当前策略的状态值(并不一定是最优)
-
v
k
+
1
(
s
)
=
∑
a
π
(
a
∣
s
)
∑
s
′
,
r
p
(
s
′
,
r
∣
s
,
a
)
[
r
+
γ
v
k
(
s
′
)
]
v_{k+1} (s) = \sum_a \pi (a|s) \sum_{s', r} p(s', r|s, a) [r + \gamma v_k(s')]
vk+1?(s)=∑a?π(a∣s)∑s′,r?p(s′,r∣s,a)[r+γvk?(s′)]
- 策略提升:寻找每个状态下的最好的动作
- 考虑在状态 s s s下找到了一个优于现有策略 π \pi π的动作 a = π ′ ( s ) ≠ π ( s ) a = \pi'(s) \neq \pi(s) a=π′(s)=π(s),则对应的动作值函数 q π ( s , a ) q_{\pi} (s, a) qπ?(s,a)不低于状态值函数 v π ( s ) v_{\pi} (s) vπ?(s),即: q π ( s , π ′ ( s ) ) ≥ v π ( s ) q_{\pi}(s, \pi'(s)) \geq v_{\pi} (s) qπ?(s,π′(s))≥vπ?(s)
- 新策略 π ′ \pi' π′不差于现有策略 π \pi π,即满足: v π ′ ( s ) ≥ v π ( s ) v_{\pi'} (s) \geq v_{\pi} (s) vπ′?(s)≥vπ?(s)
- 那么策略提升就是以贪心的方式选择每个状态下能使动作值函数最大的动作,进而更新策略: π ′ ( s ) = arg?max ? a q π ( s , a ) = arg?max ? a ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] \pi'(s) = \argmax_a q_\pi (s, a) = \argmax_a \sum_{s', r} p(s', r|s, a) [r + \gamma v_\pi(s')] π′(s)=argmaxa?qπ?(s,a)=argmaxa?∑s′,r?p(s′,r∣s,a)[r+γvπ?(s′)]
算法步骤:在第 k k k次迭代中,给定策略 π k \pi_k πk?(随机初始策略: π 0 \pi_0 π0?)
- 策略评估:计算
π
k
\pi_k
πk?的状态值
v
π
k
=
r
π
k
+
γ
P
π
k
v
π
k
v_{\pi_k} = r_{\pi_k} + \gamma P_{\pi_k} v_{\pi_k}
vπk??=rπk??+γPπk??vπk??
- *迭代中嵌套迭代,求解每次迭代策略的迭代状态值
- 策略提升:根据 π k \pi_k πk?的状态值 v π k v_{\pi_k} vπk??,求解当前的最优策略 π k + 1 \pi_{k+1} πk+1?
伪代码:
pi[0] = init_policy()
while not pi[k].is_converged:
# policy evaluation
while ||v_[j] - v_[j-1]|| >= threshold:
for s in StateSpace:
v_[j+1][s] = calculate_state_value(pi[k], v_[j][s])
j = j + 1
# policy improvement
for s in StateSpace:
for a in ActionSpace:
q[a] = calculate_q_value(s, a, v[j])
a_star = get_optimal_action(q)
pi[k+1] = update_policy(a_star)
k = k + 1
*策略迭代中,距离最终目标状态(考虑一个episode的最终状态)越近的状态的策略会越早收敛,离目标状态越远的状态的策略会越晚收敛
🟡截断策略迭代(Truncated Policy Iteration)
截断策略迭代是值迭代与策略迭代的一般化推广;反过来讲,值迭代与策略迭代都是截断策略迭代的特殊情况。
值迭代 vs. 策略迭代:
- 令 v 0 = v π 0 v_0 = v_{\pi_0} v0?=vπ0??,使得二者具有相同的初始值,便于比较
- 发现:二者的区别在于第四步的
v
π
1
≠
v
1
v_{\pi_1} \neq v_1
vπ1??=v1?,因此后续的所有迭代中,二者结果均不相同(收敛前)
- v π 1 v_{\pi_1} vπ1??是由贝尔曼最优方程计算出的状态值,而 v 1 v_1 v1?只是一个值(不是状态值)
可以发现,值迭代与策略迭代的根本差异,在于基于贝尔曼最优公式求解状态值的过程
- 值迭代:仅基于初始状态值,求解一次贝尔曼最优公式
- 策略迭代:在策略评估部分,每次迭代求解贝尔曼公式(∞次)
- *实际中,当两次迭代的状态值差异不大的时候,可以认为已经收敛了
而截断策略迭代就是更一般化的情况:迭代
j
j
j次计算状态值,其中
1
≤
j
<
∞
1\leq j < \infin
1≤j<∞
注:实际上,策略评估与策略提升是一种非常通用的强化学习思想(称为通用策略迭代,GPI),并在许多后续的强化学习方法(如蒙特卡洛方法、时序差分学习等)中有着广泛应用。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!