分类目录:《深入理解强化学习》总目录
在马尔可夫过程的基础上加入奖励函数和折扣因子,就可以得到马尔可夫奖励过程(Markov Reward Process)。一个马尔可夫奖励过程由 ( S , P , r , γ ) (S, P, r, \gamma) (S,P,r,γ)构成,各个组成元素的含义如下所示:
在一个马尔可夫奖励过程中,从第 t t t时刻状态 S t S_t St开始,直到终止状态时,所有奖励的衰减之和称为回报 G t G_t Gt(Return):
G t = R t + γ R t + 1 + γ 2 R t + 2 + ⋯ = ∑ i = 0 ∞ γ i R t + i G_t=R_t+\gamma R_{t+1}+\gamma^2 R_{t+2}+\cdots=\sum_{i=0}^\infty\gamma^i R_{t+i} Gt=Rt+γRt+1+γ2Rt+2+⋯=i=0∑∞γiRt+i
其中, R t R_t Rt表示在 t t t时刻获得的奖励。在下图中,我们在马尔可夫过程例子的基础上添加奖励函数,构建成一个马尔可夫奖励过程。例如,进入状态 s 2 s_2 s2可以得到奖励-2,表明我们不希望进入 s 2 s_2 s2,进入 s 4 s_4 s4可以获得最高的奖励10,但是进入 s 6 s_6 s6之后奖励为零,并且此时序列也终止了。
比如选取 s 1 s_1 s1为起始状态,设置 γ = 0.5 \gamma=0.5 γ=0.5,采样到一条状态序列为 s 1 → s 2 → s 3 → s 6 s_1\rightarrow s_2\rightarrow s_3\rightarrow s_6 s1→s2→s3→s6,就可以计算的回报 G 1 = 0.1 + 0.5 × ( − 2 ) + 0. 5 2 × ( − 2 ) = − 2.5 G_1=0.1+0.5\times(-2)+0.5^2\times(-2)=-2.5 G1=0.1+0.5×(−2)+0.52×(−2)=−2.5。
接下来我们用下面的代码表示上图的马尔可夫奖励过程,并且定义计算回报的函数:
import numpy as np
np.random.seed(0)
# 定义状态转移概率矩阵P
P = [
[0.9, 0.1, 0.0, 0.0, 0.0, 0.0],
[0.5, 0.0, 0.5, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.6, 0.0, 0.4],
[0.0, 0.0, 0.0, 0.0, 0.3, 0.7],
[0.0, 0.2, 0.3, 0.5, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
]
P = np.array(P)
rewards = [-1, -2, -2, 10, 1, 0] # 定义奖励函数
gamma = 0.5 # 定义折扣因子
# 给定一条序列,计算从某个索引(起始状态)开始到序列最后(终止状态)得到的回报
def compute_return(start_index, chain, gamma):
G = 0
for i in reversed(range(start_index, len(chain))):
G = gamma * G + rewards[chain[i] - 1]
return G
# 一个状态序列,s1-s2-s3-s6
chain = [1, 2, 3, 6]
start_index = 0
G = compute_return(start_index, chain, gamma)
print("根据本序列计算得到回报为:%s。" % G)
输出:
根据本序列计算得到回报为:-2.5。
参考文献:
[1] 张伟楠, 沈键, 俞勇. 动手学强化学习[M]. 人民邮电出版社, 2022.
[2] Richard S. Sutton, Andrew G. Barto. 强化学习(第2版)[M]. 电子工业出版社, 2019
[3] Maxim Lapan. 深度强化学习实践(原书第2版)[M]. 北京华章图文信息有限公司, 2021
[4] 王琦, 杨毅远, 江季. Easy RL:强化学习教程 [M]. 人民邮电出版社, 2022